Strategi Dagangan Crossover Purata Pergerakan Berganda


Tarikh penciptaan: 2023-10-13 15:40:49 Akhirnya diubah suai: 2023-10-13 15:40:49
Salin: 0 Bilangan klik: 447
1
fokus pada
1234
Pengikut

Gambaran keseluruhan

Strategi perdagangan silang dua garis rata-rata dengan mengira garis rata-rata dengan dua parameter yang berbeza, dan melakukan pembelian dan penjualan melalui persilangan garis rata-rata. Strategi ini sederhana dan langsung, sesuai untuk perdagangan jangka pendek dan sederhana.

Prinsip Strategi

Strategi ini dikira dengan memasukkan parameter seperti kitaran garis rata-rata cepat, kitaran garis rata-rata perlahan, dan jenis garis rata-rata. Apabila garis rata-rata cepat melintasi garis rata-rata perlahan, anda boleh membeli; apabila garis rata-rata cepat melintasi garis rata-rata perlahan, anda boleh menjual.

Logik utama strategi ini ialah:

  1. Parameter input: kitaran purata cepat maLen1, kitaran purata perlahan maLen2, jenis purata maTypeChoice

  2. MaValue1 dan MaValue2 yang dikira berdasarkan parameter input

  3. Bandingkan hubungan saiz dua garis rata untuk menentukan syarat pembelian dan penjualan:

    • Syarat pembelian: maValue1 memakai maValue2

    • Syarat jualan: maValue1 memakai maValue2

  4. Melakukan operasi dagangan yang sesuai apabila syarat untuk membeli dan menjual telah ditetapkan

  5. Garis rata ditunjukkan secara visual, dan hubungan saiz garis rata dibedakan dengan warna yang berbeza

  6. Menghantar isyarat membeli dan menjual

Kelebihan Strategik

  • Menggunakan prinsip persilangan dua garis sejajar, untuk mengelakkan salah kaprah oleh getaran satu garis sejajar

  • Parameter garis purata boleh disesuaikan untuk operasi kitaran yang berbeza

  • Logik urus niaga mudah, mudah difahami dan mudah dilaksanakan

  • Tanda-tanda pembelian dan penjualan yang boleh disesuaikan untuk mengetahui masa perdagangan dalam masa nyata

  • Pemandangan yang menunjukkan pergerakan garis rata, membentuk penunjuk perdagangan intuitif

  • Mencari kombinasi parameter yang optimum melalui pengoptimuman parameter

  • Boleh digunakan untuk mengesan kembali mencari parameter optimum, juga boleh digunakan untuk perdagangan cakera keras

Risiko Strategik

  • Persahabatan rata-rata mudah menghasilkan isyarat yang salah, yang harus dinilai dengan gabungan trend dan bentuk

  • Dalam pergerakan bi-mechanical, mudah untuk membuka kedudukan yang kerap menyebabkan kerugian kos dagangan

  • Parameter yang tidak betul boleh menyebabkan terlalu kerap atau tidak kerap berdagang

  • Kejadian yang tidak dijangka boleh menyebabkan keadaan yang teruk dan tidak dapat dielakkan

  • Indeks kitaran pendek mungkin tidak berfungsi apabila kitaran besar pecah

  • Ia memerlukan pemantauan yang kerap dan tidak boleh dilakukan secara automatik.

Penyelesaian risiko:

  • Kaedah untuk mengelakkan dagangan tergesa-gesa dengan menggunakan indikator trend

  • Gabungan penunjuk bentuk untuk mengesahkan keberkesanan isyarat

  • Optimumkan parameter untuk mencapai tahap frekuensi yang munasabah

  • Tetapkan titik hentian kerugian untuk mengawal kerugian tunggal

  • Kestabilan parameter yang disahkan dalam tempoh masa yang berbilang

  • Menggunakan penapis masa atau isyarat untuk mengelakkan penembusan palsu

Arah pengoptimuman strategi

  • Uji parameter rata-rata yang berbeza untuk mencari parameter optimum

  • Uji pelbagai jenis garis rata, pilih garis rata yang paling tepat untuk menghasilkan isyarat

  • Menggabungkan Indikator Trend untuk Mengelakkan Perdagangan Berlawanan Trend

  • Kaedah untuk menentukan masa yang sesuai untuk beraksi dengan menggunakan indikator turun naik

  • Menambah penapis masa atau isyarat untuk mengurangkan isyarat yang salah

  • Tetapkan kawalan titik geser untuk mengoptimumkan perdagangan cakera keras

  • Stabiliti yang disahkan oleh pelbagai jenis dan pelbagai kitaran

  • Menyertai strategi berhenti rugi automatik

  • Meneroka teknologi seperti pembelajaran mesin untuk meningkatkan pengesanan

ringkaskan

Strategi persilangan dua garis sejajar adalah strategi penunjuk teknikal yang sangat tipikal. Ia menggunakan prinsip persilangan rata-rata yang cepat dan perlahan untuk menghasilkan isyarat dagangan, dan hasil pengkajian yang baik dapat diperoleh dengan pengoptimuman parameter. Tetapi strategi ini juga mempunyai risiko tertentu, perlu bekerja dengan trend, bentuk dan lain-lain petunjuk teknikal untuk mengesahkan, mengurangkan kadar isyarat yang salah.

Kod 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 )