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