Strategi Crossover Rata-rata Bergerak

Penulis:ChaoZhang, Tanggal: 2023-10-10 10:44:25
Tag:

Gambaran umum

moving average crossover adalah strategi perdagangan yang umum digunakan berdasarkan moving average. strategi ini menggunakan crossover dari moving average yang lebih cepat dan moving average yang lebih lambat sebagai sinyal perdagangan. ketika moving average yang lebih cepat melintasi di atas moving average yang lebih lambat dari bawah, itu adalah sinyal beli. ketika moving average yang lebih cepat melintasi di bawah moving average yang lebih lambat dari atas, itu adalah sinyal jual. strategi ini menggunakan MA 50 hari sebagai MA yang lebih cepat dan MA 200 hari sebagai MA yang lebih lambat.

Logika Strategi

Logika inti dari strategi ini didasarkan pada teori moving averages. Moving averages dapat secara efektif meratakan fluktuasi harga dan menunjukkan tren harga. MA yang lebih cepat lebih sensitif terhadap perubahan harga dan dapat menangkap titik pembalikan tren. MA yang lebih lambat kurang sensitif terhadap perubahan harga dan dapat menyaring fluktuasi jangka pendek. Ketika MA yang lebih cepat melintasi di atas MA yang lebih lambat, itu menunjukkan tren naik harga. Ketika MA yang lebih cepat melintasi di bawah MA yang lebih lambat, itu menunjukkan tren penurunan harga.

Secara khusus, strategi ini pertama-tama mendefinisikan MA 50 hari dan MA 200 hari. Kondisi entri panjang ditetapkan ketika MA yang lebih cepat melintasi di atas MA yang lebih lambat. Kondisi entri pendek ditetapkan ketika MA yang lebih cepat melintasi di bawah MA yang lebih lambat. Untuk menghindari tumpang tindih perdagangan, strategi ini menggunakan isEntry dan isExit bendera untuk kontrol. Ketika kondisi masuk terpenuhi, isEntry ditetapkan menjadi benar. Ketika kondisi keluar terpenuhi, isExit ditetapkan menjadi benar. Posisi panjang hanya akan dibuka ketika isEntry salah dan sinyal beli muncul. Posisi pendek hanya akan dibuka ketika isExit salah dan sinyal jual muncul.

Selain itu, strategi juga menetapkan tingkat mengambil keuntungan dan stop loss. Pengguna dapat menentukan jarak persentase TP / SL melalui input. Harga TP dan SL akan dihitung berdasarkan persentase harga masuk. Ketika ukuran posisi lebih besar dari 0, TP dan SL akan dieksekusi berdasarkan persentase TP / SL yang panjang. Ketika ukuran posisi kurang dari 0, TP dan SL akan didasarkan pada persentase TP / SL yang pendek.

Analisis Keuntungan

Keuntungan dari strategi ini meliputi:

  1. Mudah diterapkan. Ini diperdagangkan murni berdasarkan MA silang, cocok untuk pemula tanpa pengalaman perdagangan.

  2. Pengurangan yang terkontrol dengan manajemen risiko. moving average dapat menyaring fluktuasi jangka pendek dan menghindari berhenti.

  3. Pengguna dapat mengoptimalkan parameter seperti periode MA dan tingkat TP / SL.

  4. Visualisasi yang jelas. Strategi memetakan MA utama, entri, dan tingkat TP / SL pada grafik.

  5. Kerangka kerja yang dapat diperluas. Struktur strategi sudah lengkap. Sinyal dan indikator baru dapat ditambahkan untuk memperbaikinya.

Analisis Risiko

Risiko dari strategi ini meliputi:

  1. Tidak dapat menghentikan kerugian selama peristiwa pasar yang ekstrim, yang mengarah pada penarikan besar. MA yang lebih cepat sensitif terhadap perubahan harga dan dapat gagal dalam kondisi ekstrim.

  2. Cenderung untuk whipsaws di berbagai pasar, menyebabkan kerugian berturut-turut.

  3. Biaya perdagangan tidak dipertimbangkan. Biaya dan slippage dalam perdagangan yang sebenarnya akan berdampak secara signifikan pada profitabilitas.

  4. Kondisi pasar nyata rumit dan hasil backtest mungkin tidak mewakili kinerja langsung.

Solusinya meliputi:

  1. Gunakan stop loss yang lebih luas, atau tambahkan stop loss breakout tambahan.

  2. Perluas jarak MA, kurangi frekuensi perdagangan, atau tambahkan filter lain.

  3. Pertimbangkan biaya perdagangan yang sebenarnya, tetapkan ruang target keuntungan yang lebih luas.

  4. Mengoptimalkan parameter secara bertahap dan mengurangi overfit dengan mempertimbangkan perubahan kondisi pasar.

Arahan Optimasi

Strategi ini dapat dioptimalkan dalam aspek berikut:

  1. Uji kombinasi parameter yang berbeda untuk menemukan parameter optimal, seperti periode MA.

  2. Tambahkan indikator lain sebagai filter untuk menghindari whipsaws, seperti MACD, KD dll.

  3. Mengoptimalkan strategi stop loss untuk manajemen risiko yang lebih baik, seperti trailing stop loss.

  4. Meningkatkan ukuran posisi dengan leverage untuk memperbesar keuntungan sambil mengendalikan risiko.

  5. Pertimbangkan biaya perdagangan, mengoptimalkan parameter untuk perdagangan langsung.

  6. Mengevaluasi stabilitas parameter menggunakan metode statistik untuk mengurangi overfitting.

Kesimpulan

Sebagai kesimpulan, strategi crossover MA ini memiliki logika yang jelas dan mudah diterapkan, cocok sebagai strategi pengantar untuk perdagangan algo. tetapi juga memiliki risiko dan keterbatasan. parameter yang cermat dan pengoptimalan filter, dan pengendalian risiko diperlukan untuk mencapai keuntungan yang stabil. strategi ini memiliki ekstensibilitas yang besar bagi pengguna untuk berinovasi dan mengoptimalkan berdasarkan itu agar sesuai dengan gaya perdagangan mereka sendiri.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

Lebih banyak