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.
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.
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.
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.
Strategi ini boleh dioptimumkan lagi dalam aspek berikut:
Penyesuaian penyesuaian untuk tempoh EMA berdasarkan turun naik pasaran dan hasil backtest, mengelakkan overfitting dalam tempoh tetap.
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.
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.
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.
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)