ATR 및 SMA를 기반으로 하는 동적 후속 중지 전략

저자:차오장, 날짜: 2024-03-11 11:55:21
태그:

img

전반적인 설명

이 전략은 동적 트레일링 스톱 트레이딩 시스템을 구현하기 위해 ATR (평균 참 범위) 지표와 SMA (단순 이동 평균) 지표를 결합합니다. 가격이 SMA보다 높을 때, 긴 포지션을 열고 ATR에 기반한 동적 스톱 손실을 설정합니다. 스톱 손실 가격은 가격이 상승함에 따라 계속 상승합니다. 가격이 동적 스톱 손실 가격 이하로 떨어지면 포지션은 닫습니다. 이 전략의 주요 아이디어는 동적 스톱 손실을 사용하여 트렌드 시장에서 수익을 잠금하고 인출을 줄이는 것입니다.

전략 원칙

  1. 50일 SMA를 계산합니다. 닫기 가격이 50일 SMA보다 크면 긴 포지션을 개척합니다.
  2. ATR 지표를 10의 기간으로 계산하고 키 값으로 곱하면 (예정값은 3) stop loss range nLoss를 얻습니다.
  3. 초기 값이 0인 동적 스톱 로스 가격 xATRTrailingStop를 계산합니다.
    • 종료 가격과 이전 종료 가격 모두 이전 중지 손실 가격보다 높을 때, 새로운 중지 손실 가격은 이전 중지 손실 가격과 (폐기 가격 - nLoss) 보다 높습니다.
    • 종료 가격과 이전 종료 가격 모두 이전 중지 손실 가격보다 낮을 때, 새로운 중지 손실 가격은 이전 중지 손실 가격과 ( 종료 가격 + nLoss) 의 작은 값입니다.
    • 다른 경우, 새로운 스톱 로스 가격은 (폐기 가격 - nLoss) 또는 (폐기 가격 + nLoss) 입니다.
  4. 닫기 가격이 동적 스톱 로스 가격 이하로 떨어지면 포지션을 닫습니다.
  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")

더 많은