Strategi perdagangan lintas rata-rata bergerak ganda

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

Gambaran umum

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 Strategi

Logika inti dari strategi ini adalah:

  1. Parameter input: periode MA yang lebih cepat maLen1, periode MA yang lebih lambat maLen2, jenis MA maTypeChoice

  2. Menghitung MA maValue1 yang lebih cepat dan MA maValue2 yang lebih lambat berdasarkan parameter input

  3. Mendefinisikan kondisi pembelian dan penjualan dengan membandingkan kedua MA:

    • Beli ketika maValue1 melintasi di atas maValue2

    • Jual ketika maValue1 melintasi di bawah maValue2

  4. Mengeksekusi perdagangan pada sinyal beli dan jual

  5. Visualisasikan MA dengan warna yang berbeda berdasarkan hubungan mereka

  6. Mengirim sinyal peringatan beli dan jual

Keuntungan

  • 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

Risiko

  • 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

Arahan Optimasi

  • 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

Kesimpulan

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 )

Lebih banyak