開発者の手記 #2 — インジケーター自作で気づいた「ライブラリ頼みの落とし穴」

拓海だ。前回は「時間軸」の話をした。今回は、その延長線上で引っかかる「インジケーター計算」の落とし穴について書く。

これは、ライブラリに頼ってたときに本当に困った。移動平均、RSI、ATR…標準で用意されてるから「そのまま使えば大丈夫」と思ってた。だが実装を進めると、バックテストと実運用で計算結果がズレてくるんだ。

ライブラリ版と自作版で計算結果が違う理由

cTrader の Indicators.MovingAverage() は便利だ。一行で MA が計算できる。だが、自分で MA を手動計算してみると、値が微妙にズレてることに気づく。

原因は「どの足までを計算対象にするか」の定義が、ライブラリと自作で異なるからだ。

例えば MA14 を OnBar() で計算する場合:

この1bar分の差が、特に短期足(M1, M5)では大きく出る。

自分は最初、この違いを知らずに「なぜバックテストと実運用で成績が違うんだ」と悩んでた。ライブラリのドキュメント読んで初めて気づいた。それ以来、重要な判定には自分で計算するようにしてる。

RSI計算の「平滑化」はライブラリごとに違う

もっと厄介なのが RSI だ。RSI14 は「過去14本の上昇幅と下降幅の比率」…という説明は簡単だが、実装は複雑だ。

RSI の計算には「単純移動平均(SMA)」と「指数平滑移動平均(EMA)」の2種類がある。さらに、Wilder 式という独特の平滑化方法もある。

cTrader の Indicators.RelativeStrengthIndex() は Wilder 式を使ってるんだが、他のプラットフォーム(例えば TradingView)では EMA を使ってることもある。同じ RSI14 でも、プラットフォーム間で値が違うわけだ。

自分がこれで引っかかったのは「cTrader のバックテスト結果を TradingView で検証しようとしたとき」。同じシグナルのはずなのに、RSI の値が全然違う。最初は「データが違うのかな」と思ったが、実は計算方法が違ってただけ。

今は「どのプラットフォームで検証するなら、そのプラットフォームの計算方法を採用する」と決めてる。

ATR計算の「確定bar」の扱いも要注意

ATR(Average True Range)も同じ落とし穴がある。

ATR14 は「過去14本の True Range の移動平均」だが、「過去14本」の定義が重要だ。

これらで計算結果が変わる。

cTrader のライブラリ版 ATR は「bar 確定時点で計算」するんだが、自分で OnBar() で計算すると「確定済みの bar のみ」で計算することになる。この1bar分のズレが、ストップロス計算に影響する。

自分は最初、ライブラリ版を使ってたんだが「SL の幅が想定と違う」という現象に引っかかった。調査して初めて「ATR計算のタイミングが違う」と気づいた。

解決策:重要なインジケーターは自分で実装する

今の自分のやり方は「ロジックの核になるインジケーターは自分で計算する」だ。

コードはこんな感じ:

private double CalculateATR(int period)
{
    if (Bars.Count < period) return 0;
    
    double sum = 0;
    for (int i = 1; i <= period; i++)
    {
        double tr = Math.Max(
            Bars.HighPrices[Bars.Count - i] - Bars.LowPrices[Bars.Count - i],
            Math.Max(
                Math.Abs(Bars.HighPrices[Bars.Count - i] - Bars.ClosePrices[Bars.Count - i - 1]),
                Math.Abs(Bars.LowPrices[Bars.Count - i] - Bars.ClosePrices[Bars.Count - i - 1])
            )
        );
        sum += tr;
    }
    return sum / period;
}

こうすると「何を計算してるか」が自分で把握できるし、バックテストと実運用でズレることもない。

ライブラリ版は「簡易的な検証」や「補助的なフィルター」に使う。メインロジックには使わない。

ライブラリを使う場合の確認項目

それでも「ライブラリ版を使いたい」という場合は、以下を必ず確認する:

  1. ドキュメントを読む — 計算方法、period の定義、bar の扱いを明記してるか
  2. 既知の値で検証する — 手計算できる簡単な例(例:MA3 を3本のbarで計算)で、ライブラリ版と一致するか
  3. 複数プラットフォーム間で比較する — 同じデータで同じインジケーターを計算して、値が一致するか

自分は今、これらを「cBot 実装の チェックリスト」に入れてる。

まとめ

ライブラリは便利だが、落とし穴が多い。特に金銭が絡むトレード ロジックでは「ライブラリ頼み」が命取りになる。

自分の経験から言えば、ロジックの核になる部分は「自分で実装して、自分で理解する」が最強だ。時間はかかるが、その分 バグを減らせるし、本番環境でも安心できる。

インジケーター計算は地味だが、ここをきっちり押さえておくと、あとの実装がぐっと楽になる。

本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。