
Знаете ли вы, что большинство людей используют EMA, чтобы посмотреть только на цену, но в чем сила этой стратегии? Она может рассчитывать EMA из 6 различных источников данных!
Эти 6 источников данных включают в себя: средняя цена, объем сделок, коэффициент изменения, средняя цена K-линии, средний объем сделок K-линии, средний коэффициент изменения K-линии.
Эта стратегия не просто сигнализирует! Она состоит из трёх “проверки”:
Первая линия: оценка тенденций EMA 📈 Это как смотреть на прогноз погоды, чтобы определить, будет ли дождь или нет.
Второй путь: фильтрация на ADX. 💪
ADX - это инструмент для измерения ветра, который подает сигнал только при достаточно сильном тренде (по умолчанию выше 25).
Третий путь: подтверждение транзакций 🔊 Рывок в продажах - это как “голоса” акций, которые говорят, что это серьезный сигнал, а не шутка.
И самое интересное, что эта стратегия дает три способа выхода из игры, как если бы в игре было три уровня сложности: простое, обычное и сложное.
Модуль 1: вывод обратного сигнала 🔄 Самый простой грубый, многоголовый сигнал приходит больше пустоты, пустоголовый сигнал приходит больше пустоты
Модуль 2: ATR динамическая стоп-стоп потеря 📏 Автоматическая корректировка в зависимости от волатильности рынка, с точки снятия убытков при больших колебаниях и точки снятия убытков при малых колебаниях
Модуль 3: фиксированный процент стоп-стоп 📊 Лучше всего понять, что при прибыли в 2% вы бежите, а при убытке в 1.5% проигрываете (можно настроить)
Период действияСредне- и краткосрочные сделки, особенно подходящие для рынков с некоторой волатильностью Руководство по уходу за ямой“Осторожно, рекомендую включить ADX-фильтр” ПродвижениеНапример, если вы хотите, чтобы ваши данные были доступны только для одного источника, то вы можете попробовать другие источники данных, особенно если вы хотите достичь прорыва в объеме.
Самым большим преимуществом этой стратегии является гибкость, вы можете выбрать наиболее подходящий источник данных и способ выхода в зависимости от различных рыночных условий. Помните, что нет идеальной стратегии, есть только стратегия, которая лучше всего подходит для текущего рынка!
/*backtest
start: 2025-01-01 00:00:00
end: 2025-09-01 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
//@fenyesk
strategy("EMA inFusion Pro - Source Selection", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// =============================================
// === INPUT PARAMETERS =======================
// =============================================
// Moving Average Source Selection
maSourceSelection = input.string("Price", "Moving Average Source",
options=["Price", "Volume", "Rate of Change", "Heikin Ashi Price", "Heikin Ashi Volume", "Heikin Ashi Rate of Change"],
tooltip="Select data source for EMA calculation")
// EMA Settings
emaLength = input.int(50, title="EMA Length", minval=1, maxval=200)
rocLength = input.int(1, title="Rate of Change Length", minval=1, maxval=50, tooltip="Length for ROC calculation")
// ADX Filter Settings
useAdxFilter = input.bool(true, title="Use ADX Filter", group="ADX Settings")
adxLength = input.int(14, title="ADX Length", minval=1, maxval=50, group="ADX Settings")
adxThreshold = input.float(25, title="ADX Threshold", minval=10, maxval=50, step=0.5, group="ADX Settings")
// Volume Spike Settings
useVolumeFilter = input.bool(true, title="Use Volume Spike Filter", group="Volume Settings")
volumeMultiplier = input.float(1.0, title="Volume Spike Multiplier", minval=1.0, maxval=5.0, step=0.1, group="Volume Settings")
volumeSmaLength = input.int(20, title="Volume SMA Length", minval=5, maxval=100, group="Volume Settings")
// Trading Exit Mode Selector
tradingMode = input.int(2, title="Trading Exit Mode", minval=1, maxval=3,
tooltip="1: Exit on reverse signal\n2: ATR based TP/SL\n3: Percent based TP/SL",
group="Exit Strategy")
// Mode 3: Percent-Based Settings
takeProfitPercent = input.float(2.0, title="Take Profit %", minval=0.1, maxval=10.0, step=0.1, group="Percent Exit")
stopLossPercent = input.float(1.5, title="Stop Loss %", minval=0.1, maxval=10.0, step=0.1, group="Percent Exit")
// Mode 2: ATR-Based Settings
atrLength = input.int(14, title="ATR Length", minval=1, maxval=50, group="ATR Exit")
atrMultiplierTp = input.float(4.0, title="ATR Take Profit Multiplier", minval=0.1, maxval=10.0, step=0.1, group="ATR Exit")
atrMultiplierSl = input.float(4.0, title="ATR Stop Loss Multiplier", minval=0.1, maxval=10.0, step=0.1, group="ATR Exit")
// =============================================
// === SOURCE CALCULATIONS ====================
// =============================================
// Rate of Change calculation
roc(src, length) =>
change = src - src[length]
src[length] != 0 ? (change / src[length] * 100) : 0
// Standard Rate of Change
rocPrice = roc(close, rocLength)
rocVolume = roc(volume, rocLength)
// Heikin Ashi calculations
haClose = (open + high + low + close) / 4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(high, math.max(haOpen, haClose))
haLow = math.min(low, math.min(haOpen, haClose))
// Heikin Ashi Rate of Change
haRocPrice = roc(haClose, rocLength)
haRocVolume = roc(volume, rocLength) // Volume remains same for HA
// Define EMA source based on selection
emaSource = switch maSourceSelection
"Price" => close
"Volume" => volume
"Rate of Change" => rocPrice
"Heikin Ashi Price" => haClose
"Heikin Ashi Volume" => volume // Volume doesn't change in HA
"Heikin Ashi Rate of Change" => haRocPrice
=> close // Default fallback
// =============================================
// === INDICATOR CALCULATIONS =================
// =============================================
// Core Indicators
emaValue = ta.ema(emaSource, emaLength)
[diPlus, diMinus, adx] = ta.dmi(adxLength, adxLength)
volumeSma = ta.sma(volume, volumeSmaLength)
volumeSpike = volume > (volumeSma * volumeMultiplier)
atrValue = ta.atr(atrLength)
// Trend Conditions (adjusted for different source types)
bullishTrend = switch maSourceSelection
"Price" => close > emaValue
"Heikin Ashi Price" => haClose > emaValue
"Volume" => volume > emaValue
"Heikin Ashi Volume" => volume > emaValue
"Rate of Change" => rocPrice > emaValue
"Heikin Ashi Rate of Change" => haRocPrice > emaValue
=> close > emaValue
bearishTrend = not bullishTrend
// Cross conditions (adjusted for source type)
emaCrossUp = switch maSourceSelection
"Price" => ta.crossover(close, emaValue)
"Heikin Ashi Price" => ta.crossover(haClose, emaValue)
"Volume" => ta.crossover(volume, emaValue)
"Heikin Ashi Volume" => ta.crossover(volume, emaValue)
"Rate of Change" => ta.crossover(rocPrice, emaValue)
"Heikin Ashi Rate of Change" => ta.crossover(haRocPrice, emaValue)
=> ta.crossover(close, emaValue)
emaCrossDown = switch maSourceSelection
"Price" => ta.crossunder(close, emaValue)
"Heikin Ashi Price" => ta.crossunder(haClose, emaValue)
"Volume" => ta.crossunder(volume, emaValue)
"Heikin Ashi Volume" => ta.crossunder(volume, emaValue)
"Rate of Change" => ta.crossunder(rocPrice, emaValue)
"Heikin Ashi Rate of Change" => ta.crossunder(haRocPrice, emaValue)
=> ta.crossunder(close, emaValue)
// Filters
strongTrend = useAdxFilter ? adx >= adxThreshold : true
volumeConfirm = useVolumeFilter ? volumeSpike : true
// Entry Signals
longCondition = emaCrossUp and strongTrend and volumeConfirm
shortCondition = emaCrossDown and strongTrend and volumeConfirm
// =============================================
// === STRATEGY EXECUTION WITH EXIT MODES =====
// =============================================
// MODE 1: EXIT ON REVERSE SIGNAL
if (tradingMode == 1)
if (longCondition)
strategy.entry("Long", strategy.long)
strategy.close("Short")
if (shortCondition)
strategy.entry("Short", strategy.short)
strategy.close("Long")
// MODE 2: ATR-BASED TAKE PROFIT & STOP LOSS
else if (tradingMode == 2)
if (longCondition)
strategy.entry("Long", strategy.long)
strategy.exit("Long TP/SL", "Long",
profit=atrMultiplierTp * atrValue / syminfo.mintick,
loss=atrMultiplierSl * atrValue / syminfo.mintick)
if (shortCondition)
strategy.entry("Short", strategy.short)
strategy.exit("Short TP/SL", "Short",
profit=atrMultiplierTp * atrValue / syminfo.mintick,
loss=atrMultiplierSl * atrValue / syminfo.mintick)
// MODE 3: PERCENT-BASED TAKE PROFIT & STOP LOSS
else if (tradingMode == 3)
if (longCondition)
longTpPrice = close * (1 + takeProfitPercent / 100)
longSlPrice = close * (1 - stopLossPercent / 100)
strategy.entry("Long", strategy.long)
strategy.exit("Long TP/SL", "Long", limit=longTpPrice, stop=longSlPrice)
if (shortCondition)
shortTpPrice = close * (1 - takeProfitPercent / 100)
shortSlPrice = close * (1 + stopLossPercent / 100)
strategy.entry("Short", strategy.short)
strategy.exit("Short TP/SL", "Short", limit=shortTpPrice, stop=shortSlPrice)
// =============================================
// === VISUALIZATIONS =========================
// =============================================
// Plot EMA with dynamic color based on source type
emaColor = switch maSourceSelection
"Price" => color.blue
"Volume" => color.orange
"Rate of Change" => color.purple
"Heikin Ashi Price" => color.green
"Heikin Ashi Volume" => color.red
"Heikin Ashi Rate of Change" => color.maroon
=> color.blue
plot(emaValue, title="EMA", color=emaColor, linewidth=2)
// Plot source data for reference (in separate pane when not price-based)
sourceColor = maSourceSelection == "Price" or maSourceSelection == "Heikin Ashi Price" ? na : color.gray
plot(str.contains(maSourceSelection, "Price") ? na : emaSource, title="Source Data", color=sourceColor)
// Background color based on trend
bgcolor(bullishTrend ? color.new(color.green, 95) : color.new(color.red, 95), title="Trend Background")
// Entry signals
plotshape(longCondition, title="Long Signal", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape(shortCondition, title="Short Signal", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)
// Volume spikes
plotchar(useVolumeFilter and volumeSpike, title="Volume Spike", char="V", location=location.bottom, color=color.orange, size=size.tiny)
// ATR-based levels for Mode 2
plot(tradingMode == 2 and strategy.position_size > 0 ? strategy.position_avg_price + (atrMultiplierTp * atrValue) : na,
title="Long TP Level", color=color.green, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size > 0 ? strategy.position_avg_price - (atrMultiplierSl * atrValue) : na,
title="Long SL Level", color=color.red, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size < 0 ? strategy.position_avg_price - (atrMultiplierTp * atrValue) : na,
title="Short TP Level", color=color.green, style=plot.style_circles, linewidth=1)
plot(tradingMode == 2 and strategy.position_size < 0 ? strategy.position_avg_price + (atrMultiplierSl * atrValue) : na,
title="Short SL Level", color=color.red, style=plot.style_circles, linewidth=1)
// Alert conditions
alertcondition(longCondition, title="Long Entry", message="EMA Fusion Pro: Long entry signal")
alertcondition(shortCondition, title="Short Entry", message="EMA Fusion Pro: Short entry signal")