今回は ADX(Average Directional Index)と DI、さらに CCI を組み合わせたトレンドフォロー戦略を紹介します。
一言でいうと、
- DIのクロスで方向を検知
- ADXでトレンドの“強さ”を確認
- CCIでタイミングを少しだけ調整
- 早すぎるエントリーは「保留」して、条件が整ってから入る
という、わりと“気が利く”設計です。
ADX系の戦略は「クロスした瞬間に入る → ダマしで即死」
になりがちですが、このコードはそこをちゃんと避けにいっています(少なくとも避けようとはしてます笑)。
🎯 作成の意図
この戦略の思想はかなり明確です。
① トレンドは「発生直後」を取りたい
ADXがまだ低い段階で DI がクロスした場合、
それは「トレンドが生まれそうな兆候」であって、
まだエントリーするには早いことが多いです。
そこで、
- いったん「可能性あり(possible)」としてフラグを立てる
- ADX(正確には +DI / -DI)が一定水準を超えてから入る
という 二段階構えを採用しています。
② オシレーターはフィルター役に徹する
CCIは売買シグナルの主役ではありません。
- ロングなら「極端に買われすぎではないか」
- ショートなら「極端に売られすぎではないか」
を軽くチェックするだけ。やりすぎないのがポイントです。
📘 コード(戦略部分)の解説
ここからはロジックを噛み砕いて説明します。
■ ADX / DI の計算を自前で実装
このコードでは ta.adx() を使わず、
- +DI
- -DI
- ADX(sig)
をすべて手計算しています。
up_move = ta.change(high)
down_move = -ta.change(low)
truerange = ta.rma(ta.tr, dilen)
plus = fixnan(100.0 * ta.rma(up_move > down_move and up_move > 0 ? up_move : 0.0, dilen) / truerange)
minus = fixnan(100.0 * ta.rma(down_move > up_move and down_move > 0 ? down_move : 0.0, dilen) / truerange)
dx_sum = plus + minus
sig = 100.0 * ta.rma(math.abs(plus - minus) / (dx_sum == 0 ? 1.0 : dx_sum), adxlen)
理由はシンプルで、
- 内部の値を自由に使いたい
- クロス判定を細かく制御したい
からです。
結果として シグナルの意味が明確になります。
■ 「possible_bull / possible_bear」という待機状態
この戦略のキモがここです。
- +DI が -DI を上抜けた
- でも ADX(DI値)がまだ弱い
- CCI も条件的にまだ微妙
この場合、即エントリーはしない。
代わりに、
- 「ロング候補が出現した」というフラグだけを立てる
- 条件が整うまで待つ
という動きをします。
これによって、
- 初動のノイズ
- レンジ内のフェイククロス
をある程度回避できます。
■ 本当のエントリー条件
最終的にエントリーが出るのは、
- DIの方向が確定していて
- ADX(DI値)が指定水準(例:25)を超え
- CCIが極端な逆行をしていない
この 3点が揃ったときだけ。
しかも成行ではなく、
- ロング → 直近安値ベースのストップ
- ショート → 直近高値ベースのストップ
なので、
「勢いが本当に出たら約定する」設計です。
■ 手仕舞いは“トレンド崩れ即撤退”
ポジション保有中は、
- DIの逆クロス
- ADXラインが DI を横切る
どちらかが出たら 即全決済。
利確・損切りを固定値にせず、
構造が壊れたら出るという、かなり素直な出口です。
🚀 ワン モア ステップ
この戦略、素のままでも使えますが、
もう一段レベルを上げるなら例えばこんな改良があります。
- ADX Entry(25)を 相場別に可変にする
- 上位足ADXをフィルターとして追加
- ロンドン・NY時間だけ有効化
- ATRベースのトレーリングを導入
- 勝ちトレンドだけを残すための「ADX最低滞在時間」制限
🔏 コアメンバー向けソースコード
こちらからどうぞ。
note ご指定のページが見つかりません

コメント