開発者の手記 #1 — cBot開発で最初につまずく「時間軸」の話
cBot開発で最初につまずく「時間軸」の話
拓海だ。ここから「開発者の手記」というシリーズを始める。自分がcTraderでcBotを実装してきた中で、実際に詰まったこと・改善したこと・失敗したことを素直に書いていくつもりだ。
初回は「時間軸」の話。これは本当に多くの開発者がやられる。自分もそうだった。
タイムフレームの選択は「何を見るか」で決まる
cBotを書くとき、まず設定するのがタイムフレーム(時間軸)だ。M1(1分足)、M5(5分足)、H1(1時間足)…選択肢は山ほどある。
ここで重要なのは「どのタイムフレームで判断するか」によって、ロジックそのものが変わるということ。
例えば、ATRを使ったストップロス計算を考えてみてくれ。M1で計算したATRと H1で計算したATRでは、値が全然違う。M1は短期のノイズを拾いやすいし、H1はトレンドの本質を見やすい。
自分は最初、「複数のタイムフレームを同時に見たら精度が上がるんじゃないか」と思ってた。だから M5 と H1 を両方組み込んで…結果、矛盾した判断が出まくった。売却シグナルと買いシグナルが同時に出たりしてな。
今は「メインの判断軸は1つに決める」と決めてる。H1をメインにして、M5はフィルター程度に使う。そうするとロジックがシンプルになるし、テストもしやすい。
Bar確定のタイミングを理解しないと、信号が遅れる
もう1つ、初心者がやられるのが「bar確定」の扱いだ。
cBotの OnBar() メソッドは、barが確定したときに実行される。M5足なら、5分が終わるたびに実行される。ここまでは簡単。
だが問題は「いつ確定するか」。実は cTrader のbar確定は、次のbarの始値が確定した時点だ。つまり M5 足なら、6分目の始値が来たときに「5分目のbarが確定した」と判定される。
これを知らないと、「シグナルが1bar遅れる」という現象に引っかかる。自分もそうだった。M5でクロスオーバーを判定して、その足で即座にエントリーしたつもりが、実は次の足で入ってた。
スプレッド分、すでに不利な価格で約定してる。これが積み重なると、バックテストと実運用で成績が大きく違う原因になる。
対策は「bar確定の遅延を意識して、ロジックに織り込む」こと。例えば、前々足で条件判定して、前足で確認して、現在足でエントリー…みたいに1~2bar分のバッファを持たせる。それか、Tick単位での判定に切り替えるか。
インジケーター計算のズレも見落としやすい
もう1つ。インジケーターの計算値も「どの足で計算するか」で変わる。
MA(移動平均)を例に取ると、MA14は「過去14本のbarの平均値」だ。だが、OnBar()で実行するときは「確定済みの14本」を使うのか「現在bar含めた14本」を使うのか、ライブラリの実装で異なる。
自分の場合、最初は cTrader 標準の Indicators.MovingAverage() をそのまま使ってたんだが、手動で計算したMAと値が微妙にズレてた。ドキュメント読んで初めて「あ、計算タイミングが違うんだ」と気づいた。
それ以来、重要な判定には「自分で計算する」か「ライブラリのドキュメントを必ず確認する」ようにしてる。特に bar の開始・終了の扱いは要注意だ。
実装のコツ
まとめると、時間軸を正しく扱うには以下を意識する必要がある:
- タイムフレームは1つに決める — 複数混在させると矛盾が生じやすい
- bar確定の遅延を知る — cTrader では次のbar始値で確定判定される
- インジケーター計算のタイミングを確認する — ライブラリごとに異なる可能性がある
- バックテストと実運用のズレを予測する — 1~2bar分のバッファを検討する
これらを押さえてからcBotを組むと、デバッグ時間が劇的に減る。自分の経験上、時間軸の理解不足は「なぜか上手くいかない」という泥沼の入り口だ。
次回は、具体的なATR計算と、期間選択の話をしようと思ってる。では。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。