ATR 및 SMA 기반 동적 손절매 추적 전략


생성 날짜: 2024-03-11 11:55:21 마지막으로 수정됨: 2024-03-11 11:55:21
복사: 0 클릭수: 705
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ATR 및 SMA 기반 동적 손절매 추적 전략

개요

이 전략은 ATR (Average True Range) 지표와 SMA (Simple Moving Average) 지표를 결합하여 동적 스톱 손실 추적 거래 시스템을 구현한다. 가격이 SMA보다 높을 때 다중 주문을 하고, 동시에 ATR 기반의 동적 스톱 손실을 설정하면, 스톱 가격이 가격 상승에 따라 계속 상승한다. 가격이 동적 스톱 손실 가격을 깨면 평지한다. 이 전략의 주요 아이디어는 트렌드 상황에서 동적 스톱 손실을 사용하여 수익을 고정하고, 철수를 감소시키는 것이다.

전략 원칙

  1. 50일 SMA를 계산하고, 종식 가격이 50일 SMA보다 크면 더 많은 주문을 다.
  2. ATR 지수를 계산해, ATR 주기는 10이고, 하나의 키값 ((비용 3) 을 곱하면 nLoss의 스톱로스를 얻을 수 있다.
  3. 동적 스톱 가격을 xATRTrailingStop로 계산하고, 초기값은 0。
    • 종결 가격과 이전 종결 가격이 모두 이전 중단 가격보다 크면, 새로운 중단 가격은 이전 중단 가격과 종결 가격-nLoss의 큰 값이다.
    • 종결 가격과 이전 종결 가격이 모두 이전 중단 가격보다 작을 때, 새로운 중단 가격은 이전 중단 가격과 (종결 가격 + nLoss) 의 작은 값이다.
    • 다른 경우, 새로운 스톱 로스는 [[폐쇄 가격-nLoss]] 또는 [[폐쇄 가격+nLoss]]이다.
  4. 동적 스톱 로즈 가격 (Dynamic Stop Loss Price) 을 넘어서 마감할 때 평점.
  5. 스톱포트는 여러 색으로 표시되며, 다중 헤드 스톱포트는 녹색, 빈 헤드 스톱포트는 빨간색, 다른 경우는 파란색이다.

우위 분석

  1. 다이내믹 스톱은 트렌드 상황에서 수익을 보호하고 회수 위험을 줄일 수 있다. 고정 스톱에 비해 다이내믹 스톱은 더 유연하며, 다양한 시장 상황에 적응할 수 있다.
  2. 스톱 로드 폭은 ATR 지표에 기초하여 계산되며, ATR은 시장의 변동률의 크기를 잘 반영할 수 있으므로, 스톱 로드 거리는 근래의 상황에 따라 변동률에 따라 자동으로 조정되며, 변동이 커지면 스톱 로드 공간을 확대하고, 변동이 작아지면 스톱 로드 공간을 축소한다.
  3. SMA를 트렌드 판단 근거로 사용하여 비교적 명확한 트렌드 상황을 포착할 수 있다. SMA 위에 더 많은 주문을 열어 트렌드 초기에는 개입하여 더 큰 수익을 얻을 수 있다.
  4. 사용자가 ATR 주기 및 키값 파라미터를 설정할 수 있으며, 정책 파라미터를 다른 품종 및 주기 특성에 맞게 조정할 수 있습니다.

위험 분석

  1. 추세가 불명확하거나 불안정한 상황에서, 이 전략은 빈번하게 평점을 열 수 있으며, 거래비용이 증가하고, 수익이 감소한다.
  2. 이 전략은 단지 여러 논리를 수행하는 것뿐이며, 하향 추세에서 수익을 얻을 수 없으며, 일방적인 시장의 위험에 직면해 있다. 포커스 논리를 추가하여 양방향 거래를 실현하는 것을 고려할 수 있다.
  3. 스톱로스 포인트는 ATR을 기반으로 계산되며, 시장 변동이 심한 경우 스톱로스 공간이 너무 커져 위험이 커질 수 있다. 최대 스톱로스 범위를 설정하여 단일 거래의 최대 손실을 제어하는 것을 고려할 수 있다.
  4. 매개 변수 선택이 잘못되면 전략이 실패할 수 있다. 예를 들어 ATR 주기가 너무 작을 경우, 너무 민감하고 빈번하게 촉발되는 중지 손실이 발생할 수 있다. 너무 커지면 시간 내에 중지되지 않고 손실을 증가시킬 수 있다.

최적화 방향

  1. 하락 추세에서도 수익을 얻을 수 있는 포지션 논리를 추가하여 전략의 적응력을 높일 수 있다. 가격이 SMA를 넘어갈 때 공문장을 열 수 있으며, 동적 중지 손실 논리도 적용한다.
  2. 다중 공백 위치 관리를 도입하고, 트렌드 강도에 따라 위치 크기를 조정한다. 트렌드가 강할 때 위치 크기를 늘려 수익을 올리고, 트렌드가 약할 때 위치 크기를 줄여 위험을 통제한다.
  3. 스톱로스 논리를 최적화하여 최대 스톱로스 범위를 설정하여 극단적인 상황에서 과도한 손실이 발생하지 않도록하십시오. 또한 스톱포인트를 설정하여 예상된 수익이 달성되면 적극적으로 평정하는 것이 좋습니다.
  4. 매개 변수를 최적화하여 다양한 매개 변수 조합을 통해 최적의 매개 변수 설정을 찾습니다. 유전 알고리즘과 같은 지능적인 최적화 방법을 사용하여 최적화 효율을 높일 수 있습니다.
  5. 거래량, 변동성 등과 같은 더 많은 필터링 조건을 추가하는 것을 고려하여 트렌드와 위험을 더 잘 판단하고 신호의 신뢰성을 향상시킬 수 있습니다.

요약하다

이 전략은 ATR 및 SMA 지표를 기반으로 동적 스톱 손실 추적 거래 시스템을 구현하여 트렌드 상황에서 자동으로 스톱 손실 위치를 조정하여 수익을 보호하고 위험을 제어하는 역할을합니다. 전략 논리는 명확하고 장점은 분명하지만 제한과 위험점이 있습니다. 공백 논리, 최적 포지션 관리, 최대 손실 설정 등과 같은 합리적인 최적화 및 개선을 통해 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다. 실제 응용에서는 다양한 거래 종류와 주기에 따라 전략 매개 변수를 유연하게 조정하고 위험을 엄격하게 제어해야합니다.

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

//@version=4
strategy("Trailingstop", overlay=true)

if close > sma(close, 50)
    strategy.entry("long", strategy.long)

// Trailing stop loss for long positions
Trailperc = 0.20
price_stop_long = 0.0

if (strategy.position_size > 0)
    stopValue = close * (1 - Trailperc)
    price_stop_long := max(stopValue, price_stop_long[1])
else
    price_stop_long := 0

if (strategy.position_size > 0)
    strategy.exit(id="stoploss_long", stop=price_stop_long)

// Trailing stop loss for short positions
Trailperc_short = 0.20
price_stop_short = 0.0

if (strategy.position_size < 0)
    stopValue_short = close * (1 + Trailperc_short)
    price_stop_short := min(stopValue_short, price_stop_short[1])
else
    price_stop_short := 0

if (strategy.position_size < 0)
    strategy.exit(id="stoploss_short", stop=price_stop_short)

// ATR Trailing Stop for visualization
keyvalue = input(3, title="Key Value. 'This changes the sensitivity'", step=0.5)
atrperiod = input(10, title="ATR Period")
xATR = atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
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 = 0  
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)))

xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue

plot(xATRTrailingStop, color = xcolor, title = "Trailing Stop")