開発者の手記 #2 — インジケーター自作で気づいた「ライブラリ頼みの落とし穴」
拓海だ。前回は「時間軸」の話をした。今回は、その延長線上で引っかかる「インジケーター計算」の落とし穴について書く。
これは、ライブラリに頼ってたときに本当に困った。移動平均、RSI、ATR…標準で用意されてるから「そのまま使えば大丈夫」と思ってた。だが実装を進めると、バックテストと実運用で計算結果がズレてくるんだ。
ライブラリ版と自作版で計算結果が違う理由
cTrader の Indicators.MovingAverage() は便利だ。一行で MA が計算できる。だが、自分で MA を手動計算してみると、値が微妙にズレてることに気づく。
原因は「どの足までを計算対象にするか」の定義が、ライブラリと自作で異なるからだ。
例えば MA14 を OnBar() で計算する場合:
- ライブラリ版 (cTrader 標準):現在bar を含めた過去14本を計算
- 自作版 (素朴な実装):確定済みの過去14本のみを計算
この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本」の定義が重要だ。
- 現在barを含めるか含めないか
- 計算開始時点の初期値をどうするか(最初の14bar は未計算か)
- bar確定のタイミングをどう判定するか
これらで計算結果が変わる。
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;
}
こうすると「何を計算してるか」が自分で把握できるし、バックテストと実運用でズレることもない。
ライブラリ版は「簡易的な検証」や「補助的なフィルター」に使う。メインロジックには使わない。
ライブラリを使う場合の確認項目
それでも「ライブラリ版を使いたい」という場合は、以下を必ず確認する:
- ドキュメントを読む — 計算方法、period の定義、bar の扱いを明記してるか
- 既知の値で検証する — 手計算できる簡単な例(例:MA3 を3本のbarで計算)で、ライブラリ版と一致するか
- 複数プラットフォーム間で比較する — 同じデータで同じインジケーターを計算して、値が一致するか
自分は今、これらを「cBot 実装の チェックリスト」に入れてる。
まとめ
ライブラリは便利だが、落とし穴が多い。特に金銭が絡むトレード ロジックでは「ライブラリ頼み」が命取りになる。
自分の経験から言えば、ロジックの核になる部分は「自分で実装して、自分で理解する」が最強だ。時間はかかるが、その分 バグを減らせるし、本番環境でも安心できる。
インジケーター計算は地味だが、ここをきっちり押さえておくと、あとの実装がぐっと楽になる。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。