Chiến lược dừng lỗ theo khung thời gian đa dạng


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

Chiến lược dừng lỗ theo khung thời gian đa dạng

Tổng quan

Chiến lược này là phiên bản đa khung thời gian của chiến lược đơn giản theo dõi dừng lỗ mà tôi đã phát hành trước đó. Chiến lược trước đó chỉ sử dụng lệnh dừng theo dõi cơ bản để vào vị trí. Nó hoạt động tốt, vì vậy tôi đã thử và cải thiện nó.

Trong chiến lược này, bạn chỉ có thể sử dụng ATR Stop và chọn 3 khung thời gian cao hơn, cũng như khung thời gian hiện tại. Tracking Stop trên các khung thời gian này sẽ được vẽ trên biểu đồ.

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

Cốt lõi của chiến lược này là theo dõi các điểm dừng và theo dõi xu hướng. Các điểm dừng theo dõi được sử dụng để thiết lập các điểm dừng, dựa trên tính toán giá trị ATR, có thể ngăn chặn hiệu quả các điểm dừng bị phá vỡ. Theo dõi xu hướng quyết định nhập cuộc bằng cách quan sát xu hướng trên các khung thời gian khác nhau.

Cụ thể, chiến lược này sẽ tính toán ATR trên các khung thời gian khác nhau và đặt khoảng cách dừng. Sau đó, phát ra tín hiệu tăng hoặc giảm khi giá vượt qua ngưỡng dừng. Nếu tín hiệu trên nhiều khung thời gian phù hợp, hãy tham gia.

Bằng cách kết hợp các xu hướng trong các chu kỳ khác nhau, bạn có thể lọc các phá vỡ giả hiệu quả. Đồng thời theo dõi các điểm dừng có thể khóa lợi nhuận và kiểm soát rủi ro hiệu quả.

Lợi thế chiến lược

  1. Sử dụng phán đoán khung thời gian đa dạng, có thể lọc hiệu quả tiếng ồn, nhận biết xu hướng
  2. ATR theo dõi cách dừng có thể điều chỉnh động khoảng cách dừng để giảm khả năng bị đòn bẩy
  3. Kết hợp theo xu hướng và quản lý dừng lỗ, có thể theo xu hướng và dừng lỗ kịp thời
  4. Các tham số ít hơn, dễ hiểu và điều chỉnh

Phân tích rủi ro

  1. ATR dừng nếu tham số được thiết lập không đúng, có thể quá gần hoặc xa giá, dễ bị phá vỡ hoặc dừng quá xa
  2. Gói khung thời gian đa dạng có thể không hoạt động hiệu quả hoặc phán đoán sai nếu các tham số được đặt không đúng
  3. Cần thiết phải cấu hình tốt cả các tham số dừng và tham số khung thời gian, nếu không có thể không đạt được hiệu quả tối ưu

Giải pháp:

  1. Thử nghiệm nhiều lần với các kết hợp và biến thể khác nhau để tìm ra các biến thể tốt nhất
  2. Tối ưu hóa tỷ lệ và số lượng khung thời gian để đảm bảo có thể đưa ra phán đoán xu hướng đáng tin cậy
  3. Điều chỉnh số nhân của ATR dừng để tìm sự cân bằng giữa dừng không bị phá vỡ và khoảng cách không lớn

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

Các chiến lược có thể được tối ưu hóa bằng cách:

  1. Tăng hoặc giảm số lượng khung thời gian để tìm một bộ khung để xác định xu hướng tốt nhất
  2. Kiểm tra các ATR khác nhau để xác định khoảng cách dừng tối ưu
  3. Thêm cơ chế tái nhập cảnh, xây dựng thêm vị trí khi xu hướng tiếp tục
  4. Kết hợp với các chỉ số khác để lọc thời gian nhập cảnh, chẳng hạn như chỉ số giá cả
  5. Tối ưu hóa cho các tham số khác nhau

Tóm tắt

Chiến lược này thực hiện sự kết hợp hữu cơ giữa theo dõi xu hướng và kiểm soát rủi ro bằng cách theo dõi dừng lại của ATR theo nhiều khung thời gian. Nó có thể đánh giá hướng xu hướng rõ ràng hơn so với dừng lại đơn lẻ; nó lọc rất nhiều tiếng ồn so với khung thời gian đơn lẻ.

Mã nguồn chiến lược
/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // Init Variables
    pos         = 0
    trailing_sl = 0.0
    
    // Signals
    long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
    short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 
    
    // Calculate SL
    trailing_sl := short_signal     ? high + sl_val : 
                   long_signal      ? low  - sl_val : 
                   nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
                   nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
                   nz(trailing_sl[1])
                   
    // Position var               
    pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)