ADX 트렌드 강도 필터 시스템과 결합된 동적 인덱스 이동 평균 교차 전략

EMA ADX SL TS
생성 날짜: 2025-01-06 11:44:03 마지막으로 수정됨: 2025-01-06 11:44:03
복사: 1 클릭수: 427
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

ADX 트렌드 강도 필터 시스템과 결합된 동적 인덱스 이동 평균 교차 전략

개요

이 전략은 지수 이동 평균(EMA)과 평균 방향 지수(ADX)를 결합한 추세 추종 거래 시스템입니다. 이 전략은 EMA50과 가격의 교차점에 따라 거래 방향을 결정하고, ADX 지표를 사용하여 시장 추세 강도를 걸러내는 동시에, 지속적으로 수익성 있는 K-라인을 기반으로 하는 동적 손절매 방식을 채택하여 수익을 보호합니다. 이 방법은 시장의 주요 추세를 포착할 수 있을 뿐만 아니라, 추세가 약해질 때 빠져나올 수도 있습니다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 요소에 기초합니다.

  1. 50주기 지수 이동 평균(EMA50)을 추세 방향의 가이드로 사용하세요.
  2. ADX 지표를 통해 시장 추세 강도를 필터링하고(기본 매개변수는 20) 추세가 명확할 때만 시장에 진입합니다.
  3. 입장 조건:
    • 롱: 가격이 EMA50 위에서 마감되고 ADX가 임계값보다 높습니다.
    • 단기: 가격이 EMA50 아래에서 마감되고 ADX가 임계값보다 높습니다.
  4. 독특한 손절매 메커니즘:
    • 연속된 수익성 있는 K라인의 개수를 세어보세요
    • 4개의 연속된 수익성 있는 캔들스틱이 나타나면 동적 트레일링 스톱 로스를 활성화합니다.
    • 손절매 가격은 새로운 최고가/최저가에 따라 동적으로 조정됩니다.

전략적 이점

  1. 트렌드 확인 이중 필터링
  • EMA 크로스오버는 추세 방향을 제공합니다
  • ADX 필터링은 추세 강도를 보장하고 거짓 돌파를 줄입니다.
  1. 지능형 손절매 설계
  • 시장 변동성에 따른 동적 손절매
  • 조기 이익 실현을 방지하기 위해 지속적인 이익이 발생한 후에만 트레일링 스톱 로스를 시작하십시오.
  1. 매우 적응력이 좋다
  • 높은 매개변수 조정성
  • 다양한 거래 상품에 적용 가능
  1. 완벽한 위험 관리
  • 추세가 약해지면 자동으로 종료됩니다.
  • 동적 손절매는 기존 수익을 보호합니다.

전략적 위험

  1. 추세 반전 위험
  • 급격한 추세 반전 시 큰 폭의 반등을 겪을 수 있음
  • 반전신호 확인 메커니즘을 추가하는 것이 좋습니다.
  1. 매개변수 민감도
  • EMA와 ADX 매개변수 선택은 전략 성과에 영향을 미칩니다.
  • 백테스팅을 통해 매개변수를 최적화하는 것이 좋습니다.
  1. 시장환경의존성
  • 변동성이 큰 시장에서는 자주 거래될 수 있습니다.
  • 측면 시장 필터링 메커니즘을 추가하는 것이 좋습니다.
  1. 손절매 실행 위험
  • 큰 갭은 손절매 실행 편차로 이어질 수 있습니다.
  • 하드 스톱 로스 보호 설정을 고려하는 것이 좋습니다.

전략 최적화 방향

  1. 진입 메커니즘 최적화
  • 볼륨 증가 확인 신호
  • 가격 패턴 분석 추가
  1. 완벽한 손절매 메커니즘
  • ATR에 따라 손절매 거리를 동적으로 조정합니다.
  • 시간 정지 손실 메커니즘 추가
  1. 시장 환경에 대한 적응력
  • 시장 변동성 필터 추가
  • 다양한 시장 주기에 따라 매개변수 조정
  1. 신호 확인 강화
  • 다른 기술 지표를 통합합니다
  • 기본 필터 추가

요약하다

이는 EMA와 ADX의 장점을 결합하여 위험을 통제하면서 추세를 효과적으로 포착하는 잘 설계된 추세 추종 전략입니다. 이 전략의 역동적인 손절매 메커니즘은 특히 혁신적이며, 수익 보호와 추세 포착 사이에서 좋은 균형을 이룰 수 있습니다. 최적화의 여지가 있지만, 전반적인 프레임워크는 완벽하고 논리는 명확합니다. 실제 거래에서 검증할 만한 전략 시스템입니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Simple EMA 50 Strategy with ADX Filter", overlay=true)

// Input parameters
emaLength = input.int(50, title="EMA Length")
adxThreshold = input.float(20, title="ADX Threshold", minval=0)

// Calculate EMA and ADX
ema50 = ta.ema(close, emaLength)
adxSmoothing = input.int(20, title="ADX Smoothing")
[diPlus, diMinus, adx] = ta.dmi(20, adxSmoothing)

// Conditions for long and short entries
adxCondition = adx > adxThreshold
longCondition = adxCondition and close > ema50  // Check if candle closes above EMA
shortCondition = adxCondition and close < ema50  // Check if candle closes below EMA

// Exit conditions based on 4 consecutive profitable candles
var float longSL = na
var float shortSL = na
var longCandleCounter = 0
var shortCandleCounter = 0

// Increment counters if positions are open and profitable
if (strategy.position_size > 0 and close > strategy.position_avg_price)
    longCandleCounter += 1
    if (longCandleCounter >= 4)
        longSL := na(longSL) ? close : math.max(longSL, close)  // Update SL dynamically
else
    longCandleCounter := 0
    longSL := na

if (strategy.position_size < 0 and close < strategy.position_avg_price)
    shortCandleCounter += 1
    if (shortCandleCounter >= 4)
        shortSL := na(shortSL) ? close : math.min(shortSL, close)  // Update SL dynamically
else
    shortCandleCounter := 0
    shortSL := na

// Exit based on trailing SL
if (strategy.position_size > 0 and not na(longSL) and close < longSL)
    strategy.close("Buy", comment="Candle-based SL")

if (strategy.position_size < 0 and not na(shortSL) and close > shortSL)
    strategy.close("Sell", comment="Candle-based SL")

// Entry logic: Check every candle for new positions
if (longCondition)
    strategy.entry("Buy", strategy.long)
if (shortCondition)
    strategy.entry("Sell", strategy.short)

// Plot EMA and ADX for reference
plot(ema50, color=color.blue, title="EMA 50")
plot(adx, color=color.orange, title="ADX", style=plot.style_stepline, linewidth=1)
plot(longSL, color=color.green, title="Long SL", style=plot.style_cross, linewidth=1)
plot(shortSL, color=color.red, title="Short SL", style=plot.style_cross, linewidth=1)

// Plot signals
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, title="Buy Signal")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, title="Sell Signal")