開発者の手記 #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. タイムフレームは1つに決める — 複数混在させると矛盾が生じやすい
  2. bar確定の遅延を知る — cTrader では次のbar始値で確定判定される
  3. インジケーター計算のタイミングを確認する — ライブラリごとに異なる可能性がある
  4. バックテストと実運用のズレを予測する — 1~2bar分のバッファを検討する

これらを押さえてからcBotを組むと、デバッグ時間が劇的に減る。自分の経験上、時間軸の理解不足は「なぜか上手くいかない」という泥沼の入り口だ。

次回は、具体的なATR計算と、期間選択の話をしようと思ってる。では。

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