Chiến lược đảo ngược lỗ dừng lại

Tác giả:ChaoZhang, Ngày: 2023-12-01 13:41:41
Tags:

img

Tổng quan

Đâ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 logic

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.

Phân tích lợi thế

Ư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.

Phân tích rủi ro

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.

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

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Thêm phán đoán xu hướng để tránh giao dịch chống lại xu hướng
  2. Tối ưu hóa tính toán giá trị dừng lỗ để làm cho nó theo dõi thị trường năng động hơn
  3. Tăng xác nhận đột phá cho các tín hiệu đảo ngược có khả năng cao hơn
  4. Bao gồm các biện pháp biến động để tìm thời điểm đảo ngược tốt nhất

Kết luận

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)

Thêm nữa