Chiến lược dừng lỗ Parabol dựa trên chỉ báo ATR


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

Chiến lược này được gọi là chiến lược dừng lỗ đường ngang dựa trên chỉ số ATR. Chiến lược này sử dụng chỉ số ATR để điều chỉnh tốc độ co rút của đường cong dừng lỗ đường ngang, cho phép nó thích nghi với sự thay đổi của tỷ lệ biến động thị trường.

Các yếu tố gia tốc của dừng chân của đường parabola truyền thống được cố định không thay đổi, không thể đối phó với sự gia tăng của tỷ lệ biến động. Chiến lược này làm cho tốc độ co lại của đường parabola tăng lên với giá trị ATR tăng lên, do đó, khi biến động tăng lên, đường dừng chân có thể đến gần giá nhanh hơn, kiểm soát rủi ro hiệu quả.

Cụ thể, sau khi chiến lược xác định hướng xu hướng của giá, tính toán một nhân tố gia tốc thích ứng dựa trên giá trị ATR và vẽ đường cong dừng lỗ theo đường cong. Khi giá phá vỡ đường dừng lỗ, thực hiện lệnh dừng lỗ.

Lợi thế của chiến lược này là cho phép dừng lỗ đường parabola truyền thống có thể được điều chỉnh động dựa trên biến động của thị trường. Tuy nhiên, tham số ATR cần được tối ưu hóa và đường dừng lỗ quá nhạy cảm và dễ bị phá vỡ.

Nhìn chung, tự điều chỉnh dừng lỗ là rất quan trọng để bảo vệ lợi nhuận và kiểm soát rủi ro. Các nhà giao dịch nên chọn các chỉ số dừng lỗ phù hợp theo điều kiện thị trường và kiểm tra và tối ưu hóa các tham số để có thể sử dụng tối đa chiến lược dừng lỗ.

Mã nguồn chiến lược
/*backtest
start: 2023-08-13 00:00:00
end: 2023-09-12 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="ATR Parabolic SAR Strategy [QuantNomad]", shorttitle="ATR PSAR Strategy [QN]", overlay=true, default_qty_type = strategy.percent_of_equity,  default_qty_value = 100)

atr_length = input(14)
start      = input(0.02)
increment  = input(0.02)
maximum    = input(0.2)
entry_bars = input(1, title = "Entry on Nth trend bar") 

atr = atr(atr_length)

atr := na(atr) ? tr : atr

psar        = 0.0 // PSAR
af          = 0.0 // Acceleration Factor
trend_dir   = 0   // Current direction of PSAR
ep          = 0.0 // Extreme point
trend_bars  = 0

sar_long_to_short = trend_dir[1] == 1  and close <= psar[1] // PSAR switches from long to short
sar_short_to_long = trend_dir[1] == -1 and close >= psar[1] // PSAR switches from short to long

trend_change = barstate.isfirst[1] or sar_long_to_short or sar_short_to_long

// Calculate trend direction
trend_dir    :=  barstate.isfirst[1] and close[1]  > open[1] ?  1 : 
                 barstate.isfirst[1] and close[1] <= open[1] ? -1 : 
                 sar_long_to_short ? -1 : 
                 sar_short_to_long ?  1 : nz(trend_dir[1])

trend_bars := sar_long_to_short ? -1 : 
              sar_short_to_long ?  1 : 
              trend_dir ==  1   ? nz(trend_bars[1]) + 1 : 
              trend_dir == -1   ? nz(trend_bars[1]) - 1 : 
              nz(trend_bars[1])

// Calculate  Acceleration Factor
af := trend_change ? start : 
   (trend_dir == 1 and high > ep[1]) or  
   (trend_dir == -1 and low < ep[1]) ? 
   min(maximum, af[1] + increment) : 
   af[1]

// Calculate extreme point
ep := trend_change and trend_dir == 1 ? high :  
   trend_change and trend_dir == -1 ? low : 
   trend_dir == 1 ? max(ep[1], high) : 
   min(ep[1], low)

// Calculate PSAR
psar :=  barstate.isfirst[1] and close[1]  > open[1] ? low[1]  : 
         barstate.isfirst[1] and close[1] <= open[1] ? high[1] : 
         trend_change ? ep[1] :    
         trend_dir == 1 ? psar[1] + af * atr : 
                          psar[1] - af * atr

plot(psar, style=plot.style_cross, color=trend_dir == 1 ? color.green : color.red,  linewidth = 2)


// Strategy 
strategy.entry("Long",  true,  when = trend_bars ==  entry_bars)
strategy.entry("Short", false, when = trend_bars == -entry_bars)