Trend Purata Bergerak Eksponen Dual Mengikut Strategi

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

img

Ringkasan

Strategi Mengikuti Trend Purata Bergerak Eksponensial Berganda adalah strategi mengikuti trend berdasarkan persimpangan purata bergerak eksponensial (EMA). Ia menilai arah trend semasa dengan mengira garis EMA pantas dan garis EMA perlahan dan bertindak pada persimpangan mereka. Apabila garis EMA pantas melintasi di atas garis EMA perlahan, ia ditentukan sebagai isyarat kenaikan. Apabila garis EMA pantas melintasi di bawah garis EMA perlahan, ia ditentukan sebagai isyarat penurunan. Berdasarkan arah trend yang dikenal pasti, strategi ini boleh panjang atau pendek dengan sewajarnya.

Logika Strategi

Logik teras strategi ini terletak pada mengira dua garis EMA dari tempoh yang berbeza - satu bertindak sebagai garis penurunan dan satu bertindak sebagai garis kenaikan. Khususnya, strategi mengira garis EMA pantas 8-periode menggunakan penunjuk talib sebagai garis kenaikan. Dan ia mengira garis EMA perlahan 21-periode sebagai garis penurunan. Kemudian ia menilai hubungan silang antara garis EMA pantas dan garis EMA perlahan. Apabila garis pantas melintasi di atas garis perlahan, ia menentukan isyarat kenaikan untuk pergi panjang. Apabila garis pantas melintasi di bawah garis perlahan, ia menentukan isyarat penurunan untuk pergi pendek.

Dari segi pelaksanaan perdagangan sebenar, strategi ini boleh pergi panjang sahaja, pergi pendek sahaja, atau pergi kedua-dua arah apabila persimpangan berlaku antara garis cepat dan perlahan. Juga, harga stop loss dan mengambil keuntungan dikonfigurasikan dalam strategi. Selepas membuka kedudukan, jika harga pergi ke arah yang tidak menguntungkan, stop loss akan dicetuskan untuk keluar kedudukan. Jika harga mencapai tahap sasaran yang dijangkakan, mengambil keuntungan akan merealisasikan dan menutup kedudukan.

Analisis Kelebihan

Kelebihan terbesar strategi Dual EMA Trend Following terletak pada keupayaan pengenalan trend crossover moving average yang kuat. Sebagai alat biasa untuk analisis trend, garis EMA dapat mengenal pasti perubahan trend dan titik balik melalui crossover, mengelakkan ditipu oleh bunyi pasaran dalam jangka pendek dan menangkap arah trend utama.

Selain itu, tetapan fleksibel pada arah perdagangan menjadikan strategi dapat disesuaikan dengan kedua-dua trend satu hala dan osilasi dua hala, sehingga meningkatkan penerapan strategi.

Analisis Risiko

Risiko terbesar strategi ini adalah isyarat palsu yang dicetuskan oleh persimpangan kecil yang kerap di bawah pasaran terhad julat. Ini akan membawa kepada pembukaan kedudukan yang berlebihan dan kerugian. Untuk menangani ini, kita boleh meningkatkan tempoh EMA untuk mengurangkan masa persimpangan dan kebarangkalian isyarat palsu.

Di sisi lain, tetapan stop loss yang terlalu ketat juga meningkatkan peluang untuk berhenti. Dalam kes ini, kita perlu mengembangkan julat stop loss dengan berhati-hati mengimbangi risiko terperangkap.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Penyesuaian penyesuaian untuk tempoh EMA berdasarkan turun naik pasaran dan hasil backtest, mengelakkan overfitting dalam tempoh tetap.

  2. Menambah keadaan penapis untuk menapis isyarat palsu, contohnya menggabungkan dengan jumlah dagangan untuk menapis persilangan yang tidak penting; atau menggabungkan penunjuk lain seperti MACD dan KDJ untuk mengelakkan isyarat dalam ketidakpastian.

  3. Mengoptimumkan strategi stop loss dan mengambil keuntungan, contohnya menggabungkan ATR untuk merealisasikan trailing dinamik pada SL / TP, mencegah SL yang terlalu ketat dan TP awal.

  4. Ujian tempoh penahan yang berbeza. Tempoh penahan yang terlalu lama boleh dipengaruhi oleh insiden, sementara tempoh yang terlalu pendek membawa kepada kos perdagangan yang tinggi dan kos slippage. Mencari hari penahan yang optimum dapat meningkatkan keuntungan strategi.

Ringkasan

Secara umum, Dual EMA Trend Following Strategy adalah sistem perdagangan trend yang kukuh dan praktikal. Ia menangkap arah trend dengan berkesan melalui sistem silang EMA. Sementara itu, tetapan fleksibel pada arah perdagangan menjadikannya mudah disesuaikan; risiko kawalan stop loss dan mengambil keuntungan yang dikonfigurasikan. Dengan pengoptimuman dan peningkatan lanjut, strategi ini boleh 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 lanjut