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

Liquidity Sweep Sequence

indicator liquidity sweep sequence for tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Индикатор Liquidity Sweep Sequence предназначен для обнаружения и визуализации последовательностей захватов ликвидности на графике цены в TradingView. Он определяет свинг-хаи и свинг-лоу с помощью встроенных функций Pine Script, а затем отслеживает ситуации, когда цена пробивает уровень свинга, но закрывается обратно в его диапазон — такие события помечаются как захваты ликвидности.

Индикатор поддерживает подсчёт последовательных захватов одной стороны рынка, отображает их числовыми метками на графике и рисует пунктирные линии захваченных уровней. Доступны фильтры значимости, подтверждения на следующей свече, фильтр глубины возврата через ATR, охлаждение между сигналами одной стороны и фильтр тренда на основе скользящей средней.

Пользователь может настраивать внешний вид меток, линий и их прозрачность, выбирать отображение бычьих или медвежьих захватов, показывать нетронутые уровни ликвидности, а также задавать условия оповещений TradingView для ключевых событий — второго захвата в последовательности и значимых захватов.

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

НастройкаОписание
pivLen Чувствительность свинга (бары с каждой стороны) — Количество баров с каждой стороны для определения свинг-хаев и свинг-лоу.
wickRatio Минимальная доля тени (%) — Минимальная доля тени свечи от её полного диапазона, необходимая для признания захвата.
maxAge Срок жизни уровня (бары) — Максимальное количество баров жизни уровня свинга, после которого уровень удаляется из отслеживания.
showBuy Показать захваты со стороны продаж (бычьи) — Включает отображение захватов ликвидности со стороны продаж (бычьи захваты).
showSell Показать захваты со стороны покупок (медвежьи) — Включает отображение захватов ликвидности со стороны покупок (медвежьи захваты).
seqWindow Максимальный интервал между захватами (бары) — Максимальный интервал в барах между захватами, при превышении которого последовательность считается прерванной.
requireDeeper Требовать более глубокий минимум / максимум — При включении второй захват в последовательности должен пробить более низкий минимум (или более высокий максимум), чем первый.
resetOnOpp Сбросить счётчик при противоположном захвате — При включении счётчик последовательности сбрасывается при захвате противоположной стороны рынка.
onlyShowSeq2 Показывать только 2-й захват и далее — При включении скрывает первый захват в последовательности и показывает только второй и последующие.
seq2Size Размер метки 2-го и последующих захватов — Размер меток для второго и последующих захватов в последовательности.
onlyMajor Показывать только значимые захваты — Включает отображение только значимых захватов, фильтруя незначительные внутри диапазонов.
majorLen Период значимого захвата (бары) — Период, в пределах которого свеча должна быть экстремальной, чтобы захват считался значимым.
useConsume Инвалидировать уровни при закрытии за ними — При включении уровень ликвидности удаляется после того, как цена закрывается за его пределами.
useExtreme Свеча захвата должна быть локальным экстремумом — При включении свеча захвата должна быть локальным экстремумом, иначе сигнал не генерируется.
extLen Период локального экстремума (бары) — Период поиска локального экстремума для проверки, является ли свеча захватывающим баром.
useConfirm Подтверждение на следующей свече — При включении требуется подтверждение захвата закрытием следующей свечи в направлении разворота.
useDepth Фильтр минимального возврата — При включении требуется минимальный размер возврата уровня для подтверждения захвата.
depthATR Минимальный возврат (кратное ATR) — Минимальный размер возврата уровня в кратных значениях ATR, необходимый для подтверждения захвата.
cooldown Охлаждение одной стороны (бары) — Минимальное количество баров между сигналами захватов одной стороны рынка.
useTrend Фильтр тренда (только совпадающие с трендом) — При включении бычьи захваты показываются только при цене выше скользящей средней, медвежьи — только ниже.
trendLen Длина скользящей средней тренда — Период экспоненциальной скользящей средней, используемой как фильтр тренда.
labTxtB Текст метки бычьего захвата — Текст, отображаемый в метках бычьих захватов ликвидности.
labTxtS Текст метки медвежьего захвата — Текст, отображаемый в метках медвежьих захватов ликвидности.
majSize Размер метки первого захвата — Размер меток для первого (основного) захвата в последовательности.
showLine Показать линию захваченного уровня — Включает отображение пунктирных линий захваченных уровней на графике.
lineExt Продление линии вправо (бары) — Количество баров, на которое продлеваются вправо линии захваченных уровней.
showLive Показать нетронутые уровни ликвидности — При включении рисует пунктирные линии текущих нетронутых уровней свингов для визуализации структуры.
showMA Показать скользящую среднюю тренда — Включает отображение скользящей средней тренда на графике.
atrLen Длина ATR — Период расчёта индикатора средней истинной амплитуды (ATR), используемого для фильтра глубины возврата и смещения меток.
offMult Смещение метки (кратное ATR) — Смещение меток от уровня захвата в кратных значениях ATR.
cBuy Цвет бычьего захвата — Цвет меток и линий для бычьих захватов ликвидности (захваты со стороны продаж).
cSell Цвет медвежьего захвата — Цвет меток и линий для медвежьих захватов ликвидности (захваты со стороны покупок).
lineTr Прозрачность линии захваченного уровня — Прозрачность линий захваченных уровней.
liveTr Прозрачность нетронутого уровня — Прозрачность пунктирных линий нетронутых уровней ликвидности.
minTr Прозрачность незначительного захвата — Прозрачность меток незначительных захватов ликвидности.
Получить полный код

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

indicator("Liquidity Sweep Sequence", shorttitle="LiqSweep", overlay=true, max_labels_count=500, max_lines_count=500)

gDet     = "Detection"
pivLen   = input.int(8,    "Swing sensitivity (bars each side)", minval=2, group=gDet, tooltip="Higher = only more prominent swing highs/lows are tracked. 5-10 is typical.")
wickRatio= input.float(55, "Minimum wick ratio (%)", minval=0, maxval=100, step=5, group=gDet, tooltip="The wick must be at least this share of the candle's full range. Higher = only long-wick rejections qualify.")
maxAge   = input.int(300,  "Level lifespan (bars)", minval=10, group=gDet, tooltip="Levels older than this stop being tracked.")
showBuy  = input.bool(true, "Show sell-side sweeps (bullish)", group=gDet)
showSell = input.bool(true, "Show buy-side sweeps (bearish)", group=gDet)

gSeq         = "Sequence count"
seqWindow    = input.int(50,   "Max gap between sweeps (bars)", minval=3, group=gSeq, tooltip="Two same-side sweeps further apart than this are treated as unrelated and the count restarts.")
requireDeeper= input.bool(true, "Require deeper low / higher high", group=gSeq, tooltip="ON: the second sweep must take out a lower low (or higher high) than the first to continue the sequence. OFF: any same-side sweep increments the count.")
resetOnOpp   = input.bool(true, "Reset count on opposite sweep", group=gSeq)
onlyShowSeq2 = input.bool(false,"Show 2nd sweep and beyond only", group=gSeq, tooltip="Hides first-in-sequence sweeps so only continuation sweeps remain on the chart.")
seq2Size     = input.string("normal","Label size for 2nd+", options=["small","normal","large"], group=gSeq)

gTier     = "Significance"
onlyMajor = input.bool(true, "Show major sweeps only", group=gTier, tooltip="Filters out minor sweeps that occur inside ranges.")
majorLen  = input.int(60,    "Major sweep: extreme of last N bars", minval=20, group=gTier, tooltip="The sweeping wick must be the lowest low / highest high of the last N bars. Daily: 60-120. 15m: 40-60.")

gStruct   = "Structure filters"
useConsume= input.bool(true, "Invalidate levels once closed through", group=gStruct, tooltip="A close above a swing high (or below a swing low) means that liquidity has already been taken. The level is dropped and can no longer produce a sweep signal.")
useExtreme= input.bool(true, "Sweep bar must be a local extreme", group=gStruct, tooltip="The wick must genuinely make a new local low/high, otherwise no stops were actually triggered.")
extLen    = input.int(10,    "Local extreme lookback (bars)", minval=3, group=gStruct)

gFil      = "Quality filters"
useConfirm= input.bool(true,  "Next-bar confirmation", group=gFil, tooltip="Requires the following bar to close in the reversal direction. Costs one bar of delay but removes most failed signals.")
useDepth  = input.bool(true,  "Minimum reclaim filter", group=gFil)
depthATR  = input.float(0.15, "   Minimum reclaim (ATR multiple)", minval=0, step=0.05, group=gFil, tooltip="The close must reclaim the level by at least this much, not just barely.")
cooldown  = input.int(10,     "Same-side cooldown (bars)", minval=0, group=gFil)
useTrend  = input.bool(false, "Trend filter (with-trend only)", group=gFil, tooltip="Above the MA only bullish sweeps are shown, below it only bearish ones.")
trendLen  = input.int(100,    "   Trend MA length", minval=10, group=gFil)

gStyle   = "Style"
labTxtB  = input.string("SWEEP", "Bullish label text", group=gStyle)
labTxtS  = input.string("SWEEP", "Bearish label text", group=gStyle)
majSize  = input.string("small", "Label size for 1st", options=["tiny","small","normal"], group=gStyle)
showLine = input.bool(true, "Show swept level line", group=gStyle)
lineExt  = input.int(12,    "   Extend right (bars)", minval=0, group=gStyle)
showLive = input.bool(false,"Show untouched liquidity levels", group=gStyle, tooltip="Draws the swing levels currently being tracked, so you can verify the structure logic yourself.")
showMA   = input.bool(false,"Show trend MA", group=gStyle)
atrLen   = input.int(14,    "ATR length", minval=1, group=gStyle)
offMult  = input.float(0.4, "Label offset (ATR multiple)", step=0.05, group=gStyle)

gCol   = "Colors"
cBuy   = input.color(#00E676, "Bullish sweep", group=gCol)
cSell  = input.color(#FF1744, "Bearish sweep", group=gCol)
lineTr = input.int(45, "Swept level transparency", minval=0, maxval=100, group=gCol)
liveTr = input.int(72, "Untouched level transparency", minval=0, maxval=100, group=gCol)
minTr  = input.int(45, "Minor sweep transparency", minval=0, maxval=100, group=gCol)

atrVal  = ta.atr(atrLen)
trendMA = ta.ema(close, trendLen)
plot(showMA ? trendMA : na, "Trend MA", color=color.new(color.gray, 40), linewidth=1)

f_size(s) =>
    switch s
        "tiny"   => size.tiny
        "small"  => size.small
        "normal" => size.normal
        "large"  => size.large
        => size.small
mkSize  = f_size(majSize)
seqSize = f_size(seq2Size)

f_sup(n) =>
    switch n
        2 => "²"
        3 => "³"
        4 => "⁴"
        5 => "⁵"
        6 => "⁶"
        7 => "⁷"
        8 => "⁸"
        9 => "⁹"
        => str.tostring(n)

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

var float[] hiPrice = array.new<float>()
var int[]   hiBar   = array.new<int>()
var float[] loPrice = array.new<float>()
var int[]   loBar   = array.new<int>()

if not na(ph)
    array.push(hiPrice, ph)
    array.push(hiBar,   bar_index - pivLen)
if not na(pl)
    array.push(loPrice, pl)
    array.push(loBar,   bar_index - pivLen)

f_prune(_price, _bar) =>
    if array.size(_bar) > 0
        for i = array.size(_bar) - 1 to 0
            if bar_index - array.get(_bar, i) > maxAge
                array.remove(_price, i)
                array.remove(_bar,   i)
f_prune(hiPrice, hiBar)
f_prune(loPrice, loBar)

rng      = high - low
lowWick  = math.min(open, close) - low
highWick = high - math.max(open, close)
lowWickOK  = rng > 0 and (lowWick  / rng) * 100 >= wickRatio
highWickOK = rng > 0 and (highWick / rng) * 100 >= wickRatio
atLowExtreme  = not useExtreme or low  <= ta.lowest(low,   extLen)
atHighExtreme = not useExtreme or high >= ta.highest(high, extLen)
isMajorLow    = low  <= ta.lowest(low,   majorLen)
isMajorHigh   = high >= ta.highest(high, majorLen)
trendOkBuy    = not useTrend or close > trendMA
trendOkSell   = not useTrend or close < trendMA

f_checkLow() =>
    float hit = na
    if array.size(loPrice) > 0
        for i = array.size(loPrice) - 1 to 0
            lvl = array.get(loPrice, i)
            depthOK = not useDepth or (close - lvl) >= atrVal * depthATR
            if low < lvl and close > lvl and depthOK
                hit := na(hit) ? lvl : math.max(hit, lvl)
                array.remove(loPrice, i)
                array.remove(loBar,   i)
    hit

f_checkHigh() =>
    float hit = na
    if array.size(hiPrice) > 0
        for i = array.size(hiPrice) - 1 to 0
            lvl = array.get(hiPrice, i)
            depthOK = not useDepth or (lvl - close) >= atrVal * depthATR
            if high > lvl and close < lvl and depthOK
                hit := na(hit) ? lvl : math.min(hit, lvl)
                array.remove(hiPrice, i)
                array.remove(hiBar,   i)
    hit

f_consume() =>
    if array.size(hiPrice) > 0
        for i = array.size(hiPrice) - 1 to 0
            if close > array.get(hiPrice, i)
                array.remove(hiPrice, i)
                array.remove(hiBar,   i)
    if array.size(loPrice) > 0
        for i = array.size(loPrice) - 1 to 0
            if close < array.get(loPrice, i)
                array.remove(loPrice, i)
                array.remove(loBar,   i)

f_drawBuy(_lvl, _back, _maj, _seq) =>
    y    = low[_back] - atrVal[_back] * offMult
    col  = _maj ? cBuy : color.new(cBuy, minTr)
    isS2 = _seq >= 2
    txt  = labTxtB + (isS2 ? f_sup(_seq) : "")
    sz   = isS2 ? seqSize : mkSize
    if _maj or isS2
        label.new(

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

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

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

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

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

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

Стоимость полного кода
1 142,50₽ ≈ $13.96