Dual Exponential Moving Average Trend Following Strategy adalah strategi trend following berdasarkan crossover EMA. Strategi ini menilai arah tren saat ini dengan menghitung garis EMA cepat dan garis EMA lambat dan bertindak pada crossover mereka. Ketika garis EMA cepat melintasi di atas garis EMA lambat, itu ditentukan sebagai sinyal bullish. Ketika garis EMA cepat melintasi di bawah garis EMA lambat, itu ditentukan sebagai sinyal bearish. Berdasarkan arah tren yang diidentifikasi, strategi ini dapat pergi panjang atau pergi pendek sesuai.
Logika inti dari strategi ini terletak pada perhitungan dua garis EMA dari periode yang berbeda - satu bertindak sebagai garis bearish dan satu bertindak sebagai garis bullish. Secara khusus, strategi menghitung garis EMA cepat 8 periode menggunakan indikator talib sebagai garis bullish. Dan menghitung garis EMA lambat 21 periode sebagai garis bearish. Kemudian menilai hubungan silang antara garis EMA cepat dan garis EMA lambat. Ketika garis cepat melintasi di atas garis lambat, itu menentukan sinyal bullish untuk pergi panjang. Ketika garis cepat melintasi di bawah garis lambat, itu menentukan sinyal bearish untuk pergi pendek.
Dalam hal eksekusi perdagangan yang sebenarnya, strategi ini dapat berjalan panjang saja, pendek saja, atau berjalan dua arah ketika penyeberangan terjadi antara garis cepat dan lambat. Juga, harga stop loss dan take profit dikonfigurasi dalam strategi. Setelah membuka posisi, jika harga bergerak ke arah yang tidak menguntungkan, stop loss akan dipicu untuk keluar dari posisi. Jika harga mencapai target level yang diharapkan, take profit akan direalisasikan dan menutup posisi.
Keuntungan terbesar dari strategi Dual EMA Trend Following terletak pada kemampuan identifikasi tren yang kuat dari crossover rata-rata bergerak. Sebagai alat umum untuk analisis tren, garis EMA dapat mengidentifikasi pergeseran tren dan titik balik melalui crossover, menghindari tertipu oleh kebisingan pasar dalam jangka pendek dan menangkap arah tren utama.
Selain itu, pengaturan fleksibel pada arah perdagangan membuat strategi dapat disesuaikan dengan tren satu arah dan osilasi dua arah, sehingga meningkatkan penerapan strategi.
Risiko terbesar dari strategi ini adalah sinyal palsu yang dipicu oleh penyeberangan kecil yang sering terjadi di bawah pasar yang terbatas pada kisaran. Ini akan menyebabkan pembukaan posisi yang berlebihan dan kerugian. Untuk mengatasi hal ini, kita dapat meningkatkan periode EMA untuk mengurangi waktu penyeberangan dan probabilitas sinyal palsu.
Di sisi lain, pengaturan stop loss yang terlalu ketat juga meningkatkan kemungkinan terhenti. Dalam hal ini, kita perlu memperluas rentang stop loss dengan hati-hati menyeimbangkan risiko terjebak.
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
Penyesuaian adaptatif pada periode EMA berdasarkan volatilitas pasar dan hasil backtest, menghindari overfit selama periode tetap.
Menambahkan kondisi filter untuk menyaring sinyal palsu, misalnya menggabungkan dengan volume perdagangan untuk menyaring crossover yang tidak signifikan; atau menggabungkan indikator lain seperti MACD dan KDJ untuk menghindari sinyal dalam ketidakpastian.
Mengoptimalkan strategi stop loss dan take profit, misalnya menggabungkan ATR untuk mewujudkan trailing dinamis pada SL/TP, mencegah SL yang terlalu ketat dan TP prematur.
Mencoba periode penyimpanan yang berbeda. Periode penyimpanan yang terlalu lama dapat dipengaruhi oleh insiden, sementara periode yang terlalu pendek menyebabkan biaya perdagangan dan biaya slippage yang tinggi. Menemukan hari penyimpanan yang optimal dapat meningkatkan profitabilitas strategi.
Secara umum, Dual EMA Trend Following Strategy adalah sistem perdagangan tren yang kuat dan praktis. Ini menangkap arah tren secara efektif melalui sistem crossover EMA. Sementara itu, pengaturan fleksibel pada arah perdagangan membuatnya dapat disesuaikan; risiko stop loss dan take profit yang dikonfigurasi. Dengan optimasi dan peningkatan lebih lanjut, strategi ini dapat menjadi alat yang kuat untuk perdagangan kuantitatif.
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradersPostInc //@version=5 strategy('TradersPost Example MOMO Strategy', overlay=true, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0) startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range') endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range') timeCondition = true timeConditionEnd = timeCondition[1] and not timeCondition fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length') slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length') sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None']) fastEma = ta.ema(close, fastEmaLength) slowEma = ta.ema(close, slowEmaLength) isUptrend = fastEma >= slowEma isDowntrend = fastEma <= slowEma trendChanging = ta.cross(fastEma, slowEma) ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on) ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on) plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true) plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true) aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true) bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true) fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90) tradersPostBuy = trendChanging and isUptrend and timeCondition tradersPostSell = trendChanging and isDowntrend and timeCondition pips = syminfo.pointvalue / syminfo.mintick percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips']) stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0) stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0) takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0) takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0) stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}' sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}' exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' if (sides != "None") if tradersPostBuy strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage) strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage) if tradersPostSell strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage) strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage) exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}' strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage) strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage) strategy.close_all(when = timeConditionEnd)