Chiến lược dừng lỗ và dừng lãi động dựa trên lệnh dừng lỗ kép ATR


Ngày tạo: 2024-03-22 13:52:59 sửa đổi lần cuối: 2024-03-22 13:52:59
sao chép: 1 Số nhấp chuột: 616
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ và dừng lãi động dựa trên lệnh dừng lỗ kép ATR

Tổng quan

Chiến lược này sử dụng hai chu kỳ khác nhau của chỉ số ATR (Average True Range) để xây dựng đường dừng theo dõi động đôi, tạo ra tín hiệu giao dịch khi giá vượt qua đường dừng. Đồng thời sử dụng chiều dài của thực thể đường dây đệm để thiết lập giá dừng động để thực hiện dừng động. Chiến lược cũng kết hợp với chỉ số EMA để hỗ trợ phán đoán xu hướng.

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

  1. Tính giá trị chỉ số ATR của hai chu kỳ khác nhau (bằng mặc định là 10 và 20), và nhân với hệ số nhạy tương ứng (bằng mặc định là 1 và 2) để có được hai chiều rộng dừng.
  2. Một tín hiệu đa đầu hoặc vô đầu được tạo ra tùy thuộc vào vị trí của giá trên hoặc dưới hai đường dừng và sự phá vỡ.
  3. Giá dừng được tính theo chiều dài động của 1.65 lần chiều dài của thực thể dây chuyền hiện tại (có thể điều chỉnh).
  4. Sau khi mở vị trí, nếu giá chạm mức dừng, vị trí giảm sẽ thu được lợi nhuận.
  5. Sử dụng các chỉ số hỗ trợ đánh giá xu hướng hiện tại như EMA để cung cấp thông tin tham khảo.

Chiến lược này sử dụng đặc tính của chỉ số ATR để xây dựng lỗ hổng động đôi, có thể thích ứng tốt hơn với các tỷ lệ biến động khác nhau của thị trường, đồng thời có thể phản ứng nhanh với sự đột biến của thị trường. Thiết lập dừng động cho phép chiến lược thu được nhiều lợi nhuận hơn trong tình huống xu hướng.

Phân tích lợi thế

  1. Đường dừng động kép có khả năng thích ứng với sự biến động của thị trường khác nhau, có tính linh hoạt cao.
  2. Giá Stop-Line được tính theo chiều dài hiện tại của đường dây và có thể thu được nhiều lợi nhuận hơn trong tình huống xu hướng.
  3. Sử dụng các chỉ số hỗ trợ đánh giá xu hướng như EMA, cung cấp tài liệu tham khảo cho nhập cảnh, tăng cường độ tin cậy của chiến lược.
  4. Khóa học có logic rõ ràng, dễ đọc, dễ hiểu và tối ưu hóa.

Phân tích rủi ro

  1. Trong thị trường bất ổn, giao dịch thường xuyên có thể dẫn đến chi phí phí cao, ảnh hưởng đến lợi nhuận.
  2. Các thiết lập cho các tham số đường dừng và nhân số dừng cần được tối ưu hóa theo các đặc điểm của thị trường và sản phẩm khác nhau, các tham số không phù hợp có thể dẫn đến hiệu suất chiến lược kém.
  3. Chiến lược này chủ yếu phụ thuộc vào việc tạo tín hiệu phá vỡ đường dừng động của giá, có thể tạo tín hiệu sai cho một số trường hợp phá vỡ giả của sự biến động lớn.

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

  1. Đối với thị trường chấn động, bạn có thể xem xét giới thiệu thêm các chỉ số hoặc điều kiện để lọc các tín hiệu giao dịch, chẳng hạn như RSI, MACD.
  2. Đối với các sản phẩm và thị trường khác nhau, bạn có thể tìm các tham số đường dừng và nhân số dừng tối ưu bằng cách tra cứu lịch sử và tối ưu hóa tham số.
  3. Có thể xem xét việc giới thiệu các mô-đun quản lý vị trí và kiểm soát rủi ro, điều chỉnh kích thước vị trí tùy theo biến động của thị trường và rủi ro tài khoản.
  4. Thêm nhiều chỉ số đánh giá xu hướng, tăng độ tin cậy và độ chính xác của tín hiệu.

Tóm tắt

Chiến lược này có thể thích ứng tốt hơn với các môi trường thị trường khác nhau, hoạt động tốt trong các tình huống xu hướng thông qua thiết kế hai đường dừng động và dừng động. Tuy nhiên, trong thị trường biến động, có thể gặp phải vấn đề giao dịch thường xuyên và bù lỗ. Do đó, chiến lược này phù hợp hơn để sử dụng trong thị trường xu hướng, đồng thời cần kết hợp các đặc điểm sản phẩm và môi trường thị trường, tối ưu hóa và điều chỉnh các tham số. Ngoài ra, vẫn còn không gian tối ưu hóa hơn nữa, chẳng hạn như giới thiệu nhiều điều kiện lọc, quản lý vị trí và các mô-đun kiểm soát rủi ro để tăng cường sức khỏe và lợi nhuận của chiến lược. Nói chung, chiến lược này có lối suy nghĩ rõ ràng, logic dễ hiểu, có một số giá trị thực tế và không gian tối ưu hóa, đáng để nghiên cứu và ứng dụng thêm.

Mã nguồn chiến lược
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
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 = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

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

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

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

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)