
Эта стратегия объединяет анализ кумулятивной дельты, свечи Heikin Ashi, скользящие средние и индикаторы волатильности. Основная идея — не пытаться угадать каждое движение рынка, а дождаться формирования направленного тренда и входить в сделку, когда движение подтверждается дополнительными фильтрами.
Как работает стратегия
В основе индикаторной части лежит кумулятивная дельта. Она накапливает изменения цены и отображается в виде линии или свечей. По умолчанию расчёт начинается заново в 09:00, что позволяет отслеживать движение внутри торговой сессии. Дополнительно стратегия распределяет объём свечей между условными покупками и продажами в зависимости от направления расчётной дельты.
Для более наглядного отображения движения можно использовать Heikin Ashi. Такие свечи сглаживают рыночный шум и помогают лучше видеть моменты, когда движение набирает силу или начинает затухать.
На графике также доступны SMA 14 и 28, а также EMA 12 и 26. Они помогают оценивать динамику и визуально сравнивать краткосрочные изменения с более плавным движением расчётной линии.
По каким правилам открываются сделки
Главный торговый сигнал строится на трендовом алгоритме с использованием ATR. Параметры ATR помогают определить динамические уровни, относительно которых меняется направление стратегии.
Для подтверждения силы движения используется ADX. По умолчанию сделка рассматривается, когда его значение превышает 30. Это помогает отсеивать часть слабых и боковых движений.
Направление сделки дополнительно фильтруется экспоненциальными средними:
Покупка: цена должна находиться выше EMA 200 и, если включён дополнительный фильтр, выше EMA 50.
Продажа: цена должна находиться ниже EMA 200 и, если включён дополнительный фильтр, ниже EMA 50.
Можно выбрать торговлю только в лонг, только в шорт или в обоих направлениях.
Управление рисками
Для расчёта размера позиции стратегия использует текущий капитал и заданный процент риска. По умолчанию риск установлен на уровне 1% капитала на сделку, а расстояние для расчёта объёма позиции определяется через ATR.
Также предусмотрен трейлинг-стоп с множителем 2 ATR. Его задача — сопровождать открытую позицию и помогать сохранять часть прибыли при развороте цены. Настройки предусматривают и тейк-профит с множителем 4 ATR, однако в текущем коде этот параметр ещё не подключён к реальному выходу из сделки.
Моё мнение
Главное преимущество такого подхода — сочетание нескольких факторов вместо торговли по одному сигналу. ATR помогает отслеживать изменение направления, ADX оценивает силу тренда, а EMA 50 и EMA 200 выступают дополнительными фильтрами. Кумулятивная дельта и свечи Heikin Ashi позволяют визуально оценивать характер движения.
При этом стратегия не гарантирует прибыль и может получать убытки во время резких разворотов и длительного бокового движения. Перед использованием на реальном счёте её стоит проверить на исторических данных и на демосчёте, учитывая комиссии, проскальзывание и особенности конкретного инструмента.
Важно: в текущей версии кумулятивная дельта рассчитывается по изменению цены, а не по реальным агрессивным покупкам и продажам. Поэтому она служит дополнительным способом визуализации, но не является полноценным анализом потока сделок.

//@version=5
strategy("Cumulative Trend with Heikin Ashi and Strategy", overlay=true)
// User Inputs for Cumulative Delta Reset
startHour = input.int(9, title="Start Hour for Cumulative Delta Reset")
startMinute = input.int(0, title="Start Minute for Cumulative Delta Reset")
linestyle = input.string("Candle", title="Line Style", options=["Candle", "Line"])
hacandle = input.bool(true, title="Use Heikin Ashi")
colorup = input.color(color.green, title="Candle Color Up")
colordown = input.color(color.red, title="Candle Color Down")
bcolup = input.color(color.green, title="Border Color Up")
bcoldown = input.color(color.red, title="Border Color Down")
wcolup = input.color(color.green, title="Wick Color Up")
wcoldown = input.color(color.red, title="Wick Color Down") // Цвет фитиля вниз
// MA and EMA Inputs
showma1 = input.bool(true, title="Show SMA 1")
ma1len = input.int(14, title="SMA 1 Length")
ma1col = input.color(color.blue, title="SMA 1 Color")
showma2 = input.bool(true, title="Show SMA 2")
ma2len = input.int(28, title="SMA 2 Length")
ma2col = input.color(color.purple, title="SMA 2 Color")
showema1 = input.bool(true, title="Show EMA 1")
ema1len = input.int(12, title="EMA 1 Length")
ema1col = input.color(color.orange, title="EMA 1 Color")
showema2 = input.bool(true, title="Show EMA 2")
ema2len = input.int(26, title="EMA 2 Length")
ema2col = input.color(color.red, title="EMA 2 Color")
// Delta Calculation Replacement
deltaLength = input.int(10, title="Delta Length")
volumeFilter = input.float(0, title="Volume Filter")
var float cumDelta = na
isNewSession = (hour == startHour and minute == startMinute)
delta = close - close[1]
if (isNewSession or na(cumDelta))
cumDelta := 0
cumDelta += delta
deltaDirection = ta.sma(cumDelta, deltaLength) > ta.sma(cumDelta[1], deltaLength)
buyVolume = deltaDirection ? volume : 0
sellVolume = not deltaDirection ? volume : 0
var float cumBuyVolume = na
var float cumSellVolume = na
if (isNewSession)
cumBuyVolume := 0
cumSellVolume := 0
cumBuyVolume += buyVolume
cumSellVolume += sellVolume
float ctl = na
float o = na
float h = na
float l = na
float c = na
if linestyle == 'Candle'
o := cumDelta[1]
h := math.max(cumDelta, cumDelta[1])
l := math.min(cumDelta, cumDelta[1])
c := cumDelta
else
ctl := cumDelta
plot(ctl, title="CDV Line", color=color.blue, linewidth=2)
// Heikin Ashi Candle Calculations
float haclose = na
float haopen = na
float hahigh = na
float halow = na
haclose := (o + h + l + c) / 4
haopen := na(haopen[1]) ? (o + c) / 2 : (haopen[1] + haclose[1]) / 2
hahigh := math.max(h, math.max(haopen, haclose))
halow := math.min(l, math.min(haopen, haclose))
// Select Candlestick Type
c_ = hacandle ? haclose : c
o_ = hacandle ? haopen : o
h_ = hacandle ? hahigh : h
l_ = hacandle ? halow : l
plotcandle(o_, h_, l_, c_, title='CDV Candles', color=o_ <= c_ ? colorup : colordown, bordercolor=o_ <= c_ ? bcolup : bcoldown, wickcolor=o_ <= c_ ? wcolup : wcoldown)
// Moving Averages
plot(showma1 and linestyle == "Candle" ? ta.sma(c_, ma1len) : na, title="SMA 1", color=ma1col)
plot(showma2 and linestyle == "Candle" ? ta.sma(c_, ma2len) : na, title="SMA 2", color=ma2col)
plot(showema1 and linestyle == "Candle" ? ta.ema(c_, ema1len) : na, title="EMA 1", color=ema1col)
plot(showema2 and linestyle == "Candle" ? ta.ema(c_, ema2len) : na, title="EMA 2", color=ema2col)
// Strategy Inputs
length = input.int(title='ATR Period', defval=22)
mult = input.float(title='ATR Multiplier', step=0.1, defval=3.0)
riskPercent = input.float(title='Risk % per Trade', defval=1, step=0.1)
adxThreshold = input.float(title='ADX Threshold', defval=30)
useEMA50 = input.bool(title='Use 50 EMA Filter', defval=true)
emaFilterPref = input.string(title='Trade Direction', defval='Both', options=['Long Only', 'Short Only', 'Both'])
useTrailingStop = input.bool(title='Use Trailing Stop', defval=true)
trailMultiplier = input.float(title='Trailing Stop ATR Multiplier', defval=2.0, step=0.1)
tpATR = input.float(title='Take Profit ATR Multiplier', defval=4.0, step=0.1)
// Strategy Calculations
atr = mult * ta.atr(length)
ema200 = ta.ema(close, 200)
ema50 = ta.ema(close, 50)
[_, _, adxValue] = ta.dmi(length, 14)
// Long/Short Stop Calculation
longStop = ta.highest(close, length) - atr
shortStop = ta.lowest(close, length) + atr
var int dir = 1
dir := close > shortStop ? 1 : close < longStop ? -1 : dir
buySignal = dir == 1 and adxValue > adxThreshold
sellSignal = dir == -1 and adxValue > adxThreshold
// Position Sizing
capital = strategy.equity
riskAmount = capital * (riskPercent / 100)
stopDistance = atr * 0.5
positionSize = riskAmount / stopDistance
// Trading Logic
if (buySignal and close > ema200 and (not useEMA50 or close > ema50) and (emaFilterPref == 'Both' or emaFilterPref == 'Long Only'))
strategy.entry("Long", strategy.long, qty = positionSize)
if (sellSignal and close < ema200 and (not useEMA50 or close < ema50) and (emaFilterPref == 'Both' or emaFilterPref == 'Short Only'))
strategy.entry("Short", strategy.short, qty = positionSize)
// Trailing Stop
if (useTrailingStop)
if (strategy.position_size > 0)
strategy.exit("Trailing Long", from_entry="Long", trail_offset=atr * trailMultiplier, trail_price=close)
else if (strategy.position_size < 0)
strategy.exit("Trailing Short", from_entry="Short", trail_offset=atr * trailMultiplier, trail_price=close)
// Signal Alerts
plotshape(series=buySignal, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=sellSignal, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")
alertcondition(buySignal, title='Buy Alert', message='Buy Signal Triggered')
alertcondition(sellSignal, title='Sell Alert', message='Sell Signal Triggered')
// Display Cumulative Volumes
plot(cumBuyVolume, title="Cumulative Buy Volume", color=color.green, linewidth=2)
plot(cumSellVolume, title="Cumulative Sell Volume", color=color.red, linewidth=2)
hline(0, "Zero Line", color=color.gray)
Я использую совокупный инструмент этих нотаций и ATR/МА так же, как показано в посте. Одно отличие: силу по ATR считаю >60.