Myo_LS_D Strategi Kuantitatif

Penulis:ChaoZhang, Tanggal: 2024-01-15 14:56:03
Tag:

img

Gambaran umum

Strategi kuantitatif Myo_LS_D adalah strategi stop-profit pelacakan dual-track berdasarkan posisi panjang dan pendek. Strategi ini menggabungkan beberapa indikator seperti moving average, price breakthrough, dan rasio risiko-pengembalian untuk membangun sinyal perdagangan.

Prinsip

Strategi ini terutama terdiri dari modul penilaian tren, modul posisi panjang, modul posisi pendek, modul pelacakan stop profit, dll.

  1. Modul penilaian tren menggunakan saluran Donchain untuk menentukan arah tren secara keseluruhan. prasyarat untuk pergi panjang adalah tren naik, sementara pergi pendek membutuhkan tren menurun.

  2. Modul posisi panjang memperhitungkan faktor-faktor seperti posisi tertinggi baru, posisi terendah, posisi rata-rata bergerak panjang, dll. Modul posisi pendek memperhitungkan posisi tertinggi baru, posisi terendah, posisi rata-rata bergerak pendek dan faktor-faktor lain. Hal ini memastikan pembukaan posisi ketika menerobos titik harga kritis ke atas atau ke bawah.

  3. Modul stop profit pelacakan menggunakan dua SMA moving average dari siklus yang berbeda untuk melacak perubahan harga secara real time. Ketika harga menembus garis moving average, posisi ditutup untuk keuntungan. Pelacakan real time semacam ini dapat memaksimalkan keuntungan dari tren.

  4. Pengaturan stop loss mempertimbangkan stop loss yang diperbesar untuk menjaga titik stop loss jauh dari level support untuk menghindari terjatuh.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah pembentukan posisi panjang dan pendek yang terpisah dan strategi stop profit pelacakan.

  1. Posisi panjang dan pendek yang terpisah dapat memaksimalkan peluang keuntungan dengan menangkap peluang perdagangan tren satu sisi.

  2. Pelacakan stop profit dapat memperoleh margin keuntungan yang lebih tinggi melalui penyesuaian real-time.

  3. Perhentian yang diperbesar dapat mengurangi kemungkinan terjatuh dan mengurangi risiko kerugian.

Risiko dan Solusi

Risiko utama dari strategi ini terkonsentrasi pada poin berikut:

  1. Penghakiman tren yang salah dapat mengakibatkan posisi dan kerugian yang bertentangan. Optimasi dapat dicapai dengan menyesuaikan parameter Donchain dengan tepat atau menambahkan indikator lain untuk penilaian.

  2. Pelacakan stop profit terlalu agresif dan dapat menghentikan keuntungan secara prematur tanpa dapat mempertahankan keuntungan. Optimasi dapat dicapai dengan meningkatkan jarak antara stop profit moving average.

  3. Jangkauan stop loss terlalu kecil, yang dapat meningkatkan kemungkinan tersingkir.

Arahan Optimasi

Arah utama optimasi untuk strategi ini adalah:

  1. Optimalkan modul penilaian tren untuk meningkatkan akurasi penilaian. Pertimbangkan untuk menggabungkan lebih banyak indikator seperti MACD.

  2. Sesuaikan metode pelacakan stop profit untuk memperluas ruang profit lebih lanjut.

  3. Memperluas jangkauan stop loss atau mempertimbangkan stop shrinkage dapat mengurangi kemungkinan terjatuh.

  4. Varietas yang berbeda memiliki parameter yang berbeda. Kombinasi parameter yang optimal dapat diperoleh melalui pelatihan untuk meningkatkan kembali strategi.

Ringkasan

Secara umum, strategi Myo_LS_D adalah strategi kuantitatif stop-profit yang relatif matang dan stabil dengan pelacakan dua jalur. Ini memiliki keuntungan yang jelas dan risiko yang dapat dikendalikan. Ini adalah salah satu solusi kuantitatif yang layak dipegang untuk jangka panjang. Optimasi masa depan dapat memungkinkan peningkatan kinerja terus menerus untuk menjadikannya strategi kuantitatif yang lebih unggul.


/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 4h
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/
// © agresiynin

//@version=5
// ©Myo_Pionex
strategy(
 title                  =   "Myo_simple strategy_LS_D",
 shorttitle             =   "Myo_LS_D",
 overlay                =   true )


// var
lowest_price = ta.lowest(low, 200)
highest_price = ta.highest(high, 200)
min_800 = ta.lowest(low, 800)
max_800 = ta.highest(high, 800)
tp_target_L = min_800 + (max_800 - min_800) * math.rphi
tp_target_S = max_800 - (max_800 - min_800) * math.rphi
sl_length_L = input.int(100, "做多的止損長度", minval = 50, maxval = 300, step = 50)
sl_length_S = input.int(100, "做空的止損長度", minval = 50, maxval = 300, step = 50)
sl_L = lowest_price * (1 - 0.005)
sl_S = highest_price * (1 + 0.005)
rrr_L = tp_target_L - sl_L / sl_L
rrr_S = ta.lowest(low, 800) + ta.highest(high, 800) - ta.lowest(low, 800) * math.rphi / ta.highest(high, 200) + 0.005 * ta.highest(high, 200) - ta.lowest(low, 200) - 0.005 * ta.lowest(low, 200)
smalen1 = input.int(10, "做多追蹤止盈SMA長度1", options = [5, 10, 20, 40, 60, 80])
smalen2 = input.int(20, "做多追蹤止盈SMA長度2", options = [5, 10, 20, 40, 60, 80])
smalen1_S = input.int(5, "做空追蹤止盈SMA長度1", options = [5, 10, 20, 40, 60, 80])
smalen2_S = input.int(10, "做空追蹤止盈SMA長度2", options = [5, 10, 20, 40, 60, 80])
TrendLength_L = input.int(400, "做多趨勢線", options = [100, 200, 300, 400, 500])
TrendLength_S = input.int(300, "做空趨勢線", options = [100, 200, 300, 400, 500])
SMA1 = ta.sma(close, smalen1)
SMA2 = ta.sma(close, smalen2)
SMA1_S = ta.sma(close, smalen1_S)
SMA2_S = ta.sma(close, smalen2_S)
shortlength = input.int(20, "短期均價K線數量")
midlength = input.int(60, "中期均價K線數量")
longlength = input.int(120, "長期均價K線數量")
ShortAvg = math.sum(close, shortlength)/shortlength
MidAvg = math.sum(close, midlength)/midlength
LongAvg = math.sum(close, longlength)/longlength

// Trend
basePeriods = input.int(8, minval=1, title="趨勢基準線")
basePeriods_Short = input.int(26, "做空基準線")
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
baseLine = donchian(basePeriods)
baseLine_Short = donchian(basePeriods_Short)
trend = request.security(syminfo.tickerid, "D", baseLine)
isUptrend = false
isDowntrend = false
baseLine_D = request.security(syminfo.tickerid, "D", baseLine)
plot(baseLine_D, color=#B71C1C, title="趨勢基準線")
if close[0] > baseLine_D
    isUptrend := true
if close[0] < baseLine_Short
    isDowntrend := true
// Long
// Condition
// entry
con_a = low > lowest_price ? 1 : 0
con_b = high > highest_price ? 1 : 0
con_c = close[0] > ta.sma(close, TrendLength_L) ? 1 : 0
con_d = isUptrend ? 1 : 0
con_e = rrr_L > 3 ? 1 : 0
con_a1 = close[0] > ShortAvg[shortlength] ? 1 : 0
con_b1 = close[0] > MidAvg[midlength] ? 1 : 0

// close
con_f = ta.crossunder(close, SMA1) and ta.crossunder(close, SMA2) ? 1 : 0
con_g = close < ta.lowest(low, sl_length_L)[1] * (1 - 0.005) ? 1 : 0

// exit
con_h = tp_target_L

// Main calculation
LongOpen = false
AddPosition_L = false

if con_a + con_b + con_c + con_e + con_a1 + con_b1 >= 4 and con_d >= 1
    LongOpen := true
// Short
// Condition
// entry
con_1 = high < highest_price ? 1 : 0
con_2 = low < lowest_price ? 1 : 0
con_3 = close[0] < ta.sma(close, TrendLength_S) ? 1 : 0
con_4 = isDowntrend ? 1 : 0
con_5 = rrr_S > 3 ? 1 : 0
con_11 = close[0] < ShortAvg[shortlength] ? 1 : 0
con_12 = close[0] < MidAvg[midlength] ? 1 : 0

// close
con_6 = ta.crossover(close, SMA1_S) and ta.crossover(close, SMA2_S) ? 1 : 0
con_7 = close > ta.highest(high, sl_length_S)[1] * (1 + 0.005) ? 1 : 0

// exit
con_8 = tp_target_S

// Main calculation
ShortOpen = false
AddPosition_S = false

if con_1 + con_2 + con_3 + con_4 + con_5 + con_11 + con_12 >= 5
    ShortOpen := true

//
// execute
//
strategy.initial_capital = 50000
if strategy.position_size == 0
    if LongOpen
        strategy.entry("Long Open" , strategy.long , comment= "Long Open " + str.tostring(close[0]), qty=strategy.initial_capital/close[0])

if strategy.position_size > 0
    if (con_f > 0 or con_g > 0 or ShortOpen) and close <= baseLine_D
        strategy.close_all(comment="Close Long " + str.tostring(close[0]))

if strategy.position_size == 0
    if ShortOpen
        strategy.entry("Short Open" , strategy.short , comment= "Short Open " + str.tostring(close[0]), qty=strategy.initial_capital/close[0])

if strategy.position_size < 0
    if (con_6 > 0 or con_7 > 0 or LongOpen) and close >= baseLine_D
        strategy.close_all(comment="Close Short " + str.tostring(close[0]))


plot(ta.sma(close, TrendLength_L), color=#e5c212, title="LTradeTrend")
plot(ta.sma(close, TrendLength_S), color=#1275e5, title="STradeTrend")
plot(SMA1, "SMA1", color = color.lime, linewidth = 2)
plot(SMA2, "SMA2", color = color.rgb(255, 0, 255), linewidth = 2)

Lebih banyak