Strategi perdagangan crossover purata bergerak berganda menghasilkan isyarat perdagangan dengan mengira dua purata bergerak dengan tetapan parameter yang berbeza dan berdagang apabila purata bergerak bersilang.
Logik teras strategi ini ialah:
Parameter input: tempoh MA yang lebih cepat maLen1, tempoh MA yang lebih perlahan maLen2, jenis MA maTypeChoice
Mengira MA maValue1 yang lebih cepat dan MA maValue2 yang lebih perlahan berdasarkan parameter input
Tentukan syarat beli dan jual dengan membandingkan kedua-dua MA:
Beli apabila maValue1 melintasi di atas maValue2
Jual apabila maValue1 melintasi di bawah maValue2
Melakukan perdagangan pada isyarat beli dan jual
Melihat MA dalam warna yang berbeza berdasarkan hubungan mereka
Hantar isyarat amaran beli dan jual
Menggunakan sistem silang MA berganda, mengelakkan isyarat palsu dari MA tunggal
Tempoh MA yang boleh disesuaikan sesuai dengan jangkauan perdagangan yang berbeza
Logik yang mudah dan mudah difahami dan dilaksanakan
Isyarat isyarat yang boleh disesuaikan untuk pelaksanaan tepat pada masanya
Trend MA yang dipaparkan membentuk penunjuk perdagangan intuitif
Parameter yang boleh dioptimumkan untuk mencari kombinasi terbaik
Berlaku untuk backtesting dan perdagangan langsung
Pembebasan MA boleh menghasilkan isyarat palsu, memerlukan trend dan pengesahan corak tambahan
Whipsaws di sekitar persilangan MA menimbulkan kos perdagangan yang tidak perlu
Parameter yang tidak betul membawa kepada perdagangan berlebihan atau perdagangan jarang
Kejadian melampau menyebabkan perubahan harga yang besar, tidak dapat mengehadkan kerugian
Penghentian trend jangka panjang membatalkan penunjuk jangka pendek
Memerlukan pemantauan kerap, tidak sepenuhnya automatik
Pengurusan Risiko:
Tambah penapis trend untuk mengelakkan perdagangan terhadap trend
Tambah penapis corak untuk mengesahkan kesahihan isyarat
Mengoptimumkan parameter untuk kekerapan dagangan yang munasabah
Tetapkan stop loss/take profit untuk mengehadkan kerugian
Ujian ketahanan dalam jangka masa yang panjang
Penapis harga dan masa untuk mengelakkan pecah palsu
Uji parameter MA yang berbeza untuk mencari optimum
Uji pelbagai jenis MA untuk isyarat yang paling tepat
Tambah penapis trend untuk mengelakkan perdagangan kontra-trend
Tambah penapis turun naik untuk mengenal pasti titik keluar yang betul
Tambah penapis harga / masa untuk mengurangkan isyarat palsu
Melaksanakan kawalan slippage untuk perdagangan sebenar
Ujian ketahanan merentasi instrumen dan jangka masa
Mengintegrasikan auto stop loss/take profit
Meneroka pembelajaran mesin untuk meningkatkan strategi
Pertukaran purata bergerak berganda adalah strategi penunjuk teknikal klasik. Ia menjana isyarat dari persilangan MA dan boleh menghasilkan hasil backtest yang baik melalui pengoptimuman. Walau bagaimanapun, risiko seperti isyarat palsu tetap ada, yang memerlukan penapis tambahan. Dagangan sebenar juga memerlukan butiran pelaksanaan seperti kawalan slippage. Secara keseluruhan, strategi ini sesuai dengan perdagangan jangka menengah sebagai pilihan yang mudah dan intuitif. Dengan peningkatan berterusan dan pengesahan ketahanan, strategi ini dapat mencapai pulangan 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 )