Strategi silang purata bergerak berganda

Penulis:ChaoZhang, Tarikh: 2023-11-16 17:50:52
Tag:

img

Ringkasan

Strategi Crossover Purata Bergerak Berganda menilai arah trend harga dengan mengira purata bergerak dari tempoh yang berbeza, dan merealisasikan trend berikut. Ia menjadi panjang apabila MA tempoh pendek melintasi MA tempoh panjang, dan menjadi pendek apabila MA tempoh pendek melintasi di bawah MA tempoh panjang.

Logika Strategi

Strategi ini adalah berdasarkan 9, 21 dan 50 tempoh EMA. 9 tempoh EMA mewakili trend jangka pendek, 21 tempoh EMA mewakili trend jangka sederhana, dan 50 tempoh EMA mewakili trend jangka panjang.

Apabila EMA tempoh 9 melintasi EMA tempoh 21, ia menandakan aliran menaik dalam jangka pendek, dengan itu pergi panjang. Apabila EMA tempoh 9 melintasi di bawah EMA tempoh 21, ia menandakan aliran menurun dalam jangka pendek, dengan itu pergi pendek.

Logik untuk masuk panjang/pendek, mengambil keuntungan dan stop loss dikonfigurasikan. Syarat masuk adalah persilangan MA. Long mengambil keuntungan adalah harga masuk * (1 + input mengambil keuntungan nisbah), mengambil keuntungan pendek adalah harga masuk * (1 - input mengambil keuntungan nisbah). Stop loss panjang adalah harga masuk * (1 - input stop loss nisbah), stop loss pendek adalah harga masuk * (1 + input stop loss nisbah).

Beberapa penapis juga ditambah, seperti penapis trend untuk mengelakkan sisi, dan penapis ekuiti untuk mengelakkan perdagangan apabila ekuiti strategi terlalu rendah.

Ringkasnya, strategi ini menggunakan silang EMA berganda untuk menentukan arah trend harga, dengan mengambil keuntungan yang betul dan logik berhenti kerugian, yang dapat menangkap trend jangka menengah hingga panjang.

Analisis Kelebihan

  • Menggunakan persilangan MA berganda untuk menentukan arah trend, logiknya mudah dan mudah difahami.

  • Mengambil EMA tempoh yang berbeza boleh menilai trend jangka pendek dan jangka panjang.

  • Mengambil keuntungan dan berhenti kehilangan logik kunci dalam keuntungan dan kawalan risiko.

  • Penapis membantu mengelakkan beberapa isyarat palsu hingga tahap tertentu.

  • Parameter boleh dikonfigurasikan secara bebas, tempoh boleh dioptimumkan untuk persekitaran pasaran yang berbeza.

Analisis Risiko

  • Sebagai strategi faktor tunggal, isyarat perdagangan mungkin tidak cukup stabil. Whipsaws mungkin berlaku semasa penyatuan harga.

  • Apabila persilangan berlaku, harga mungkin telah naik / turun dengan risiko membeli tinggi dan menjual rendah.

  • Kos dagangan tidak dipertimbangkan, pulangan sebenar mungkin lebih rendah.

  • Tiada stop loss di tempat, risiko kerugian tidak terhad dalam keadaan pasaran yang melampau.

Penyelesaian:

  1. Mengoptimumkan tempoh MA untuk isyarat yang lebih stabil.

  2. Tambah penunjuk lain untuk menapis isyarat.

  3. Meningkatkan saiz perdagangan untuk mengurangkan kesan kos.

  4. Tetapkan stop loss yang betul untuk menghadkan kerugian maksimum.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Mengoptimumkan tempoh MA untuk mencari kombinasi terbaik, atau menggunakan pengoptimuman adaptif untuk memilih tempoh terbaik secara dinamik.

  2. Tambah penunjuk teknikal lain seperti MACD, KD dan lain-lain untuk menapis isyarat dan meningkatkan kualiti, atau gunakan pembelajaran mesin untuk menjaringkan isyarat dan menapis yang salah.

  3. Masukkan analisis jumlah. Jangan mengambil isyarat jika jumlah tidak mencukupi pada persimpangan MA.

  4. Periksa turun naik harga sebelum crossover berlaku. crossover dalam pasaran berkisar mungkin isyarat palsu.

  5. Membina mekanisme stop loss dinamik seperti trailing stop loss, Chandelier Exit dll, untuk mengurangkan jarak stop loss tetapi mengekalkannya berkesan.

  6. Mengoptimumkan saiz kedudukan seperti tetap / dinamik / leveraged, untuk mencapai nisbah keuntungan / kerugian yang lebih munasabah.

  7. Mempertimbangkan kos dagangan secara komprehensif, slippage. Mengoptimumkan nisbah mengambil keuntungan / berhenti kerugian untuk memastikan keuntungan dalam perdagangan langsung.

Kesimpulan

Struktur keseluruhan strategi ini adalah bunyi, dengan logik crossover EMA berganda yang mudah untuk menentukan arah trend, ditambah dengan mengambil keuntungan dan logik stop loss untuk menangkap trend. Sebagai strategi faktor tunggal, ia boleh dioptimumkan lebih lanjut pada parameter, penapis isyarat dan lain-lain untuk menjadikannya lebih kukuh. Dengan kehilangan berhenti dan saiz kedudukan yang betul, risiko dapat dikurangkan lagi. Secara keseluruhan, ia menyediakan trend yang kukuh mengikuti rangka kerja strategi, yang dapat mencapai keuntungan yang konsisten selepas pengoptimuman dan penyesuaian.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

Lebih lanjut