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

Liquidity Side Bias Engine

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

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

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

О программе

Liquidity Side Bias Engine — это индикатор Pine Script v6 для TradingView, который анализирует ликвидность на покупательской и продавательской сторонах. Он определяет ближайшие нетронутые ликвидностные пулы (равневые максимумы и минимумы, свинг-точки, пулы предыдущего периода) и рассчитывает, с какой стороны вероятнее ближайший откат цены.

Индикатор собирает свинг-хаи и свинг-лоу в качестве кандидатов в ликвидностные пулы, оценивая каждую сторону по четырём факторам: близость пула к текущей цене, сила кластера, свежесть формирования и контекст тренда. Результат — числовой баланс 0–100 для каждой стороны и определение доминирующей.

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

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

НастройкаОписание
pivotLen Сила свинга для определения свинг-хаев и свинг-лоу, которые становятся ликвидностными пулами. Более высокие значения оставляют только более значимые свинги.
poolMemory Количество последних свинг-хаев и свинг-лоу, сохраняемых в качестве кандидатов в ликвидностные пулы. Более старые пулы удаляются первыми.
eqTol Допуск в единицах ATR для объединения близких свинговых уровней в кластеры равневых максимумов или минимумов.
usePrior Включает или отключает использование свинг-точек предыдущего периода более высокого таймфрейма в качестве ликвидностных пулов. На внутридневных графиках используется предыдущий день, на дневных — неделя, на старших — месяц.
atrLen Период индикатора ATR, используемый для нормализации расстояний до пулов, допусков и визуальных смещений.
trendLen Период EMA, используемой для определения направления тренда. Сторона, совпадающая с преобладающим направлением, получает больший вес в расчёте.
slopeBars Количество баров для оценки направления наклона EMA тренда — используется для определения контекста направления.
rangeLen Период для построения диапазона премиум/дисконт. Цена в зоне дисконта усиливает покупательскую сторону, в зоне премиум — продавательскую.
maxDist Максимальное расстояние до ликвидностного пула в единицах ATR, при превышении которого пул считается слишком далёким для активного краткосрочного отката.
freshWin Окно в барах для оценки свежести ликвидностных пулов — более свежие пулы получают больший вес в расчёте перевеса стороны.
minBiasScore Минимальный баланс стороны 0–100, при котором сторона считается активным перевесом для отображения и уведомлений.
balanceTol Допустимая разница в балансе между покупательской и продавательской стороной, при которой стороны считаются сбалансированными вместо явного перевеса.
showSides Включает или отключает отображение линий обеих сторон. Доминирующая сторона отображается сплошной линией, противоположная — пунктирной.
showBadge Включает или отключает центральный бейдж с названием доминирующей стороны и числовым балансом 0–100.
showTarget Включает или отключает отображение целевого тега на доминирующей стороне у правого края графика.
showPools Включает или отключает отображение фоновых линий других нетронутых ликвидностных пулов на каждой стороне.
maxPools Максимальное количество дополнительных фоновых линий ликвидностных пулов, отображаемых на каждой стороне.
projectionBars Количество баров вправо, на которые продлеваются линии сторон и бейдж перевеса.
tagOffsetBars Горизонтальное смещение целевого тега за пределы проекции, добавляемое у правого края графика.
showLabels Включает или отключает отображение событийных меток при смене доминирующей стороны или при забранной ликвидности.
labelCooldown Минимальное количество баров между событийными метками, чтобы график оставался читаемым.
maxVisibleLabels Максимальное количество событийных меток, сохраняемых на графике одновременно.
labelOffsetAtr Вертикальное смещение событийных меток в единицах ATR, чтобы они не перекрывали свечи.
labelSizeInput Размер шрифта для всех меток на графике и бейджа. Доступны варианты: Tiny, Small, Normal, Large.
showPanel Включает или отключает информационную панель AG Pro с данными о состоянии и балансе.
panelLocationInput Позиция информационной панели на графике. Доступны варианты: Top Left, Top Center, Top Right, Middle Left, Middle Center, Middle Right, Bottom Left, Bottom Center, Bottom Right.
panelThemeInput Тема информационной панели. Доступны варианты: Dark (тёмная) и Light (светлая).
panelFontSizeInput Размер шрифта в информационной панели. Доступны варианты: Tiny, Small, Normal, Large.
alertLean Включает или отключает условные уведомления при смене доминирующей стороны (покупательская или продавательская ликвидность становится активной).
alertTaken Включает или отключает условные уведомления, когда ликвидность на одной из сторон была забрана ценой.
Получить полный код

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

indicator("Liquidity Side Bias Engine",
     shorttitle       = "LSB",
     overlay          = true,
     max_labels_count = 200,
     max_lines_count  = 100,
     max_boxes_count  = 30)

headerBg      = color.rgb(37, 99, 235)
headerText    = color.rgb(245, 247, 250)
panelBg       = color.rgb(15, 23, 42)
panelBorder   = color.rgb(51, 65, 85)
panelLabelCol = color.rgb(148, 163, 184)
panelValueCol = color.rgb(226, 232, 240)
bullColor     = color.rgb(34, 197, 166)
bearColor     = color.rgb(244, 114, 182)
neutralColor  = color.rgb(245, 189, 92)
accentColor   = color.rgb(129, 140, 248)

ttPivot = "Swing strength used to detect the highs and lows that become liquidity pools. Higher values keep only stronger, more meaningful swings."
ttPoolMemory = "How many recent swing highs and swing lows are retained as candidate liquidity pools. Older pools are dropped first."
ttEqTol = "ATR-based tolerance used to group nearby swing levels into an equal-highs or equal-lows liquidity cluster. Higher values merge levels more loosely."
ttUsePrior = "Includes the prior higher-timeframe high and low as significant liquidity pools. The period adapts to the chart: prior day on intraday charts, prior week on daily charts, and prior month on higher timeframes."
ttAtrLen = "ATR length used to normalize draw distance, pool tolerance, label offsets, and visual spacing."
ttTrendLen = "EMA backbone used to read directional context. The side aligned with the prevailing direction is weighted as a more likely draw."
ttSlopeBars = "Bars used to measure whether the trend backbone is rising or falling for the directional context score."
ttRangeLen = "Lookback used to build the premium-discount dealing range. Price in discount weights buy-side draw; price in premium weights sell-side draw."
ttMaxDist = "Distance in ATR beyond which a liquidity pool is treated as too far to act as an active near-term draw on that side."
ttFreshWin = "Window in bars used to fade older pools. More recently formed pools contribute a stronger side lean."
ttMinBias = "Minimum 0-100 side lean required before a side is treated as an active bias for alerts and emphasis."
ttBalanceTol = "Lean gap below which buy-side and sell-side are treated as balanced two-sided liquidity instead of one leaning side."
ttShowSides = "Shows both nearest liquidity side lines. The leaning side is drawn solid and emphasized; the opposite side is drawn faint as the flip reference."
ttShowBadge = "Shows the centered side-bias badge with the leaning side and its 0-100 lean score."
ttShowTarget = "Shows the primary draw target tag on the leaning side at the right edge."
ttShowPools = "Shows faint reference lines for the other untapped liquidity pools on each side, as a light liquidity map."
ttMaxPools = "Maximum number of additional faint pool reference lines drawn per side."
ttProjection = "How far the side lines and bias badge extend to the right."
ttTagOffset = "Horizontal offset added beyond the projection for the right-edge target tag."
ttShowLabels = "Shows compact labels when the side lean flips or when a liquidity side is taken. Labels are offset away from candles."
ttLabelCooldown = "Minimum bars between event labels so the chart stays readable and premium."
ttMaxLabels = "Maximum number of recent event labels retained on the chart."
ttLabelOffset = "ATR-based vertical offset that keeps labels clear of candles."
ttLabelSize = "Font size for all on-chart labels and the bias badge. Normal is the recommended publication default."
ttShowPanel = "Shows or hides the AG Pro planning panel. It is shown by default for public-release readability."
ttPanelLocation = "Moves the AG Pro panel to the preferred chart location."
ttPanelTheme = "Switches the panel between AG Pro dark and clean light themes."
ttPanelFont = "Font size for the AG Pro panel. Normal is the recommended publication default."
ttAlerts = "Enables alert conditions for buy-side lean, sell-side lean, and liquidity-side-taken events."

gEngine = "Bias Engine"
pivotLen = input.int(8, "Swing Strength", minval = 2, maxval = 50, group = gEngine, tooltip = ttPivot)
poolMemory = input.int(20, "Pool Memory", minval = 6, maxval = 60, group = gEngine, tooltip = ttPoolMemory)
eqTol = input.float(0.45, "Equal Level Tolerance ATR", minval = 0.05, maxval = 2.00, step = 0.05, group = gEngine, tooltip = ttEqTol)
usePrior = input.bool(true, "Use Prior-Period Pools", group = gEngine, tooltip = ttUsePrior)
atrLen = input.int(14, "ATR Length", minval = 5, maxval = 100, group = gEngine, tooltip = ttAtrLen)
trendLen = input.int(55, "Trend Backbone EMA", minval = 5, maxval = 300, group = gEngine, tooltip = ttTrendLen)
slopeBars = input.int(5, "Trend Slope Bars", minval = 1, maxval = 30, group = gEngine, tooltip = ttSlopeBars)
rangeLen = input.int(60, "Premium-Discount Range", minval = 10, maxval = 400, group = gEngine, tooltip = ttRangeLen)

gScore = "Bias Scoring"
maxDist = input.float(10.0, "Max Draw Distance ATR", minval = 2.0, maxval = 30.0, step = 0.5, group = gScore, tooltip = ttMaxDist)
freshWin = input.int(120, "Pool Freshness Window", minval = 20, maxval = 500, group = gScore, tooltip = ttFreshWin)
minBiasScore = input.int(58, "Active Bias Score", minval = 30, maxval = 95, group = gScore, tooltip = ttMinBias)
balanceTol = input.int(8, "Balanced Gap", minval = 1, maxval = 30, group = gScore, tooltip = ttBalanceTol)

gVisual = "Chart Visuals"
showSides = input.bool(true, "Show Side Lines", group = gVisual, tooltip = ttShowSides)
showBadge = input.bool(true, "Show Bias Badge", group = gVisual, tooltip = ttShowBadge)
showTarget = input.bool(true, "Show Target Tag", group = gVisual, tooltip = ttShowTarget)
showPools = input.bool(true, "Show Other Liquidity Pools", group = gVisual, tooltip = ttShowPools)
maxPools = input.int(2, "Pools Per Side", minval = 1, maxval = 5, group = gVisual, tooltip = ttMaxPools)
projectionBars = input.int(28, "Projection Bars", minval = 6, maxval = 120, group = gVisual, tooltip = ttProjection)
tagOffsetBars = input.int(3, "Target Tag Offset Bars", minval = 1, maxval = 30, group = gVisual, tooltip = ttTagOffset)

gLabels = "Labels"
showLabels = input.bool(true, "Show Event Labels", group = gLabels, tooltip = ttShowLabels)
labelCooldown = input.int(20, "Label Cooldown Bars", minval = 1, maxval = 80, group = gLabels, tooltip = ttLabelCooldown)
maxVisibleLabels = input.int(5, "Max Visible Labels", minval = 3, maxval = 40, group = gLabels, tooltip = ttMaxLabels)
labelOffsetAtr = input.float(0.3, "Label Offset ATR", minval = 0.0, maxval = 3.00, step = 0.05, group = gLabels, tooltip = ttLabelOffset)
labelSizeInput = input.string("Normal", "Label Font Size", options = ["Tiny", "Small", "Normal", "Large"], group = gLabels, tooltip = ttLabelSize)

gPanel = "Panel"
showPanel = input.bool(true, "Show Panel", group = gPanel, tooltip = ttShowPanel)
panelLocationInput = input.string("Top Right", "Panel Location", options = ["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"], group = gPanel, tooltip = ttPanelLocation)
panelThemeInput = input.string("Dark", "Panel Theme", options = ["Dark", "Light"], group = gPanel, tooltip = ttPanelTheme)
panelFontSizeInput = input.string("Normal", "Panel Font Size", options = ["Tiny", "Small", "Normal", "Large"], group = gPanel, tooltip = ttPanelFont)

gAlerts = "Alerts"
alertLean = input.bool(true, "Alert on Side Lean", group = gAlerts, tooltip = ttAlerts)
alertTaken = input.bool(true, "Alert on Side Taken", group = gAlerts, tooltip = ttAlerts)

f_clamp(float value, float minValue, float maxValue) =>
    math.min(math.max(value, minValue), maxValue)

f_label_size(string sizeText) =>
    switch sizeText
        "Tiny" => size.tiny
        "Small" => size.small
        "Large" => size.large
        => size.normal

f_panel_position(string posText) =>
    switch posText
        "Top Left" => position.top_left
        "Top Center" => position.top_center
        "Middle Left" => position.middle_left
        "Middle Center" => position.middle_center
        "Middle Right" => position.middle_right
        "Bottom Left" => position.bottom_left
        "Bottom Center" => position.bottom_center
        "Bottom Right" => position.bottom_right
        => position.top_right

f_panel_bg(string theme, bool alt) =>
    theme == "Light" ? (alt ? color.rgb(226, 232, 240) : color.rgb(241, 245, 249)) : (alt ? color.rgb(20, 31, 52) : panelBg)

f_panel_border(string theme) =>
    theme == "Light" ? color.rgb(148, 163, 184) : panelBorder

f_panel_label(string theme) =>
    theme == "Light" ? color.rgb(71, 85, 105) : panelLabelCol

f_panel_value(string theme) =>
    theme == "Light" ? color.rgb(15, 23, 42) : panelValueCol

f_text_on(color bgColor) =>
    bright = (color.r(bgColor) * 299 + color.g(bgColor) * 587 + color.b(bgColor) * 114) / 1000
    bright >= 145 ? color.rgb(15, 23, 42) : color.rgb(248, 250, 252)

f_price_text(float value) =>
    na(value) ? "-" : str.tostring(value, format.mintick)

f_panel_row(table target, int row, string leftText, string rightText, color rightColor, string theme, string fontSize) =>
    rowBg = f_panel_bg(theme, row % 2 == 0)
    table.cell(target, 0, row, leftText, text_color = f_panel_label(theme), bgcolor = rowBg, text_size = f_label_size(fontSize))
    table.cell(target, 1, row, rightText, text_color = rightColor, bgcolor = rowBg, text_size = f_label_size(fontSize), text_halign = text.align_right)

f_keep_label(array<label> labelArray, label labelId, int maxCount) =>
    array.push(labelArray, labelId)
    while array.size(labelArray) > maxCount
        oldLabel = array.shift(labelArray)
        label.delete(oldLabel)

labelSize = f_label_size(labelSizeInput)
atr = math.max(nz(ta.atr(atrLen), ta.tr(true)), syminfo.mintick)
trendEma = ta.ema(close, trendLen)
trendSlope = trendEma - nz(trendEma[slopeBars], trendEma)
trendUp = close > trendEma and trendSlope > 0.0
trendDown = close < trendEma and trendSlope < 0.0
rangeLow = ta.lowest(low, rangeLen)
rangeHigh = ta.highest(high, rangeLen)
freshLow = ta.lowest(low, freshWin)
freshHigh = ta.highest(high, freshWin)
rangeSpan = math.max(rangeHigh - rangeLow, atr)
rangePos = f_clamp((close - rangeLow) / rangeSpan, 0.0, 1.0)

priorTF = timeframe.isintraday ? "D" : timeframe.isdaily ? "W" : "M"
priorName = timeframe.isintraday ? "Day" : timeframe.isdaily ? "Week" : "Month"
priorHigh = usePrior ? request.security(syminfo.tickerid, priorTF, high[1], lookahead = barmerge.lookahead_on) : na
priorLow = usePrior ? request.security(syminfo.tickerid, priorTF, low[1], lookahead = barmerge.lookahead_on) : na

var array<float> swingHighPrice = array.new_float()
var array<int> swingHighBar = array.new_int()
var array<bool> swingHighTaken = array.new_bool()
var array<float> swingLowPrice = array.new_float()
var array<int> swingLowBar = array.new_int()
var array<bool> swingLowTaken = array.new_bool()

pivHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivLow = ta.pivotlow(low, pivotLen, pivotLen)

if not na(pivHigh)
    array.push(swingHighPrice, pivHigh)
    array.push(swingHighBar, bar_index - pivotLen)
    array.push(swingHighTaken, false)
    if array.size(swingHighPrice) > poolMemory
        array.shift(swingHighPrice)
        array.shift(swingHighBar)
        array.shift(swingHighTaken)

if not na(pivLow)
    array.push(swingLowPrice, pivLow)
    array.push(swingLowBar, bar_index - pivotLen)
    array.push(swingLowTaken, false)
    if array.size(swingLowPrice) > poolMemory
        array.shift(swingLowPrice)
        array.shift(swingLowBar)
        array.shift(swingLowTaken)

takenBuy = false
takenSell = false
if array.size(swingHighPrice) > 0
    for i = 0 to array.size(swingHighPrice) - 1
        if not array.get(swingHighTaken, i) and high > array.get(swingHighPrice, i)
            array.set(swingHighTaken, i, true)
            takenBuy := true
if array.size(swingLowPrice) > 0
    for i = 0 to array.size(swingLowPrice) - 1
        if not array.get(swingLowTaken, i) and low < array.get(swingLowPrice, i)
            array.set(swingLowTaken, i, true)
            takenSell := true

float buyPoolPrice = na
int buyPoolBar = na
if array.size(swingHighPrice) > 0
    for i = 0 to array.size(swingHighPrice) - 1
        if not array.get(swingHighTaken, i) and array.get(swingHighPrice, i) > close
            if na(buyPoolPrice) or array.get(swingHighPrice, i) < buyPoolPrice
                buyPoolPrice := array.get(swingHighPrice, i)
                buyPoolBar := array.get(swingHighBar, i)

bool buyIsPrior = false
if not na(priorHigh) and priorHigh > close
    if na(buyPoolPrice) or priorHigh < buyPoolPrice
        buyPoolPrice := priorHigh
        buyPoolBar := na
        buyIsPrior := true

float sellPoolPrice = na
int sellPoolBar = na
if array.size(swingLowPrice) > 0
    for i = 0 to array.size(swingLowPrice) - 1
        if not array.get(swingLowTaken, i) and array.get(swingLowPrice, i) < close
            if na(sellPoolPrice) or array.get(swingLowPrice, i) > sellPoolPrice
                sellPoolPrice := array.get(swingLowPrice, i)
                sellPoolBar := array.get(swingLowBar, i)

bool sellIsPrior = false
if not na(priorLow) and priorLow < close
    if na(sellPoolPrice) or priorLow > sellPoolPrice
        sellPoolPrice := priorLow
        sellPoolBar := na
        sellIsPrior := true

int buyTouches = 0
if not na(buyPoolPrice) and array.size(swingHighPrice) > 0
    for i = 0 to array.size(swingHighPrice) - 1
        if not a

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

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

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

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

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

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

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