Chiến lược phá vỡ động lực kép

Tác giả:ChaoZhang, Ngày: 2023-11-16 17:00:54
Tags:

img

Tổng quan

Đây là một chiến lược đột phá động lượng kép. Nó sử dụng hai chỉ số động lượng với các thiết lập tham số khác nhau và tạo ra tín hiệu giao dịch khi cả hai chỉ số động lực vượt qua đường không. Chiến lược chỉ sử dụng các mục nhập dài và ngắn chỉ được sử dụng để ra khỏi các vị trí.

Chiến lược logic

Mã đầu tiên thiết lập các thuộc tính chiến lược như loại lệnh, chương trình hoa hồng v.v. Sau đó nó tính toán hai chỉ số động lực:

// Momentum settings
****
i_len           = input(defval = 12, title = "Length", minval = 1)
i_src           = input(defval = close, title = "Source")  
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code 

mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent) 
mom2 = momentum(i_src, 1, i_percent)

momX = mom1   

if i_mom == "MOM2"
    momX := mom2

mom0 là chỉ số động lượng cơ sở với chiều dài i_len, nguồn dữ liệu i_src, việc tính tỷ lệ phần trăm được quyết định bởi i_percent.

mom1 là chỉ số động lượng với mom0 là nguồn dữ liệu và chiều dài 1.

mom2 là chỉ số động lượng với dữ liệu ban đầu i_src là nguồn và chiều dài 1.

Chỉ số động lực cuối cùng momX mặc định là mom1, cũng có thể chọn mom2.

Khi mom0 và momX đều vượt qua đường 0, đi dài. khi mom0 và momX đều vượt qua đường 0, đóng vị trí.

Ưu điểm của Chiến lược

  1. Sử dụng các chỉ số động lượng kép với các cài đặt khác nhau cải thiện độ tin cậy tín hiệu với xác nhận hai lần và ít tín hiệu sai.

  2. Chỉ sử dụng các mục nhập dài và sử dụng ngắn để thoát giảm tần suất giao dịch và giảm chi phí giao dịch.

  3. Điều chỉnh tham số động lượng linh hoạt phù hợp với môi trường thị trường khác nhau.

  4. Cấu trúc mã sạch, dễ hiểu và sửa đổi.

  5. Giao dịch thông điệp được kích hoạt, tích hợp tốt với các hệ thống giao dịch tự động.

Rủi ro của chiến lược

  1. Động lực kép có thể bỏ qua các tín hiệu xu hướng yếu hơn trong khi giảm các tín hiệu sai.

  2. Mất cơ hội giao dịch ngắn hạn với chỉ có các mục dài.

  3. Cài đặt tham số động lượng không chính xác dẫn đến giao dịch quá mức hoặc tín hiệu bị trì hoãn.

  4. Dữ liệu backtest không đủ gây ra quá mức điều chỉnh tham số.

  5. Xác nhận hai lần làm giảm nhưng không loại bỏ các tín hiệu sai, cần phải theo dõi tính hợp lệ trong giao dịch trực tiếp.

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

  1. Kiểm tra sự kết hợp của các tham số chiều dài và tỷ lệ phần trăm để tìm ra tối ưu.

  2. Xem xét thêm tín hiệu giao dịch ngắn sau khi xác nhận xu hướng để nắm bắt nhiều giao dịch hơn.

  3. Kiểm tra các tính toán động lượng khác nhau như ROC, RSI vv để có kết quả tốt hơn.

  4. Thêm bộ lọc xu hướng để tránh thị trường whipsaw.

  5. Tối ưu hóa dừng lỗ để đạt được lợi nhuận tối đa trong giới hạn rủi ro.

Kết luận

Đây là một chiến lược đột phá động lượng kép điển hình. Nó sử dụng xác nhận kép để giảm tín hiệu sai và chỉ có các mục nhập dài để giảm tần suất giao dịch. Ưu điểm là sự đơn giản và dễ dàng thực hiện, với nhiều cơ hội để cải thiện tối ưu hóa tham số và kiểm soát rủi ro. Nhìn chung nó phục vụ như một khuôn khổ đột phá động lượng hợp lý nhưng cần điều chỉnh và tối ưu hóa cụ thể thị trường để giao dịch trực tiếp có lợi nhuận.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

Thêm nữa