UT 보트 지표 기반 ATR 트레일링 스톱 전략

저자:차오장, 날짜: 2024-03-11 11:17:33
태그:

img

전반적인 설명

이 전략은 퀀트노마드가 개발한 UT Bot 지표에 기반하고 있으며, 트레일링 스톱 로스의 아이디어를 포함하고 있다. 원래 코드는 @Yo_adriiiiaan에 의해 작성되고 @HPotter에 의해 수정되었다. 이 전략은 LuxAlgo의 스마트 머니 컨셉트와 함께 사용될 것이다. 현재 이 전략은 테스트 단계이다.

전략 원칙

이 전략의 주요 원칙은 다음과 같습니다.

  1. 닫기 가격이 50주기 단순한 이동 평균보다 높으면 긴 거래를 합니다.
  2. 긴 포지션의 경우 후속 스톱 손실 가격이 설정됩니다. 후속 스톱 손실 가격은 현재 폐쇄 가격의 80% (1-20%) 이다. 후속 스톱 손실 가격은 가격 상승과 함께 상승하지만 감소하지 않으며 이로 인해 이익을 보호합니다.
  3. 짧은 포지션의 경우, 트레일링 스톱 로스 가격도 설정됩니다. 트레일링 스톱 로스 가격은 현재 클로징 가격의 120% (1+20%) 입니다. 트레일링 스톱 로스 가격은 가격 하락에 따라 하락하지만 상승하지 않습니다.
  4. ATR (Average True Range) 는 트레일링 스톱의 참조로 사용됩니다. ATR 트레일링 스톱 가격의 계산 방법은: 상승할 때 이전 ATR 트레일링 스톱 가격의 더 큰 값을 취하고 (현재 종료 가격 - ATR * 키 값); 하락할 때 이전 ATR 트레일링 스톱 가격의 더 작은 값을 취하고 (현재 종료 가격 + ATR * 키 값). 키 값은 트레일링 스톱의 민감도를 조정하는 데 사용되는 사용자 설정 매개 변수입니다.
  5. ATR 트레일링 스톱 가격의 돌파를 기반으로 현재 포지션 방향이 결정됩니다. 가격이 ATR 트레일링 스톱 가격 이상으로 돌파하면 긴 포지션이 유지됩니다. 가격이 ATR 트레일링 스톱 가격 아래로 돌파하면 짧은 포지션이 유지됩니다. 다른 경우 현재 포지션 상태는 변하지 않습니다.

이점 분석

  1. 트레일링 스톱을 설정하면 수익을 효과적으로 보호 할 수 있으며 트렌드 시장에서 더 많은 이익을 얻을 수 있습니다.
  2. 장기 포지션과 단기 포지션에 대해 별도로 스톱 로스를 설정하는 것은 다른 시장 조건에 적응할 수 있습니다.
  3. 스톱 손실을 기준으로 하는 ATR을 사용하면 스톱 손실 위치를 동적으로 조정할 수 있고, 더 유연하고 효율적으로 조정할 수 있습니다.
  4. 키 밸류 매개 변수는 사용자 최적화를 위해 제공되며, 다양한 품종과 주기에 따라 조정하여 적응력을 향상시킬 수 있습니다.

위험 분석

  1. 불안정한 시장에서 빈번한 중단은 과도한 거래로 이어지고 수수료 비용을 증가시키고 수익을 줄일 수 있습니다.
  2. 일정한 비율의 트레일링 스톱 방법은 비교적 간단하며 일부 시장 조건에서 가격 변동에 잘 대처할 수 없을 수 있습니다.
  3. 이 전략은 단지 후속 중단만을 고려하고 있으며, 일부 수익 기회를 놓칠 수 있는 후속 수익 목표를 설정하지 않습니다.
  4. 매개 변수 선택은 전략 성과에 상당한 영향을 미치며, 부적절한 매개 변수는 더 큰 유출 위험을 초래할 수 있습니다.

최적화 방향

  1. 거래량과 변동성 같은 다른 지표 또는 조건은 입시 조건을 최적화하고 신호 신뢰성을 향상시키기 위해 고려 될 수 있습니다.
  2. 트레일링 스톱의 계산 방법은 파라볼 스톱 손실 또는 동적 퍼센트 스톱 손실을 사용하는 것과 같은 더 복잡하고 효과적인 방법을 탐구 할 수 있습니다.
  3. 예를 들어, ATR 또는 비율에 기반한 동적 수익 목표를 설정하여 수익을 더 잘 확보하기 위해 후속 수익 목표 메커니즘을 추가 할 수 있습니다.
  4. 매개 변수 최적화는 가장 적합한 매개 변수 조합을 찾기 위해 다양한 품종과 주기에 수행 할 수 있습니다. 또한 시장 조건의 변화에 따라 매개 변수를 동적으로 조정 할 수 있습니다.

요약

이 전략은 트렌드 시장에서 수익을 보호 할 수있는 트레일링 스톱 로직을 포함하고 UT Bot 지표에 기반합니다. 동시에 전략은 장기 및 단위 포지션에 대해 별도로 스톱 손실을 설정하여 매우 적응력이 있습니다. 트레일링 스톱에 대한 참조로 ATR을 사용하면 스톱 손실 포지션을 동적으로 조정하여 유연성을 향상시킬 수 있습니다. 그러나이 전략은 불안정한 시장에서 빈번한 스톱 아웃으로 인해 높은 거래 비용의 위험에 직면 할 수 있으며, 수익 기회를 놓칠 수있는 트레일링 수익 목표 설정이 부족합니다. 또한 매개 변수 선택은 전략 성능에 중요한 영향을 미칩니다.

향후, 전략은 입시 조건을 최적화하고, 더 복잡한 트레일링 스톱 방법을 탐구하고, 트레일링 수익 목표 메커니즘을 추가하고, 더 안정적인 수익을 얻기 위해 다른 품종과 주기에 대한 매개 변수를 최적화하여 개선 할 수 있습니다. 전반적으로 전략 아이디어는 간단하고 직설적이며, 이해하기 쉽고 구현하기 쉽지만, 더 많은 최적화를 위한 여지가 있으며 계속 탐색하고 개선하는 것이 가치가 있습니다.


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

더 많은