UT Bot 지표를 기반으로 한 ATR 이동형 손절매 전략


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

UT Bot 지표를 기반으로 한 ATR 이동형 손절매 전략

개요

이 전략은 QuantNomad에서 개발한 UT Bot 지표에 기반하고, 모바일 정지 (mobile stop loss) 의 사고를 결합한다. @Yo_adriiiiaan이 원본 코드를 작성하고, @HPotter이 수정했다. 이 전략은 LuxAlgo의 Smart Money Concepts와 함께 사용될 것이다. 현재 이 전략은 테스트 단계에 있다.

전략 원칙

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

  1. 종결 가격이 50주기 간단한 이동 평균보다 높을 때 더 많은 거래를 한다.
  2. 다중 상위 포지션의 경우, 이동 중지 가격을 설정하십시오. 이동 중지 가격은 현재 종료 가격의 80% (~ 1-20%) 입니다. 이동 중지 가격은 가격 상승과 함께 상승하지만 하향으로 이동하지 않으며 이익을 보호하는 역할을합니다.
  3. 공백 포지션의 경우, 마찬가지로 이동 스톱 가격을 설정하십시오. 이동 스톱 가격은 현재 폐장 가격의 120%입니다. 이동 스톱 가격은 가격 하락에 따라 하락하지만 상승하지 않습니다.
  4. ATR (Average True Range, 평균 실제 진폭) 을 이동 스톱의 기준으로 사용한다. ATR 이동 스톱 가격을 계산하는 방법은: 상향으로 이동할 때, 이전 ATR 이동 스톱 가격과 현재 종료 가격-ATR을 취한다.*Key Value) 둘 중 더 큰 값; 하향으로 이동할 때, 이전 ATR의 이동 중지 가격과 현재 종료 가격 + ATR*Key Value) 둘 중 더 작은 값이다. Key Value는 이동 중지 손실의 민감도를 조정하기 위해 사용자가 설정하는 파라미터이다.
  5. ATR 이동식 중지 가격의 돌파 상황에 따라, 현재 포지션 방향을 판단한다. 가격이 ATR 이동식 중지 가격을 상향으로 돌파 할 때, 다수 포지션을 유지한다. 가격이 ATR 이동식 중지 가격을 상향으로 돌파 할 때, 공백 포지션을 유지한다. 다른 경우에는 현재 포지션 상태를 유지한다.

우위 분석

  1. 이동식 중지 설정은 수익을 보호할 수 있으며, 트렌드 상황에서 더 많은 수익을 얻을 수 있습니다.
  2. 각각 다중 헤드 및 빈 헤드 포지션에 대한 손실을 설정하여 다른 상황에 적응 할 수 있습니다.
  3. ATR을 사용해서 손해의 기준으로 손해의 위치를 동적으로 조정할 수 있어 더 유연하고 효과적이다.
  4. 사용자 최적화를 위해 Key Value 파라미터를 제공하여 다양한 품종과 주기에 따라 조정하여 적응력을 높일 수 있습니다.

위험 분석

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