Эта стратегия представляет собой тенденционную систему, которая сочетает в себе множество технических индикаторов, в основном включая пять экспоненциальных скользящих средних (EMAs) разных периодов, индекс относительной силы (RSI) и два Дончианских канала разных периодов.
Стратегия использует множество технических индикаторов для подтверждения сигналов: во-первых, она использует 5 EMA (9, 21, 55, 89, 144 периода) для построения структуры тренда, определяющей начальное направление тренда посредством перекрестного взаимодействия между быстрыми и медленными EMA. Во-вторых, она использует RSI (14 периодов) в качестве фильтра тренда, требуя, чтобы RSI находился в зоне перекупленности (выше 60) для длинных позиций и зоне перепроданности (ниже 40) для коротких позиций, избегая таким образом частой торговли на рыночных диапазонах. Наконец, она использует 21-периодные и 74-периодные Дончианские каналы для определения диапазонов движения цен, обеспечивая дополнительную структуру рынка ссылок для торговли.
Стратегия строит относительно полную торговую систему путем сочетания нескольких технических индикаторов. Хотя она имеет некоторое отставание, она может достичь стабильной доходности на трендовых рынках благодаря строгой фильтрации сигналов и управлению рисками. Трейдерам рекомендуется корректировать параметры в соответствии с конкретными характеристиками рынка и их терпимостью к риску в практических приложениях. Между тем, необходимо постоянное наблюдение за производительностью системы и регулярное оценку направлений оптимизации, чтобы гарантировать, что стратегия остается адаптивной к изменениям рынка.
/*backtest start: 2019-12-23 08:00:00 end: 2024-12-04 00:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("EMA RSI Donchian Strategy", overlay=true) // Input parameters fastEmaLength = input(9, title="Fast EMA Length") midEmaLength = input(21, title="Mid EMA Length") slowEmaLength = input(55, title="Slow EMA Length") ema89Length = input(89, title="89 EMA Length") ema144Length = input(144, title="144 EMA Length") rsiPeriod = input(14, title="RSI Period") rsiOverbought = input(60, title="RSI Overbought Level") rsiOversold = input(40, title="RSI Oversold Level") donchianLength1 = input(21, title="Donchian Channel Length 1") donchianLength2 = input(74, title="Donchian Channel Length 2") // EMA calculations fastEma = ta.ema(close, fastEmaLength) midEma = ta.ema(close, midEmaLength) slowEma = ta.ema(close, slowEmaLength) ema89 = ta.ema(close, ema89Length) ema144 = ta.ema(close, ema144Length) // RSI calculation rsi = ta.rsi(close, rsiPeriod) // Donchian Channel calculations donchianUpper1 = ta.highest(high, donchianLength1) donchianLower1 = ta.lowest(low, donchianLength1) donchianUpper2 = ta.highest(high, donchianLength2) donchianLower2 = ta.lowest(low, donchianLength2) donchianMid1 = (donchianUpper1 + donchianLower1) / 2 donchianMid2 = (donchianUpper2 + donchianLower2) / 2 // Plot EMAs plot(fastEma, color=color.green, linewidth=2, title="Fast EMA") plot(midEma, color=color.blue, linewidth=2, title="Mid EMA") plot(slowEma, color=color.orange, linewidth=2, title="Slow EMA") plot(ema89, color=color.red, linewidth=2, title="89 EMA") plot(ema144, color=color.purple, linewidth=2, title="144 EMA") // Plot Donchian Channels plot(donchianUpper1, color=color.new(color.blue, 0), title="Donchian Upper 1") plot(donchianLower1, color=color.new(color.blue, 0), title="Donchian Lower 1") plot(donchianMid1, color=color.new(color.blue, 80), title="Donchian Mid 1") plot(donchianUpper2, color=color.new(color.red, 0), title="Donchian Upper 2") plot(donchianLower2, color=color.new(color.red, 0), title="Donchian Lower 2") plot(donchianMid2, color=color.new(color.red, 80), title="Donchian Mid 2") // Entry Conditions longCondition = ta.crossover(fastEma, slowEma) and rsi > rsiOverbought shortCondition = ta.crossunder(fastEma, slowEma) and rsi < rsiOversold // Stop Loss and Take Profit var float longStopLoss = na var float longTakeProfit1 = na var float longTakeProfit2 = na var float shortStopLoss = na var float shortTakeProfit1 = na var float shortTakeProfit2 = na if longCondition longStopLoss := high * 0.99 longTakeProfit1 := longStopLoss * 1.02618 longTakeProfit2 := longStopLoss * 1.036185 strategy.entry("Long", strategy.long) if shortCondition shortStopLoss := low * 1.01 shortTakeProfit1 := shortStopLoss * 0.97382 shortTakeProfit2 := shortTakeProfit1 * 0.96381 strategy.entry("Short", strategy.short) // Exit Conditions if not na(longStopLoss) strategy.exit("Take Profit 1", "Long", limit=longTakeProfit1) strategy.exit("Take Profit 2", "Long", limit=longTakeProfit2) strategy.exit("Stop Loss", "Long", stop=longStopLoss) if not na(shortStopLoss) strategy.exit("Take Profit 1", "Short", limit= shortTakeProfit1) strategy.exit("Take Profit 2", "Short", limit=shortTakeProfit2) strategy.exit("Stop Loss", "Short", stop=shortStopLoss) // Labels for buy and sell signals if longCondition label.new(bar_index, low, "Buy", color=color.green, style=label.style_label_up, textcolor=color.white) if shortCondition label.new(bar_index, high, "Sell", color=color.red, style=label.style_label_down, textcolor=color.white) // Alerts alertcondition(longCondition, title="Long Entry Alert", message="Long entry signal") alertcondition(shortCondition, title="Short Entry Alert", message="Short entry signal")