ATR 후속 정지 전략

저자:차오장, 날짜: 2023-10-09 16:59:57
태그:

전반적인 설명

이 전략은 주식 가격 변화를 추적하기 위해 평균 진정한 범위 (ATR) 표시를 기반으로 동적 스톱 손실 라인을 설정하여 수익을 극대화하면서 스톱 손실을 보호합니다.

전략 논리

이 전략은 주로 다음과 같은 단계를 통해 실행됩니다.

  1. ATR 표시기를 계산합니다. ATR 기간은 nATRPeriod 매개 변수로 설정됩니다. 기본값은 5입니다.

  2. ATR 값에 기초하여 스톱 손실 라인을 계산합니다. 스톱 손실 크기는 nATRMultip 매개 변수로 설정되며, ATR의 3.5배로 기본 설정됩니다.

  3. 가격이 상승하면, 이전 스톱 로스 라인보다 높으면, 스톱 로스 라인을 가격 빼기 스톱 로스 크기로 조정합니다. 가격이 하락하면, 이전 스톱 로스 라인보다 낮으면, 스톱 로스 라인을 가격 더하기 스톱 로스 크기로 조정합니다.

  4. 가격이 스톱 로스 라인을 넘어서면 판단하고, 만약 그 라인을 넘어서면 구매 또는 판매 신호를 보내야 합니다.

  5. 스톱 로스 라인 브레이크오웃 신호에 따라 긴 또는 짧은 포지션을 입력하고 가격이 다시 스톱 로스 라인을 만지면 포지션을 닫습니다.

가격 상승 시, 스톱 로스 라인은 수익을 잠금하기 위해 지속적으로 올라갈 것입니다. 가격이 떨어지면 스톱 로스 라인은 손실을 중지하기 위해 지속적으로 내려갈 것입니다. ATR 지표는 가격 변동을 더 정확하게 반영 할 수 있습니다. ATR에 기반한 스톱 로스 라인을 동적으로 조정하면 지나치게 공격적이거나 지나치게 보수적인 스톱 로스를 피할 수 있습니다.

이점 분석

  • 손실 확장을 피하기 위해 신속한 손실 중지 라인을 동적으로 조정합니다.
  • 스톱 로스 라인 조정은 조기 스톱 로스를 피하기 위해 비교적 부드럽습니다.
  • ATR 지표를 사용하여 최신 변동성을 기반으로 더 합리적인 스톱 로스 크기를 계산합니다.
  • 트레일 스톱 손실 라인 효율적으로 수익을 잠금

위험 분석

  • ATR 매개 변수 설정은 신중해야 합니다. 너무 짧은 ATR 기간은 스톱 로스 라인의 과도한 변동을 일으킬 수 있습니다. 너무 길게는 시간적 가격 변화를 반영하지 못할 수 있습니다.
  • 스톱 로즈 크기는 특정 주식 변동성에 따라 설정되어야 합니다. 너무 큰 값이나 너무 작은 값은 전략 성과에 영향을 줄 것입니다.
  • 후속 스톱 손실은 또 다른 가격 상승 전에 수익을 중지함으로써 수익 마진을 줄일 수 있습니다.
  • 빈번한 위치 조정으로 인해 거래 비용이 증가할 수 있습니다.

매개 변수는 ATR 기간과 스톱 손실 크기를 조정하여 스톱 손실과 트레일링 사이의 최적의 균형을 찾기 위해 최적화 할 수 있습니다. 불필요한 스톱 손실을 줄이기 위해 다른 기술적 지표도 입력 시기를 필터링하는 데 사용할 수 있습니다.

최적화 방향

  • 가격 변동을 더 자세히 따라 스톱 손실 라인 변경을 만들기 위해 ATR 기간 매개 변수를 최적화
  • 더 합리적인 스톱 손실을 위해 스톱 손실 크기 매개 변수를 최적화
  • 입력 시간 필터에 다른 지표를 추가
  • 명백한 상승 추세가 나타날 때만 장기화하십시오.
  • 재입입시 메커니즘을 추가하여 손실을 멈추지만 상승을 계속 기대하는 주식에 참여하는 것을 고려하십시오.

요약

이 전략은 동적 ATR 트레일링 스톱 로스 라인을 통해 보유 중 스톱 로스와 수익을 실현한다. 고정 스톱 로스 포인트와 비교하면 과도한 공격적 또는 과도한 보수적 스톱 로스를 피하면서 가격 변동에 더 잘 적응한다. ATR 지표는 스톱 로스 라인 조정을 더 타겟으로 한다. 그러나 매개 변수와 재입구 전략은 불필요한 스톱을 줄이고 이익 마진을 확대하기 위해 추가 최적화가 필요하다. 전반적으로 이것은 더 많은 연구와 응용을 가치가 있는 좋은 동적 트레일링 스톱 로스 아이디어이다.


/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, 
  initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
  
nATRPeriod      = input(5, "ATR Period")
nATRMultip      = input(3.5, "ATR Multiplier")
useShorts       = input(false, "Test w/Shorts?")
daysBackMax     = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin     = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax       = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin       = 1000 * 60 * 60 * 24 * daysBackMin

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop := 
 iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
  iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), 
   iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss))) 
                       
pos = na 
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 ? red: pos == 1 ? green : blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))

buy     = crossover(close, xATRTrailingStop)
sell    = crossunder(close, xATRTrailingStop)

strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)



더 많은