이 전략은 주식 가격 변화를 추적하기 위해 평균 진정한 범위 (ATR) 표시를 기반으로 동적 스톱 손실 라인을 설정하여 수익을 극대화하면서 스톱 손실을 보호합니다.
이 전략은 주로 다음과 같은 단계를 통해 실행됩니다.
ATR 표시기를 계산합니다. ATR 기간은 nATRPeriod 매개 변수로 설정됩니다. 기본값은 5입니다.
ATR 값에 기초하여 스톱 손실 라인을 계산합니다. 스톱 손실 크기는 nATRMultip 매개 변수로 설정되며, ATR의 3.5배로 기본 설정됩니다.
가격이 상승하면, 이전 스톱 로스 라인보다 높으면, 스톱 로스 라인을 가격 빼기 스톱 로스 크기로 조정합니다. 가격이 하락하면, 이전 스톱 로스 라인보다 낮으면, 스톱 로스 라인을 가격 더하기 스톱 로스 크기로 조정합니다.
가격이 스톱 로스 라인을 넘어서면 판단하고, 만약 그 라인을 넘어서면 구매 또는 판매 신호를 보내야 합니다.
스톱 로스 라인 브레이크오웃 신호에 따라 긴 또는 짧은 포지션을 입력하고 가격이 다시 스톱 로스 라인을 만지면 포지션을 닫습니다.
가격 상승 시, 스톱 로스 라인은 수익을 잠금하기 위해 지속적으로 올라갈 것입니다. 가격이 떨어지면 스톱 로스 라인은 손실을 중지하기 위해 지속적으로 내려갈 것입니다. 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)