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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.