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