Chiến lược dừng kéo theo thích nghi

Tác giả:ChaoZhang, Ngày: 2023-10-08 15:06:28
Tags:

Tổng quan

Chiến lược này chủ yếu thực hiện một cơ chế dừng lỗ thích nghi tự động điều chỉnh vị trí dừng lỗ dựa trên biến động giá để đạt được hiệu ứng dừng lỗ tốt hơn. Chiến lược sử dụng chỉ số ATR để tính phạm vi dừng lỗ hợp lý và tạo ra tín hiệu giao dịch kết hợp với đường EMA. Nó mở các vị trí dài hoặc ngắn khi giá vượt qua đường EMA và sử dụng thuật toán dừng lỗ thích nghi để theo dõi mức dừng lỗ.

Chiến lược logic

  1. Tính toán chỉ số ATR và đặt giá trị ATR nhân tham số a là phạm vi dừng lỗ nLoss.
  2. Tính toán đường EMA.
  3. Đi dài khi giá phá vỡ trên đường EMA, và đi ngắn khi giá phá vỡ dưới đường EMA.
  4. Sử dụng thuật toán dừng lỗ thích nghi để tự động điều chỉnh vị trí dừng lỗ xATRTrailingStop, với các quy tắc như sau:
    • Khi giá phá vỡ trên vị trí dừng lỗ, điều chỉnh dừng lỗ với giá trừ khoảng dừng lỗ nLoss.
    • Khi giá phá vỡ dưới vị trí dừng lỗ, điều chỉnh dừng lỗ để giá cộng với phạm vi dừng lỗ nLoss.
    • Nếu không, giữ lệnh dừng lỗ không thay đổi.
  5. Đóng vị trí để dừng lỗ khi giá đạt mức dừng lỗ.

Phân tích lợi thế

  1. Thực hiện cơ chế dừng lỗ thích nghi tự động điều chỉnh phạm vi dừng lỗ dựa trên biến động thị trường, kiểm soát hiệu quả rủi ro.
  2. Tính toán phạm vi stop loss hợp lý với chỉ số ATR, tránh stop loss quá lớn hoặc quá nhỏ.
  3. Sử dụng EMA để tạo ra tín hiệu giao dịch, giảm giao dịch không cần thiết và lọc tiếng ồn thị trường.
  4. Đơn giản và rõ ràng chiến lược logic, dễ hiểu và tối ưu hóa.
  5. Cho phép điều chỉnh các thông số đầu vào để thích nghi với môi trường thị trường khác nhau.

Rủi ro và cải tiến

  1. Các tín hiệu EMA có thể chậm trễ, dẫn đến việc tham gia muộn.
  2. Thời gian giữ không chắc chắn, không thể kiểm soát kích thước lỗ dừng duy nhất.
  3. Đặt lỗ dừng có thể được kích hoạt quá thường xuyên trong các thị trường có xu hướng mạnh.
  4. Các thông số như thời gian ATR, nhân stop loss nên được điều chỉnh dựa trên các đặc điểm biểu tượng, các giá trị mặc định không nên được sử dụng mù quáng.

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

  1. Xem xét thêm chỉ số xu hướng, thực hiện giao dịch theo hướng xu hướng để tránh giao dịch ngược xu hướng.
  2. Điều chỉnh nhân stop loss dựa trên biến động, cho phép dừng rộng hơn trong điều kiện biến động cao.
  3. Đặt thời gian giữ tối đa, dừng lỗ hoạt động sau khi vượt quá một thời gian nhất định.
  4. Thêm chiến lược dừng lỗ di chuyển, tăng dần dừng khi giá di chuyển.
  5. Tùy chỉnh tham số thời gian ATR dựa trên các đặc điểm của biểu tượng.

Kết luận

Chiến lược này có logic rõ ràng và đơn giản, quản lý rủi ro với các tín hiệu dừng lỗ dựa trên ATR thích ứng và EMA cho các tín hiệu giao dịch. Nhưng nó tương đối thụ động với nhiều không gian tối ưu hóa. Hãy xem xét thêm đánh giá xu hướng, điều chỉnh tham số động dựa trên điều kiện thị trường để làm cho nó chủ động hơn. Nhìn chung nó phục vụ như một ý tưởng tốt và mẫu cho các chiến lược dừng lỗ đảo ngược, nhưng các tham số nên được điều chỉnh cho các biểu tượng khác nhau thay vì mù quáng áp dụng các giá trị mặc định.


/*backtest
start: 2023-09-07 00:00:00
end: 2023-10-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay = true)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 

// Inputs
a = input(1,     title = "Key Vaule. 'This changes the sensitivity'")
c = input(10,    title = "ATR Period")
h = input(false, title = "Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// 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 = 2019, 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 = true
 
////////////////////////////////////////////////////////////////////////////////


xATR  = atr(c)
nLoss = a * xATR

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close

xATRTrailingStop = 0.0
xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss),
   iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), 
   iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss)))
 
pos = 0   
pos :=	iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema   = ema(src,1)
above = crossover(ema, xATRTrailingStop)
below = crossover(xATRTrailingStop, ema)

buy  = src > xATRTrailingStop and above 
sell = src < xATRTrailingStop and below

barbuy  = src > xATRTrailingStop 
barsell = src < xATRTrailingStop 

plotshape(buy,  title = "Buy",  text = 'Buy',  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny)
plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, transp = 0, size = size.tiny)

barcolor(barbuy  ? color.green : na)
barcolor(barsell ? color.red   : na)

strategy.entry("long",   true, when = buy  and time_cond)
strategy.entry("short", false, when = sell and time_cond)

Thêm nữa