← К каталогу
Исходный код · ID 4136

FVG with Probabilities | GainzAlgo

indicator fvg with probabilities gainzalgo for tradingview.pine
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор для TradingView на Pine Script v6, предназначенный для обнаружения зон Fair Value Gap (FVG) и оценки их качества с помощью вероятностного скоринга. Отображает FVG в виде боксов с центральной линией, окрашенных по уровню вероятности и направлению. Поддерживает фильтрацию по импульсным свечам, отслеживание инвертированных FVG, обнаружение ордер-блоков, ликвидностных сиквов и уровней равных высот/низов.

Настройки программы

НастройкаОписание
i_minAtrMult Минимальный размер FVG — Минимальный размер разрыва FVG в кратных ATR
i_atrLen Период ATR — Период расчёта ATR для нормализации размеров
i_extendBars Продление бокса — Количество баров вправо, на которое продлеваются боксы FVG
i_fullMitigate Полная перебалансировка — Режим полного устранения FVG при закрытии через всю зону
i_showCE Показать центральную линию — Отображение пунктирной линии посередине FVG
i_useDisp Требовать импульс — Требование импульсного движения свечи для подтверждения FVG
i_dispBodyAtr Минимальное тело в ATR — Минимальная длина тела свечи в кратных ATR для импульса
i_dispBodyRat Минимальное соотношение тела — Минимальное соотношение тела свечи к полному диапазону
i_trackIFVG Отслеживать IFVG — Включение отслеживания инвертированных FVG
i_ifvgReqDisp Импульс при инверсии — Требование импульсной свечи при инверсии FVG
i_ifvgCloseDist Мин. дистанция закрытия — Минимальное расстояние закрытия от предыдущего разрыва в ATR
i_ifvgReqBOS Требовать BOS — Требование выравнивания с Break of Structure для инверсии
i_ifvgRedraw Перерисовка бокса — Перерисовка бокса FVG до тела инверсионной свечи
i_ifvgKzOnly Инверсии в killzone — Инверсии FVG только в активных зонах ликвидности
i_emaFast Быстрая EMA — Период быстрой EMA для определения направления тренда
i_emaSlow Медленная EMA — Период медленной EMA для определения направления тренда
i_emaHTF HTF EMA — Период EMA для фильтрации по более высокому таймфрейму
i_ShowEMA Показать EMA — Отображение линий EMA на графике
i_highProb Порог высокого уровня — Верхний порог вероятности для окраски FVG
i_medProb Порог среднего уровня — Средний порог вероятности для окраски FVG
i_maxScore Максимальный балл — Верхний предел скоринга качества FVG
i_swingLen Глубина пивотов — Глубина поиска пивотных точек для структуры
i_showStructure Показать пивоты — Отображение маркеров пивотных высоких и низких точек
i_showPDZones Показать зоны P/D — Отображение зон премиума и дисконта относительно диапазона
i_useOB Обнаружение OB — Включение поиска ордер-блоков в недавних свечах
i_obLookback Поиск OB назад — Количество баров назад для поиска ордер-блоков
i_useSweeps Обнаружение сиквов — Включение обнаружения ликвидностных сиквов
i_sweepMinWick Мин. фитиль сиква — Минимальная длина фитиля в ATR для признака сиква
i_sweepReclaim Требовать возврат — Требование возврата цены после сиква для подтверждения
i_showLiq Линии ликвидности — Отображение линий равных высоких и низких уровней
i_liqTolerance Допуск совпадения — Допуск отклонения уровней в кратных ATR
i_liqMaxAge Макс. возраст линий — Максимальный возраст линий ликвидности в барах
i_showOR Диапазон открытия — Отображение диапазона открытия торговой сессии
i_orSession Сессия OR — Сессия для определения диапазона открытия
i_showPDHL PDH / PDL — Отображение предыдущего дневного максимума и минимума
i_showPDOC Open/Close пред. дня — Отображение открытия и закрытия предыдущего торгового дня
i_tzOffset Часовой пояс — Часовой пояс для расчёта сессий и killzones
i_kzLondon Лондонская KZ — Временной интервал лондонской killzone
i_kzNYAM NY AM KZ — Временной интервал нью-йоркской утренней killzone
i_kzNYPM NY PM KZ — Временной интервал нью-йоркской дневной killzone
i_kzShowBG Подсветка KZ — Подсветка фона графика в активных killzones
i_ageSoft Затухание старых — Барс, после которых FVG начинает визуально затемняться
i_ageHard Удаление старых — Барс, после которых FVG удаляется с графика
i_distMax Макс. дистанция — Максимальное расстояние FVG от цены в ATR для отображения
i_enableDist Фильтр расстояния — Включение скрытия FVG, слишком удалённых от текущей цены
i_showSignals Включить сигналы — Отображение сигналов на графике при выполнении условий
i_sigMinScore Мин. балл для сигнала — Минимальный балл качества FVG для генерации сигнала
i_sigMode Режим сигналов — Выбор режима: трендовые, разворотные или оба типа сигналов
i_sigReqConfirm Подтверждающая свеча — Требование подтверждающей свечи после генерации сигнала
i_sigReqPD Совпадение P/D — Требование нахождения в зоне премиума или дисконта для трендовых сигналов
i_sigReqKZ Активная KZ — Требование активной killzone для генерации сигнала
i_sigHTFBuffer Буфер HTF EMA — Отступ цены от HTF EMA в ATR для подтверждения сигнала
i_sigCooldown Интервал между сигналами — Минимальное количество баров между последовательными сигналами
i_sigAplusOnly Только A+ сигналы — Отображение только сигналов высшего качества
i_sigOnCETap Сигнал при касании CE — Генерация сигнала при касании центральной линии FVG
i_sigOnOBRetest Сигнал при ретесте OB — Генерация сигнала при ретесте обнаруженного ордер-блока
i_sigOnSweep Сигнал при сикве — Генерация сигнала при обнаружении ликвидностного сиква
i_rvolLen Период RVOL — Период расчёта относительного объёма
i_rvolMin Мин. RVOL — Минимальное значение относительного объёма для сигнала
i_volRegimeLen Период волатильности — Период ATR для определения волатильного режима
i_volCompressPct Порог сжатия — Порог отношения текущего ATR к длинному для определения сжатого режима
i_volExpandPct Порог расширения — Порог отношения текущего ATR к длинному для определения расширенного режима
i_useTimeFilter Фильтр по времени — Включение фильтрации сигналов по времени суток
i_avoidOpenMin Пропуск открытия NY AM — Количество минут после открытия NY AM, в которые пропускаются сигналы
i_avoidCloseMin Пропуск закрытия NY PM — Количество минут перед закрытием NY PM, в которые пропускаются сигналы
i_avoidLunch Пропуск обеда — Пропуск сигналов в обеденный перерыв NY
i_bullHigh Бычий высокий — Цвет для бычьих FVG с высоким уровнем вероятности
i_bullMed Бычий средний — Цвет для бычьих FVG со средним уровнем вероятности
i_bullLow Бычий низкий — Цвет для бычьих FVG с низким уровнем вероятности
i_bearHigh Медвежий высокий — Цвет для медвежьих FVG с высоким уровнем вероятности
i_bearMed Медвежий средний — Цвет для медвежьих FVG со средним уровнем вероятности
i_bearLow Медвежий низкий — Цвет для медвежьих FVG с низким уровнем вероятности
i_ifvgBull IFVG был бычьим — Цвет для инвертированных FVG, изначально являвшихся бычьими
i_ifvgBear IFVG был медвежьим — Цвет для инвертированных FVG, изначально являвшихся медвежьими
i_orColor Цвет диапазона открытия — Цвет линий диапазона открытия сессии
i_pdhColor Цвет PDH — Цвет линии предыдущего дневного максимума
i_pdlColor Цвет PDL — Цвет линии предыдущего дневного минимума
i_liqColor Цвет ликвидности — Цвет линий уровней ликвидности
i_fillAlpha Прозрачность заливки — Прозрачность заливки боксов FVG
i_borderAlpha Прозрачность границы — Прозрачность границ боксов FVG
i_dimExtra Дополнительное затемнение — Дополнительный уровень затемнения старых FVG
i_showTable Показать панель — Отображение информационной панели с текущим состоянием на графике
i_tblPos Позиция панели — Расположение информационной панели на графике
Получить полный код

Поиск по коду файла

indicator("FVG with Probabilities | GainzAlgo", overlay=true, max_boxes_count=500, max_lines_count=500, max_labels_count=500)

grp_fvg    = "FVG Detection"
grp_disp   = "Displacement Filter"
grp_ifvg   = "IFVG Rules"
grp_ml     = "Quality Score"
grp_smc    = "Market Structure"
grp_ob     = "Order Blocks (Internal)"
grp_sweep  = "Liquidity Sweeps (Internal)"
grp_liq    = "Liquidity Pools (Equal H/L)"
grp_daily  = "Daily Levels"
grp_sess   = "Killzones"
grp_clean  = "Chart Cleanup"
grp_sig    = "Signal Engine"
grp_vol    = "Volume & Volatility"
grp_time   = "Time-of-Day Filter"
grp_style  = "Visual Style"
grp_tbl    = "Dashboard"

i_minAtrMult   = input.float(0.3, "Min FVG Size (ATR x)", minval=0.05, step=0.05, group=grp_fvg)
i_atrLen       = input.int(14, "ATR Length", group=grp_fvg)
i_extendBars   = input.int(50, "Box Extension", group=grp_fvg)
i_fullMitigate = input.bool(false, "Full Rebalance Mitigation", group=grp_fvg)
i_showCE       = input.bool(true, "Show CE (50%)", group=grp_fvg)

i_useDisp      = input.bool(true, "Require Displacement", group=grp_disp)
i_dispBodyAtr  = input.float(0.6, "Min Body (ATR x)", minval=0.1, step=0.05, group=grp_disp)
i_dispBodyRat  = input.float(0.6, "Min Body/Range", minval=0.3, maxval=0.95, step=0.05, group=grp_disp)

i_trackIFVG     = input.bool(true, "Track IFVGs", group=grp_ifvg)
i_ifvgReqDisp   = input.bool(true, "Req Displacement on Inversion", group=grp_ifvg)
i_ifvgCloseDist = input.float(0.3, "Min Close Dist Past Gap (ATR x)", minval=0.0, step=0.05, group=grp_ifvg)
i_ifvgReqBOS    = input.bool(true, "Req Aligned BOS", group=grp_ifvg)
i_ifvgRedraw    = input.bool(true, "Redraw Box to Inversion Body", group=grp_ifvg)
i_ifvgKzOnly    = input.bool(false, "Inversions Only in Killzones", group=grp_ifvg)

i_emaFast  = input.int(20, "Fast EMA", group=grp_ml)
i_emaSlow  = input.int(50, "Slow EMA", group=grp_ml)
i_emaHTF   = input.int(200, "HTF EMA", group=grp_ml)
i_ShowEMA  = input.bool(true, "Show EMAs", group=grp_ml)
i_highProb = input.float(0.65, "High Cutoff", group=grp_ml, minval=0.5, maxval=0.99, step=0.01)
i_medProb  = input.float(0.45, "Med Cutoff", group=grp_ml, minval=0.2, maxval=0.64, step=0.01)
i_maxScore = input.float(0.85, "Max Score Clamp", group=grp_ml, minval=0.70, maxval=0.98, step=0.01)

i_swingLen      = input.int(5, "Fractal Lookback", minval=2, maxval=20, group=grp_smc)
i_showStructure = input.bool(false, "Show Swing Points", group=grp_smc)
i_showPDZones   = input.bool(true, "Show P/D Zones", group=grp_smc)

i_useOB        = input.bool(true, "Enable OB Detection", group=grp_ob)
i_obLookback   = input.int(10, "OB Lookback (bars)", minval=3, maxval=30, group=grp_ob)

i_useSweeps    = input.bool(true, "Enable Sweep Detection", group=grp_sweep)
i_sweepMinWick = input.float(0.3, "Min Sweep Wick (ATR x)", minval=0.1, step=0.05, group=grp_sweep)
i_sweepReclaim = input.bool(true, "Require Reclaim (close back)", group=grp_sweep)

i_showLiq      = input.bool(true, "Show Equal H/L Lines", group=grp_liq)
i_liqTolerance = input.float(0.1, "Equal Tolerance (ATR x)", minval=0.01, step=0.01, group=grp_liq)
i_liqMaxAge    = input.int(50, "Max Age (bars)", minval=10, group=grp_liq)

i_showOR       = input.bool(true, "Show Opening Range", group=grp_daily)
i_orSession    = input.session("0930-1000", "Opening Range Session", group=grp_daily)
i_showPDHL     = input.bool(true, "Show PDH / PDL", group=grp_daily)
i_showPDOC     = input.bool(false, "Show Prev Day Open/Close", group=grp_daily)

i_tzOffset = input.string("America/New_York", "Session TZ", options=["America/New_York","Europe/London","Asia/Tokyo","UTC"], group=grp_sess)
i_kzLondon = input.session("0200-0500", "London KZ", group=grp_sess)
i_kzNYAM   = input.session("0700-1000", "NY AM KZ", group=grp_sess)
i_kzNYPM   = input.session("1330-1600", "NY PM KZ", group=grp_sess)
i_kzShowBG = input.bool(false, "Highlight KZ BG", group=grp_sess)

i_ageSoft    = input.int(100, "Dim Older Than (bars)", minval=10, group=grp_clean)
i_ageHard    = input.int(300, "Delete Older Than (bars)", minval=50, group=grp_clean)
i_distMax    = input.float(8.0, "Hide Beyond (ATR x)", minval=2.0, step=0.5, group=grp_clean)
i_enableDist = input.bool(true, "Enable Distance Filter", group=grp_clean)

i_showSignals     = input.bool(true, "Enable Signals", group=grp_sig)
i_sigMinScore     = input.float(0.60, "Min FVG Score for Signal", group=grp_sig, minval=0.40, maxval=0.95, step=0.01)
i_sigMode         = input.string("Both", "Signal Mode", options=["Trend Only","Reversal Only","Both"], group=grp_sig, tooltip="Trend = with dominant bias. Reversal = counter-trend with sweep.")
i_sigReqConfirm   = input.bool(true,  "Require Confirmation Candle", group=grp_sig, tooltip="Next candle must show opposing displacement.")
i_sigReqPD        = input.bool(true,  "Req P/D Alignment (Trend)", group=grp_sig)
i_sigReqKZ        = input.bool(true,  "Req Killzone Active", group=grp_sig)
i_sigHTFBuffer    = input.float(0.3,  "HTF Buffer (ATR x)", minval=0.0, step=0.05, group=grp_sig, tooltip="Price must be this far past HTF EMA to count.")
i_sigCooldown     = input.int(10, "Min Bars Between Signals", minval=0, group=grp_sig)
i_sigAplusOnly    = input.bool(false, "Show Only A+ Signals", group=grp_sig)
i_sigOnCETap      = input.bool(true,  "Trigger on CE Tap", group=grp_sig)
i_sigOnOBRetest   = input.bool(true,  "Trigger on OB Retest", group=grp_sig)
i_sigOnSweep      = input.bool(true,  "Trigger on Liquidity Sweep", group=grp_sig)

i_rvolLen        = input.int(20, "RVOL Length", minval=5, group=grp_vol)
i_rvolMin        = input.float(1.0, "Min RVOL for Signal", minval=0.3, step=0.1, group=grp_vol, tooltip="Relative volume gate. Below this, signals are downgraded.")
i_volRegimeLen   = input.int(50, "Volatility Regime ATR Length", group=grp_vol)
i_volCompressPct = input.float(0.7, "Compression Threshold", minval=0.4, maxval=0.95, step=0.05, group=grp_vol, tooltip="If current ATR / long ATR < this, market is compressed = chop risk.")
i_volExpandPct   = input.float(1.3, "Expansion Threshold", minval=1.05, maxval=2.0, step=0.05, group=grp_vol)

i_useTimeFilter  = input.bool(true, "Enable Time Filter", group=grp_time)
i_avoidOpenMin   = input.int(5, "Skip First N Minutes of NY AM", minval=0, maxval=30, group=grp_time, tooltip="Skip open drive (noise).")
i_avoidCloseMin  = input.int(10, "Skip Last N Minutes of NY PM", minval=0, maxval=30, group=grp_time)
i_avoidLunch     = input.bool(true, "Skip Lunch (11:30-13:30 NY)", group=grp_time)

color i_bullHigh = input.color(#00e676, "Bull High", group=grp_style)
color i_bullMed  = input.color(#26a69a, "Bull Med",  group=grp_style)
color i_bullLow  = input.color(#37474f, "Bull Low",  group=grp_style)
color i_bearHigh = input.color(#ff1744, "Bear High", group=grp_style)
color i_bearMed  = input.color(#ff6d00, "Bear Med",  group=grp_style)
color i_bearLow  = input.color(#4e342e, "Bear Low",  group=grp_style)
color i_ifvgBull = input.color(#7e57c2, "IFVG was Bull", group=grp_style)
color i_ifvgBear = input.color(#f48fb1, "IFVG was Bear", group=grp_style)
color i_orColor  = input.color(#ffd700, "Opening Range", group=grp_style)
color i_pdhColor = input.color(#ff1744, "PDH",  group=grp_style)
color i_pdlColor = input.color(#00e676, "PDL",  group=grp_style)
color i_liqColor = input.color(#bb86fc, "Liquidity", group=grp_style)
i_fillAlpha   = input.int(88, "Fill Alpha", minval=60, maxval=98, group=grp_style)
i_borderAlpha = input.int(45, "Border Alpha", minval=0, maxval=90, group=grp_style)
i_dimExtra    = input.int(6, "Extra Dim on Old", minval=0, maxval=10, group=grp_style)

i_showTable = input.bool(true, "Show Dashboard", group=grp_tbl)
i_tblPos    = input.string("Top Right", "Position", options=["Top Right","Top Left","Bottom Right","Bottom Left"], group=grp_tbl)

atr      = ta.atr(i_atrLen)
atrLong  = ta.atr(i_volRegimeLen)
emaFast  = ta.ema(close, i_emaFast)
emaSlow  = ta.ema(close, i_emaSlow)
emaHTF   = ta.ema(close, i_emaHTF)
volMA    = ta.sma(volume, i_rvolLen)
rvol     = volume / math.max(volMA, 1)

bullTrend = emaFast > emaSlow
bearTrend = emaFast < emaSlow

htfBuf    = i_sigHTFBuffer * atr
aboveHTF  = close > emaHTF + htfBuf
belowHTF  = close < emaHTF - htfBuf

volRatio   = atr / math.max(atrLong, syminfo.mintick)
volCompressed = volRatio < i_volCompressPct
volExpanded   = volRatio > i_volExpandPct
volNormal     = not volCompressed and not volExpanded

inLondon = not na(time(timeframe.period, i_kzLondon, i_tzOffset))
inNYAM   = not na(time(timeframe.period, i_kzNYAM,   i_tzOffset))
inNYPM   = not na(time(timeframe.period, i_kzNYPM,   i_tzOffset))
inKZ     = inLondon or inNYAM or inNYPM

bgcolor(i_kzShowBG and inLondon ? color.new(#448aff, 94) : na)
bgcolor(i_kzShowBG and inNYAM   ? color.new(#00e676, 94) : na)
bgcolor(i_kzShowBG and inNYPM   ? color.new(#ffd700, 94) : na)

nyHour   = hour(time, i_tzOffset)
nyMinute = minute(time, i_tzOffset)
nyMinsFromMid = nyHour * 60 + nyMinute

openBlackout  = nyMinsFromMid >= 570 and nyMinsFromMid < (570 + i_avoidOpenMin)

closeBlackout = nyMinsFromMid >= (960 - i_avoidCloseMin) and nyMinsFromMid < 960

lunchBlackout = i_avoidLunch and nyMinsFromMid >= 690 and nyMinsFromMid < 810

inBlackout = i_useTimeFilter and (openBlackout or closeBlackout or lunchBlackout)

isDisp(ofs, wantBull) =>
    bodyAbs = math.abs(close[ofs] - open[ofs])
    rng     = math.max(high[ofs] - low[ofs], syminfo.mintick)
    atrRef  = math.max(atr, syminfo.mintick)
    big     = bodyAbs / atrRef >= i_dispBodyAtr
    solid   = bodyAbs / rng    >= i_dispBodyRat
    dir     = wantBull ? close[ofs] > open[ofs] : close[ofs] < open[ofs]
    big and solid and dir

c2_bullDisp = isDisp(1, true)
c2_bearDisp = isDisp(1, false)
curBullDisp = isDisp(0, true)
curBearDisp = isDisp(0, false)

bullVelocity = (isDisp(0, true)  ? 1 : 0) + (isDisp(1, true)  ? 1 : 0) + (isDisp(2, true)  ? 1 : 0)
bearVelocity = (isDisp(0, false) ? 1 : 0) + (isDisp(1, false) ? 1 : 0) + (isDisp(2, false) ? 1 : 0)

volRelDisp = volume[1] / math.max(volMA[1], 1)

swingH = ta.pivothigh(high, i_swingLen, i_swingLen)
swingL = ta.pivotlow(low,   i_swingLen, i_swingLen)

var float lastSH = na
var float lastSL = na
var float prevSH = na
var float prevSL = na
var int   lastSHBar = na
var int   lastSLBar = na

if not na(swingH)
    prevSH := lastSH
    lastSH := swingH
    lastSHBar := bar_index - i_swingLen
    if i_showStructure
        label.new(bar_index - i_swingLen, swingH, "H", style=label.style_none, textcolor=color.new(#ff1744, 30), size=size.tiny, yloc=yloc.abovebar)
if not na(swingL)
    prevSL := lastSL
    lastSL := swingL
    lastSLBar := bar_index - i_swingLen
    if i_showStructure
        label.new(bar_index - i_swingLen, swingL, "L", style=label.style_none, textcolor=color.new(#00e676, 30), size=size.tiny, yloc=yloc.belowbar)

bosBull = not na(lastSH) and not na(prevSH) and lastSH > prevSH
bosBear = not na(lastSL) and not na(prevSL) and lastSL < prevSL

haveRange = not na(lastSH) and not na(lastSL)
rangeHi   = haveRange ? math.max(lastSH, lastSL) : na
rangeLo   = haveRange ? math.min(lastSH, lastSL) : na
rangeMid  = haveRange ? (rangeHi + rangeLo) / 2 : na

inDiscount = haveRange and close < rangeMid
inPremium  = haveRange and close > rangeMid

var line pdLine  = na
var box  premBox = na
var box  discBox = na
if i_showPDZones and haveRange and barstate.islast
    line.delete(pdLine)
    box.delete(premBox)
    box.delete(discBox)
    pdLine  := line.new(bar_index - 50, rangeMid, bar_index + 20, rangeMid, color=color.new(#ffd700, 40), style=line.style_dashed)
    premBox := box.new(bar_index - 50, rangeHi, bar_index + 20, rangeMid, bgcolor=color.new(#ff1744, 96), border_color=color.new(#ff1744, 85))
    discBox := box.new(bar_index - 50, rangeMid, bar_index + 20, rangeLo, bgcolor=color.new(#00e676, 96), border_color=color.new(#00e676, 85))

sweepBull = false
sweepBear = false
if i_useSweeps and not na(lastSL) and not na(lastSH)
    wickDown = low < lastSL and (lastSL - low) >= i_sweepMinWick * atr
    wickUp   = high > lastSH and (high - lastSH) >= i_sweepMinWick * atr
    reclaimUp   = not i_sweepReclaim or close > lastSL
    reclaimDown = not i_sweepReclaim or close < lastSH
    sweepBull := wickDown and reclaimUp
    sweepBear := wickUp   and reclaimDown

var array<float> ob_tops   = array.new<float>()
var array<float> ob_bots   = array.new<float>()
var array<bool>  ob_isBull = array.new<bool>()
var array<int>   ob_bar    = array.new<int>()

if i_useOB

    if curBullDisp
        for k = 1 to i_obLookback
            if close[k] < open[k]
                obTop = high[k]
                obBot = low[k]

                dup = false
                if array.size(ob_tops) > 0
                    for m = 0 to array.size(ob_tops) - 1
                        if math.abs(array.get(ob_tops, m) - obTop) < syminfo.mintick and math.abs(array.get(ob_bots, m) - obBot) < syminfo.mintick
                            dup := true
                            break
                if not dup
                    array.push(ob_tops, obTop)
                    array.push(ob_bots, obBot)
                    array.push(ob_isBull, true)
                    array.push(ob_bar, bar_index - k)
                break
    if curBearDisp
        for k = 1 to i_obLookback
            if close[k] > open[k]
                obTop = high[k]
                obBot = low[k]
                dup = false
                if array.size(ob_tops) > 0
                    for m = 0 to array.size(ob_tops) - 1
                        if math.abs(array.get(ob_tops, m) - obTop) < syminfo.mintick and math.abs(array.get(ob_bots, m) - obBot) < syminfo.mintick
                            dup := true
                            break
                if not dup
                    array.push(ob_tops, obTop)
                    array.push(ob_bots, obBot)
                    array.push(ob_isBull, false)
                    array.push(ob_bar, bar_index - k)
                break

if array.size(ob_tops) > 20
    array.shift(ob_tops)
    array.shift(ob_bots)
    array.shift(ob_isBull)
    array.shift(ob_bar)

obRetestBull = false
obRetestBear = false
if array.size(ob_tops) > 0
    for m = 0 to array.size(ob_tops) - 1
        t = array.get(ob_tops, m)
        b = array.get(ob_bots, m)
        isBullOB = array.get(ob_isBull, m)
        bornAt = array.get(ob_bar, m)

        if bar_index - bornAt < 100
            if isBullOB and low <= t and low >= b and close > b
                obRetestBull := true
            if not isBullOB and high >= b and high <= t and close < t
                obRetestBear := true

var array<line> liq_lines = array.new<line>()
var array<int>  liq_bars  = array.new<int>()

if i_showLiq and not na(swingH) and not na(prevSH)
    if math.abs(lastSH - prevSH) <= i_liqTolerance * atr

        ln = line.new(lastSHBar, lastSH, bar_index + 10, lastSH, color=color.new(i_liqColor, 40), style=line.style_dotted, width=1, extend=extend.right)
        array.push(liq_lines, ln)
        array.push(liq_bars, bar_index)

if i_showLiq and not na(swingL) and not na(prevSL)
    if math.abs(lastSL - prevSL) <= i_liqTolerance * atr
        ln = line.new(lastSLBar, lastSL, bar_index + 10, lastSL, color=color.new(i_liqColor, 40), style=line.style_dotted, width=1, extend=extend.right)
        array.push(liq_lines, ln)
        array.push(liq_bars, bar_index)

if array.size(liq_lines) > 0
    var array<int> liqToDel = array.new<int>()
    array.clear(liqToDel)
    for m = 0 to array.size(liq_lines) - 1
        if bar_index - array.get(liq_bars, m) > i_liqMaxAge
            array.push(liqToDel, m)
    if array.size(liqToDel) > 0
        for j = array.size(liqToDel) - 1 to 0
            idx = array.get(liqToDel, j)
            if idx < array.size(liq_lines)
                line.delete(array.get(liq_lines, idx))
                array.remove(liq_lines, idx)
                array.remove(liq_bars, idx)

var float orHigh = na
var float orLow  = na
var line  orHighLn = na
var line  orLowLn  = na

inORSession = not na(time(timeframe.period, i_orSession, i_tzOffset))
if inORSession and not inORSession[1]
    orHigh := high
    orLow  := low
if inORSession
    orHigh := math.max(orHigh, high)
    orLow  := math.min(orLow, low)

if i_showOR and not na(orHigh) and barstate.islast
    line.delete(orHighLn)
    line.delete(orLowLn)
    orHighLn := line.new(bar_index - 100, orHigh, bar_index + 20, orHigh, color=color.new(i_orColor, 30), style=line.style_solid, width=1, extend=extend.right)
    orLowLn  := line.new(bar_index - 100, orLow,  bar_index + 20, orLow,  color=color.new(i_orColor, 30), style=line.style_solid, width=1, extend=extend.right)

pdh = request.security(syminfo.tickerid, "D", high[1], lookahead=barmerge.lookahead_on)
pdl = request.security(syminfo.tickerid, "D", low[1],  lookahead=barmerge.lookahead_on)
pdo = request.security(syminfo.tickerid, "D", open[1], lookahead=barmerge.lookahead_on)
pdc = request.security(syminfo.tickerid, "D", close[1],lookahead=barmerge.lookahead_on)

var line pdhLn = na
var line pdlLn = na
var line pdoLn = na
var line pdcLn = na

if i_showPDHL and barstate.islast
    line.delete(pdhLn)
    line.delete(pdlLn)
    pdhLn := line.new(bar_index - 100, pdh, bar_index + 20, pdh, color=color.new(i_pdhColor, 30), style=line.style_dashed, width=1, extend=extend.right)
    pdlLn := line.new(bar_index - 100, pdl, bar_index + 20, pdl, color=color.new(i_pdlColor, 30), style=line.style_dashed, width=1, extend=extend.right)

if i_showPDOC and barstate.islast
    line.delete(pdoLn)
    line.delete(pdcLn)
    pdoLn := line.new(bar_index - 100, pdo, bar_index + 20, pdo, color=color.new(color.gray, 50), style=line.style_dotted, width=1, extend=extend.right)
    pdcLn := line.new(bar_index - 100, pdc, bar_index + 20, pdc, color=color.new(color.white, 50), style=line.style_dotted, width=1, extend=extend.right)

clamp(v, lo, hi) => math.max(lo, math.min(hi, v))
logit(p) => math.log(p / (1.0 - p))

calcScore(fvgSize, fvgMid, isBull) =>
    sizeRatio = fvgSize / math.max(atr, syminfo.mintick)
    f1 = sizeRatio > 1.5 ? 0.82 : sizeRatio > 0.9 ? 0.65 : sizeRatio > 0.4 ? 0.50 : 0.35
    f2 = isBull ? (bullTrend ? 0.78 : 0.30) : (bearTrend ? 0.78 : 0.30)
    f3 = isBull ? (aboveHTF ? 0.76 : 0.34) : (belowHTF ? 0.76 : 0.34)
    f4 = volRelDisp > 1.5 ? 0.72 : volRelDisp > 0.8 ? 0.55 : 0.38
    f5 = not haveRange ? 0.50 : (isBull ? (fvgMid < rangeMid ? 0.80 : 0.30) : (fvgMid > rangeMid ? 0.80 : 0.30))
    f6 = isBull ? (bosBull ? 0.75 : 0.40) : (bosBear ? 0.75 : 0.40)
    f7 = inKZ ? 0.68 : 0.45
    f8 = volNormal ? 0.60 : volExpanded ? 0.75 : 0.35
    ll = 1.2*logit(clamp(f1,0.1,0.9)) + 1.0*logit(clamp(f2,0.1,0.9)) + 1.0*logit(clamp(f3,0.1,0.9)) + 0.8*logit(clamp(f4,0.1,0.9)) + 1.5*logit(clamp(f5,0.1,0.9)) + 1.3*logit(clamp(f6,0.1,0.9)) + 0.7*logit(clamp(f7,0.1,0.9)) + 0.9*logit(clamp(f8,0.1,0.9))
    clamp(1.0 / (1.0 + math.exp(-(-0.60 + ll))), 0.04, i_maxScore)

probColor(p, isBull) =>
    tier = p >= i_highProb ? 2 : p >= i_medProb ? 1 : 0
    isBull ? (tier == 2 ? i_bullHigh : tier == 1 ? i_bullMed : i_bullLow) : (tier == 2 ? i_bearHigh : tier == 1 ? i_bearMed : i_bearLow)

tierLabel(p) => p >= i_highProb ? "H" : p >= i_medProb ? "M" : "L"

var array<box>   fvg_boxes    = array.new<box>()
var array<line>  fvg_ceLns    = array.new<line>()
var array<float> fvg_tops     = array.new<float>()
var array<float> fvg_bots     = array.new<float>()
var array<bool>  fvg_isBull   = array.new<bool>()
var array<float> fvg_probs    = array.new<float>()
var array<int>   fvg_state    = array.new<int>()
var array<int>   fvg_birthBar = array.new<int>()

overlaps(newTop, newBot) =>
    bool hit = false
    sz = array.size(fvg_boxes)
    if sz > 0
        for i = 0 to sz - 1
            exTop = array.get(fvg_tops, i)
            exBot = array.get(fvg_bots, i)
            if (newTop <= exTop and newTop >= exBot) or (newBot <= exTop and newBot >= exBot) or (newBot <= exBot and newTop >= exTop) or (exBot <= newBot and exTop >= newTop)
                hit :=

Показано первые 50% кода (символов: 31221)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
3 122,10₽ ≈ $38.16