Strategi Dagangan Crossover Rata-rata Bergerak Berganda

Penulis:ChaoZhang, Tarikh: 2023-10-13 15:40:49
Tag:

Ringkasan

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.

Logika Strategi

Logik teras strategi ini ialah:

  1. Parameter input: tempoh MA yang lebih cepat maLen1, tempoh MA yang lebih perlahan maLen2, jenis MA maTypeChoice

  2. Mengira MA maValue1 yang lebih cepat dan MA maValue2 yang lebih perlahan berdasarkan parameter input

  3. Tentukan syarat beli dan jual dengan membandingkan kedua-dua MA:

    • Beli apabila maValue1 melintasi di atas maValue2

    • Jual apabila maValue1 melintasi di bawah maValue2

  4. Melakukan perdagangan pada isyarat beli dan jual

  5. Melihat MA dalam warna yang berbeza berdasarkan hubungan mereka

  6. Hantar isyarat amaran beli dan jual

Kelebihan

  • 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

Risiko

  • 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

Arahan pengoptimuman

  • 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

Kesimpulan

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 )

Lebih lanjut