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

Liquidity Sweep + CISD + FVG Reversal

indicator_liquidity_sweep_+_cisd_+_fvg_reversal_for_tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Индикатор «Liquidity Sweep + CISD + FVG Reversal» реализует на Pine Script v6 многоэтапную логику обнаружения разворотов цены. Он отслеживает ликвидностные уровни (спайки свинг-хаев и свинг-лоу), выявляет их протаривание (sweep), затем ищет изменение состояния доставки (CISD) и справедливую ценовую разницу (FVG) для формирования сигналов на вход.

Внутри индикатора работает машина состояний из четырёх стадий: сканирование, протаривание, CISD и установка FVG. Каждая установка оценивается по пяти независимым мерам качества (баланс пула, дисплейсмент, глубина проникновения, премия/дисконт, эффективность подхода) и получает буквенную оценку A/B/C. Встроенный дашборд отображает текущую стадию, оценку, позиции и торговую статистику.

Индикатор поддерживает пользовательские параметры для настройки всех ключевых окон и порогов, визуальные настройки отображения уровней, зон и меток, а также вебхуки для отправки алертов. Управление сделками включает стоп-лосс, тейк-профит, кулдаун между сигналами и плоское закрытие в конце торгового дня. Это индикатор анализа и отображения, а не автоматический советник.

Встроенный дашборд в виде таблицы внизу по центру показывает 11 параметров в четыре строки: стадию, направление охоты, ликвидностные уровни, оценку качества, CISD-уровень, зону FVG, текущую позицию, TP/SL, торговую запись и статус готовности.

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

НастройкаОписание
pLen Количество баров с каждой стороны для подтверждения свинг-хая или свинг-лоу. Отслеживаемый уровень — самый последний непротаренный свинг.
liqMaxAge Возраст ликвидностного уровня в барах, после которого отслеживаемый уровень удаляется с графика.
cisdWait Количество баров, отведённое на переход от протаривания к закрытию CISD. Отсутствие CISD в этом окне означает недействительную установку.
fvgMinAtr Минимальный размер FVG в кратных значениях ATR. Более узкие разрывы игнорируются.
fvgWait Количество баров, отведённых на ретрейс цены в разрыв FVG и его отклонение. Превышение тайм-аута делает установку недействительной.
showCE Включает отображение пунктирной линии середины разрыва FVG (consequent encroachment).
qMinGrade Минимальная оценка качества для допуска установки к срабатыванию: «A — только лучшие» (75+), «B — хорошие и лучше» (50–74), «C — показать всё» (ниже 50).
qEqTol Допуск в кратных ATR для распознавания двух и более свинг-хаев/лоу на одном уровне как единого пула ликвидности.
qEqLook Глубина поиска в истории для подсчёта равных свинг-хаев/лоу при оценке качества пула.
qDispAtr Минимальное значение тела CISD-свечи в кратных ATR для получения максимальных баллов за меру дисплейсмента (силу изменения состояния доставки).
qPDmin Минимальный порог премии/дисконта. Установка должна находиться хотя бы на нужной стороне равновесия (0.5) для получения баллов за меру массива.
qPDLook Глубина поиска в истории для определения диапазона сделки (dealing range) при оценке премии/дисконта.
qSwpMax Максимальная глубина протаривания в кратных ATR. Проникновение за этот порог обнуляет баллы за меру чистоты протаривания.
qAppLen Количество баров, на которые оценивается эффективность подхода (Kaufman Efficiency Ratio) перед протариванием.
qAppTrend Порог эффективности подхода (ER). При значении на или выше этого порога подход считается трендовым приходом, а не рейдом.
qAppMode Поведение при обнаружении трендового прихода: «Downgrade only» — снижение оценки, «Skip the setup» — пропуск установки, «FLIP the direction» — открытие в противоположном направлении.
qShowGrade Включает или отключает отображение буквенной оценки и числового балла на метках входа.
tradeMode Режим расчёта TP/SL: «Structural RR» — стоп за вик протаривания, цель = множитель риска; «Fixed %» — TP и SL в процентах от входа.
rrMult Множитель риска к прибыли (Risk:Reward) при структурном режиме TP/SL. Цель равна этому множителю, умноженному на риск.
slBufAtr Отступ стоп-лосса за пределы свечи протаривания в кратных ATR.
tpPct Процент тейк-профита от цены входа при режиме «Fixed %».
slPct Процент стоп-лосса от цены входа при режиме «Fixed %».
showLevels Включает отображение ящиков TP/SL для открытых сделок.
pastBoxFade Процент прозрачности (затемнения) для ящиков прошлых сделок.
useCooldown Включает или отключает кулдаун (задержку) между последовательными торговыми сигналами.
cooldownBars Количество баров ожидания между последовательными сигналами при включённом кулдауне.
maxBars Максимальное количество баров, в течение которых сделка может оставаться открытой.
useEOD Включает или отключает плоское закрытие всех открытых позиций в заданном оконце конца торгового дня (по нью-йоркскому времени).
eodHour Час начала окна конца торгового дня (по нью-йоркскому времени) для плоского закрытия позиций.
eodMinute Минута начала окна конца торгового дня (по нью-йоркскому времени).
eodEndHour Час окончания окна конца торгового дня (по нью-йоркскому времени) для плоского закрытия позиций.
eodEndMin Минута окончания окна конца торгового дня (по нью-йоркскому времени).
enableWebhook Включает или отключает отправку вебхука-оповещений при входе и выходе из сделки.
STRATEGY_ID Идентификатор стратегии, используемый в полезной нагрузке вебхука для оповещений.
whQty Количество контрактов/единиц в полезной нагрузке вебхука-оповещения.
showLiq Включает отображение светящихся горизонтальных линий ликвидностных уровней (золотого и бирюзового цвета).
showSweep Включает отображение зоны протаривания (фиолетовый ящик) и маркера на графике.
showCisd Включает отображение горизонтальной линии уровня CISD (золотого цвета).
showFvg Включает отображение прямоугольных зон FVG (фиолетового цвета) на графике.
showSig Включает отображение меток входа и выхода с информацией о TP, SL и оценке.
keepStruct Количество сохранённых на графике прошлых установок (свечей, линий, меток).
keepTrades Количество сохранённых прошлых торговых ящиков и меток на графике.
showDash Включает или отключает табличный дашборд внизу по центру графика.
Получить полный код

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

indicator("Liquidity Sweep + CISD + FVG Reversal", shorttitle="LIQ SWEEP Reversal + CISD + FVG
 ", overlay=true, max_lines_count=200, max_labels_count=300, max_boxes_count=300)

gL = "◈ Liquidity + Sweep"
pLen      = input.int(10,  "Swing Pivot Length", minval=2, maxval=50, group=gL, tooltip="Bars on each side required to confirm a swing high/low. The most recent unswept swing is the tracked liquidity pool.")
liqMaxAge = input.int(300, "Max Level Age (bars)", minval=20, maxval=1000, group=gL, tooltip="A tracked level older than this is dropped.")
cisdWait  = input.int(15,  "Sweep → CISD Window (bars)", minval=2, maxval=100, group=gL, tooltip="Bars allowed between the sweep and the CISD close. No CISD inside the window = setup dead.")

gF = "◈ CISD + FVG"
fvgMinAtr = input.float(0.20, "Min FVG Size (ATR ×)", minval=0.0, maxval=2.0, step=0.05, group=gF, tooltip="Gaps smaller than this fraction of ATR are ignored.")
fvgWait   = input.int(25,  "FVG Retrace Window (bars)", minval=2, maxval=150, group=gF, tooltip="Bars allowed for price to retrace into the gap and reject. Timeout = setup dead.")
showCE    = input.bool(true, "FVG Midline (CE)", group=gF, tooltip="Dashed consequent-encroachment line at the middle of the gap.")

gQ = "◈ SETUP QUALITY — what separates a real sweep from a wiggle"
qMinGrade = input.string("C — show everything", "Minimum Grade To Signal", options=["A — only the best", "B — good and better", "C — show everything"], group=gQ, tooltip="Every setup is scored 0-100 on four independent measures and graded. Raise this to trade only the ones that earn it. A = 75+, B = 50-74, C = below 50. The grade is printed on the entry label and in the dashboard either way, so you can watch what you are filtering out before you filter it.")
qEqTol    = input.float(0.15, "  ◈ Equal-H/L tolerance (ATR ×)", minval=0.02, maxval=1.0, step=0.01, group=gQ, tooltip="MEASURE 1 — POOL QUALITY. A single swing high is a wiggle; TWO OR MORE highs at the same price is a POOL, because that is where stops actually stack. This is how close two highs must be to count as equal. The engine counts the touches and scores the level accordingly — a 3-touch pool is worth far more than a 1-touch pivot, and nothing in the original build measured this at all.")
qEqLook   = input.int(60, "  ◈ Equal-H/L lookback (bars)", minval=10, maxval=400, group=gQ)
qDispAtr  = input.float(1.00, "  ◈ Displacement: CISD body (ATR ×)", minval=0.0, maxval=5.0, step=0.05, group=gQ, tooltip="MEASURE 2 — DISPLACEMENT. ICT's change in state of delivery is supposed to arrive with FORCE. The original build only required a close through the level with a directional candle — a doji qualified. This scores the CISD candle's BODY against ATR. A body at or above this multiple is full marks.")
qPDmin    = input.float(0.50, "  ◈ Premium/discount edge required", minval=0.0, maxval=1.0, step=0.05, group=gQ, tooltip="MEASURE 3 — ARRAY CONTEXT. You sell in PREMIUM and buy in DISCOUNT. The dealing range is the recent swing high to swing low; 0.5 is the equilibrium. A short sweep firing in the LOWER half of the range is fighting the array and scores nothing here. 0.50 = must at least be on the correct side of equilibrium.")
qPDLook   = input.int(80, "  ◈ Dealing-range lookback (bars)", minval=20, maxval=400, group=gQ)
qSwpMax   = input.float(1.50, "  ◈ Max sweep penetration (ATR ×)", minval=0.2, maxval=10.0, step=0.1, group=gQ, tooltip="MEASURE 4 — SWEEP CLEANLINESS. A clean raid pokes through the pool and snaps back. A spear 3 ATR beyond it is not a sweep, it is a breakout that failed later — different animal, worse odds. Penetration beyond this multiple scores zero.")
qAppLen   = input.int(20, "  ◈ MEASURE 5 · Approach length (bars)", minval=5, maxval=100, group=gQ, tooltip="THE ONE THAT SEPARATES A RAID FROM A BREAK. Kaufman Efficiency Ratio over the bars leading INTO the sweep: |net travel| ÷ |total path|. Price that DRIFTED sideways and then wicked through a pool was raided — fade it. Price that arrived on a clean, one-way, efficient leg is a TREND ARRIVING, and the pool is fuel rather than a wall: the level breaks and keeps going. A high approach ER is the single best evidence that a sweep-reversal is about to be wrong.")
qAppTrend = input.float(0.55, "  ◈ Trend-arrival ER threshold", minval=0.1, maxval=1.0, step=0.05, group=gQ, tooltip="At or above this the approach is judged a TREND ARRIVAL rather than a raid. 0.55 is a genuinely directional leg; 0.25 is churn.")
qAppMode  = input.string("Downgrade only", "  ◈ On a trend arrival", options=["Downgrade only", "Skip the setup", "FLIP the direction"], group=gQ, tooltip="DOWNGRADE ONLY (default) — it just costs the setup its Measure-5 points and usually drops it out of A. SKIP — refuse it entirely. FLIP — take the OTHER side, on the thesis that the pool is about to break and run. Flip is the aggressive read and the one that would have turned both of the Architect's circled losers into winners; test it before believing it.")
qShowGrade= input.bool(true, "  ◈ Print grade on labels", group=gQ)

gT = "🎯 Trade Levels"
tradeMode = input.string("Structural RR", "TP/SL Mode", options=["Structural RR", "Fixed %"], group=gT, tooltip="Structural RR: stop beyond the sweep wick, target = RR multiple of that risk. Fixed %: TP and SL as a percent of entry.")
rrMult    = input.float(2.0,  "Risk : Reward (Structural)", minval=0.5, maxval=10.0, step=0.5, group=gT)
slBufAtr  = input.float(0.25, "Stop Buffer Past Wick (ATR ×)", minval=0.0, maxval=3.0, step=0.05, group=gT)
tpPct     = input.float(1.00, "Take Profit % (Fixed)", minval=0.05, step=0.05, group=gT)
slPct     = input.float(0.50, "Stop Loss % (Fixed)",   minval=0.05, step=0.05, group=gT)
showLevels  = input.bool(true, "Show TP/SL Boxes", group=gT)
pastBoxFade = input.int(92,    "Past Trade Box Fade %", group=gT, minval=80, maxval=99)

gR = "🛡️ Risk Management"
useCooldown = input.bool(true, "Cooldown Between Signals", group=gR)
cooldownBars= input.int(5,    "Cooldown Bars",   group=gR, minval=1, maxval=200)
maxBars     = input.int(60,   "Max Bars In Trade", group=gR, minval=3, maxval=500)
useEOD      = input.bool(false,"Flatten in EOD Window", group=gR)
eodHour     = input.int(16,   "EOD Start Hour (NY)", group=gR, minval=0, maxval=23)
eodMinute   = input.int(40,   "EOD Start Min (NY)",  group=gR, minval=0, maxval=59)
eodEndHour  = input.int(18,   "EOD End Hour (NY)",   group=gR, minval=0, maxval=23)
eodEndMin   = input.int(5,    "EOD End Min (NY)",    group=gR, minval=0, maxval=59)

gW = "🔗 Webhook"
enableWebhook = input.bool(false, "Enable Webhook Alerts", group=gW)
STRATEGY_ID   = input.string("sweep_cisd_fvg_v1", "Strategy ID", group=gW)
whQty         = input.float(1.0, "Quantity", group=gW, minval=0.01, step=0.01)

gS = "🎨 Visuals"
showLiq   = input.bool(true, "Liquidity Lines (glow)", group=gS)
showSweep = input.bool(true, "Sweep Zone + Marker",    group=gS)
showCisd  = input.bool(true, "CISD Level Line",        group=gS)
showFvg   = input.bool(true, "FVG Boxes",              group=gS)
showSig   = input.bool(true, "Entry / Exit Labels",    group=gS)
keepStruct= input.int(8,     "Past Setups To Keep",    group=gS, minval=2, maxval=20)
keepTrades= input.int(30,    "Past Trades To Keep",    group=gS, minval=1, maxval=60)

gD = "📊 Dashboard"
showDash  = input.bool(true, "Show Dashboard", group=gD)

color C_TEAL   = #00F5D4
color C_PURPLE = #AA00FF
color C_GOLD   = #FFD700
color C_BULL   = #00FF88
color C_BEAR   = #FF4466
color C_ORANGE = #FF8800
color C_INK    = #E8ECF2
color C_MUTED   = color.new(#AAAAAA, 40)
color C_HDR_BG  = color.new(#0d1f1e, 0)
color C_COL_BG  = color.new(#0a0a14, 10)
color C_COL_ALT = color.new(#0d1117, 30)
color C_STRIPE  = color.new(#00F5D4, 20)

f_instr() => na(syminfo.current_contract) ? syminfo.ticker : syminfo.current_contract

float atr  = ta.atr(14)
float atrS = atr > 0 ? atr : syminfo.mintick

string tzNY = "America/New_York"
int    nowMin   = hour(time, tzNY) * 60 + minute(time, tzNY)
int    eodStart = eodHour * 60 + eodMinute
int    eodEnd   = eodEndHour * 60 + eodEndMin
bool   inEODWin = eodStart <= eodEnd ? (nowMin >= eodStart and nowMin < eodEnd) : (nowMin >= eodStart or nowMin < eodEnd)
bool   isEOD    = useEOD and inEODWin

var array<float> rO = array.new<float>()
var array<float> rH = array.new<float>()
var array<float> rL = array.new<float>()
var array<float> rC = array.new<float>()
var array<int>   rB = array.new<int>()

var int   stage    = 0
var int   dir      = 0
var float liqHi    = na
var float liqLo    = na
var int   liqHiBar = na
var int   liqLoBar = na
var float sweepLvl = na
var float sweepExt = na
var int   sweepBar = na
var float cisdLvl  = na
var int   cisdBar  = na
var float fvgTop   = na
var float fvgBot   = na
var int   fvgBar   = na
var bool  fvgTouched = false

var float upRunOpen = na
var float dnRunOpen = na
var bool  bullStreak = false
var bool  bearStreak = false

var bool   g_inTrade  = false
var bool   g_isLong   = false
var float  g_entry    = na
var float  g_tp       = na
var float  g_sl       = na
var int    g_entryBar = na
var int    lastSigBar = na
var int    wins       = 0
var int    losses     = 0
var string lastExitTxt = "--"
bool cdOK    = not useCooldown or na(lastSigBar) or bar_index - lastSigBar >= cooldownBars
bool canFire = not g_inTrade and cdOK and not isEOD and barstate.isconfirmed

bool longSig  = false
bool shortSig = false
bool exitSig  = false
var bool  pendLong  = false
var bool  pendShort = false
var int   pendBar   = na
var float armSweepExt = na

var line  liqHiL1 = na
var line  liqHiL2 = na
var line  liqHiL3 = na
var label liqHiTag = na
var line  liqLoL1 = na
var line  liqLoL2 = na
var line  liqLoL3 = na
var label liqLoTag = na
var box   sweepBox = na
var label sweepTag = na
var line  cisdLine = na
var label cisdTag  = na
var box   fvgBox   = na
var line  fvgCe    = na
var label fvgTag   = na
var array<box>   oldBoxes = array.new<box>()
var array<line>  oldLines = array.new<line>()
var array<label> oldLbls  = array.new<label>()
var box   tpBox  = na
var box   slBox  = na
var label entLbl = na

var int   qPool  = 0
var float qDisp  = 0.0
var float qPen   = 0.0
var float qPD    = 0.5
var int   qScore = 0
var float qApp   = 0.0
var bool  qTrendArr = false
var int   qFlips = 0
var string qGrade = "C"

var label exLbl  = na
var array<box>   pastTrBoxes = array.new<box>()
var array<label> pastTrLbls  = array.new<label>()

f_glowDel(line a, line b, line c) =>
    line.delete(a)
    line.delete(b)
    line.delete(c)

f_fadeLine(line _l, color _c) =>
    if not na(_l)
        line.set_color(_l, color.new(_c, 88))
        oldLines.push(_l)

f_fadeLbl(label _x, color _c) =>
    if not na(_x)
        label.set_color(_x, color.new(_c, 95))
        label.set_textcolor(_x, color.new(_c, 70))
        oldLbls.push(_x)

f_fadeBox(box _b, color _c, int _tr) =>
    if not na(_b)
        box.set_bgcolor(_b, color.new(_c, _tr))
        box.set_border_color(_b, color.new(_c, math.min(99, _tr + 3)))
        oldBoxes.push(_b)

f_trimStruct() =>
    while oldBoxes.size() > keepStruct * 2
        box.delete(oldBoxes.shift())
    while oldLines.size() > keepStruct * 3
        line.delete(oldLines.shift())
    while oldLbls.size() > keepStruct * 4
        label.delete(oldLbls.shift())

if (pendLong or pendShort) and not na(pendBar) and bar_index > pendBar
    if not g_inTrade and not isEOD
        bool  isL = pendLong
        float e   = open
        float sl  = na
        float tp  = na
        if tradeMode == "Structural RR"
            sl := isL ? armSweepExt - atrS * slBufAtr : armSweepExt + atrS * slBufAtr
            float risk = math.max(syminfo.mintick, isL ? e - sl : sl - e)
            tp := isL ? e + rrMult * risk : e - rrMult * risk
        else
            tp := isL ? e + e * tpPct / 100.0 : e - e * tpPct / 100.0
            sl := isL ? e - e * slPct / 100.0 : e + e * slPct / 100.0
        if not na(tpBox)
            box.set_bgcolor(tpBox, color.new(C_TEAL, pastBoxFade))
            box.set_border_color(tpBox, color.new(C_TEAL, pastBoxFade))
            pastTrBoxes.push(tpBox)
        if not na(slBox)
            box.set_bgcolor(slBox, color.new(C_BEAR, pastBoxFade))
            box.set_border_color(slBox, color.new(C_BEAR, pastBoxFade))
            pastTrBoxes.push(slBox)
        if not na(entLbl)
            pastTrLbls.push(entLbl)
        if not na(exLbl)
            pastTrLbls.push(exLbl)
        tpBox  := na
        slBox  := na
        entLbl := na
        exLbl  := na
        while pastTrBoxes.size() > keepTrades * 2
            box.delete(pastTrBoxes.shift())
        while pastTrLbls.size() > keepTrades * 2
            label.delete(pastTrLbls.shift())
        g_inTrade  := true
        g_isLong   := isL
        g_entry    := e
        g_tp       := tp
        g_sl       := sl
        g_entryBar := bar_index
        lastSigBar := bar_index
        if showLevels
            tpBox := box.new(bar_index, math.max(e, tp), bar_index + maxBars, math.min(e, tp), border_color=color.new(C_TEAL, 22), bgcolor=color.new(C_TEAL, 87), border_width=2)
            slBox := box.new(bar_index, math.max(e, sl), bar_index + maxBars, math.min(e, sl), border_color=color.new(C_BEAR, 22), bgcolor=color.new(C_BEAR, 87), border_width=2)
        if showSig
            float slD = math.max(math.abs(e - sl), syminfo.mintick)
            float rr  = math.abs(tp - e) / slD
            string enTxt = (isL ? "▲ LONG  1:" : "▼ SHORT  1:") + str.tostring(rr, "#.##") + " RR" + (qShowGrade ? "   ◈ " + qGrade + " " + str.tostring(qScore) : "") + "\nTP " + str.tostring(tp, format.mintick) + "   IN " + str.tostring(e, format.mintick) + "   SL " + str.tostring(sl, format.mintick)
            entLbl := label.new(bar_index, isL ? low : high, enTxt, style=isL ? label.style_label_up : label.style_label_down, color=isL ? color.new(#003322, 20) : color.new(#330000, 20), textcolor=isL ? C_BULL : C_BEAR, size=size.small, text_font_family=font.family_monospace)
        if enableWebhook
            alert('{"strategy_id":"' + STRATEGY_ID + '","instrument":"' + f_instr() + '","action":"enter","side":"' + (isL ? "buy" : "sell") + '","entry":' + str.tostring(e, "#.##") + ',"stop":' + str.tostring(sl, "#.##") + ',"profit":' + str.tostring(tp, "#.##") + ',"instrument_multiplier":' + str.tostring(syminfo.pointvalue) + ',"quantity":' + str.tostring(whQty) + '}', alert.freq_once_per_bar)
    pendLong  := false
    pendShort := false
else if g_inTrade
    if not na(tpBox)
        box.set_right(tpBox, bar_index + 1)
    if not na(slBox)
        box.set_right(slBox, bar_index + 1)

float ph = ta.pivothigh(high, pLen, pLen)
float pl = ta.pivotlow(low, pLen, pLen)

if barstate.isconfirmed

    if close > open
        if not bullStreak
            upRunOpen := open
        bullStreak := true
        bearStreak := false
    else if close < open
        if not bearStreak
            dnRunOpen := open
        bearStreak := true
        bullStreak := false

    if not na(ph) and stage != 1 and stage != 2 and stage != 3
        liqHi    := ph
        liqHiBar := bar_index - pLen
        f_glowDel(liqHiL1, liqHiL2, liqHiL3)
        label.delete(liqHiTag)
        if showLiq
            liqHiL1 := line.new(liqHiBar, liqHi, bar_index, liqHi, color=color.new(C_GOLD, 88), width=6)
            liqHiL2 := line.new(liqHiBar, liqHi, bar_index, liqHi, color=color.new(C_GOLD, 68), width=3)
            liqHiL3 := line.new(liqHiBar, liqHi, bar_index, liqHi, color=color.new(C_GOLD, 10), width=1)
            liqHiTag := label.new(bar_index, liqHi, " ◆ BSL ", style=label.style_label_left, color=color.new(C_HDR_BG, 40), textcolor=C_GOLD, size=size.tiny, text_font_family=font.family_monospace)
    if not na(pl) and stage != 1 and stage != 2 and stage != 3
        liqLo    := pl
        liqLoBar := bar_index - pLen
        f_glowDel(liqLoL1, liqLoL2, liqLoL3)
        label.delete(liqLoTag)
        if showLiq
            liqLoL1 := line.new(liqLoBar, liqLo, bar_index, liqLo, color=color.new(C_TEAL, 88), width=6)
            liqLoL2 := line.new(liqLoBar, liqLo, bar_index, liqLo, color=color.new(C_TEAL, 68), width=3)
            liqLoL3 := line.new(liqLoBar, liqLo, bar_index, liqLo, color=color.new(C_TEAL, 10), width=1)
            liqLoTag := label.new(bar_index, liqLo, " ◆ SSL ", style=label.style_label_left, color=color.new(C_HDR_BG, 40), textcolor=C_TEAL, size=size.tiny, text_font_family=font.family_monospace)

    if not na(liqHi)
        if bar_index - liqHiBar > liqMaxAge
            f_glowDel(liqHiL1, liqHiL2, liqHiL3)
            label.delete(liqHiTag)
            liqHi := na
        else if showLiq and not na(liqHiL1)
            line.set_x2(liqHiL1, bar_index)
            line.set_x2(liqHiL2, bar_index)
            line.set_x2(liqHiL3, bar_index)
            label.set_x(liqHiTag, bar_index)
    if not na(liqLo)
        if bar_index - liqLoBar > liqMaxAge
            f_glowDel(liqLoL1, liqLoL2, liqLoL3)
            label.delete(liqLoTag)
            liqLo := na
        else if showLiq and not na(liqLoL1)
            line.set_x2(liqLoL1, bar_index)
            line.set_x2(liqLoL2, bar_index)
            line.set_x2(liqLoL3, bar_index)
            label.set_x(liqLoTag, bar_index)

f_touches(float lvl, bool isHigh, int look, float tol) =>
    int cnt = 0
    if not na(lvl) and tol > 0
        for i = 0 to look - 1
            float v = isHigh ? high[i] : low[i]
            if math.abs(v - lvl) <= tol
                cnt += 1
    cnt

float drHi = ta.highest(high, qPDLook)
float drLo = ta.lowest(low, qPDLook)
float drP

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

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

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

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

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

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

Стоимость полного кода
2 687,60₽ ≈ $32.85