Tren Rata-rata Bergerak Eksponensial Ganda Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2024-02-02 17:11:29
Tag:

img

Gambaran umum

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 Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Penyesuaian adaptatif pada periode EMA berdasarkan volatilitas pasar dan hasil backtest, menghindari overfit selama periode tetap.

  2. 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.

  3. 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.

  4. 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.

Ringkasan

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)

Lebih banyak