Strategi Perdagangan Crossover Rata-rata Pergerakan Ganda


Tanggal Pembuatan: 2023-10-13 15:40:49 Akhirnya memodifikasi: 2023-10-13 15:40:49
menyalin: 0 Jumlah klik: 743
1
fokus pada
1617
Pengikut

Ringkasan

Strategi perdagangan silang dua rata-rata dengan menghitung rata-rata dari dua pengaturan parameter yang berbeda, dan melakukan operasi beli dan jual melalui persilangan rata-rata. Strategi ini sederhana dan langsung, cocok untuk perdagangan jangka pendek menengah.

Prinsip Strategi

Strategi ini terutama dengan memasukkan parameter seperti siklus rata-rata cepat, siklus rata-rata lambat, dan jenis rata-rata, untuk menghitung rata-rata cepat dan rata-rata lambat. Operasi pembelian dilakukan ketika rata-rata cepat melewati rata-rata lambat di atas rata-rata cepat dan operasi penjualan dilakukan ketika rata-rata lambat melewati rata-rata cepat di bawah rata-rata cepat.

Logika inti dari strategi ini adalah:

  1. Masukkan parameter: siklus rata-rata cepat maLen1, siklus rata-rata lambat maLen2, tipe rata-rata maTypeChoice

  2. Rata-rata kecepatan cepat maValue1 dan rata-rata kecepatan lambat maValue2 berdasarkan parameter input

  3. Bandingkan dua hubungan ukuran garis rata untuk menentukan kondisi pembelian dan penjualan:

    • Kondisi pembelian: maValue1 memakai maValue2

    • Kondisi penjualan: maValue1 di bawah maValue2

  4. Melakukan transaksi yang sesuai saat kondisi pembelian dan penjualan terwujud

  5. Garis rata ditampilkan secara visual, dan hubungan ukuran garis rata dibedakan dengan warna yang berbeda

  6. Menerbitkan sinyal untuk membeli dan menjual

Keunggulan Strategis

  • Menggunakan prinsip dua garis sejajar silang, untuk menghindari salah kaprah oleh getaran satu garis sejajar

  • Parameter rata-rata linear dapat disesuaikan untuk operasi siklus yang berbeda

  • Logika transaksi sederhana dan mudah dipahami

  • Tanda-tanda pembelian dan penjualan yang dapat disesuaikan, untuk mengetahui waktu transaksi secara real-time

  • Visualisasi menunjukkan pergerakan rata-rata, membentuk indikator perdagangan intuitif

  • Optimalisasi parameter untuk menemukan kombinasi parameter yang optimal

  • Dapat digunakan untuk retrospeksi mencari parameter optimal, juga dapat digunakan untuk perdagangan hard disk

Risiko Strategis

  • Persilangan rata-rata mudah menghasilkan sinyal yang salah, dan harus dinilai dalam kombinasi tren dan bentuk

  • Pada saat bergejolak, sering membuka posisi dapat menyebabkan kerugian biaya transaksi.

  • Parameter yang salah dapat menyebabkan terlalu sering atau tidak sering bertransaksi

  • Kejadian yang tak terduga dapat menyebabkan situasi yang tidak dapat dihindari.

  • Indikator siklus pendek mungkin tidak berfungsi saat siklus besar pecah

  • Perangkat lunak ini membutuhkan pemantauan yang sering dan tidak sepenuhnya otomatis.

Solusi untuk Mengatasi Risiko:

  • Menggunakan Indeks Tren untuk Menghindari Perdagangan Besi Bergoyang

  • Kombinasi indikator morfologi untuk mengkonfirmasi efektivitas sinyal

  • Optimalkan parameter agar frekuensi transaksi mencapai tingkat yang wajar

  • Tetapkan Stop Loss Stop Point untuk mengendalikan kerugian tunggal

  • Stabilitas parameter yang diverifikasi dalam beberapa periode waktu

  • Filter waktu atau sinyal untuk menghindari penembusan palsu

Arah optimasi strategi

  • Uji parameter rata-rata yang berbeda untuk mencari parameter optimal

  • Uji jenis rata-rata yang berbeda, pilih rata-rata yang paling akurat untuk menghasilkan sinyal

  • Menggunakan indikator tren untuk menghindari perdagangan yang tidak sesuai tren

  • Menggabungkan indikator fluktuasi untuk menentukan waktu bermain yang tepat

  • Tambahkan waktu atau sinyal filter, mengurangi sinyal yang salah

  • Mengatur kontrol slider untuk mengoptimalkan efek perdagangan

  • Stabilitas multi-varietas multi-siklus

  • Tergabung dalam strategi stop loss otomatis

  • Menjelajahi teknologi seperti pembelajaran mesin untuk meningkatkan hasil pengukuran

Meringkaskan

Strategi crossover linier ganda adalah strategi indikator teknis yang sangat khas. Ini menggunakan prinsip crossover linier yang cepat dan lambat untuk menghasilkan sinyal perdagangan, dan dapat memperoleh hasil yang baik dengan pengoptimalan parameter. Namun, strategi ini juga memiliki risiko tertentu, perlu bekerja sama dengan tren, bentuk, dan indikator teknis lainnya untuk melakukan verifikasi, mengurangi tingkat sinyal yang salah. Selain itu, dalam perdagangan langsung, detail perdagangan seperti kontrol slippage juga perlu dipertimbangkan.

Kode Sumber Strategi
/*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 )