Strategi Crossover Rata-rata Bergerak Ganda

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

img

Gambaran umum

Strategi Dual Moving Average Crossover menilai arah tren harga dengan menghitung rata-rata bergerak dari periode yang berbeda, dan mewujudkan tren berikut.

Logika Strategi

Strategi ini didasarkan pada 9, 21 dan 50 periode Eksponensial Moving Averages (EMA). 9 periode EMA mewakili tren jangka pendek, 21 periode EMA mewakili tren jangka menengah, dan 50 periode EMA mewakili tren jangka panjang.

Ketika EMA periode 9 melintasi EMA periode 21, itu menandakan tren naik dalam jangka pendek, sehingga pergi panjang. Ketika EMA periode 9 melintasi di bawah EMA periode 21, itu menandakan tren menurun dalam jangka pendek, sehingga pergi pendek.

Logika untuk masuk panjang/pendek, mengambil keuntungan dan stop loss dikonfigurasi. Kondisi masuk adalah persilangan MA. Long take profit adalah harga masuk * (1 + input take profit ratio), short take profit adalah harga masuk * (1 - input take profit ratio). Long stop loss adalah harga masuk * (1 - input stop loss ratio), short stop loss adalah harga masuk * (1 + input stop loss ratio).

Beberapa filter juga ditambahkan, seperti filter tren untuk menghindari sisi, dan filter ekuitas untuk menghindari perdagangan ketika ekuitas strategi terlalu rendah. filter ini dapat membantu menghindari beberapa sinyal palsu.

Singkatnya, strategi ini menggunakan silang EMA ganda untuk menentukan arah tren harga, dengan mengambil keuntungan yang tepat dan logika stop loss, yang dapat menangkap tren jangka menengah hingga jangka panjang.

Analisis Keuntungan

  • Menggunakan crossover MA ganda untuk menentukan arah tren, logika sederhana dan mudah dipahami.

  • Mengadopsi EMA dari periode yang berbeda dapat menilai tren jangka pendek dan jangka panjang.

  • Mengambil keuntungan dan stop loss logika kunci dalam keuntungan dan mengontrol risiko.

  • Filter membantu menghindari beberapa sinyal palsu sampai batas tertentu.

  • Parameter dapat diatur secara bebas, periode dapat dioptimalkan untuk lingkungan pasar yang berbeda.

Analisis Risiko

  • Sebagai strategi faktor tunggal, sinyal perdagangan mungkin tidak cukup stabil. Whipsaws dapat terjadi selama konsolidasi harga.

  • Ketika crossover terjadi, harga mungkin sudah naik/turun, dengan risiko membeli tinggi dan menjual rendah.

  • Biaya perdagangan tidak dipertimbangkan, pengembalian sebenarnya bisa lebih rendah.

  • Tidak ada stop loss di tempat, risiko kerugian tak terbatas dalam kondisi pasar yang ekstrim.

Solusi:

  1. Mengoptimalkan periode MA untuk sinyal yang lebih stabil.

  2. Tambahkan indikator lain ke sinyal filter.

  3. Meningkatkan ukuran perdagangan untuk mengurangi dampak biaya.

  4. Atur stop loss yang tepat untuk membatasi kerugian maksimum.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Optimalkan periode MA untuk menemukan kombinasi terbaik, atau gunakan optimasi adaptif untuk secara dinamis memilih periode terbaik.

  2. Tambahkan indikator teknis lainnya seperti MACD, KD dll untuk menyaring sinyal dan meningkatkan kualitas, atau gunakan pembelajaran mesin untuk mencetak sinyal dan menyaring yang salah.

  3. Masukkan analisis volume. Jangan mengambil sinyal jika volume tidak cukup pada penyeberangan MA.

  4. Periksa fluktuasi harga sebelum crossover terjadi.

  5. Membangun mekanisme stop loss dinamis seperti trailing stop loss, Chandelier Exit dll, untuk mengurangi jarak stop loss tetapi tetap efektif.

  6. Mengoptimalkan ukuran posisi seperti tetap / dinamis / leveraged, untuk mencapai rasio keuntungan / kerugian yang lebih wajar.

  7. Pertimbangkan secara komprehensif biaya perdagangan, slippage. Optimalkan rasio take profit / stop loss untuk memastikan profitabilitas dalam perdagangan langsung.

Kesimpulan

Struktur keseluruhan dari strategi ini adalah suara, dengan logika sederhana dari dua EMA crossover untuk menentukan arah tren, ditambah dengan mengambil keuntungan dan stop loss logika untuk menangkap tren. Sebagai strategi faktor tunggal, itu dapat lebih dioptimalkan pada parameter, filter sinyal dll untuk membuatnya lebih kuat. Dengan stop loss yang tepat dan ukuran posisi, risiko dapat lebih dikurangi. Secara keseluruhan, ini memberikan tren yang solid mengikuti kerangka strategi, yang dapat mencapai keuntungan yang konsisten setelah optimasi 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 banyak