
이 전략 named ATR 트렌드 추적 전략은, 평균 실제 변동량 (ATR) 을 기반으로 스톱로드를 설정하고, 표준 차차 통로를 사용하여 시장 진입 시기를 판단하는 트렌드 추적 거래 전략이다. 이 전략은 주식 지수, 외환, 상품 등이 명백한 추세에 있는 금융 상품에 적용된다.
이 전략은 ATR 지표를 사용하여 스톱스피드 가격을 설정한다. ATR 지표는 시장의 변동성을 반영하고 스톱스피드 거리를 동적으로 설정할 수 있다. 전략은 ATR 주기와 복수를 입력하여 ATR 값을 계산하고 복수를 스톱스피드 거리로 곱한다. 구체적으로, ATR 스톱스피드 라인의 계산 공식은 다음과 같습니다.
ATR线 = 前一日ATR线 ± nLoss(nLoss = nATRMultip * ATR值)
若收盘价 > ATR线,ATR线上调至收盘价 - nLoss
若收盘价 < ATR线,ATR线下调至收盘价 + nLoss
따라서 ATR 라인은 가격 변동에 따라 동적으로 조정될 수 있고, 트렌드 추적 스톱로스를 구현할 수 있다.
ATR 상쇄 이외에, 전략은 표준 격차 통로를 사용하여 상장 시기를 판단한다. 표준 격차 통로의 계산 공식은 다음과 같다:
中线 = ATR止损线
上轨 = 中线 + n倍标准差
下轨 = 中线 - n倍标准差
가격이 아래에서 위로 중간선을 돌파할 때, 더 많이; 가격이 위에서 아래로 중간선을 돌파할 때, 더 많이.
이 전략의 가장 큰 장점은 ATR 지표를 손실을 막는 도구로 사용하여 시장의 변동 정도에 따라 중단 거리를 동적으로 조정할 수 있으며, 트렌드 추적 중지 및 위험을 효과적으로 제어 할 수 있다는 것입니다.
또한, 표준 간격 통로와 함께 시장 진입 시기를 판단하면, 소규모 가격 변동으로 인해 자주 입장을 열지 않을 수 있다.
이 전략의 주요 위험은, 중지 거리가 너무 길면 위험을 효과적으로 제어할 수 없다는 것입니다. 중지 거리가 지나면 시장 소음으로 방해 될 수 있습니다. 이 위험에 대해, ATR 주기 및 ATR 배수를 조정하여 최적의 파라미터 조합을 찾을 수 있습니다.
또 다른 위험은, 표준편차 통로 매개 변수가 잘못 설정되어 너무 높거나 너무 낮은 포지션 개시 빈도를 초래할 수 있다는 것입니다. 매개 변수 최적화를 통해 최적의 매개 변수를 찾을 수 있습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
ATR 주기 및 배수 최적화. 이 두 가지 변수를 조정하면 더 나은 손실을 방지 할 수 있습니다.
표준비례 통로 매개 변수를 최적화한다. 통로 매개 변수를 최적화하여 더 나은 상장 효과를 얻는다.
다른 지표 필터링을 추가하십시오. 이동 평균, K선 형태와 같은 지표를 추가하여 트렌드 방향을 판단하고 수익률을 높일 수 있습니다.
포지션 개시 및 평화 포지션 논리를 최적화한다. 가격이 표준 격차 통로에 도달했을 때, K선 형태를 다시 확인한 후에 포지션을 열 수 있다.
이 전략은 ATR 지표에 기반하여 트렌드 추적 스톱로스를 구현하고, 표준 격차 통로를 사용하여 시장 진출 시기를 판단한다. 전략의 장점은 스톱로스 위험 제어 효과가 좋으며, 트렌드 거래에 적합하다. 위험과 최적화 방향도 명확하게 분석된다. 이 전략은 추가 테스트를 통해 최적화할 가치가 있으며, 실장 거래 가치가 있다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version = 2
strategy(title="Average True Range Strategy", overlay = true)
nATRPeriod = input(11) //Hur många perioder ATR är på
nATRMultip = input(0.5) //Hur många gånger nuvarande ATR multipliceras med
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
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 = 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)))
stdev3 = 14*stdev(xATR, nATRPeriod)
band1 = xATRTrailingStop+stdev3 //Översta stdev bandet
band2 = xATRTrailingStop-stdev3 //Nedersta stdev bandet
// Datum och tid
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 18, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2013, title = "From Year", minval = 2013)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 2020, title = "To Year", minval = 2017)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest slut
startTimeOk() => true
initial_capital = 100000
take = close > xATRTrailingStop
if( startTimeOk() ) and (pos == 1)
//if (pos == 1)
strategy.entry("Long", strategy.long, comment = "KOP")
strategy.exit("Long", when = take)
if( startTimeOk() ) and (pos == -1)
//if (pos == -1)
strategy.entry("Short", strategy.short, comment = "SALJ")
barcolor(pos == -1 ? red: pos == 1 ? green : blue )
plot(xATRTrailingStop, color=red, title="ATR Trailing Stop") //Mittersta linjen som är triggerlinjen för köp/sälj
plot(band1, color=red)
plot(band2, color=blue)