ATR 지표를 기반으로 한 적응형 트레일링 스톱로스 전략


생성 날짜: 2023-10-19 12:42:26 마지막으로 수정됨: 2023-10-19 12:42:26
복사: 0 클릭수: 843
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ATR 지표를 기반으로 한 적응형 트레일링 스톱로스 전략

개요

이 전략의 핵심 아이디어는 평균 실제 파도 (ATR) 지표를 사용하여 적응 가능한 추적 스톱 라인을 설정하여 수익을 창출하는 입장을 최대한 보호하고 조기 상실을 피합니다. ATR 지표는 시장의 변동성을 동적으로 포착 할 수 있습니다. 시장의 변동에 따라 상쇄 손실 거리를 조정하고 상쇄 손실을 보장하면서 상쇄 손실이 유발되는 가능성을 최소화합니다. 이 전략은 동시에 브린 밴드를 추가하여 상쇄 손실 라인의 상하를 시각화하고 상쇄 시장의 영향에 대항하기 위해 그림자 보호 라인을 추가 할 수 있습니다.

전략 원칙

이 전략은 ATR 지표의 N주기 평균값을 1배로 곱하여 기본 중지 거리를 사용한다. ATR 값이 클수록, 시장의 변동이 클수록, 중지 거리는 더 넓게 설정된다. ATR 값이 작을수록, 중지 거리는 더 좁게 설정된다.

특히, 전략은 다음과 같은 핵심 논리를 사용합니다.

  1. ATR 주기 ((nATRPeriod) 의 ATR 값을 계산한다.

  2. ATR값을 곱해서 nLoss을 얻는다.

  3. 현재의 최고, 최저, 그리고 지난 주기의 스톱 라인을 기준으로 스톱 라인 xATRTrailingStop를 업데이트한다.

  4. 만약 현재의 낮은 점이 지난 주기의 스톱 라인을 촉발한다면, 스톱 라인은 낮은 것에서 nLoss의 거리로 이동한다.

  5. 만약 현재의 높이가 지난 주기의 스톱 라인을 촉발한다면, 스톱 라인 아래로 이동하여 높이에 nLoss 이상의 거리를 이동한다.

  6. 만약 스톱로스가 촉발되지 않는다면, 클로즈 가격의 스톱로스 라인으로부터의 거리에 따라 스톱로스를 조정한다.

  7. 선택적인 그림자 선 보호 거리를 추가하여 손해 막선을 더욱 최적화한다.

  8. 브린띠 궤도를 그려서 스톱다일의 상하한도를 시각화한다.

  9. 스톱 라인의 색에 따라 포지션 방향을 판단한다.

이 전략은 ATR 지표를 유연하게 사용하여 시장의 변동에 따라 중지 라인을 조정할 수 있도록 해줍니다. 이는 중지 거리가 합리적인지 확인하고 너무 급진적인 중지로 인해 불필요한 위치 손실을 피하는 데 도움이됩니다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. ATR 지표를 사용하여 손해배상 거리를 동적으로 조정하여 다른 시장 상황에 적응 할 수 있습니다.

  2. 배수 파라미터는 사용자 정의 가능하며, 스톱드라이브의 유연한 조정을 가능하게 한다.

  3. 브린 벨트 궤도에 합류하여 스포드피드 라인의 시각의 상하한을 형성한다.

  4. 선택적인 그림자 보호 기능으로, 흔들리는 시의 휘프사우를 피할 수 있습니다.

  5. 이윤을 창출한 포지션을 최대한 철회할 수 있도록 트래킹 스톱로스로 사용할 수 있다.

  6. 전략이 명확하고 이해가 쉬우며, 파라미터는 덜 최적화된다.

  7. 다양한 품종과 주기에서 사용할 수 있으며, 적용 범위가 넓다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. ATR 지표는 시장의 갑작스러운 사건에 대한 반응이 지연되어 너무 큰 중단 거리를 초래할 수 있습니다.

  2. 배수 세팅이 너무 커지면, 손해배상 거리가 너무 넓어져 손실 위험이 증가합니다.

  3. 그림자 선 보호 기능은 진동이 커지면 스톱드레이를 너무 느슨하게 만듭니다.

  4. 출전규칙을 고려하지 않고는 출전/출구 전략으로 사용할 수 없습니다.

  5. 다양한 품종과 주기에 맞는 최적화 매개 변수를 반복적으로 테스트해야 합니다.

  6. 스톱로스를 뚫면 손실이 커질 수 있으며, 효율적인 자금 관리가 필요합니다.

최적화 방향

이 정책은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다양한 ATR 주기 파라미터를 테스트하고, 스톱 피해 거리를 최적화한다.

  2. 배수 변수를 조정하여 스톱 거리와 스톱 확률 사이의 균형을 찾습니다.

  3. 위프사우를 방지하기 위해 그림자 보호 주기 변수를 최적화한다.

  4. 엔트리/엑시트 전략으로, 스톱로스 기반의 엔트리 조건을 추가하려고 합니다.

  5. 트렌드를 판단하는 지표를 추가하고, 트렌드에 따라 스톱 라인지를 조정한다.

  6. 파동 이론과 결합하여, 파동 위치에 따라 막손해 거리를 조정한다.

  7. 포지션 컨트롤을 추가하여 단편 손실을 제한합니다.

요약하다

이 전략은 ATR 지표의 자기 적응 특성을 활용하여, 동적으로 조정할 수 있는 손해 중지 메커니즘을 설계했다. 손해 중지 보장하면서도, 불필요한 손해 중지 촉발을 최대한 줄일 수 있다. 전략 아이디어는 간단하고 명확하며, 자신의 필요에 따라 유연하게 최적화 할 수 있다.

전략 소스 코드
/*backtest
start: 2022-10-12 00:00:00
end: 2023-10-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR 
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick) 
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
 iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick), 
//                        iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
 iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))

pos =	iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
 iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
color = pos == 1 ? red: pos == -1 ? green : blue 
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")

longCondition = (color == green and color[1] == red)
if (longCondition)
    strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
    strategy.close("Long")

shortCondition = (color == red and color[1] == green)
if (shortCondition)
    strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
    strategy.close("Short")