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

A.R.E.S. — Adaptive Reversal Engine System

ares_indicator.pine

Похожие материалы по тегам

gold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

A.R.E.S. (Adaptive Reversal Engine System) — это индикатор-оверлей для TradingView, который оценивает вероятностное качество разворотов рынка. Система задействует восемь независимых движков — растяжение, ликвидность, отклонение, истощение, структура, дивергенция, объём и контекст старшего таймфрейма — и объединяет их с адаптивными весами в итоговый балл от 0 до 100 для каждой стороны.

Модель разворота построена по многоэтапному принципу: растяжение → истощение → событие ликвидности → отклонение → замедление импульса → структурное подтверждение → триггер разворота. Сигналы BUY/SELL формируются через конечный автомат с фазами NEUTRAL → ARMED → CONFIRMED → COOLDOWN и выпускаются исключительно на подтверждённых барах, что гарантирует отсутствие перерисовок.

Визуализация включает линии ликвидности, линии структуры (BOS/CHoCH), линии дивергенции, зоны разворота, маркеры установок, информационную панель и шесть условий оповещений. Поддерживаются пресеты конфигурации и автоматическая адаптация весов движков под текущий рыночный режим.

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

НастройкаОписание
preset Предустановка конфигурации: Aggressive (больше сигналов, ниже совпадение), Balanced (по умолчанию), Conservative (меньше сигналов, выше совпадение), Custom (настраиваемые параметры группы 02).
showSignals Включает или отключает отображение маркеров BUY и SELL на графике.
compactMode Отображает маркеры сигналов в компактном виде (буквы B / S вместо полных надписей BUY / SELL).
showScore Показывает числовой балл сигнала рядом с маркером BUY/SELL.
customSetup Пороговое значение балла для формирования сигнала BUY/SELL при пресете Custom.
customTrig Минимальный балл триггера, необходимый для подтверждения сигнала при пресете Custom.
customCool Количество баров периода охлаждения после сигнала при использовании пользовательского пресета Custom.
watchMin Минимальный балл для классификации сигнала как WATCH (наблюдение).
validMin Минимальный балл для классификации сигнала как VALID (валидный).
strongMin Минимальный балл для классификации сигнала как STRONG (сильный).
extremeMin Минимальный балл для классификации сигнала как EXTREME (экстремальный).
armBand Размер зоны ниже порога установки, при которой сигнал переходит в состояние ARMED (подготовленный).
maxSetupAge Максимальный возраст установки в барах, после которого ARMED-сигнал аннулируется, если не подтверждён.
setupDecay Скорость уменьшения балла установки в пунктах на каждый бар, если сигнал не подтверждён.
scoreCurve Степень кривой калибровки итогового балла: чем выше значение, тем больше одновременных доказательств требуется для достижения высокого балла.
wStretch Вест растяжения (отклонение от среднего в единицах Z-score и ATR) в общем расчёте балла.
wLiq Вес движка ликвидности в общем расчёте итогового балла.
wRej Вес движка отклонения (виковые характеристики свечей) в общем расчёте балла.
wExh Вес движка истощения в общем расчёте итогового балла.
wStr Вес структуры (нарушения внутреннего свинга) в общем расчёте балла.
wVol Вес движка объёма в общем расчёте балла (автоматически перераспределяется при отсутствии данных объёма).
wHtf Вез контекста старшего таймфрейма в общем расчёте балла (автоматически перераспределяется при отключении HTF).
pivLeft Количество баров слева для определения swing high/swing low при расчёте уровней ликвидности.
pivRight Количество баров справа, которые должны закрыться перед подтверждением свинга; только подтверждённые свинги используются.
rollLen Период скользящего окна для определения максимума/минимума при поиске уровней ликвидности.
eqTol Допуск для определения равных уровней (в кратных ATR), при котором два свинга считаются эквивалентными.
sweepMem Количество баров, в течение которых качество спреда (sweep) остаётся актуальным и учитывается в расчёте.
maxLiqLns Максимальное количество одновременно активных линий ликвидности на графике; менее значимые удаляются первыми.
liqMaxAge Максимальный возраст линии ликвидности в барах, после которого она удаляется.
momLen Период расчёта индекса относительной силы (RSI), используемого в оценке импульса и истощения.
velSmooth Период сглаживания нормализованной доходности для расчёта скорости импульса.
exhLook Период наблюдения для расчёта пиков замедления импульса и оценки истощения.
useDiv Включает или отключает учёт дивергенции (RSI и ATR-нормализованная скорость) в расчёте балла.
divW Вес дивергенции в общем расчёте итогового балла (при включённой опции дивергенции).
divLeft Количество баров слева для определения пивота при расчёте дивергенции.
divRight Количество баров справа для подтверждения пивота при расчёте дивергенции; задержка подтверждения.
divMaxGap Максимальное количество баров между двумя пивотами, при котором дивергенция считается валидной.
useVol Включает или отключает движок объёма (аномальный объём в сочетании с отклонением/восстановлением) в расчёте балла.
volLen Период скользящего среднего для расчёта базовой линии объёма и отклонения.
useAdapt Включает автоматическую адаптивную переоценку весов движков в зависимости от определённого рыночного режима.
adxLen Период расчёта индекса направленного движения (ADX), используемый для оценки силы тренда.
erLen Период расчёта коэффициента эффективности (Efficiency Ratio) для определения рыночного режима.
atrPctLen Период расчёта процентиля ATR для определения волатильности (сжатие/расширение).
useHtf Включает контекст старшего таймфрейма как фильтр (сам по себе не генерирует сигналы BUY/SELL).
htfInput Выбранный старший таймфрейм для контекстного фильтра (используется только при включённом HTF-контексте).
confWin Максимальное количество баров, в течение которого триггерное событие остаётся действительным для подтверждения.
adaptConf Включает адаптивное окно подтверждения: при боковом рынке окно сужается для ускорения, при трендовом — расширяется для строгости.
structMin Минимальный структурный балл, необходимый для подтверждения сигнала.
minSame Минимальное количество баров между сигналами одной стороны (BUY-BUY или SELL-SELL).
visMode Режим визуализации: Minimal — только сигналы и панель, Balanced — стандартный, Advanced — добавляет маркеры последовательности.
showLiq Отображает линии уровней ликвидности (swing high / swing low) на графике.
showStr Отображает линии структурных нарушений (BOS/CHoCH) на графике.
showZone Отображает прямоугольные зоны разворота, которые создаются при ARMED и усиливаются при CONFIRMED.
showDivL Отображает линии дивергенции между подтверждёнными пивотами на графике.
showSeq Отображает текстовые метки этапа установки (растяжение, ликвидность, отклонение) при активации ARMED.
showEq Отображает линию среднего (EMA 34) как линию равновесия на графике.
showInval Отображает уровень инвалидации (следующий за ATR-буфером от экстремума спреда) и линию проекции среднего.
invalLen Длина в барах для отображения уровня инвалидации и линии проекции среднего.
atrBuf Отступ в единицах ATR для позиционирования маркеров сигналов и уровней над/под свечами.
smartBars Закрашивает бары цветом (зелёный/красный) при значительном превышении балла одной стороны над другой.
showProj Отображает линию проекции среднего (EMA 34) как визуальную справочную линию, а не целевой уровень.
dashMode Режим информационной панели: Off — скрыта, Minimal — базовая информация, Detailed — расширенная с деталями движков.
debugOn Включает отображение промежуточных значений движков в окне данных для разработки и отладки.
Получить полный код

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

indicator("A.R.E.S. — Adaptive Reversal Engine System", shorttitle="A.R.E.S.", overlay=true, max_lines_count=500, max_labels_count=300, max_boxes_count=50)

type LiqLevel
    float px
    int   bi
    int   st
    int   sd
    float imp
    line  ln

G_SIG  = "01 — Signal Engine"
G_SENS = "02 — Reversal Sensitivity"
G_LIQ  = "03 — Liquidity"
G_MOM  = "04 — Momentum"
G_DIV  = "05 — Divergence"
G_VOL  = "06 — Volume"
G_REG  = "07 — Market Regime"
G_HTF  = "08 — Higher Timeframe"
G_CONF = "09 — Confirmation"
G_VIS  = "10 — Visuals"
G_DASH = "11 — Dashboard"
G_ADV  = "13 — Advanced"

preset      = input.string("Balanced", "Preset", options=["Aggressive", "Balanced", "Conservative", "Custom"], group=G_SIG, tooltip="Aggressive: more signals, lower confluence. Balanced: default. Conservative: fewer signals, higher confluence. Custom: uses the group 02 values.")
showSignals = input.bool(true, "Show BUY / SELL Signals", group=G_SIG)
compactMode = input.bool(false, "Compact Markers (B / S)", group=G_SIG)
showScore   = input.bool(false, "Show Score On Signal", group=G_SIG)

customSetup = input.float(75.0, "Custom: Setup Threshold", minval=50.0, maxval=95.0, step=1.0, group=G_SENS, tooltip="Score needed for a BUY / SELL (Custom preset only).")
customTrig  = input.float(45.0, "Custom: Min Trigger Score", minval=0.0, maxval=100.0, step=1.0, group=G_SENS)
customCool  = input.int(6, "Custom: Cooldown Bars", minval=0, group=G_SENS)
watchMin    = input.float(65.0, "Quality: Watch From", minval=0.0, maxval=100.0, group=G_SENS)
validMin    = input.float(72.0, "Quality: Valid From", minval=0.0, maxval=100.0, group=G_SENS)
strongMin   = input.float(80.0, "Quality: Strong From", minval=0.0, maxval=100.0, group=G_SENS)
extremeMin  = input.float(90.0, "Quality: Extreme From", minval=0.0, maxval=100.0, group=G_SENS)
armBand     = input.float(10.0, "Arm Band Below Setup", minval=0.0, maxval=30.0, step=1.0, group=G_SENS, tooltip="A setup becomes ARMED when the score enters this band below the signal threshold.")
maxSetupAge = input.int(12, "Max Setup Age (bars)", minval=2, group=G_SENS)
setupDecay  = input.float(1.5, "Setup Decay (pts per bar)", minval=0.0, maxval=5.0, step=0.1, group=G_SENS)
scoreCurve  = input.float(1.8, "Score Sharpness", minval=1.0, maxval=3.0, step=0.1, group=G_SENS, tooltip="Calibration curve applied to the weighted confluence average. Higher values require more simultaneous evidence.")
wStretch    = input.float(15.0, "Weight: Stretch", minval=0.0, group=G_SENS)
wLiq        = input.float(20.0, "Weight: Liquidity", minval=0.0, group=G_SENS)
wRej        = input.float(15.0, "Weight: Rejection", minval=0.0, group=G_SENS)
wExh        = input.float(15.0, "Weight: Exhaustion", minval=0.0, group=G_SENS)
wStr        = input.float(10.0, "Weight: Structure", minval=0.0, group=G_SENS)
wVol        = input.float(7.5, "Weight: Volume", minval=0.0, group=G_SENS, tooltip="Redistributed automatically when volume data is missing.")
wHtf        = input.float(7.5, "Weight: HTF Context", minval=0.0, group=G_SENS, tooltip="Redistributed automatically when HTF context is disabled.")

pivLeft   = input.int(5, "Swing Left Bars", minval=2, group=G_LIQ)
pivRight  = input.int(3, "Swing Right Bars", minval=1, group=G_LIQ, tooltip="Bars that must close before a swing is confirmed. Only confirmed swings are used.")
rollLen   = input.int(40, "Rolling Liquidity Lookback", minval=5, group=G_LIQ)
eqTol     = input.float(0.25, "Equal Level Tolerance (ATR)", minval=0.05, maxval=1.0, step=0.05, group=G_LIQ)
sweepMem  = input.int(6, "Sweep Memory (bars)", minval=1, group=G_LIQ)
maxLiqLns = input.int(8, "Max Active Liquidity Lines", minval=2, maxval=30, group=G_LIQ, tooltip="Lowest-importance levels are removed first.")
liqMaxAge = input.int(300, "Max Liquidity Line Age (bars)", minval=20, group=G_LIQ)

momLen    = input.int(14, "RSI Length", minval=2, group=G_MOM)
velSmooth = input.int(3, "Velocity Smoothing", minval=1, group=G_MOM)
exhLook   = input.int(6, "Exhaustion Lookback", minval=2, group=G_MOM)

useDiv    = input.bool(true, "Use Divergence", group=G_DIV)
divW      = input.float(10.0, "Divergence Weight", minval=0.0, group=G_DIV)
divLeft   = input.int(3, "Divergence Pivot Left", minval=1, group=G_DIV)
divRight  = input.int(3, "Divergence Pivot Right", minval=1, group=G_DIV, tooltip="Confirmation delay. The divergence is marked on the bar where the second pivot becomes confirmed.")
divMaxGap = input.int(60, "Max Bars Between Pivots", minval=5, group=G_DIV)

useVol    = input.bool(true, "Use Volume Engine", group=G_VOL)
volLen    = input.int(20, "Volume Baseline Length", minval=5, group=G_VOL)

useAdapt  = input.bool(true, "Auto Adaptive Weights", group=G_REG, tooltip="Re-weights the engines according to the detected market regime.")
adxLen    = input.int(14, "Trend Strength Length", minval=5, group=G_REG)
erLen     = input.int(10, "Efficiency Ratio Length", minval=3, group=G_REG)
atrPctLen = input.int(100, "ATR Percentile Lookback", minval=20, group=G_REG)

useHtf    = input.bool(false, "Enable HTF Context", group=G_HTF, tooltip="HTF is a context filter only. It never produces BUY or SELL by itself.")
htfInput  = input.timeframe("240", "HTF Timeframe", group=G_HTF)

confWin   = input.int(3, "Trigger Window (bars)", minval=1, maxval=10, group=G_CONF)
adaptConf = input.bool(true, "Adaptive Confirmation", group=G_CONF, tooltip="Range: faster confirmation. Trend: stricter confirmation.")
structMin = input.float(35.0, "Min Structure Score", minval=0.0, maxval=100.0, group=G_CONF)
minSame   = input.int(8, "Min Bars Between Same Signals", minval=0, group=G_CONF)

visMode   = input.string("Balanced", "Visual Mode", options=["Minimal", "Balanced", "Advanced"], group=G_VIS, tooltip="Minimal: signals and dashboard only. Balanced: default. Advanced: adds the optional sequence markers.")
showLiq   = input.bool(true, "Liquidity Lines", group=G_VIS)
showStr   = input.bool(true, "Structure Lines", group=G_VIS)
showZone  = input.bool(true, "Reversal Zones", group=G_VIS)
showDivL  = input.bool(true, "Divergence Lines", group=G_VIS)
showSeq   = input.bool(false, "Advanced Sequence", group=G_VIS, tooltip="Writes a small stage-status label when a setup arms.")
showEq    = input.bool(false, "Equilibrium Line", group=G_VIS)
showInval = input.bool(false, "Show Invalidation Level", group=G_VIS)
invalLen  = input.int(20, "Invalidation / Projection Length (bars)", minval=5, group=G_VIS)
atrBuf    = input.float(0.4, "Marker ATR Buffer", minval=0.0, maxval=3.0, step=0.1, group=G_VIS)
smartBars = input.bool(true, "Enable Smart Bar Colors", group=G_VIS)
showProj  = input.bool(false, "Show Mean Projection (not a target)", group=G_VIS)

dashMode  = input.string("Minimal", "Dashboard Mode", options=["Off", "Minimal", "Detailed"], group=G_DASH)

debugOn   = input.bool(false, "Developer / Debug Mode", group=G_ADV, tooltip="Exposes engine values in the Data Window.")

bullC  = color.rgb(34, 211, 166)     // emerald-aqua
bearC  = color.rgb(255, 99, 120)     // coral-red
neuC   = color.rgb(148, 163, 184)    // slate
txtC   = color.rgb(226, 232, 240)    // near-white text
panelC = color.rgb(15, 23, 42)       // deep slate panel

f_clamp01(float x) => math.max(0.0, math.min(1.0, nz(x)))
f_clampS(float x, float lo, float hi) => math.max(lo, math.min(hi, nz(x)))
f_safeDiv(float a, float b) => nz(b) == 0.0 ? 0.0 : nz(a) / b
f_b(bool c) => c ? 1.0 : 0.0
f_i(float x) => str.tostring(math.round(x))

f_row(table t, int r, string k, string v, color bgc, color tc) =>
    table.cell(t, 0, r, k, text_color=tc, bgcolor=bgc, text_size=size.small, text_halign=text.align_left)
    table.cell(t, 1, r, v, text_color=tc, bgcolor=bgc, text_size=size.small, text_halign=text.align_right)
    r

f_trimLines(array<line> arr, int maxN) =>
    while array.size(arr) > maxN
        line.delete(array.shift(arr))
    array.size(arr)

f_trimLabels(array<label> arr, int maxN) =>
    while array.size(arr) > maxN
        label.delete(array.shift(arr))
    array.size(arr)

f_findLiq(array<LiqLevel> arr, int sdv, float px, float tol) =>
    int found = -1
    if array.size(arr) > 0
        for i = 0 to array.size(arr) - 1
            LiqLevel lv = array.get(arr, i)
            if found == -1 and lv.sd == sdv and lv.st == 0 and math.abs(lv.px - px) <= tol
                found := i
    found

f_pruneLiq(array<LiqLevel> arr, int maxN, int maxAge) =>
    int i = 0
    while i < array.size(arr)
        LiqLevel lv = array.get(arr, i)
        if bar_index - lv.bi > maxAge
            line.delete(lv.ln)
            array.remove(arr, i)
        else
            i += 1
    while array.size(arr) > maxN
        int worst = 0
        float worstImp = 1.0e9
        for j = 0 to array.size(arr) - 1
            LiqLevel c = array.get(arr, j)
            if c.imp < worstImp
                worstImp := c.imp
                worst := j
        LiqLevel old = array.remove(arr, worst)
        line.delete(old.ln)
    array.size(arr)

var float lastSwH    = na
var float lastSwL    = na
var float intSwH     = na
var float intSwL     = na
var int   intSwHBar  = na
var int   intSwLBar  = na
var int   eqlSBar    = na
var int   eqlBBar    = na

var int   swpBBar    = na
var float swpBLvl    = na
var float swpBLow    = na
var float swpBQ      = 0.0
var int   swpSBar    = na
var float swpSLvl    = na
var float swpSHigh   = na
var float swpSQ      = 0.0

var int   strBBar    = na
var float strBLvl    = na
var int   strBFrom   = na
var int   strSBar    = na
var float strSLvl    = na
var int   strSFrom   = na

var float pLowPx     = na
var float pLowOsc    = na
var int   pLowBar    = na
var float pHighPx    = na
var float pHighOsc   = na
var int   pHighBar   = na
var int   divBBar    = na
var float divBSc     = 0.0
var int   divBFrom   = na
var float divBFromPx = na
var int   divBTo     = na
var float divBToPx   = na
var int   divSBar    = na
var float divSSc     = 0.0
var int   divSFrom   = na
var float divSFromPx = na
var int   divSTo     = na
var float divSToPx   = na

var int   trgBLast   = na
var float trgBPk     = 0.0
var int   trgSLast   = na
var float trgSPk     = 0.0

var int   stateL     = 0      // 0 NEUTRAL · 1 ARMED · 3 COOLDOWN
var int   stateS     = 0
var int   armL       = na
var int   armS       = na
var float peakL      = 0.0
var float peakS      = 0.0
var int   coolL      = 0
var int   coolS      = 0
var int   lastBuy    = na
var int   lastSell   = na
var float sigScore   = 0.0
var bool  buySig     = false
var bool  sellSig    = false

var array<LiqLevel> liqArr = array.new<LiqLevel>()
var array<line>     strLn  = array.new<line>()
var array<line>     divLn  = array.new<line>()
var array<line>     auxLn  = array.new<line>()
var array<label>    lblArr = array.new<label>()
var box   zoneB      = na
var box   zoneS      = na
var table dash       = table.new(position.top_right, 2, 12, bgcolor=color.new(panelC, 10), frame_color=color.new(neuC, 60), frame_width=1, border_color=color.new(neuC, 80), border_width=1)

atr     = ta.atr(14)
atrS    = math.max(atr, syminfo.mintick)
ema34   = ta.ema(close, 34)
sd50    = math.max(ta.stdev(close, 50), syminfo.mintick)
zSc     = (close - ema34) / sd50
atrDev  = (close - ema34) / atrS
rng     = math.max(high - low, syminfo.mintick)
bodyHi  = math.max(open, close)
bodyLo  = math.min(open, close)
lowWkR  = (bodyLo - low) / rng
upWkR   = (high - bodyHi) / rng
clvBull = ((close - low) - (high - close)) / rng    // close location value, [-1, 1]
clvB    = (clvBull + 1.0) / 2.0                     // 1 = closed at the high
clvS    = 1.0 - clvB
bodyATR = (close - open) / atrS                     // signed displacement in ATR

isAgg      = preset == "Aggressive"
isCons     = preset == "Conservative"
isCust     = preset == "Custom"
setupThr   = isCust ? customSetup : isAgg ? 70.0 : isCons ? 80.0 : 75.0
trigBase   = isCust ? customTrig : isAgg ? 35.0 : isCons ? 55.0 : 45.0
cdBase     = isCust ? customCool : isAgg ? 3 : isCons ? 12 : 6
cdN        = cdBase > minSame ? cdBase : minSame
coreReq    = isAgg ? 0.25 : isCons ? 0.50 : 0.35
structNeed = isCons ? 50.0 : isAgg ? 25.0 : structMin
winPreset  = isAgg ? 4 : isCons ? 2 : confWin
armedThr   = setupThr - armBand

swH     = ta.pivothigh(high, pivLeft, pivRight)
swL     = ta.pivotlow(low, pivLeft, pivRight)
swBar   = bar_index - pivRight
rollHi  = ta.highest(high, rollLen)[1]
rollLo  = ta.lowest(low, rollLen)[1]
refLo   = na(lastSwL[1]) ? rollLo : lastSwL[1]
refHi   = na(lastSwH[1]) ? rollHi : lastSwH[1]

bullSwp = not na(refLo) and low < refLo and close > refLo
bearSwp = not na(refHi) and high > refHi and close < refHi
penL    = f_clamp01((refLo - low) / (atrS * 0.5))
recL    = f_clamp01((close - refLo) / (atrS * 0.4))
sweepQB = 0.45 * penL + 0.35 * recL + 0.20 * (0.5 * clvB + 0.5 * lowWkR)
penH    = f_clamp01((high - refHi) / (atrS * 0.5))
recH    = f_clamp01((refHi - close) / (atrS * 0.4))
sweepQS = 0.45 * penH + 0.35 * recH + 0.20 * (0.5 * clvS + 0.5 * upWkR)

rsiV  = ta.rsi(close, momLen)
retN  = (close - close[1]) / atrS
vel   = ta.ema(retN, velSmooth)
dVel  = vel - vel[1]
dAcc  = dVel - dVel[1]
pushD = math.max(0.0, -vel)
pushU = math.max(0.0, vel)
peakD = ta.highest(pushD, exhLook)
peakU = ta.highest(pushU, exhLook)
rsiSl = rsiV - rsiV[3]
decB  = peakD > 0.0 ? f_clamp01((peakD - pushD) / peakD) : 0.0
decS  = peakU > 0.0 ? f_clamp01((peakU - pushU) / peakU) : 0.0
exhB  = 0.45 * decB + 0.25 * f_clamp01(dVel / 0.2) + 0.20 * f_clamp01(dAcc / 0.15) + 0.10 * f_clamp01(rsiSl / 8.0)
exhS  = 0.45 * decS + 0.25 * f_clamp01(-dVel / 0.2) + 0.20 * f_clamp01(-dAcc / 0.15) + 0.10 * f_clamp01(-rsiSl / 8.0)

iH    = ta.pivothigh(high, 2, 2)
iL    = ta.pivotlow(low, 2, 2)
oscD  = 0.5 * ((rsiV - 50.0) / 50.0) + 0.5 * math.max(-1.0, math.min(1.0, nz(vel)))
pvL   = ta.pivotlow(low, divLeft, divRight)
pvH   = ta.pivothigh(high, divLeft, divRight)
oscPL = oscD[divRight]
oscPH = oscD[divRight]

stretchB = 0.6 * f_clamp01(-zSc / 2.5) + 0.4 * f_clamp01(-atrDev / 3.0)
stretchS = 0.6 * f_clamp01(zSc / 2.5) + 0.4 * f_clamp01(atrDev / 3.0)

rejBr = f_clamp01(0.5 * f_clamp01(lowWkR / 0.6) + 0.3 * clvB + 0.2 * f_clamp01((bodyLo - low) / atrS / 0.8))
rejSr = f_clamp01(0.5 * f_clamp01(upWkR / 0.6) + 0.3 * clvS + 0.2 * f_clamp01((high - bodyHi) / atrS / 0.8))

if barstate.isconfirmed

    if not na(swL) and not na(lastSwL) and math.abs(swL - lastSwL) <= eqTol * atrS
        eqlBBar := bar_index
    if not na(swH) and not na(lastSwH) and math.abs(swH - lastSwH) <= eqTol * atrS
        eqlSBar := bar_index

    if bullSwp
        swpBBar := bar_index
        swpBLvl := refLo
        swpBLow := low
        swpBQ   := sweepQB
    if bearSwp
        swpSBar  := bar_index
        swpSLvl  := refHi
        swpSHigh := high
        swpSQ    := sweepQS

    if not na(swL)
        lastSwL := swL
    if not na(swH)
        lastSwH := swH

    if not na(intSwH) and close > intSwH and close[1] <= intSwH
        strBBar  := bar_index
        strBLvl  := intSwH
        strBFrom := intSwHBar
    if not na(intSwL) and close < intSwL and close[1] >= intSwL
        strSBar  := bar_index
        strSLvl  := intSwL
        strSFrom := intSwLBar
    if not na(iH)
        intSwH    := iH
        intSwHBar := bar_index - 2
    if not na(iL)
        intSwL    := iL
        intSwLBar := bar_index - 2

    if not na(pvL)
        pbL = bar_index - divRight
        if not na(pLowPx) and pbL - pLowBar <= divMaxGap and pvL < pLowPx and oscPL > pLowOsc
            divBSc   := f_clamp01((oscPL - pLowOsc) / 0.5)
            divBBar  := bar_index
            divBFrom := pLowBar
            divBFromPx := pLowPx
            divBTo   := pbL
            divBToPx := pvL
        pLowPx  := pvL
        pLowOsc := oscPL
        pLowBar := pbL

    if not na(pvH)
        pbH = bar_index - divRight
        if not na(pHighPx) and pbH - pHighBar <= divMaxGap and pvH > pHighPx and oscPH < pHighOsc
            divSSc     := f_clamp01((pHighOsc - oscPH) / 0.5)
            divSBar    := bar_index
            divSFrom   := pHighBar
            divSFromPx := pHighPx
            divSTo     := pbH
            divSToPx   := pvH
        pHighPx  := pvH
        pHighOsc := oscPH
        pHighBar := pbH

bsAge   = na(swpBBar) ? 999 : bar_index - swpBBar
ssAge   = na(swpSBar) ? 999 : bar_index - swpSBar
bsAct   = bsAge <= sweepMem
ssAct   = ssAge <= sweepMem
eqlBRec = not na(eqlBBar) and bar_index - eqlBBar <= 5
eqlSRec = not na(eqlSBar) and bar_index - eqlSBar <= 5

liqB = bsAct ? f_clamp01(swpBQ * (1.0 - bsAge / (sweepMem + 1.0)) + (eqlBRec ? 0.10 : 0.0)) : 0.0
liqS = ssAct ? f_clamp01(swpSQ * (1.0 - ssAge / (sweepMem + 1.0)) + (eqlSRec ? 0.10 : 0.0)) : 0.0

rejB = rejBr * (bsAct ? 1.0 : 0.75)
rejS = rejSr * (ssAct ? 1.0 : 0.75)

strBAge = na(strBBar) ? 999 : bar_index - strBBar
strSAge = na(strSBar) ? 999 : bar_index - strSBar
strBOk  = not na(strBLvl) and close > strBLvl
strSOk  = not na(strSLvl) and close < strSLvl
structB = f_clamp01(f_clamp01(1.0 - strBAge / 8.0) * (bsAct ? 1.0 : 0.7) + (strBOk ? 0.2 : 0.0))
structS = f_clamp01(f_clamp01(1.0 - strSAge / 8.0) * (ssAct ? 1.0 : 0.7) + (strSOk ? 0.2 : 0.0))

divBNow = na(divBBar) ? 0.0 : divBSc * f_clamp01(1.0 - (bar_index - divBBar) / 30.0)
divSNow = na(divSBar) ? 0.0 : divSSc * f_clamp01(1.0 - (bar_index - divSBar) / 30.0)
divB    = useDiv ? divBNow : 0.0
divS    = useDiv ? divSNow : 0.0

trigB = 100.0 * (0.20 * f_b(close > high[1]) + 0.20 * f_b(dVel > 0.0) + 0.20 * f_clamp01(bodyATR / 0.6) + 0.20 * f_b(strBAge <= 3) + 0.20 * f_b(bsAct and close > swpBLvl))
trigS = 100.0 * (0.20 * f_b(close < low[1]) + 0.20 * f_b(dVel < 0.0) + 0.20 * f_clamp01(-bodyATR / 0.6) + 0.20 * f_b(strSAge <= 3) + 0.20 * f_b(ssAct and close < swpSLvl))

volAvg = ta.sma(volume, volLen)
volSd  = ta.stdev(volume, volLen)
volOk  = useVol and volAvg > 0.0
volZ   = f_safeDiv(volume - volAvg, volSd)
volAbn = f_clamp01(volZ / 3.0)
volB   = volOk ? volAbn * f_clamp01(0.5 * rejB + 0.5 * clvB) * (zSc < 0.0 ? 1.0 : 0.5) : 0.0
volS   = volOk ? volAbn * f_clamp01(0.5 * rejS + 0.5 * clvS) * (zSc > 0.0 ? 1.0 : 0.5) : 0.0

htfSel   = useHtf ? htfInput : timeframe.period
emaH     = ta.ema(close, 50)
slopeH0  = (emaH - emaH[3]) / atrS
eqH0     = (close - emaH) / atrS
momH0    = (close - close[5]) / atrS
[slopeH, eqH, momH] = request.security(syminfo.tickerid, htfSel, [slopeH0[1], eqH0[1], momH0[1]], lookahead=barmerge.lookahead_on)
hTrend   = f_clampS(slopeH / 0.5, -1.0, 1.0)
hEqN     = f_clampS(eqH / 2.0, -1.0, 1.0)
hMomN    = f_clampS(momH / 2.0, -1.0, 1.0)

hBullCtx = f_clamp01(0.5 - 0.25 * hEqN + 0.15 * hTrend + 0.10 * hMomN)
hBearCtx = f_clamp01(0.5 + 0.25 * hEqN - 0.15 * hTrend - 0.10 * hMomN)

[diP, diM, adxV] = ta.dmi(adxLen, adxLen)
trendStr = f_clamp01(nz(adxV) / 40.0)
ema50    = ta.ema(clo

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

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

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

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

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

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

Стоимость полного кода
2 934,10₽ ≈ $35.86