
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 đồ.
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ả.
Giải pháp:
Các chiến lược có thể được tối ưu hóa bằng cách:
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ẻ.
/*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)