동적 트레일링 스톱을 사용한 각도 기반 VWMA 추세 추종 전략

VWMA EMA MA PVSRA Angle BIAS
생성 날짜: 2025-02-18 13:42:01 마지막으로 수정됨: 2025-02-18 13:42:01
복사: 2 클릭수: 356
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

동적 트레일링 스톱을 사용한 각도 기반 VWMA 추세 추종 전략

개요

이것은 부피 가중 이동 평균 (VWMA) 과 지수 이동 평균 (EMA) 에 기반한 트렌드 추적 전략이며, 가격 각도 분석과 동적 추적 스톱스 메커니즘을 결합한다. 이 전략은 주로 VWMA와 빠른 이동 평균의 교차를 모니터링하면서 가격 운동의 각도 조건과 결합하여 진입 시기를 결정하며, 비율 추적 스톱스를 사용하여 위험을 관리한다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 구성 요소를 기반으로 합니다.

  1. 25주기 VWMA를 주요 트렌드 지표로 사용함
  2. 8주기 VWMA를 통해 빠른 신호선으로
  3. 50주기 EMA를 사용하여 더 장기적인 트렌드를 결정합니다.
  4. 50주기 EMA의 각을 계산하기 (값을 45도로 설정)
  5. 선택 가능한 200주기 EMA 시장 편향 필터로 입문 신호는 빠른 이동 평균과 주 VWMA의 교차가 발생하고 가격 각이 조건을 충족하면 트리거된다. 전략은 1%의 동적 추적 스톱로스를 통해 이익을 보호한다.

전략적 이점

  1. 다중 시간 프레임 검증 - 전략은 H1 이상의 시간 프레임과 M1 시간 프레임에서 잘 수행됩니다.
  2. 각 필터 - 가격 운동 각 조건을 도입하여 가짜 돌파구를 줄인다.
  3. 리스크 관리가 완벽합니다. Stop Loss Tracking, Dynamic Profit Protection의 비율을 사용합니다.
  4. 적응력 - 다양한 시장 조건에 따라 변수를 조정할 수 있습니다
  5. 트렌드 확인이 충분하다 - 다중 이동 평균을 사용하여 트렌드를 교차 확인이

전략적 위험

  1. 위기 시장의 부실한 성과 - 수평 시장에서 빈번한 잘못된 신호가 발생할 수 있습니다.
  2. 진입 시간이 지연되어 - 복수의 확인이 사용되어 트렌드 초반의 기회를 놓칠 수 있습니다.
  3. M15 타임프레임의 효과는 좋지 않습니다. 이 타임프레임에서는 사용하지 않는 것이 좋습니다.
  4. 변수 감수성 - 코너 값과 이동 평균 주기 선택이 전략 성능에 큰 영향을 미칩니다.
  5. 추적 중지 조기 출구 가능 - 변동성이 높은 시장에서 조기 종료로 이어질 수 있습니다.

전략 최적화 방향

  1. 변동율 자조제도 도입 - 시장의 변동율에 따라 동적으로 조정되는 중지 손실 비율 추적
  2. 트랜지먼트 필터 증가 - 트랜지먼트 확인을 통해 신호 품질을 향상
  3. 최적화 각 계산 방법 - 적응 각 값을 사용하는 것을 고려
  4. 시장 상태 식별에 참여 - 트렌드 / 변동 시장 식별 메커니즘을 개발
  5. 출구 메커니즘의 개선 - 가격 형태와 동적 지표와 결합하여 출구 시기를 최적화

요약하다

이것은 잘 구성된 트렌드 추적 전략으로, 앵글 분석과 다중 이동 평균의 조합을 통해 주요 트렌드에서 더 나은 성능을 얻을 수 있습니다. 약간의 뒤처짐과 변수 민감성의 문제가 있지만, 제안된 최적화 방향을 통해 전략은 여전히 개선할 수 있습니다. 특히 더 긴 시간 주기 트렌드 거래에서 적용하기에 적합합니다.

전략 소스 코드
/*backtest
start: 2024-02-18 00:00:00
end: 2024-10-16 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("PVSRA Trailing Strategy with Angle Condition (40-50 degrees)", overlay=true)

// === INPUTS ===
priceData = input.source(close, title="Price Data")
maLength  = input.int(25, title="Moving Average Length", minval=2)
useBias   = input.bool(false, title="Long/Short just above/below 200 EMA")
useTrailing = input.bool(true, title="Use Trailing Stop")
trailPerc  = input.float(1.0, title="Trailing Stop Percentage", minval=0.1)
anglePeriod = input.int(14, title="Period for Angle Calculation", minval=1)

// === CÁLCULOS ===
maValue = ta.vwma(priceData, maLength)
maLong  = ta.ema(high, 50)
maShort = ta.ema(low, 50)
maFast  = ta.vwma(close, 8)
bias    = ta.ema(close, 200)
longBias  = useBias ? close > bias : true
shortBias = useBias ? close < bias : true

// === CÁLCULO DO ÂNGULO DA MÉDIA MÓVEL DE 50 ===
ma50 = ta.ema(close, 50)
angle = math.atan((ma50 - ma50[anglePeriod]) / anglePeriod) * (180 / math.pi)  // Converte radianos para graus

// === CONDIÇÃO DE ÂNGULO ===
validAngleL = angle >= 45
validAngleS = angle <= 45

// === PLOTS ===
plot(maValue, color=color.orange, title="Moving Average")
plot(maFast, color=color.green, title="Fast MA")
plot(ma50, color=color.blue, title="50 EMA")

plotshape(series=(strategy.position_size > 0) ? maValue : na,
     color=color.red, style=shape.circle, location=location.absolute,
     title="Long Stop")

plotshape(series=(strategy.position_size < 0) ? maValue : na,
     color=color.red, style=shape.cross, location=location.absolute,
     title="Short Stop")

// === CONDIÇÕES DE ENTRADA ===
enterLong  = close > maValue and ta.crossover(maFast, maValue) and close > maLong and longBias and validAngleL
enterShort = close < maValue and ta.crossunder(maFast, maValue) and close < maShort and shortBias and validAngleS

// === CONDIÇÕES DE SAÍDA ===
exitLong  = ta.crossunder(maFast, maValue) and strategy.position_size > 0
exitShort = ta.crossover(maFast, maValue) and strategy.position_size < 0

// === EXECUÇÃO DA ESTRATÉGIA ===
if (enterLong)
    strategy.entry("EL", strategy.long)

if (enterShort)
    strategy.entry("ES", strategy.short)

if (exitLong or exitShort)
    strategy.close_all()

// === TRAILING STOP ===
if (useTrailing and strategy.position_size > 0)
    trailPrice = close * (1 - trailPerc / 100)
    strategy.exit("Trailing Long", from_entry="EL", stop=trailPrice)

if (useTrailing and strategy.position_size < 0)
    trailPrice = close * (1 + trailPerc / 100)
    strategy.exit("Trailing Short", from_entry="ES", stop=trailPrice)