Chiến lược dừng theo dõi thích ứng


Ngày tạo: 2023-10-08 15:06:28 sửa đổi lần cuối: 2023-10-08 15:06:28
sao chép: 0 Số nhấp chuột: 771
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này chủ yếu thực hiện một cơ chế dừng tự động, có thể tự động điều chỉnh vị trí dừng tùy theo biến động giá, để đạt được hiệu quả dừng tốt hơn. Chiến lược sử dụng chỉ số ATR để tính toán phạm vi dừng hợp lý và kết hợp với đường trung bình EMA để tạo ra tín hiệu giao dịch, mở thêm lỗ khi phá vỡ đường trung bình EMA, đồng thời theo dõi vị trí dừng bằng thuật toán dừng tự động.

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

  1. Tính toán chỉ số ATR, đặt giá trị ATR nhân với tham số a làm phạm vi dừng lỗ nLoss.
  2. Tính toán đường trung bình của EMA.
  3. Khi giá vượt qua đường trung bình EMA, hãy làm nhiều hơn và khi giá vượt qua đường trung bình EMA, hãy làm trống.
  4. TrailingStop tự động điều chỉnh điểm dừng xATRTrailingStop bằng thuật toán dừng thích ứng, quy tắc như sau:
    • Khi giá vượt mức dừng lỗ lên, mức dừng lỗ sẽ được điều chỉnh thành giá trừ phạm vi dừng lỗ nLoss.
    • Khi giá phá vỡ điểm dừng xuống, điểm dừng sẽ được điều chỉnh thành giá cộng với phạm vi dừng nLoss.
    • Trong các trường hợp khác, Stop Loss sẽ không thay đổi.
  5. Khi giá chạm mức dừng lỗ, lệnh dừng lỗ sẽ được thực hiện.

Phân tích lợi thế

  1. Có cơ chế dừng lỗ thích ứng, có thể tự động điều chỉnh mức dừng lỗ theo mức độ biến động của thị trường, kiểm soát rủi ro hiệu quả.
  2. Tính toán phạm vi dừng hợp lý kết hợp với chỉ số ATR, tránh dừng quá lớn hoặc quá nhỏ.
  3. Sử dụng EMA để tạo ra tín hiệu giao dịch, bạn có thể giảm giao dịch vô nghĩa, lọc tiếng ồn thị trường.
  4. Chiến lược của nó rất đơn giản và rõ ràng, mã dễ hiểu, dễ kiểm tra và tối ưu hóa.
  5. Các tham số nhập có thể được điều chỉnh để phù hợp với môi trường thị trường khác nhau.

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

  1. EMA có thể tạo ra tín hiệu giao dịch có thể bị chậm trễ, dẫn đến việc nhập cảnh quá muộn. Bạn có thể xem xét sử dụng các chỉ số khác để hỗ trợ phán đoán trước khi nhập cảnh.
  2. Thời gian giữ vị trí không chắc chắn, không thể kiểm soát kích thước lỗ hổng đơn lẻ. Bạn có thể đặt mục tiêu lợi nhuận hoặc thời gian giữ vị trí tối đa để tránh thua lỗ quá lớn.
  3. Trong thị trường xu hướng lớn, dừng lỗ có thể được kích hoạt quá thường xuyên. Bạn có thể xem xét điều chỉnh tham số theo tình trạng xu hướng hoặc thêm điều kiện lọc.
  4. Các tham số nên được điều chỉnh theo các đặc điểm của các giống khác nhau, chẳng hạn như chu kỳ ATR, số lần dừng lỗ, v.v., không được sử dụng các giá trị mặc định một cách mù quáng.

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

  1. Có thể xem xét thêm các chỉ số đánh giá xu hướng, đặt hàng theo hướng xu hướng, tránh giao dịch ngược.
  2. Các nhân dừng lỗ có thể được điều chỉnh theo kích thước của biến động, và trong biến động lớn, phạm vi dừng lỗ có thể được nới lỏng thích hợp.
  3. Bạn có thể đặt thời gian giữ vị trí tối đa, sau một khoảng thời gian nhất định, bạn có thể chủ động dừng lỗ.
  4. Bạn có thể thêm một chiến lược dừng chân di động, nâng mức dừng chân lên từng bước khi giá di chuyển.
  5. Bạn có thể tùy chỉnh tham số chu kỳ ATR theo đặc điểm của từng cổ phiếu.

Tóm tắt

Chiến lược này có ý tưởng rõ ràng và dễ hiểu, sử dụng chỉ số ATR để thiết lập phạm vi dừng tự điều chỉnh và kết hợp với EMA để tạo tín hiệu giao dịch, có thể kiểm soát tổn thất hiệu quả. Tuy nhiên, chính chiến lược này khá thụ động, có nhiều không gian tối ưu hóa, có thể xem xét thêm phán đoán xu hướng, điều chỉnh các tham số tùy theo tình trạng thị trường để chiến lược chủ động hơn. Nói chung, chiến lược này là một chiến lược dừng lỗ tốt hơn và mẫu, nhưng cần điều chỉnh tối ưu hóa theo các đặc điểm khác nhau của sản phẩm, không thể chuyển sang sử dụng phần cứng.

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