Strategi ini adalah sistem mengikuti trend yang menggabungkan pelbagai penunjuk teknikal, terutamanya mengintegrasikan lima Exponential Moving Averages (EMA) dari tempoh yang berbeza, Indeks Kekuatan Relatif (RSI), dan dua Saluran Donchian dari tempoh yang berbeza. Sistem ini menangkap trend pasaran melalui penyelarasan pelbagai penunjuk dan menguruskan risiko dan pulangan menggunakan sasaran stop-loss dan keuntungan dinamik.
Strategi ini menggunakan beberapa penunjuk teknikal untuk pengesahan isyarat: Pertama, ia menggunakan 5 EMA (9, 21, 55, 89, 144 tempoh) untuk membina kerangka trend, menentukan arah trend awal melalui persilangan antara EMA yang cepat dan perlahan. Kedua, ia menggunakan RSI (14 tempoh) sebagai penapis trend, yang memerlukan RSI berada di zon overbought (di atas 60) untuk kedudukan panjang dan zon oversold (di bawah 40) untuk kedudukan pendek, dengan itu mengelakkan perdagangan yang kerap di pasaran julat. Akhirnya, ia menggunakan Saluran Donchian 21 tempoh dan 74 tempoh untuk menentukan julat pergerakan harga, menyediakan rujukan struktur pasaran tambahan untuk perdagangan.
Strategi ini membina sistem perdagangan yang agak lengkap melalui gabungan beberapa penunjuk teknikal. Walaupun ia mempunyai beberapa kelewatan, ia dapat mencapai pulangan yang stabil di pasaran trend melalui penapisan isyarat yang ketat dan pengurusan risiko. Pedagang dinasihatkan untuk menyesuaikan parameter mengikut ciri pasaran tertentu dan toleransi risiko mereka dalam aplikasi praktikal. Sementara itu, pemantauan berterusan prestasi sistem dan penilaian tetap arah pengoptimuman diperlukan untuk memastikan strategi tetap dapat disesuaikan dengan perubahan pasaran.
/*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")