Chiến lược đảo ngược Trailing Stop


Ngày tạo: 2023-12-01 13:41:41 sửa đổi lần cuối: 2023-12-01 13:41:41
sao chép: 0 Số nhấp chuột: 629
1
tập trung vào
1619
Người theo dõi

Chiến lược đảo ngược Trailing Stop

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

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

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

Phân tích lợi thế

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

Phân tích rủi ro

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.

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

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

  1. Tăng khả năng đánh giá xu hướng, tránh trở ngại
  2. Tối ưu hóa cách tính toán giá trị dừng để theo dõi thị trường một cách năng động hơn
  3. Tăng khả năng đánh giá đột phá, đảm bảo tín hiệu đảo ngược có xác suất cao hơn
  4. Kết hợp các chỉ số như tỷ lệ biến động để xác định thời gian đảo ngược tốt nhất

Tóm tắt

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.

Mã nguồn chiến lược
/*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)