Strategi persimpangan

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

Ringkasan

Strategi melintasi rata-rata adalah strategi perdagangan yang biasa digunakan berdasarkan rata-rata bergerak. Strategi ini menggunakan persimpangan rata-rata bergerak cepat dan rata-rata bergerak perlahan sebagai isyarat beli dan jual. Apabila rata-rata bergerak cepat melintasi rata-rata perlahan dari bawah, ia dianggap sebagai isyarat beli; apabila rata-rata pantas melintasi rata-rata perlahan dari atas, ia dianggap sebagai isyarat jual. Strategi ini menggunakan rata-rata 50 hari sebagai rata-rata pantas dan rata-rata 200 hari sebagai rata-rata perlahan.

Prinsip-prinsip strategi

Logik utama strategi ini adalah berdasarkan teori rata-rata; rata-rata bergerak dapat meratakan pergerakan harga dengan berkesan dan mencerminkan trend harga; rata-rata pantas lebih sensitif terhadap perubahan harga dan dapat menangkap titik balik trend; rata-rata perlahan kurang sensitif terhadap perubahan harga dan dapat menapis turun naik jangka pendek. Apabila rata-rata pantas melintasi rata-rata perlahan, ia menunjukkan harga pendek mula naik dan mula memasuki trend multihead; apabila rata-rata pantas melintasi rata-rata perlahan, ia menunjukkan harga pendek mula turun dan mula memasuki trend atas.

Secara khusus, strategi ini mula-mula mentakrifkan garis purata 50 hari dan garis purata 200 hari; kemudian menetapkan syarat masuk berbilang kepala untuk melintasi garis purata perlahan di atas garis purata pantas, dan syarat masuk kosong untuk melintasi garis purata perlahan di bawah garis purata pantas. Untuk mengelakkan perdagangan bertindih, strategi ini menggunakan tanda isEntry dan isExit untuk kawalan. Apabila syarat masuk dipenuhi, isEntry ditetapkan sebagai benar, apabila syarat keluar dipenuhi, isExit ditetapkan sebagai benar.

Selain itu, strategi ini juga menetapkan titik stop loss. Pengguna boleh menetapkan jarak stop loss dengan memasukkan peratusan. Stop loss dan stop loss akan dikira berdasarkan perubahan peratusan harga masuk. Stop loss akan dilaksanakan mengikut peratusan stop loss dan stop loss yang ditetapkan apabila jumlah pegangan lebih besar daripada 0.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Operasi mudah dan mudah dilaksanakan. Perdagangan hanya boleh dilakukan dengan bergantung kepada persimpangan garis rata, sangat sesuai untuk pemula yang tidak mempunyai pengalaman perdagangan.

  2. Pengecutan adalah terkawal, mempunyai mekanisme pengurusan risiko tertentu. Garis rata bergerak dapat menapis secara berkesan pergolakan harga jangka pendek dan mengelakkan keuntungan yang disesuaikan.

  3. Parameter yang boleh disesuaikan, daya adaptasi yang kuat. Pengguna boleh menetapkan sendiri parameter rata-rata dan standard penghentian rugi untuk mengoptimumkan parameter strategi.

  4. Visualisasi menunjukkan dengan jelas. Strategi yang langsung pada carta untuk melukis garis rata utama, titik masuk, titik hentian dan hentian, dengan jelas.

  5. Skalable. Rangka kerja strategi ini lengkap, hanya perlu mengubah isyarat dagangan utama, menambah penunjuk, dan lain-lain untuk meningkatkan strategi.

Analisis risiko

Tetapi ada juga beberapa risiko dengan strategi ini:

  1. Kecemasan pasaran menyebabkan pasaran yang besar dan tidak dapat dihentikan. Garis purata cepat lebih sensitif terhadap perubahan harga dan tidak dapat bertindak balas secara berkesan terhadap kejutan.

  2. Jika pasaran bergolak dalam jangka masa yang lama, kerugian akan berulang.

  3. Kos urus niaga tidak dipertimbangkan. Bayaran prosedur dan kehilangan titik geser dalam urus niaga sebenar menjejaskan keuntungan.

  4. Mengkaji semula data sesuai dengan risiko. Keadaan sebenar adalah rumit dan berubah-ubah, dan hasil pengkaji semula tidak mewakili prestasi sebenar.

Penyelesaian:

  1. Standar stop loss yang lebih longgar boleh ditetapkan, atau tambahan stop loss terobosan boleh ditambah.

  2. Jarak rata boleh diperluaskan dengan sewajarnya, mengurangkan kekerapan dagangan, atau menukar isyarat penapis dengan indikator lain.

  3. Dalam pada itu, pihak berkuasa juga harus memberi perhatian kepada kos sebenar transaksi dan menetapkan ruang yang lebih luas untuk menghalang.

  4. Perubahan persekitaran pasaran harus diambil kira sepenuhnya, parameter yang dioptimumkan dan kesesuaian yang beransur-ansur dikurangkan.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dari beberapa aspek berikut:

  1. Uji kombinasi parameter yang berbeza untuk mencari parameter yang terbaik.

  2. Menggabungkan indikator lain untuk penapisan untuk mengelakkan perdagangan yang salah dalam pasaran yang goyah; contohnya MACD, KD dan lain-lain.

  3. Mengoptimumkan strategi stop loss untuk mencapai pengurusan risiko yang lebih cekap. Contohnya, menjejaki stop loss, menggantung stop loss, dan lain-lain.

  4. Meningkatkan saiz pegangan, menggunakan levera untuk memperbesar, meningkatkan ruang keuntungan; tetapi untuk mengawal risiko.

  5. Mengingat kos dagangan sebenar, parameter pengukuran semula disesuaikan dan dioptimumkan untuk menjadikan parameter strategi lebih sesuai untuk pertempuran sebenar.

  6. Menggabungkan kaedah statistik untuk menilai kestabilan parameter, mengurangkan risiko pemasangan data dan meningkatkan kestabilan.

Ringkasan

Ringkasnya, strategi persilangan linear ini secara keseluruhan adalah idea yang jelas, mudah dilaksanakan, dan sesuai untuk strategi permulaan perdagangan kuantitatif. Tetapi strategi ini juga mempunyai risiko dan kekurangan tertentu, yang memerlukan pengoptimuman parameter dan penapis yang halus, dan memberi perhatian untuk mengawal risiko perdagangan riil untuk mendapatkan keuntungan yang stabil. Rangka kerja strategi ini mempunyai skala yang kuat, pengguna boleh berinovasi dan mengoptimumkan berdasarkannya, untuk membangunkan 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")

Lebih lanjut