Đây là một chiến lược rất đơn giản. Nó chỉ bao gồm một lệnh dừng lỗ. Khi lệnh dừng lỗ được kích hoạt, vị trí được đảo ngược và lệnh dừng lỗ được đặt cho vị trí mới.
Chiến lược được xây dựng dựa trên một trong ba loại dừng lỗ: tỷ lệ dừng lỗ, dừng lỗ ATR, dừng lỗ tuyệt đối.
Cụ thể, chiến lược đầu tiên tính toán giá trị stop loss dựa trên loại stop loss đã chọn. Sau đó nó kiểm tra các tín hiệu đầu vào, đi dài khi cao hơn giá stop loss trước đó và đi ngắn khi thấp hơn giá stop loss trước đó. Sau khi vào, nó tiếp tục cập nhật giá stop loss để theo dõi sự thay đổi giá. Giá stop loss dài thấp trừ giá trị stop loss, giá stop loss ngắn là cao cộng với giá trị stop loss.
Ưu điểm lớn nhất của chiến lược này là sự đơn giản của nó, đòi hỏi theo dõi chỉ một điểm dừng lỗ mà không cần phải xem xét các lựa chọn điểm vào và ra.
So với lệnh dừng lỗ cố định, lệnh dừng lỗ kéo dài mà nó sử dụng có thể khóa lợi nhuận lớn hơn trong khi cũng giảm xác suất lệnh dừng lỗ bị tấn công.
Các rủi ro chính của chiến lược này có thể đến từ việc thiết lập giá trị dừng lỗ không đúng cách. Giá trị dừng lỗ quá lớn có thể dẫn đến tổn thất phóng đại, trong khi giá trị quá nhỏ có thể gây ra stop loss thường xuyên. Điều này đòi hỏi tối ưu hóa thích nghi dựa trên điều kiện thị trường.
Một rủi ro khác là phán đoán hướng không chính xác sau khi kích hoạt dừng lỗ khi đảo ngược các vị trí, 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 phân tích xu hướng và hỗ trợ / kháng cự để xác định thời gian đảo ngược tối ưu.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Chiến lược này thực hiện lợi nhuận thông qua một cơ chế dừng lỗ sau lưng đơn giản và dễ hiểu cho người mới bắt đầu. So với các chiến lược dừng lỗ truyền thống, nó thêm các vị trí đảo ngược sau khi dừng lỗ để có được lợi nhuận bổ sung. Với kiểm tra và tối ưu hóa liên tục, nó có thể trở thành một chương trình định lượng rất thực tế.
/*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)