MTF移動平均の組み合わせ — 日足・4時間足・1時間足で方向の整合を確認する
移動平均を1本の時間足だけで眺めていると、いまの動きが押し目なのか転換なのか、判断が付きにくい場面によく出会います。マルチタイムフレーム(MTF)分析は、同じ移動平均を日足・4時間足・1時間足という複数の階層に置き、トレンド方向のそろい方を確認するアプローチです。本記事では、3階層それぞれの役割分担と、判定がねじれたときの扱い、そしてcBotとして実装する際の足の同期やルックアヘッド回避までを整理します。特定の設定が成果を保証するものではなく、設計の参考としてお読みください。
日足の役割 — 環境を決める
日足に置いた移動平均は、数週間から数か月単位の大きな流れを平滑化して見せてくれます。この階層の仕事は、いまが上向きの環境なのか、下向きの環境なのか、それとも方向感の乏しいレンジなのかという「前提」を決めることです。価格が移動平均のどちら側にあるか、移動平均自体の傾きがどちらを向いているか、という2点だけでも、環境の分類としては十分に機能します。
単独利用時の限界もはっきりしています。日足は1日に1本しか確定しないため判断の更新が遅く、環境が切り替わったことに気づくのはどうしても事後になります。また、日足だけを根拠にエントリーのタイミングまで決めようとすると損切り幅が大きくなりがちで、資金管理面の負担が重くなります。
4時間足の役割 — 流れとの接続を確認する
4時間足は、日足の環境と1時間足のタイミングをつなぐ中間層です。日足が上向きでも、その内部では数日単位の押しや戻りが繰り返されています。4時間足の移動平均は、その中間スケールの流れがいま環境と同じ方向を向いているのか、それとも調整局面にあるのかを教えてくれます。
この階層の限界は、単独では「環境」としても「タイミング」としても中途半端になりやすい点です。4時間足だけで完結させると、日足レベルの転換に逆らった判断を続けてしまったり、逆に1時間足レベルの細かい動きに揺さぶられたりと、どっちつかずの挙動になりやすいのです。上下の階層と組み合わせて初めて、接続役としての価値が出ます。
1時間足の役割 — タイミングを測る
1時間足の移動平均は、実際にエントリーを検討する階層です。上位2階層で方向がそろっていることを前提に、価格が移動平均まで引き付けられた場面や、短期の傾きが同方向へ戻り始めた場面など、「流れに復帰するタイミング」を測る役割を担います。
単独利用時の限界はノイズの多さです。1時間足だけを見ていると、上位足では単なる調整に過ぎない動きが転換に見えてしまい、逆方向のシグナルを頻繁に拾ってしまいます。ダマシの多くは、この「下位足だけで方向を判断してしまう」構造から生まれると考えられます。
なぜこの組み合わせか
3階層の役割分担を一言でまとめると、日足が前提を決め、4時間足が接続を確認し、1時間足が入り口を測る、という分業です。移動平均という同じ単純な道具でも、置く階層を変えるだけで別々の情報を取り出せる点が、この設計の面白いところです。
補完関係は明確です。日足単独の「遅さ」は下位足のタイミング判定が補い、1時間足単独の「ノイズの多さ」は上位足の環境フィルターが補います。3階層すべてが同方向を向いている場面だけに判断を絞ることで、下位足で発生するダマシの一部を前段で弾く、ノイズフィルターとしての機能が期待できます。
もうひとつ重要なのは「ねじれ」の扱いです。3階層の方向が食い違っている状態は、シグナルの欠如ではなく「見送り」という積極的な判断材料になります。たとえば日足と4時間足が上向きで1時間足だけ下向きの場面は、押し目形成の途中かもしれませんが、その見極めを急ぐ必要はありません。再び3階層がそろうまで待つ、というのがこの設計の基本姿勢です。
ただし、そろいを厳格に要求するほどシグナルの頻度は下がり、トレンドの初動は取り逃がしやすくなるというトレードオフがあります。この組み合わせは機会の多さではなく判断の確度を優先する設計だと理解しておくと、期待とのずれを防げます。
パラメータをどう考えるか
調整対象は、移動平均の種類(SMA/EMAなど)、算出期間、そして階層の組み合わせ方の3つです。期間を短くすれば反応が速く短期向けに、長くすれば環境判定が安定し長期向けに寄る、という方向性はどの階層でも共通です。
設計上の分岐は、全階層で同じ期間をそろえるか、階層ごとに変えるかです。そろえる設計は「同じ物差しをスケール違いで当てる」という解釈が素直に通り、検証もしやすくなります。一方で、上位足ほど長めの期間にして環境判定をより安定させる設計もよく知られています。どちらが正解というものではなく、時間足の選び方(日足・4時間足・1時間足という組み合わせ自体も固定ではありません)も含めて、対象銘柄ごとにバックテストで挙動を確かめてから決める流れが安全です。
cBot化する際の考慮点
MTFロジックの実装には、単一時間足のcBotにはない固有の論点がいくつかあります。
まず足の取得です。cTraderでは MarketData.GetBars(TimeFrame.Daily) のように、チャートの時間足とは別の足系列を取得できます。移動平均は、この取得した足系列に対して個別に生成します。
次に、最大の注意点であるルックアヘッドの回避です。1時間足の確定時点では、同じ時刻を含む日足や4時間足はまだ確定していません。未確定の上位足の終値を判定に使うと、バックテストでは「その時点で知り得なかった情報」を参照する形になり、実運用と乖離した結果を生みます。上位足は確定済みの最後の足(Last(1))を参照するのが基本です。
インデックスの同期にも注意が必要です。異なる時間足の足番号は一致しないため、GetIndexByTime などで時刻をキーに対応する足を引き当てます。休場やデータ欠損で対応する足が存在しないケースへの防御も入れておくと堅牢になります。
エッジケースとしては、起動直後に上位足の本数が算出期間に満たないウォームアップ不足が代表的です。3階層すべてで必要本数を確認し、そろうまで判定をスキップする実装が安心です。計算負荷の面では、上位足の判定は該当する足が切り替わったときだけ更新すれば十分で、1時間足の確定ごとに毎回再計算する必要はありません。
// 例: 上位足は確定済みの足だけを参照する(ルックアヘッド回避)
var dailyBars = MarketData.GetBars(TimeFrame.Daily);
var h4Bars = MarketData.GetBars(TimeFrame.Hour4);
var maDaily = Indicators.MovingAverage(dailyBars.ClosePrices, 20, MovingAverageType.Simple);
var maH4 = Indicators.MovingAverage(h4Bars.ClosePrices, 20, MovingAverageType.Simple);
// OnBar(1時間足の確定時)にて
bool dailyUp = dailyBars.ClosePrices.Last(1) > maDaily.Result.Last(1);
bool h4Up = h4Bars.ClosePrices.Last(1) > maH4.Result.Last(1);
// 1時間足側の判定と合わせて「3階層の整合」を判断材料とする
実装の流れ
処理の流れは、上位足から下位足へ一方向に降りていく構造に整理できます。
- 環境判定: 日足の移動平均で上向き・下向き・方向感なしを分類する
- 流れの確認: 4時間足の移動平均が環境と同方向かを確認する
- タイミング判定: 1時間足で移動平均との位置関係・傾きからエントリー候補を検出する
- 共通フィルター: 経済指標の前後、スプレッド異常、保有ポジション数を確認する
- 発注・管理: 条件がそろった場合のみ、リスク管理ルールに沿ってロットと決済条件を決める
どこか1つでも整合が崩れたら、その時点で見送りに分岐させる「早期リターン」型に組むと、判定ロジックが読みやすくなり、検証時にどの段で弾かれたのかのログも取りやすくなります。
どう活用するか
自分でcBotを作る方は、Claude Codeを使った実装の参考にしてください。「上位足で絞り、下位足で入る」という構造は、移動平均に限らずADXやRSIなど他の指標にもそのまま展開できる設計パターンです。
実装に時間が取れない方や、既存の戦略に環境フィルターとして組み込みたい方は、ai-programming.xyz で個別の実装相談を承っています。体系的に学びたい方は、スクールでMTF設計の考え方から検証の進め方までを、実際の開発フローに沿って学ぶことができます。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。