Myo_LS_D Chiến lược định lượng

Tác giả:ChaoZhang, Ngày: 2024-01-15 14:56:03
Tags:

img

Tổng quan

Chiến lược định lượng Myo_LS_D là một chiến lược dừng lợi nhuận theo dõi hai theo dõi dựa trên các vị trí dài và ngắn. Chiến lược kết hợp nhiều chỉ số như trung bình động, đột phá giá và tỷ lệ rủi ro-lợi nhuận để xây dựng tín hiệu giao dịch. Nó đạt được tỷ lệ thắng cao và tỷ lệ lợi nhuận dựa trên tiền đề của phán đoán xu hướng chính xác.

Nguyên tắc

Chiến lược chủ yếu bao gồm mô-đun đánh giá xu hướng, mô-đun vị trí dài, mô-đun vị trí ngắn, mô-đun dừng lợi nhuận theo dõi, v.v.

  1. Mô-đun đánh giá xu hướng sử dụng kênh Donchain để xác định hướng xu hướng tổng thể.

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

  3. Mô-đun theo dõi stop profit sử dụng hai SMA trung bình động của các chu kỳ khác nhau để theo dõi sự thay đổi giá trong thời gian thực. Khi giá vượt qua đường trung bình động, vị trí được đóng để kiếm lợi nhuận.

  4. Cài đặt stop loss xem xét stop loss mở rộng để giữ điểm stop loss cách xa mức hỗ trợ để tránh bị đánh bại.

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 và theo dõi chiến lược dừng lợi nhuận vị trí dài và ngắn riêng biệt.

  1. Các vị trí dài và ngắn riêng biệt có thể tối đa hóa cơ hội lợi nhuận bằng cách nắm bắt các cơ hội giao dịch xu hướng một chiều.

  2. Theo dõi stop profit có thể đạt được lợi nhuận cao hơn thông qua điều chỉnh thời gian thực. So với các phương pháp stop profit truyền thống, thu nhập có thể được cải thiện đáng kể.

  3. Các điểm dừng mở rộng có thể làm giảm khả năng bị đánh bại và giảm nguy cơ thua lỗ.

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 các điểm sau:

  1. Phán quyết xu hướng không chính xác có thể dẫn đến các vị trí và lỗ trái ngược. Tối ưu hóa có thể đạt được bằng cách đ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 để phán đoán.

  2. Theo dõi stop profit quá mạnh và có thể dừng lợi nhuận sớm mà không thể duy trì lợi nhuận.

  3. Phạm vi dừng lỗ quá nhỏ, có thể làm tăng xác suất bị đánh bại.

Hướng dẫn tối ưu hóa

Các hướng tối ưu hóa chính cho chiến lược này là:

  1. Tối ưu hóa mô-đun đánh giá xu hướng để cải thiện độ chính xác đánh giá.

  2. Điều chỉnh phương pháp stop profit theo dõi để mở rộng thêm không gian lợi nhuận. Ví dụ, di chuyển các đường stop profit theo tỷ lệ.

  3. Mở rộng phạm vi dừng lỗ hoặc xem xét dừng co lại có thể làm giảm thêm khả năng bị đánh bại.

  4. Các giống khác nhau có các tham số khác nhau. Sự kết hợp các tham số tối ưu có thể được thu được thông qua đào tạo để cải thiện lợi nhuận chiến lược hơn nữa.

Tóm lại

Nói chung, chiến lược Myo_LS_D là một chiến lược định lượng dừng lợi nhuận tương đối trưởng thành và ổn định. Nó có những lợi thế rõ ràng và rủi ro có thể kiểm soát được. Đây là một trong những giải pháp định lượng đáng để giữ lâu dài. Tối ưu hóa trong tương lai có thể cho phép cải thiện hiệu suất liên tục để làm cho nó trở thành một chiến lược định lượng vượt trội hơn.


/*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)

Thêm nữa