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

Adaptive Liquidity Reclaim Map [PhenLabs]

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

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

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

О программе

Индикатор «Adaptive Liquidity Reclaim Map» анализирует график в TradingView, выявляя зоны ликвидности на основе ключевых опорных точек цены (пифов). Он отображает эти зоны в виде графических блоков и линий, помогая визуально отслеживать области, где цена ранее разворачивалась. Индикатор использует адаптивную оценку качества сигналов, основанную на волатильности (ATR) и согласованности с более высоким таймфреймом (EMA-смещение), чтобы оценивать силу потенциального возврата к ликвидности. Результаты представлены через маркеры сигналов, блоки риск/прибыли с проекцией и информационную панель с текущими параметрами рынка. Все расчёты выполняются средствами Pine Script v6 на данных текущего и выбранного старшего таймфрейма.

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

НастройкаОписание
leftBars Количество баров слева от точки, необходимых для подтверждения пивота (опорного экстремума).
rightBars Количество баров справа от точки, необходимых для подтверждения пивота (опорного экстремума).
atrLen Период расчёта ATR (среднего истинного диапазона), используемый как базовая мера волатильности для нормализации параметров индикатора.
volLookback Период усреднения ATR для формирования базовой линии волатильности, используемой при адаптивной оценке импульса.
baseImpulse Минимальное относительное тело свечи в долях ATR, служащее порогом для адаптивной оценки силы импульса.
zoneWidthAtr Ширина зоны ликвидности в долях ATR, определяющая размер графического блока вокруг опорного уровня.
useHtfGate Включает или отключает обязательное совпадение сигнала с направлением старшего таймфрейма перед его отображением.
htfTimeframe Выбранный старший таймфрейм, данные которого используются для фильтрации и подтверждения сигналов.
htfEmaLen Период EMA (экспоненциальной скользящей средней), рассчитываемой на старшем таймфрейме для определения направления рыночного контекста.
rrPrimary Первое целевое соотношение риск/прибыль (в R), рассчитываемое от точки входа до экстремума свечи.
rrRunner Второе (дополнительное) целевое соотношение риск/прибыль (в R), рассчитываемое от точки входа до экстремума свечи.
projectionBars Количество баров вправо от сигнальной свечи, на котором отрисовываются блоки риска и прибыли.
showLiquidityZones Включает или отключает отображение графических блоков зон ликвидности на графике.
showZoneCenter Включает или отключает отображение пунктирных линий центра зон ликвидности.
showSignals Включает или отключает графические маркеры (ромбы) на графике, обозначающие сигналы reclaim.
showCallouts Включает или отключает текстовые выноски с оценкой качества текущего сигнала.
showPayoffMap Включает или отключает отображение блоков риска и прибыли с проекцией целей.
showSignalTint Включает или отключает цветовую подсветку свечи при появлении сигнала.
bullColor Цвет, используемый для обозначения бычьих (ростовых) элементов на графике.
bearColor Цвет, используемый для обозначения медвежьих (нисходящих) элементов на графике.
primaryColor Цвет линий и отметок первичных целей по соотношению риск/прибыль.
neutralColor Цвет нейтральных текстовых и графических элементов индикатора.
charcoalColor Цвет фона информационной панели и дашборда индикатора.
Получить полный код

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

indicator("Adaptive Liquidity Reclaim Map [PhenLabs]", shorttitle="ALRM", overlay=true, max_lines_count=30, max_boxes_count=10, max_labels_count=6)

string grpDetection = "1. Liquidity Detection"
leftBars = input.int(4, "Pivot Left Bars", minval=2, maxval=20, group=grpDetection, tooltip="Bars required to the left of a confirmed liquidity pivot.")
rightBars = input.int(4, "Pivot Right Bars", minval=2, maxval=20, group=grpDetection, tooltip="Bars required to the right of a confirmed liquidity pivot. Higher values are more selective.")
atrLen = input.int(14, "ATR Length", minval=5, maxval=100, group=grpDetection, tooltip="Volatility baseline used to normalize reclaim strength and size liquidity zones.")
volLookback = input.int(50, "Volatility Lookback", minval=10, maxval=200, group=grpDetection, tooltip="Lookback used to adapt the impulse threshold to the current volatility regime.")
baseImpulse = input.float(0.35, "Base Impulse (ATR)", minval=0.10, maxval=2.00, step=0.05, group=grpDetection, tooltip="Minimum candle body as a fraction of ATR before adaptive scaling.")
zoneWidthAtr = input.float(0.10, "Liquidity Zone Width (ATR)", minval=0.02, maxval=1.00, step=0.01, group=grpDetection, tooltip="Half-width of each active liquidity zone as a fraction of ATR. 0.10 keeps zones slim on a screenshot.")

string grpContext = "2. Higher-Timeframe Context"
useHtfGate = input.bool(true, "Require HTF Alignment", group=grpContext, tooltip="Signals only fire when the reclaim agrees with the selected higher-timeframe EMA bias.")
htfTimeframe = input.timeframe("240", "Higher Timeframe", group=grpContext, tooltip="Context timeframe. Select one above the chart timeframe for a meaningful bias filter.")
htfEmaLen = input.int(50, "HTF EMA Length", minval=10, maxval=300, group=grpContext, tooltip="EMA length used inside the higher-timeframe bias calculation.")

string grpTargets = "3. Payoff Map"
rrPrimary = input.float(1.0, "Primary Target (R)", minval=0.50, maxval=5.00, step=0.25, group=grpTargets, tooltip="First objective measured from entry to the sweep-bar extreme.")
rrRunner = input.float(2.0, "Runner Target (R)", minval=0.75, maxval=8.00, step=0.25, group=grpTargets, tooltip="Second objective measured from entry to the sweep-bar extreme.")
projectionBars = input.int(30, "Projection Length", minval=5, maxval=200, group=grpTargets, tooltip="Number of bars used to draw the current risk/reward block.")

string grpVisuals = "4. Screenshot Visuals"
showLiquidityZones = input.bool(true, "Show Active Liquidity Zones", group=grpVisuals)
showZoneCenter = input.bool(true, "Show Zone Center Line", group=grpVisuals)
showSignals = input.bool(true, "Show Signal Markers", group=grpVisuals)
showCallouts = input.bool(true, "Show Score Callouts", group=grpVisuals)
showPayoffMap = input.bool(true, "Show Risk/Reward Blocks", group=grpVisuals)
showSignalTint = input.bool(true, "Tint Signal Candle", group=grpVisuals)
bullColor = input.color(color.rgb(0, 245, 160), "Bullish Emerald", group=grpVisuals)
bearColor = input.color(color.rgb(255, 45, 149), "Bearish Magenta", group=grpVisuals)
primaryColor = input.color(color.rgb(255, 190, 65), "Primary Target Amber", group=grpVisuals)
neutralColor = input.color(color.rgb(156, 163, 175), "Neutral Text", group=grpVisuals)
charcoalColor = input.color(color.rgb(19, 20, 27), "Charcoal Background", group=grpVisuals)

float atrValue = ta.atr(atrLen)
float atrBaseline = ta.sma(atrValue, volLookback)
float volatilityRatio = not na(atrValue) and not na(atrBaseline) and atrBaseline > 0 ? atrValue / atrBaseline : 1.0
float adaptiveImpulse = baseImpulse * math.max(0.65, math.min(1.50, volatilityRatio))
float bodyAtr = not na(atrValue) and atrValue > 0 ? math.abs(close - open) / atrValue : na
float zoneHalfWidth = not na(atrValue) and atrValue > 0 ? atrValue * zoneWidthAtr : na
float candleHeight = high - low
float bullCloseLocation = candleHeight > 0 ? (close - low) / candleHeight : 0.50
float bearCloseLocation = candleHeight > 0 ? (high - close) / candleHeight : 0.50
float impulseQuality = not na(bodyAtr) and adaptiveImpulse > 0 ? math.min(1.0, bodyAtr / (adaptiveImpulse * 1.50)) : 0.0
float volatilityQuality = math.max(0.0, 1.0 - math.min(1.0, math.abs(volatilityRatio - 1.0) / 0.75))

float pivotHigh = ta.pivothigh(high, leftBars, rightBars)
float pivotLow = ta.pivotlow(low, leftBars, rightBars)

var float lastSwingHigh = na
var float lastSwingLow = na
var bool bullUsed = false
var bool bearUsed = false
var box buySideZone = na
var box sellSideZone = na
var line buySideCenter = na
var line sellSideCenter = na

if not na(pivotHigh)
    lastSwingHigh := pivotHigh
    bearUsed := false
    if not na(buySideZone)
        box.delete(buySideZone)
    if not na(buySideCenter)
        line.delete(buySideCenter)
    if showLiquidityZones and not na(zoneHalfWidth)
        buySideZone := box.new(left=bar_index - rightBars, top=lastSwingHigh + zoneHalfWidth, right=bar_index, bottom=lastSwingHigh - zoneHalfWidth, xloc=xloc.bar_index, extend=extend.right, border_color=color.new(bearColor, 15), border_width=1, bgcolor=color.new(bearColor, 88))
        if showZoneCenter
            buySideCenter := line.new(x1=bar_index - rightBars, y1=lastSwingHigh, x2=bar_index, y2=lastSwingHigh, xloc=xloc.bar_index, extend=extend.right, color=color.new(bearColor, 30), style=line.style_dashed, width=1)

if not na(pivotLow)
    lastSwingLow := pivotLow
    bullUsed := false
    if not na(sellSideZone)
        box.delete(sellSideZone)
    if not na(sellSideCenter)
        line.delete(sellSideCenter)
    if showLiquidityZones and not na(zoneHalfWidth)
        sellSideZone := box.new(left=bar_index - rightBars, top=lastSwingLow + zoneHalfWidth, right=bar_index, bottom=lastSwingLow - zoneHalfWidth, xloc=xloc.bar_index, extend=extend.right, border_color=color.new(bullColor, 15), border_width=1, bgcolor=color.new(bullColor, 88))
        if showZoneCenter
            sellSideCenter := line.new(x1=bar_index - rightBars, y1=lastSwingLow, x2=bar_index, y2=lastSwingLow, xloc=xloc.bar_index, extend=extend.right, color=color.new(bullColor, 30), style=line.style_dashed, width=1)

bool htfBull = request.security(syminfo.tickerid, htfTimeframe, close > ta.ema(close, htfEmaLen), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
bool htfBear = request.security(syminfo.tickerid, htfTimeframe, close < ta.ema(close, htfEmaLen), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
bool bullContext = not useHtfGate or htfBull
bool bearContext = not useHtfGate or htfBear
float bullHtfQuality = htfBull ? 1.0 : useHtfGate ? 0.0 : 0.50
float bearHtfQuality = htfBear ? 1.0 : useHtfGate ? 0.0 : 0.50

bool bullSweep = not na(lastSwingLow) and low < lastSwingLow and close > lastSwingLow
bool bearSweep = not na(lastSwingHigh) and high > lastSwingHigh and close < lastSwingHigh
bool bullImpulse = not na(bodyAtr) and close > open and bodyAtr >= adaptiveImpulse
bool bearImpulse = not na(bodyAtr) and close < open and bodyAtr >= adaptiveImpulse
float bullRisk = close - low
float bearRisk = high - close

float bullScore = math.max(0.0, math.min(100.0, impulseQuality * 35.0 + bullCloseLocation * 30.0 + bullHtfQuality * 20.0 + volatilityQuality * 15.0))
float bearScore = math.max(0.0, math.min(100.0, impulseQuality * 35.0 + bearCloseLocation * 30.0 + bearHtfQuality * 20.0 + volatilityQuality * 15.0))

bool bullSignal = bullSweep and bullImpulse and bullContext and not bullUsed and bullRisk > syminfo.mintick
bool bearSignal = bearSweep and bearImpulse and bearContext and not bearUsed and bearRisk > syminfo.mintick
var table wm = table.new(position.bottom_right, 1, 1)
if barstate.isfirst
    table.cell(wm, 0, 0, "Telegram @SimpleForexTools", text_color = color.new(color.gray, 70), text_size = size.large)

var label bullCallout = na
var label bearCallout = na
var box riskBlock = na
var box rewardBlock = na
var line entryLine = na
var line primaryTargetLine = na
var line runnerTargetLine = na
var string lastSignalText = "WAITING"
var float lastSignalScore = na
var color lastSignalColor = neutralColor

if bullSignal
    bullUsed := true
  

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

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

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

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

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

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

Стоимость полного кода
1 411,40₽ ≈ $17.25