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