ATR 지표에 기초한 파라볼리 SAR 후속 정지 전략

저자:차오장, 날짜: 2023-09-13 15:53:00
태그:

이 전략은 ATR 지표에 기반한 Parabolic SAR Trailing Stop 전략이라고 불립니다. 시장 변동성에 적응하기 위해 ATR 지표를 사용하여 Parabolic SAR의 가속 인수를 조정합니다.

전통적인 파라볼릭 SAR의 가속 인수는 고정되어 있으며 변동성이 증가함에 적응할 수 없습니다. 이 전략은 ATR 값이 확장됨에 따라 SAR 곡선이 더 빨리 수축하므로 변동성이 증가하면 가격 주위를 더 빨리 강화하여 위험을 효과적으로 제어 할 수 있습니다.

구체적으로, 가격 트렌드를 결정한 후, 적응 가속 인수는 ATR 값을 기반으로 평형 SAR 후속 스톱 곡선을 그리기 위해 계산됩니다. 가격이 스톱 레벨을 위반하면 스톱 손실이 유발됩니다.

이 전략의 장점은 기존의 패러볼릭 SAR가 시장의 변동성에 따라 동적으로 멈출 수 있다는 것입니다. 그러나 ATR 매개 변수는 최적화가 필요하며, 스톱 라인은 조기 침해에 취약할 수 있습니다.

일반적으로 적응 스톱은 이익을 보호하고 위험을 제한하는 데 중요합니다. 거래자는 시장 조건에 따라 적절한 스톱 지표를 선택하고 스톱 손실 전략의 유용성을 극대화하기 위해 매개 변수를 테스트하고 최적화해야합니다.


/*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)

더 많은