ATR 후속 정지 대역 전략

저자:차오장, 날짜: 2023-10-19 12:42:26
태그:

img

전반적인 설명

이 전략의 핵심 아이디어는 평균 참 범위 (ATR) 지표를 사용하여 유리한 포지션의 보호를 극대화하면서 조기 스톱 손실을 피하기 위해 적응력있는 트레이링 스톱 손실 라인을 설정하는 것입니다. ATR 지표는 시장의 변동성을 동적으로 캡처하고 시장 변동성에 따라 스톱 손실 거리를 조정하여 효과적인 스톱 손실을 보장하면서 스톱 손실 발생 가능성을 최소화 할 수 있습니다. 이 전략은 또한 스톱 손실 라인의 상부 및 하부 한계를 시각화하기 위해 볼링거 밴드를 포함하고 있으며, 범위 시장에서 화이트 시 효과에 대응하기 위해 보호 기능을 추가 할 수 있습니다.

전략 논리

이 전략은 ATR 지표의 N 기간 평균을 기본 스톱 로스 거리로 인수로 곱합니다. ATR 값이 클수록 시장 변동성이 커지기 때문에 스톱 로스 거리가 넓어집니다. ATR 값이 작을수록 스톱 로스 거리가 좁아집니다. 이것은 시장 변동성에 따라 스톱 로스 거리를 동적으로 조정 할 수 있습니다.

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

  1. ATR 기간 (nATRPeriod) 의 ATR 값을 계산합니다.

  2. ATR값을 인수로 곱하여 nLoss의 기본 스톱 손실 거리를 얻습니다 (nATRMultip).

  3. 현재 최대, 최저 및 이전 기간의 스톱 손실 라인을 기반으로 스톱 손실 라인 xATRTrailingStop을 업데이트합니다.

  4. 만약 현재 하락이 이전 기간의 스톱 손실 라인을 유발한다면, 스톱 손실 라인은 nLoss 거리의 하락으로 이동합니다.

  5. 만약 현재 고도가 이전 기간의 스톱 로스 라인을 트리거한다면, 스톱 로스 라인은 n 로스 거리의 고도를 넘어서기 위해 아래로 이동합니다.

  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")


더 많은