동적 추세 추적 및 변동성 필터링 전략: ADX 및 CI의 이중 확인을 기반으로 한 이동 평균 교차 시스템

ADX CI SMA DM TR ATR DI
생성 날짜: 2025-02-21 09:33:38 마지막으로 수정됨: 2025-02-21 09:33:38
복사: 0 클릭수: 406
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

동적 추세 추적 및 변동성 필터링 전략: ADX 및 CI의 이중 확인을 기반으로 한 이동 평균 교차 시스템 동적 추세 추적 및 변동성 필터링 전략: ADX 및 CI의 이중 확인을 기반으로 한 이동 평균 교차 시스템

개요

이 전략은 평행선 교차 신호와 시장 상태 필터를 결합한 거래 시스템이다. 9주기 및 21주기 간단한 이동 평균 ((SMA) 의 교차로 시장 추세를 포착하고, 평균 방향 지수 ((ADX) 와 혼돈 지수 ((Choppiness Index, CI) 를 사용하여 시장 환경을 필터링하여, 트렌드가 명확하고 변동성이 좋은 시장에서만 거래하도록 보장한다. 이 방법은 전통적인 트렌드 추적 전략을 현대 기술 지표와 효과적으로 결합하여 보다 안정적인 거래 프레임워크를 제공합니다.

전략 원칙

이 전략의 핵심 논리는 다음과 같은 세 가지 핵심 요소로 구성되어 있습니다.

  1. 트렌드 신호 생성: 9주기 및 21주기 SMA의 교차를 사용하여 트렌드 방향을 결정하여 기본 거래 신호를 형성한다.
  2. 트렌드 강도 확인: 트렌드의 강도를 확인하기 위해 ADX 지표 (값을 20로 설정) 를 사용하여 트렌드 강도를 확인하여 트렌드가 명확한 시장 환경에서 거래하는 것을 보장합니다.
  3. 시장의 변동 필터: 시장의 변동 특성을 식별하기 위해 혼돈 지수를 도입 (값이 50로 설정) 하고, 격렬한 변동 시장에서 거래하는 것을 피한다.

이 전략은 최적화된 기술 지표 계산 방법을 채택하고 있으며, 사용자 정의의 덧셈 함수, 최고값과 최저값 계산, 표준화된 실제 파도 (TR) 계산을 포함하고 있으며, 신호의 정확성과 계산 효율을 보장하고 있다.

전략적 이점

  1. 다중 확인 메커니즘: 평선 교차, ADX 및 CI 삼중 필터링을 결합하여 거래 신호의 신뢰성을 크게 향상시킵니다.
  2. 적응력: 전략의 매개 변수는 다른 시장 환경에 따라 조정될 수 있으며, 잘 적응한다.
  3. 위험 제어: CI 지수 필터링을 통해 높은 변동 기간 동안 가짜 돌파구로 인한 위험을 효과적으로 감소시킵니다.
  4. 계산 효율성: 최적화된 계산 방법을 사용하며, 특히 역사 데이터를 처리할 때 뛰어난 성능을 발휘한다.

전략적 위험

  1. 변수 민감성: 전략 효과는 ADX와 CI의 임계 설정에 크게 의존하며, 다른 시장 환경에는 다른 변수 구성이 필요할 수 있다.
  2. 지연성: 여러 개의 이동 평균 지표가 사용됨에 따라 신호 지연 문제가 발생할 수 있습니다.
  3. 변동성 시장: 변동성 시장에서 몇 가지 단선 거래 기회를 놓칠 수 있습니다.
  4. 계산 복잡성: 여러 지표의 계산은 전략의 복잡성을 증가시키고, 실시간 거래의 실행 효율성에 영향을 줄 수 있다.

전략 최적화 방향

  1. 동적 변수 조정: 적응 변수 조정 메커니즘을 도입하여 시장 상태의 동성에 따라 ADX와 CI의 절댓값을 조정한다.
  2. 손해 중지 최적화: 동적 손해 중지 메커니즘을 추가하여 ATR 또는 변동성 대역을 기반으로 더 유연한 손해 중지 전략을 설계할 수 있습니다.
  3. 신호 확인 강화: 신호 신뢰성을 더욱 높이기 위해 수량 확인 메커니즘을 추가하는 것이 고려될 수 있다.
  4. 계산 효율성 향상: 지표 계산 방법을 최적화, 특히 긴 주기 데이터를 처리 할 때 성능.

요약하다

이 전략은 고전적인 평선선 교차 전략과 현대적인 기술 지표들을 결합하여 하나의 완전한 거래 시스템을 구축한다. 그것은 트렌드를 포착하는 것뿐만 아니라 시장 환경에 적합성에 특히 관심을 두고 있으며, 여러 필터링 메커니즘을 통해 거래의 안정성을 높인다.

전략 소스 코드
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-06 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("MA9/MA21 Cross with ADX & CHOP Filter", overlay=true, initial_capital=10000, currency=currency.USD)

// ─── CUSTOM FUNCTIONS ──────────────────────────────────────────────────────
// Custom function to compute the sum over the last 'len' bars.
f_sum(src, len) =>
    s = 0.0
    for i = 0 to len - 1
        s += src[i]
    s

// Custom function to compute the highest value over the last 'len' bars.
f_highest(src, len) =>
    h = src[0]
    for i = 1 to len - 1
        h := math.max(h, src[i])
    h

// Custom function to compute the lowest value over the last 'len' bars.
f_lowest(src, len) =>
    l = src[0]
    for i = 1 to len - 1
        l := math.min(l, src[i])
    l

// ─── INPUTS ──────────────────────────────────────────────────────────────
ma9Period   = input.int(9, title="MA 9 Period", minval=1)
ma21Period  = input.int(21, title="MA 21 Period", minval=1)
adxLength   = input.int(7, title="ADX Smoothing / DI Length", minval=1)
adxThresh   = input.float(20.0, title="ADX Threshold", step=0.1)
chopLen     = input.int(7, title="CHOP Length", minval=1)
chopOff     = input.int(0, title="CHOP Offset", minval=0)  // Not applied in calculation
chopThresh  = input.float(50.0, title="CHOP Maximum (do not trade if above)", step=0.1)

// ─── CALCULATE INDICATORS ────────────────────────────────────────────────────
// Moving Averages
ma9  = ta.sma(close, ma9Period)
ma21 = ta.sma(close, ma21Period)

// --- True Range Calculation ---
// Manual implementation of true range (tr)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))), math.abs(low - nz(close[1])))

// --- ADX Calculation (Manual Implementation) ---
// Calculate directional movements
upMove   = high - nz(high[1])
downMove = nz(low[1]) - low
plusDM   = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM  = (downMove > upMove and downMove > 0) ? downMove : 0.0

// Smooth the values using the built-in rma function
atr      = ta.rma(tr, adxLength)
plusDI   = 100 * ta.rma(plusDM, adxLength) / atr
minusDI  = 100 * ta.rma(minusDM, adxLength) / atr
dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adxValue = ta.rma(dx, adxLength)

// --- Choppiness Index Calculation ---
// Compute the sum of true range over chopLen periods
atrSum      = f_sum(tr, chopLen)
// Compute highest high and lowest low over chopLen periods using custom functions
highestHigh = f_highest(high, chopLen)
lowestLow   = f_lowest(low, chopLen)
priceRange  = highestHigh - lowestLow
chop        = priceRange != 0 ? 100 * math.log(atrSum / priceRange) / math.log(chopLen) : 0

// ─── STRATEGY CONDITIONS ─────────────────────────────────────────────────────
// MA Crossover Signals
longCond  = ta.crossover(ma9, ma21)
shortCond = ta.crossunder(ma9, ma21)

// Filter: Only trade if ADX > threshold and CHOP ≤ threshold.
filterCond = (adxValue > adxThresh) and (chop <= chopThresh)

// Entries and Exits
if longCond and filterCond
    strategy.entry("Long", strategy.long)
if shortCond and filterCond
    strategy.entry("Short", strategy.short)
if shortCond
    strategy.close("Long")
if longCond
    strategy.close("Short")

// ─── PLOTTING ──────────────────────────────────────────────────────────────
plot(ma9, color=color.red, title="MA 9")
plot(ma21, color=color.blue, title="MA 21")
plot(adxValue, title="ADX", color=color.purple)
hline(adxThresh, title="ADX Threshold", color=color.purple, linestyle=hline.style_dotted)
plot(chop, title="CHOP", color=color.orange)
hline(chopThresh, title="CHOP Threshold", color=color.orange, linestyle=hline.style_dotted)