動的トレンド追跡とボラティリティフィルタリング戦略:ADXとCIの二重確認に基づく移動平均クロスオーバーシステム

ADX CI SMA DM TR ATR DI
作成日: 2025-02-21 09:33:38 最終変更日: 2025-02-21 09:33:38
コピー: 0 クリック数: 406
2
フォロー
319
フォロワー

動的トレンド追跡とボラティリティフィルタリング戦略:ADXとCIの二重確認に基づく移動平均クロスオーバーシステム 動的トレンド追跡とボラティリティフィルタリング戦略:ADXとCIの二重確認に基づく移動平均クロスオーバーシステム

概要

この戦略は,均線交差信号と市場状態のフィルタを組み合わせた取引システムである.これは,9周期と21周期の簡易移動平均 ((SMA)) の交差によって市場のトレンドを捉え,平均方向指数 ((ADX)) とカオス指数 ((Choppiness Index, CI)) を利用して市場環境をフィルタリングし,トレンドが明確で波動的な特徴のある市場でのみ取引を確実にする.この方法は,伝統的なトレンド追跡戦略と近代的な技術指標を効果的に組み合わせ,より堅牢な取引の枠組みを提供します.

戦略原則

戦略の核心的な論理には,以下の3つの重要な要素が含まれています.

  1. トレンドシグナル生成: 9サイクルと21サイクルSMAの交差を使用して,トレンドの方向を決定し,基本の取引シグナルを形成する.
  2. トレンド強度確認: トレンドの強さをADX指数で検証する (値を20に設定する) 傾向が明確な市場環境でのみ取引を保証する.
  3. 市場の波動フィルター:市場の波動特性を認識するためにカオス指数 (値が50に設定) を導入し,激しい波動の市場での取引を避ける.

策略は,カスタマイズされた求和関数,最大値と最小値の計算,および標準化された実際の波幅の計算 (TR) を含む,最適化された技術指標計算方法を採用し,信号の正確性と計算効率を保証する.

戦略的優位性

  1. 多重確認メカニズム:均線交差,ADX,CIの3重フィルタリングを組み合わせることで,取引信号の信頼性が著しく向上する.
  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)