Chiến lược chốt lời theo sau dựa trên đường song song dài và ngắn


Ngày tạo: 2024-01-15 14:56:03 sửa đổi lần cuối: 2024-01-15 14:56:03
sao chép: 1 Số nhấp chuột: 626
1
tập trung vào
1617
Người theo dõi

Chiến lược chốt lời theo sau dựa trên đường song song dài và ngắn

Chính sách định lượng Myo_LS_D

Tổng quan

Chiến lược định lượng Myo_LS_D là một chiến lược tracking stop-stop dựa trên nhiều đường song không. Chiến lược này tích hợp nhiều chỉ số để xây dựng tín hiệu giao dịch như đường trung bình, giá phá vỡ, tỷ lệ lợi nhuận rủi ro. Với sự xác định chính xác của xu hướng, tỷ lệ thắng và lợi nhuận cao hơn được thực hiện.

Nguyên tắc chiến lược

Chiến lược này bao gồm các mô-đun đánh giá xu hướng, mô-đun đa, mô-đun trống, và mô-đun theo dõi.

  1. Mô-đun đánh giá xu hướng sử dụng kênh donchain để đánh giá hướng xu hướng tổng thể. Việc nhập nhiều hơn là ở trong xu hướng tăng, trong khi việc tham gia cần phải ở trong xu hướng giảm.

  2. Các mô-đun đa dạng xem xét các yếu tố như điểm cao, điểm thấp và vị trí đường trung bình dài. Các mô-đun trống xem xét các yếu tố như điểm cao, điểm thấp và vị trí đường trung bình ngắn. Điều này đảm bảo việc đặt hàng khi phá vỡ điểm giá quan trọng lên hoặc xuống.

  3. Mô-đun theo dõi dừng sử dụng đường trung bình SMA của hai chu kỳ khác nhau để theo dõi thay đổi giá trong thời gian thực. Khi giá giảm xuống đường trung bình, dừng lại. Việc theo dõi thời gian thực này có thể tối đa hóa lợi nhuận trong xu hướng.

  4. Cài đặt dừng lỗ xem xét mở rộng dừng lỗ, đảm bảo điểm dừng lỗ cách xa điểm hỗ trợ, tránh bị rung.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là xây dựng kho phân tách nhiều chỗ trống, theo dõi chiến lược ngăn chặn. Cụ thể là:

  1. Sự phân chia đa không gian có thể tối đa hóa cơ hội lợi nhuận từ các xu hướng đơn phương.

  2. Theo dõi Stop Stop có thể đạt được tỷ lệ lợi nhuận cao hơn bằng cách điều chỉnh thời gian thực. Tỷ lệ lợi nhuận tăng lên đáng kể so với phương pháp Stop Stop truyền thống.

  3. Mở rộng lỗ hổng có thể làm giảm khả năng bị chấn động và giảm rủi ro mất mát.

Rủi ro và giải pháp

Các rủi ro chính của chiến lược này tập trung vào:

  1. Nếu có lỗi trong việc đánh giá xu hướng, nó có thể dẫn đến thua lỗ khi lập vị thế ngược. Bạn có thể điều chỉnh các tham số donchain một cách thích hợp hoặc thêm các chỉ số khác để tối ưu hóa.

  2. Theo dõi stop loss quá quyết liệt, có thể stop loss sớm sẽ không có lợi nhuận lâu dài. Bạn có thể mở rộng khoảng cách stop loss theo đường trung bình để tối ưu hóa.

  3. Phạm vi dừng quá nhỏ, có thể làm tăng khả năng bị chấn động. Bạn có thể mở rộng mức dừng một cách thích hợp để giảm nguy cơ.

Hướng tối ưu hóa

Chiến lược này có thể được tiếp tục tối ưu hóa từ những khía cạnh sau:

  1. Tối ưu hóa mô-đun đánh giá xu hướng, tăng độ chính xác đánh giá. Có thể xem xét kết hợp nhiều chỉ số như MACD để thực hiện.

  2. Điều chỉnh theo dõi cách dừng để mở rộng thêm không gian lợi nhuận. Ví dụ: có thể di chuyển dây dừng theo tỷ lệ.

  3. Mở rộng phạm vi dừng hoặc xem xét thu hẹp dừng để giảm thêm khả năng bị chấn động.

  4. Các tham số khác nhau của các giống khác nhau có thể được đào tạo để có được sự kết hợp tham số tối ưu.

Tóm tắt

Chiến lược Myo_LS_D nói chung là một chiến lược ngăn chặn theo dõi nhiều không gian ổn định. Ưu điểm của nó rõ ràng, rủi ro có thể kiểm soát được, là một trong những chương trình định lượng đáng để sử dụng trong thời gian dài.

Mã nguồn chiến lược
/*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)