【開発録】なぜインジケーターは移植できないのか。ADX・ATRという「合わない指標」との戦い
前回の開発録では、Pythonで組んだロジックをMT4/MT5へ移植する際に生じる、環境の構造的な差異について記録した。今回はその中でも、実務上もっとも厄介な部分――テクニカル指標そのものの内部計算が、環境によって一致しないという問題――について、掘り下げて記録しておきたい。ここは実際に手を動かして移植作業をやった人間でなければ、なかなか実感として共有できない領域だと感じている。
1. インジケーターは「公式」ではなく「実装」である
ADXやATRといった指標は、教科書的には単一の定義を持つもののように見える。しかし実際には、平滑化に用いる移動平均の種類(単純移動平均か、指数移動平均か、Wilder方式の平滑化か)、初期値の扱い、丸め処理のタイミングなど、計算方法には複数のバリエーションが存在する。
MT4の内部実装のソースコードは公開されておらず、どの平滑化方式・どの初期化ロジックを採用しているかは、外部から正確に知る術がない。つまりADXやATRという同じ名前の指標であっても、環境ごとに「実装」が異なる可能性がある、というのが出発点になる。この前提を知らずに開発を始めると、「同じ指標を使っているのに、なぜか結果が合わない」という現象に、延々と頭を悩ませることになる。原因が指標そのものの内部計算にあると気づくまでに、無駄な時間を費やしてしまう開発者も少なくないだろう。
2. Python側で厳密に合わせ込もうとする試みの限界
当然、開発の過程ではPython側の計算をMT4の出力にできる限り近づけようと試みる。複数の平滑化方式を実装し、初期値やウォームアップ期間を調整しながら、数値を突き合わせていく作業である。
しかし、この作業には現実的な限界がある。特にWilder系の平滑化は、単純な指数移動平均とは係数の取り方が微妙に異なり、再現性の罠になりやすい。どれだけ精度を詰めても、最終的には小数点以下のわずかな差が残り、完全一致には至らない。さらに厄介なのは、この誤差が固定値ではなく、相場の変動幅やデータの取得期間によって揺れ動く点である。ある期間ではほぼ一致していたのに、別の期間ではズレが顕著になる、ということも珍しくない。
3. 「一致しない指標」をフィルターに使うことの危険性
この小数点以下のズレは、一見些細に見えるが、実務上は致命的な問題を引き起こす。フィルター条件の多くは「ある閾値を超えたらエントリー」という形で設計されるため、指標値がわずかに異なるだけで、閾値をまたぐタイミングそのものがズレてしまう。
結果として、Python側のバックテストで最適だったパラメータをそのままMT4へ移植しても、シグナルの発生タイミングが一致せず、検証結果と実測結果のあいだに無視できない乖離が生まれる。これは移植のミスではなく、そもそも指標の計算方法自体が一致していないことに起因する、構造的な問題である。表面上は同じロジック、同じパラメータであるにもかかわらず、片方では優位性があり、もう片方ではそれが消えている――この状態こそが、移植作業において最も判断を誤りやすい落とし穴になる。
4. 発想の転換:計算が変わらない要素だけでロジックを組む
この問題に対する現実的な解決策は、指標の再現精度を極限まで追い求めることではない。そもそも実装差異の影響を受けない要素だけで、フィルターロジックを組み直すという発想の転換である。
具体的には、生の価格差や高値・安値・終値ベースの単純な比較、あるいは単純移動平均(SMA)のように計算方法が一意に定まる指標など、複雑な平滑化処理に依存しない要素に絞り込む。こうした要素であれば、Python側とMT4側で計算結果が一致するため、検証結果と実運用結果の乖離を構造的に排除できる。派手な複合指標をあきらめる代わりに、地味だが確実に再現できる要素を積み上げていく、という設計思想への転換である。
5. それでも良い成績を出せる条件を探すという、地道な作業
ただし、この方針には明確なトレードオフがある。使える指標の選択肢が大きく絞られるため、そのなかで有効なフィルター条件、優位性のあるロジックを探し出す作業は、選択肢が多いときよりもむしろ難易度が上がる。
限られた武器の中で、いかに再現性のある優位性を見つけ出すか――この工程は、実際にPythonでの開発からMT4への移植までを一気通貫で手掛けたことのある人間にしか、実感として理解されない領域だと思う。多くの開発者は、この壁にぶつかった時点で、指標の精度を諦めて妥協するか、そもそも移植そのものを断念してしまう。選択肢を絞り込んだうえで、それでも優位性を維持できる組み合わせを見つけ出すには、通常のパラメータ探索以上に、地道な総当たりと検証の反復が必要になる。
Semura Lab.が向き合っている、地味だが避けられない工程
我々Semura Lab.は、この「合わない指標」との戦いから逃げるつもりはない。計算方法が確実に一致する要素だけでロジックを組み立てるという制約下でも、なお優位性を持つ条件を探索し続けることが、Python開発をMT4という商品の形に落とし込むうえで避けられない工程だと考えている。指標の精度そのものを妥協するのではなく、依存する要素を厳選することで問題の根本を回避する――この発想の転換ができるかどうかが、移植の成否を分ける分岐点になっている。
華やかなバックテスト結果の裏側には、こうした地味な、しかし決して省略できない検証の積み重ねがある。この開発録では、こうした表に出にくい工程についても、引き続き正直に記録していきたい。