Strategi Dual Moving Average Crossover menilai arah tren harga dengan menghitung rata-rata bergerak dari periode yang berbeda, dan mewujudkan tren berikut.
Strategi ini didasarkan pada 9, 21 dan 50 periode Eksponensial Moving Averages (EMA). 9 periode EMA mewakili tren jangka pendek, 21 periode EMA mewakili tren jangka menengah, dan 50 periode EMA mewakili tren jangka panjang.
Ketika EMA periode 9 melintasi EMA periode 21, itu menandakan tren naik dalam jangka pendek, sehingga pergi panjang. Ketika EMA periode 9 melintasi di bawah EMA periode 21, itu menandakan tren menurun dalam jangka pendek, sehingga pergi pendek.
Logika untuk masuk panjang/pendek, mengambil keuntungan dan stop loss dikonfigurasi. Kondisi masuk adalah persilangan MA. Long take profit adalah harga masuk * (1 + input take profit ratio), short take profit adalah harga masuk * (1 - input take profit ratio). Long stop loss adalah harga masuk * (1 - input stop loss ratio), short stop loss adalah harga masuk * (1 + input stop loss ratio).
Beberapa filter juga ditambahkan, seperti filter tren untuk menghindari sisi, dan filter ekuitas untuk menghindari perdagangan ketika ekuitas strategi terlalu rendah. filter ini dapat membantu menghindari beberapa sinyal palsu.
Singkatnya, strategi ini menggunakan silang EMA ganda untuk menentukan arah tren harga, dengan mengambil keuntungan yang tepat dan logika stop loss, yang dapat menangkap tren jangka menengah hingga jangka panjang.
Menggunakan crossover MA ganda untuk menentukan arah tren, logika sederhana dan mudah dipahami.
Mengadopsi EMA dari periode yang berbeda dapat menilai tren jangka pendek dan jangka panjang.
Mengambil keuntungan dan stop loss logika kunci dalam keuntungan dan mengontrol risiko.
Filter membantu menghindari beberapa sinyal palsu sampai batas tertentu.
Parameter dapat diatur secara bebas, periode dapat dioptimalkan untuk lingkungan pasar yang berbeda.
Sebagai strategi faktor tunggal, sinyal perdagangan mungkin tidak cukup stabil. Whipsaws dapat terjadi selama konsolidasi harga.
Ketika crossover terjadi, harga mungkin sudah naik/turun, dengan risiko membeli tinggi dan menjual rendah.
Biaya perdagangan tidak dipertimbangkan, pengembalian sebenarnya bisa lebih rendah.
Tidak ada stop loss di tempat, risiko kerugian tak terbatas dalam kondisi pasar yang ekstrim.
Solusi:
Mengoptimalkan periode MA untuk sinyal yang lebih stabil.
Tambahkan indikator lain ke sinyal filter.
Meningkatkan ukuran perdagangan untuk mengurangi dampak biaya.
Atur stop loss yang tepat untuk membatasi kerugian maksimum.
Strategi dapat dioptimalkan dalam aspek berikut:
Optimalkan periode MA untuk menemukan kombinasi terbaik, atau gunakan optimasi adaptif untuk secara dinamis memilih periode terbaik.
Tambahkan indikator teknis lainnya seperti MACD, KD dll untuk menyaring sinyal dan meningkatkan kualitas, atau gunakan pembelajaran mesin untuk mencetak sinyal dan menyaring yang salah.
Masukkan analisis volume. Jangan mengambil sinyal jika volume tidak cukup pada penyeberangan MA.
Periksa fluktuasi harga sebelum crossover terjadi.
Membangun mekanisme stop loss dinamis seperti trailing stop loss, Chandelier Exit dll, untuk mengurangi jarak stop loss tetapi tetap efektif.
Mengoptimalkan ukuran posisi seperti tetap / dinamis / leveraged, untuk mencapai rasio keuntungan / kerugian yang lebih wajar.
Pertimbangkan secara komprehensif biaya perdagangan, slippage. Optimalkan rasio take profit / stop loss untuk memastikan profitabilitas dalam perdagangan langsung.
Struktur keseluruhan dari strategi ini adalah suara, dengan logika sederhana dari dua EMA crossover untuk menentukan arah tren, ditambah dengan mengambil keuntungan dan stop loss logika untuk menangkap tren. Sebagai strategi faktor tunggal, itu dapat lebih dioptimalkan pada parameter, filter sinyal dll untuk membuatnya lebih kuat. Dengan stop loss yang tepat dan ukuran posisi, risiko dapat lebih dikurangi. Secara keseluruhan, ini memberikan tren yang solid mengikuti kerangka strategi, yang dapat mencapai keuntungan yang konsisten setelah optimasi dan penyesuaian.
/*backtest start: 2023-10-16 00:00:00 end: 2023-11-15 00:00:00 period: 1h 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/ // © TradingMentalist //@version=4 strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs //turn on/off longs/shorts / extraneous conditions longinc=input(true, title="include longs?") lConSw2=input(true, title="condition two?") lConSw3=input(true, title="condition three?") shotinc=input(true, title="include shorts?") sConSw2=input(true, title="condition two?") sConSw3=input(true, title="condition three?") //turn on/off / adjust trade filters (average range/average equity) sidein2 = input(200, step=10, title='lookback for average range (bars)') sidein = input(1, title='filter trades if range is less than (%)')/100 equityIn = input(40, title='filter trades if equity is below ema()') sidewayssw = input(true, title='sideways filter?') equitysw = input(true, title='equity filter?') longtpin = input(1,step=0.1, title='long TP %')/100 longslin = input(0.4,step=0.1, title='long SL %')/100 shorttpin = input(1,step=0.1, title='short TP %')/100 shortslin = input(0.4,step=0.1, title='short SL %')/100 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters //(leave as is) side1 = (close[1] + close[sidein2]) / 2 side2 = close[1] - close[sidein2] side3 = side2 / side1 notsideways = side3 > sidein equityMa = equitysw ? ema(strategy.equity, equityIn) : 0 equityCon = strategy.equity >= equityMa ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators ma1 = ema(close, 9) ma2 = ema(close, 21) ma3 = ema(close, 50) plot(ma1, color=color.new(#E8B6B0,50)) plot(ma2, color=color.new(#B0E8BE,50)) plot(ma3, color=color.new(#00EEFF,50)) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions //adjust conditions //------------------------------------------- longCondition1 = crossover(ma2,ma3) longCondition2 = close[5] > close[10] longCondition3 = close[1] > close[2] shortCondition1 = crossover(ma3,ma2) shortCondition2 = close[5] < close[10] shortCondition3 = close[1] < close[2] closelong = shortCondition1 closeshort = longCondition1 //------------------------------------------- //(leave as is) longCondition1in = longCondition1 longCondition2in = lConSw2 ? longCondition2 : true longCondition3in = lConSw3 ? longCondition3 : true shortCondition1in = shortCondition1 shortCondition2in = sConSw2 ? shortCondition2: true shortCondition3in = sConSw3 ? shortCondition3: true longConditions = longCondition1in and longCondition2in and longCondition3in shortConditions = shortCondition1in and shortCondition2in and shortCondition3in ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution //(leave as is) long = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions short = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk //(leave as is) longtplevel = strategy.position_avg_price * (1 + longtpin) longsllevel = strategy.position_avg_price * (1 - longslin) shorttplevel = strategy.position_avg_price * (1 - shorttpin) shortsllevel = strategy.position_avg_price * (1 + shortslin) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe //adjust timeframe //------------------------------------------- startyear = 2000 startmonth = 1 startday = 1 stopyear = 9999 stopmonth = 12 stopday = 31 //------------------------------------------- //(leave as is) startperiod = timestamp(startyear,startmonth,startday,0,0) periodstop = timestamp(stopyear,stopmonth,stopday,0,0) timeframe() => time >= startperiod and time <= periodstop ? true : false ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders //comments are empty characters for clear chart if timeframe() if longinc if strategy.position_size == 0 or strategy.position_size > 0 strategy.entry(id="long", long=true, when=long, comment=" ") strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ") strategy.close(id="long", when=closelong, comment = " ") if shotinc if strategy.position_size == 0 or strategy.position_size < 0 strategy.entry(id="short", long=false, when=short, comment = " ") strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ") strategy.close(id="short", when=closeshort, comment = " ")