
Đây là một chiến lược rất đơn giản. Nó chỉ bao gồm một lệnh dừng theo dõi. Khi lệnh dừng được kích hoạt, vị trí được đảo ngược và đặt một lệnh dừng theo dõi cho vị trí mới.
Chiến lược này được xây dựng dựa trên một trong ba loại dừng lỗ: dừng phần trăm, dừng ATR và dừng tuyệt đối. Khi dừng lỗ được kích hoạt, vị trí được đảo ngược và đặt một lệnh dừng theo dõi cho vị trí mới.
Cụ thể, chiến lược đầu tiên tính toán giá dừng dựa trên loại dừng được chọn. Sau đó, nó sẽ đánh giá xem liệu có tín hiệu đặt hàng hay không, tức là khi giá cao hơn giá dừng trước đó, giá thấp hơn giá dừng trước đó và trống. Sau khi tham gia, nó sẽ cập nhật giá dừng trong thời gian thực để nó theo dõi sự thay đổi giá.
Ưu điểm lớn nhất của chiến lược này là rất đơn giản, chỉ cần theo dõi một điểm dừng, không cần phải xem xét lựa chọn điểm vào và lựa chọn điểm ra. Các thiết lập linh hoạt của giá trị dừng cũng làm cho phạm vi ứng dụng của nó rộng hơn.
So với lệnh dừng cố định, nó sử dụng lệnh dừng theo dõi để khóa lợi nhuận lớn hơn, đồng thời giảm khả năng bị chặn. Mỗi khi lệnh dừng được kích hoạt, vị trí đảo ngược có thể nắm bắt cơ hội biến đổi giá.
Rủi ro chính của chiến lược này có thể là rủi ro do thiết lập giá dừng không phù hợp. Thiết lập giá dừng quá lớn có thể dẫn đến tổn thất mở rộng; thiết lập giá dừng quá nhỏ có thể dẫn đến việc dừng thường xuyên được kích hoạt. Điều này cần được tối ưu hóa phù hợp với tình hình thị trường.
Một rủi ro khác là đánh giá không chính xác về hướng của vị trí đảo ngược sau khi dừng lỗ được kích hoạt, do đó bỏ lỡ cơ hội đảo ngược giá hoặc tăng lỗ. Điều này cần kết hợp xu hướng và đánh giá kháng cự hỗ trợ để xác định thời gian đảo ngược tối ưu.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Chiến lược này tạo ra lợi nhuận thông qua cơ chế dừng lỗ theo dõi đơn giản, một chiến lược định lượng phù hợp cho người mới bắt đầu. So với chiến lược dừng lỗ truyền thống, nó tăng cơ chế tái tạo vị trí sau khi kích hoạt dừng lỗ, do đó thu được lợi nhuận bổ sung. Bằng cách liên tục kiểm tra và tối ưu hóa, chiến lược này có thể trở thành một chương trình định lượng rất hữu ích.
/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)
////////////
// Inputs //
sl_type = input("%", options = ["%", "ATR", "Absolute"])
sl_perc = input(4, title = "% SL", type = input.float)
atr_length = input(10, title = "ATR Length")
atr_mult = input(2, title = "ATR Mult", type = input.float)
sl_absol = input(10, title = "Absolute SL", type = input.float)
// 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 //
// SL values
sl_val = sl_type == "ATR" ? atr_mult * atr(atr_length) :
sl_type == "Absolute" ? sl_absol :
close * sl_perc / 100
// 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])
//////////////
// PLOTINGS //
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//////////////
// STRATEGY //
if (time_cond and pos != 1)
strategy.entry("long", true, stop = trailing_sl)
if (time_cond and pos != -1)
strategy.entry("short", false, stop = trailing_sl)