Strategi perdagangan crossover rata-rata bergerak ganda menghasilkan sinyal perdagangan dengan menghitung dua rata-rata bergerak dengan pengaturan parameter yang berbeda dan perdagangan ketika rata-rata bergerak bersilang.
Logika inti dari strategi ini adalah:
Parameter input: periode MA yang lebih cepat maLen1, periode MA yang lebih lambat maLen2, jenis MA maTypeChoice
Menghitung MA maValue1 yang lebih cepat dan MA maValue2 yang lebih lambat berdasarkan parameter input
Mendefinisikan kondisi pembelian dan penjualan dengan membandingkan kedua MA:
Beli ketika maValue1 melintasi di atas maValue2
Jual ketika maValue1 melintasi di bawah maValue2
Mengeksekusi perdagangan pada sinyal beli dan jual
Visualisasikan MA dengan warna yang berbeda berdasarkan hubungan mereka
Mengirim sinyal peringatan beli dan jual
Menggunakan sistem crossover MA ganda, menghindari sinyal palsu dari MA tunggal
Periode MA yang dapat disesuaikan sesuai dengan jangkauan perdagangan yang berbeda
Logika yang sederhana dan langsung, mudah dipahami dan diterapkan
Pemberitahuan sinyal yang dapat disesuaikan untuk eksekusi tepat waktu
Tren MA yang ditampilkan membentuk indikator perdagangan intuitif
Parameter yang dapat dioptimalkan untuk menemukan kombinasi terbaik
Berlaku untuk backtesting dan perdagangan langsung
Pembebasan MA dapat menghasilkan sinyal palsu, membutuhkan konfirmasi tren dan pola tambahan
Whipsaws di sekitar MA crossover menimbulkan biaya perdagangan yang tidak perlu
Parameter yang tidak tepat menyebabkan perdagangan yang berlebihan atau trading yang jarang
Kejadian ekstrim menyebabkan perubahan harga yang sangat besar, tidak dapat membatasi kerugian
Pelanggaran tren jangka panjang membatalkan indikator jangka pendek
Membutuhkan pemantauan sering, tidak sepenuhnya otomatis
Manajemen Risiko:
Tambahkan filter tren untuk menghindari perdagangan melawan tren
Tambahkan filter pola untuk mengkonfirmasi validitas sinyal
Mengoptimalkan parameter untuk frekuensi perdagangan yang wajar
Setel stop loss/take profit untuk membatasi kerugian
Uji ketahanan dalam jangka waktu yang panjang
Filter harga dan waktu untuk menghindari kebocoran palsu
Uji parameter MA yang berbeda untuk menemukan yang optimal
Uji berbagai jenis MA untuk sinyal yang paling akurat
Tambahkan filter tren untuk menghindari perdagangan kontra-tren
Tambahkan filter volatilitas untuk mengidentifikasi titik keluar yang tepat
Tambahkan filter harga/waktu untuk mengurangi sinyal palsu
Menerapkan kontrol slippage untuk perdagangan nyata
Uji ketahanan di seluruh instrumen dan kerangka waktu
Mengintegrasikan stop loss otomatis/take profit
Jelajahi pembelajaran mesin untuk meningkatkan strategi
Dual Moving Average Crossover adalah strategi indikator teknis klasik. Ini menghasilkan sinyal dari MA cross dan dapat menghasilkan hasil backtest yang baik melalui optimasi. Namun, risiko seperti sinyal palsu tetap ada, yang membutuhkan filter tambahan. Perdagangan nyata juga membutuhkan detail eksekusi seperti kontrol slippage. Secara keseluruhan, strategi ini cocok untuk perdagangan jangka menengah sebagai pilihan yang sederhana dan intuitif. Dengan perbaikan berkelanjutan dan validasi ketahanan, strategi ini dapat mencapai pengembalian yang stabil dalam perdagangan langsung.
/*backtest start: 2023-10-05 00:00:00 end: 2023-10-05 22:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // © sehweijun //study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="") // strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract) maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] ) maSrc = input( close, title="MA Source" ) maLen1 = input( 15, minval=1, title="MA Length" ) maLen2 = input( 95, minval=1, title="MA Length" ) maValue1 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen1 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen1 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen1 ) else 0 maValue2 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen2 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen2 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen2 ) else 0 buySignal = crossover( maValue1, maValue2 ) sellSignal = crossunder( maValue1, maValue2 ) mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 ) //plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 ) var color buyCandleColour = #00ff0a var color sellCandleColour = #ff1100 barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" ) bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour") alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!") alertcondition( buySignal, title="Buy signal!", message="Buy signal!") alertcondition( sellSignal, title="Sell signal!", message="Sell signal!") // Strategy Tester stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session ) startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session ) maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer ) maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer ) contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer ) tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false) fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" ) fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" ) fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970) thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" // strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash ) // strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash ) isTime(_position) => range = time( timeframe.period, _position + ':1234567' ) bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 ) if ( stratTesterOn and window() ) if ( buySignal and isTime( entryTime ) ) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Buy", strategy.long, contractSize ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) if ( sellSignal and isTime( entryTime )) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Sell", strategy.short, contractSize ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 ) if ( maValue1 > maValue2 ) strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) else strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) strategy.close_all( when=not isTime( entryTime ) ) plot( strategy.equity )