Strategi persimpangan rata-rata adalah strategi perdagangan yang umum digunakan yang didasarkan pada rata-rata bergerak. Strategi ini menggunakan persimpangan rata-rata bergerak cepat dan rata-rata bergerak lambat sebagai sinyal beli dan jual. Ketika rata-rata bergerak cepat melewati rata-rata bergerak lambat dari bawah, dianggap sebagai sinyal beli; Ketika rata-rata bergerak cepat melewati rata-rata bergerak lambat dari atas ke bawah, dianggap sebagai sinyal jual.
Logika inti dari strategi ini didasarkan pada teori rata-rata. Rata-rata bergerak dapat secara efektif meluruskan pergerakan harga, mencerminkan tren harga. Rata-rata cepat lebih sensitif terhadap perubahan harga dan dapat menangkap titik balik tren; rata-rata lambat kurang sensitif terhadap perubahan harga dan dapat menyaring fluktuasi jangka pendek.
Secara khusus, strategi ini pertama-tama mendefinisikan garis rata-rata 50 hari dan garis rata-rata 200 hari. Kemudian mengatur kondisi masuk multihead untuk melewati rata-rata lambat di atas rata-rata cepat, dan kondisi masuk head kosong untuk melewati rata-rata lambat di bawah rata-rata cepat. Untuk menghindari perdagangan yang tumpang tindih, strategi ini menggunakan isEntry dan isExit untuk kontrol.
Selain itu, strategi juga menetapkan titik stop loss. Pengguna dapat mengatur jarak stop loss dengan menginput persentase. Stop loss dan harga stop loss akan dihitung berdasarkan perubahan persentase harga masuk.
Strategi ini memiliki keuntungan sebagai berikut:
Operasi sederhana, mudah untuk dilakukan. Hanya mengandalkan penyeberangan linear untuk melakukan perdagangan, sangat cocok untuk pemula yang tidak memiliki pengalaman perdagangan.
Pengembalian dapat dikontrol, dengan mekanisme manajemen risiko tertentu. Garis rata bergerak dapat secara efektif menyaring pergerakan harga jangka pendek, dan menghindari terjadinya lelang.
Parameter yang dapat disesuaikan, sangat mudah beradaptasi. Pengguna dapat mengatur sendiri parameter rata-rata dan standar stop-loss, parameter untuk mengoptimalkan strategi.
Strategi memetakan garis tengah, titik masuk, dan titik stop loss secara langsung di grafik.
Skalabilitas yang kuat. Kerangka strategi ini utuh, hanya perlu mengubah sinyal perdagangan utama, menambahkan indikator, dan lain-lain untuk meningkatkan strategi.
Strategi ini juga memiliki beberapa risiko:
Kejutan pasar menyebabkan tren yang sangat besar dan tidak dapat dihentikan. Garis rata-rata cepat lebih sensitif terhadap perubahan harga dan tidak dapat menanggapi kejutan secara efektif.
Dalam situasi yang bergejolak, mereka mudah terjebak. Jika kondisi bergejolak lama, mereka akan mengalami kerugian berulang.
Tidak mempertimbangkan biaya transaksi. Biaya dan slip loss dalam transaksi yang sebenarnya sangat mempengaruhi keuntungan.
Risiko penyesuaian data pengembalian. Situasi di lapangan rumit dan berubah-ubah, dan hasil pengembalian tidak mewakili kinerja di lapangan.
Solusi yang sesuai:
Standar stop loss yang lebih longgar dapat diatur, atau stop loss penembusan tambahan dapat ditambahkan.
Jarak garis rata-rata dapat diperluas sesuai kebutuhan, mengurangi frekuensi transaksi, atau mengubah sinyal filter dengan indikator lain.
Hal ini dilakukan dengan mempertimbangkan biaya transaksi yang sebenarnya, dan mengatur ruang penghentian yang lebih luas.
Dengan mempertimbangkan perubahan lingkungan pasar, parameter harus dioptimalkan dan disesuaikan secara bertahap.
Strategi ini dapat dioptimalkan dalam beberapa hal:
Uji kombinasi parameter yang berbeda untuk mencari parameter yang optimal. Anda dapat menguji jumlah hari rata-rata cepat, kombinasi parameter, dll.
Menambahkan indikator lain untuk memfilter, menghindari kesalahan perdagangan dalam situasi getaran. Misalnya MACD, KD dan indikator lainnya.
Mengoptimalkan strategi stop loss dan manajemen risiko yang lebih efisien. Misalnya, pelacakan stop loss, penangkapan stop loss, dll.
Peningkatan skala kepemilikan, memanfaatkan leverage untuk memperbesar, meningkatkan ruang keuntungan.
Mengingat biaya transaksi disk solid, parameter pengembalian disesuaikan dan dioptimalkan, sehingga parameter strategi lebih cocok untuk pertempuran nyata.
Menggabungkan metode statistik untuk menilai stabilitas parameter, mengurangi risiko pencocokan data, meningkatkan stabilitas.
Secara keseluruhan, strategi crossover linier ini memiliki ide yang jelas, implementasi yang sederhana, dan cocok untuk strategi awal untuk trading kuantitatif. Namun, strategi ini juga memiliki risiko dan kekurangan tertentu, yang memerlukan pengoptimalan parameter dan filter secara cermat, dan perhatian untuk mengendalikan risiko perdagangan disk nyata, untuk mendapatkan keuntungan yang stabil. Kerangka kebijakan ini memiliki skalabilitas yang kuat, pengguna dapat melakukan inovasi dan pengoptimalan berdasarkan ini, untuk mengembangkan strategi perdagangan yang lebih sesuai dengan gaya 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")