Xu hướng ATR theo chiến lược

Tác giả:ChaoZhang, Ngày: 2023-09-21 15:13:47
Tags:

Tổng quan

Chiến lược này sử dụng Average True Range (ATR) để nắm bắt xu hướng giá và thiết lập điểm dừng dựa trên ATR để theo xu hướng.

Làm thế nào nó hoạt động

  1. Tính toán giá trị ATR.

  2. Xác định mức dừng lỗ dựa trên ATR.

  3. Nhập dài / ngắn khi giá phá vỡ mức dừng.

  4. Chốt trong lợi nhuận bằng cách điều chỉnh dừng lại năng động.

Ưu điểm

  • ATR tự động điều chỉnh dừng, không cần can thiệp thủ công
  • Logic đơn giản và trực quan, dễ thực hiện
  • Giúp tránh bị mắc kẹt, dừng lỗ kịp thời
  • Lợi nhuận từ xu hướng cưỡi ngựa
  • Tần số giao dịch được điều khiển thông qua các tham số ATR

Rủi ro

  • Các thông số ATR kém có thể gây ra dừng quá lỏng hoặc chặt chẽ
  • Không thể xác định hiệu quả cuối xu hướng
  • Một số thời gian trễ tồn tại
  • Sự đảo ngược có thể làm giảm lợi nhuận

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

  • Tối ưu hóa tham số thời gian ATR
  • Kiểm tra nhiều lần ATR khác nhau cho khoảng cách dừng
  • Thêm bộ lọc để phát hiện sự đảo ngược xu hướng
  • Khám phá máy học để tối ưu hóa tham số
  • Xem xét các cơ chế thu lợi nhuận bổ sung

Kết luận

Chiến lược này có hiệu quả nắm bắt xu hướng sử dụng ATR và khóa lợi nhuận với các điểm dừng động. Các thông số điều chỉnh tinh tế có thể cải thiện hiệu suất. Nhưng sự chậm trễ của ATR không thể được loại bỏ hoàn toàn. Nhìn chung một giải pháp sau xu hướng đơn giản và thực tế.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

strategy(title="ATR Strategy", overlay = true,  commission_type=strategy.commission.percent,commission_value=0.075)
//credits to HPotter for the orginal code
nATRPeriod = input(5)
nATRMultip = input(3.5)
xATR = ta.atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), math.max(nz(xATRTrailingStop[1]), close - nLoss),
                    iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), math.min(nz(xATRTrailingStop[1]), close + nLoss), 
                        iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))
pos =	iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1,
	    iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
color = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

barbuy = close > xATRTrailingStop 
barsell = close < xATRTrailingStop 

strategy.entry("Long", strategy.long, when = barbuy) 
strategy.entry("Short", strategy.short, when = barsell) 

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



Thêm nữa