EAのマルチタイムフレームでFX自動売買の確定足をそろえる方法

EAのマルチタイムフレームは、上位足で売買の方向を決め、下位足で実行のきっかけを判断する設計です。FX自動売買で先に決めたいのは時間足の数よりも、「どの時刻に、どこまで確定した値を使うか」というルールです。
たとえば15分足が閉じても、その足を含む1時間足はまだ途中かもしれません。同じ番号の足を選ぶだけでは時刻はそろわず、後から完成した上位足を過去の判定へ使うと、当時は分からなかった情報が混ざります。
この記事ではMT4を例に、1時間足と15分足の役割、確定足の対応、履歴が足りないときの見送り、発注しない状態での照合を順番に整理します。設定例は動作を理解するためのもので、収益や有利な時間足の組み合わせを示すものではありません。
- 上位足と下位足に別々の役割を持たせる設計
- 判断時刻と足の開始時刻を区別する具体例
- 履歴不足と条件不成立を分ける確認方法
- 売買を始める前に同じ時刻で判定を照合する手順
EAのマルチタイムフレームとFX自動売買の設計

最初は同じ銘柄の上位足と下位足を1つずつに絞ると、判断がずれた理由を追いやすくなります。複数の時間足を多数決にするのではなく、方向を許可する条件と、実行のきっかけになる条件を分けて書き出しましょう。
時間足ごとの役割を決める
上位足を1時間足、下位足を15分足とする説明例では、上位足は買いを検討してよい環境か、下位足は実際に買い条件が成立したかを担当します。上位足の条件が買いでも、その瞬間に注文する設計とは限りません。下位足の条件が整わなければ新規注文は出さない、という関係です。
仕様書には「1時間足の確定した終値が同じ足の移動平均より上なら買い方向を許可し、15分足の別に定めた確定条件を満たしたときだけ候補にする」のように書きます。移動平均の期間・種類・適用価格、足の参照位置は別の欄で固定します。数値を未定のまま「上昇中なら買う」と書くと、作成者によって条件が変わってしまいます。
売りを扱うなら売り側も独立して定義します。買いが不成立だから自動的に売り、とは限りません。横ばいや情報不足を「見送り」として残せば、買い・売り・判定不能を区別できます。上位足が反転したら新規だけ止めるのか、保有分も決済するのかも、同じ方向判定にまとめず別の運用条件にします。
一つのチャートへEAを設定する構成でも、コード側で別の時間足を参照できます。逆に、チャートを2枚開いただけで両方を自動的に判断するわけではありません。EAが参照する銘柄と時間足、設定先のチャートを仕様書で分けることが第一歩です。
現在足と確定足を区別する

MT4の時系列で現在形成中の足は通常shiftが0、直前の足は1として参照します。ただし「1ならいつも正しい」ではなく、いまの判断なのか、過去の判断を振り返っているのかを分けて考える必要があります。最新時点の上位足1本前と、過去の判断時点で確定していた上位足は、同じ番号にはなりません。
実時間で下位足の新しい足を検出し、直前の足に基づいて判断する方式なら、その時点で確定した上位足を使います。一方、過去の15分足を順番に調べる処理では、その15分足をいつ判断したかという時刻から上位足を探します。いま見えている完成済みの1時間足を、過去の15分足すべてへそのまま当てはめないようにします。
また、足に付いている時刻は一般に開始時刻です。10時00分の15分足は10時00分に結果が分かる足ではありません。10時15分以降に次の足が現れたことを確認して、10時00分開始の足が終わったものとして扱う、という整理が必要です。表示された時刻と判定できる時刻の違いを、先に小さな例で確かめてください。
バー時刻を取得する関数と履歴未取得時の扱いはMQL4公式のiTimeで確認できます。終値の読取りはiCloseの公式仕様も合わせて確認し、時間足とshiftの両方をそろえましょう。
同じ番号より判断時刻をそろえる

以下は取引サーバー上の時刻で考える説明例です。1時間足が毎正時、15分足が00分・15分・30分・45分に始まる連続した履歴を仮定します。休場や欠損がある区間へそのまま当てはめるための表ではありません。
| 新しい15分足の開始 | 判断する下位足 | その時点で直近の確定上位足 |
|---|---|---|
| 10:15 | 10:00開始の15分足 | 09:00開始の1時間足 |
| 10:30 | 10:15開始の15分足 | 09:00開始の1時間足 |
| 10:45 | 10:30開始の15分足 | 09:00開始の1時間足 |
| 11:00 | 10:45開始の15分足 | 10:00開始の1時間足 |
10時15分の判定に10時00分開始の1時間足の最終終値を使うと、その1時間足が11時まで動いた結果を先取りしてしまいます。形成途中の値を、その時点で取得して記録する設計とは別の問題です。途中値を使う戦略もあり得ますが、その場合は途中値を再現できるデータと判定頻度を用意し、確定足の戦略と同じ条件として比較しないことが必要です。
過去時刻から上位足を探すにはiBarShiftが使えます。ただし返るのは指定時刻を含むバーの位置であり、必ず「すでに閉じたバー」になる関数ではありません。検索に渡す時刻が下位足の開始なのか、判断した時刻なのかを決め、その上位足が当時閉じていたかを時刻で照合します。機械的に常に1を足せばよい、と一般化しないようにしましょう。
履歴に穴があるとき、exactの指定によって近い足を返すか、該当なしを返すかも変わります。iBarShiftの公式説明を確認し、見つかった足の開始時刻をもう一度取得して、別の日や別の時間帯の足で代用されていないかを調べます。
更新のきっかけと重複判定を分ける

確定した下位足を1本につき1回だけ判定するなら、下位足の最新開始時刻を前回値と比較する方法が考えられます。時刻が変わったら直前の足を読む、という流れです。ただし端末起動直後やEA再設定直後の最初の呼出しをどう扱うかも決めておきます。初回の値を前回として記憶するだけにするか、直前足を1回評価するかで動作は変わります。
ここで重要なのは、時計の15分ちょうどに必ず処理が走ると決めつけないことです。OnTickを使うEAは、設定したチャートの銘柄に新しいティックが来たときに呼び出されます。ティックが届くまで、新しい足を処理できないことがあります。公式のイベント処理の説明で、OnTickとOnTimerの違いを確認できます。
新バー検出と発注済み判定も別です。新しい足を見つけたことだけを注文の重複防止にすると、再起動で記憶が消えた場合や、注文結果の確認が遅れた場合の扱いが残ります。判断した足の時刻、注文の識別方法、発注の応答、保有中の扱いを分けて設計します。接続を戻した直後に過去の候補を何本もまとめて発注しない方針も決めておきましょう。
説明用の判定表示と、実際に注文するコードは別にして確認すると原因を切り分けやすくなります。「上位足は買い許可、下位足は不成立」のような表示を先に作り、意図どおりに条件が切り替わるかを見ます。この段階で売買成績を追うより、参照した時刻が正しいかを優先します。
時間足を増やす前に見送りを定義する
上位足と下位足が反対方向なら見送る、上位足の値を取得できなければ見送る、必要な過去本数が足りなければ見送る。このように、注文しない理由を先に分類すると、取引がないときの調査が進めやすくなります。「条件不成立」と「データ不備」は同じ結果に見えても原因が違います。
複数時間足にすると、条件の組み合わせが増えて売買回数が減ることがあります。そのことだけで品質が上がったとは判断できません。たまたま損失の区間を除外した可能性や、期待していた場面まで除外した可能性を確かめるため、後半で単一時間足との差を比較します。時間足を増やす前に、何を改善したいのかを一つに絞るのがよいですね。
同じ目的の指標を上位足に何本も足すと、どの条件が判断を変えたのか分からなくなります。まずは方向を許可する条件を一つ、下位足のきっかけを一つにして、追加する前と後を比較します。条件の数が多いことや、すべての足の向きがそろうことを、有利さの証明にしないようにしましょう。
表示が変わる理由そのものを確認したい場合は、EAのリペイントと当時のシグナルを照合する方法も参考になります。本記事では表示の書き換え全般ではなく、異なる時間足を同じ判断時刻で読む設計に絞って進めます。
EAのマルチタイムフレームを時刻で検証する

設計がまとまったら、利益の比較へ進む前に、上位足と下位足が同じ判断時刻でつながっているかを確かめます。履歴の読取り、条件判定、発注の順に分ければ、食い違いが見つかっても戻る場所を特定しやすくなります。
必要な履歴と指標の準備を確認する
最初に固定するのは、接続先、銘柄名、上位と下位の時間足、対象期間、移動平均などの入力値です。同じ通貨ペアでも銘柄名に接尾辞が付く場合があるため、表示名を推測して入力せず、端末で使っている実際の名前を確認します。日本時間へ換算した時刻とサーバーの足時刻も混ぜないようにします。
上位足の必要本数は、指標の期間だけでなく、比較する過去位置や初期計算に必要な履歴も含めて考えます。本数が少ない状態でたまたま値を受け取れたとしても、準備が十分とは限りません。各時間足の開始日と最終更新の範囲を確認し、検証する期間を両方の履歴で扱えるようにそろえます。
履歴がまだ形成されていない、または同期されていないときはBarsが0を返す仕様です。MQL4公式のBarsと、履歴状態の情報を得るSeriesInfoIntegerを確認し、本数や取得失敗の確認を判定処理へ入れます。取得できなかった値を0の価格や「売り」として扱わない設計が必要です。
外部インジケーターを使う場合は、同じ設定のチャート上の値とプログラムが読んだ値を対応させます。インジケーターのファイル名が同じでも、版や入力値が違うと比較条件はそろいません。まず標準指標だけで時間の対応を確認してから外部指標を加えると、時刻の誤りと指標側の仕様の違いを分けやすくなります。
注文しない状態で判定表を作る

発注しない検証用の処理では、判断時刻、下位足の開始時刻、参照した上位足の開始時刻、上位足の値、下位足の値、許可方向、見送り理由を並べます。口座番号や認証情報を記録する必要はありません。狙いは後から成績を飾ることではなく、一本の判定がどの値から作られたかを追えるようにすることです。
たとえば10時30分の判定で上位足の開始時刻が10時00分になっていたら、確定足を使う仕様との不一致を疑います。反対に、11時00分になっても09時00分の足を読み続けていたら、更新の検出や時刻の対応を確認します。まず1日分の全取引ではなく、上位足の境界をまたぐ数回の判断を手で追ってみてください。
| 確認する場面 | 調べる値 | ずれたときに戻る箇所 |
|---|---|---|
| 上位足の途中 | ひとつ前の確定上位足の開始時刻 | 判断時刻とshiftの対応 |
| 上位足の切替直後 | 新しい確定上位足と下位足の時刻 | 新バー検出と値の更新順 |
| 履歴取得の失敗時 | 取得成否と見送り理由 | 履歴準備とエラー分岐 |
| 端末の再起動直後 | 最初に評価した下位足と注文済み状態 | 初回動作と重複防止 |
チャートに重ねた線が滑らかであることは、EAが当時読んだ値の証明にはなりません。描画用の処理が過去の値を補間したり、後から再計算したりする可能性もあるためです。比較したい足の開始時刻を先に合わせて、その時刻の数値を確認します。チャート全体の見た目だけで一致と判定しないのがポイントです。
差が出たら、価格を丸める桁数や移動平均の期間を変える前に、銘柄、時間足、足の開始時刻、入力値の順に確かめます。同じ時刻の同じ条件であることが確認できてから、計算値の差を調べます。時刻が違うまま数値を合わせようとすると、別の誤りを追加してしまいます。
単一時間足との差を同じ条件で比べる

時刻の照合が済んだら、上位足フィルターなしの元の条件と、フィルターを追加した条件を比較します。銘柄、期間、取引コスト、ロット計算、損切り、決済条件を同じにして、追加条件だけが変わるようにします。比較の途中で下位足の設定まで調整すると、どちらの変更が結果へ影響したのか分からなくなります。
見るものは合計利益だけではありません。取引回数、最大の損失区間、保有時間、買いと売りの偏り、見送った条件の内訳も確認します。フィルターにより取引が少なくなると、一部の取引だけで数値が大きく動くこともあります。結果の良い一期間を選ぶのではなく、方向感がある区間と横ばいの区間をあらかじめ分けて見直しましょう。
上位足の条件で損失取引を多く除外できても、利益になる取引も大量に消えていれば、目的に合った改善とは限りません。逆に利益が下がっても、もともと減らしたかった保有の偏りが改善する場合は、運用の目的に沿うか検討できます。何を採用条件とするかは結果を見る前に文章で決めておくと、都合のよい説明へ変わりにくくなります。
テスターはその実行条件の中での検証です。確定足を使うから軽いモデルで十分、と一律に決めず、損切りや利確が足の途中で動くか、注文管理がティックに依存するかも確認します。テストの進め方全体は、FX自動売買のバックテストとフォワード確認の手順で整理しています。
デモで再起動と境界時刻を確かめる

デモ環境では、上位足の途中で起動する場面、上位足が切り替わる場面、接続復旧後、EAを付け直した直後を分けて確認します。期待する動作も先に決めます。たとえば起動直後は新しい下位足が現れるまで注文しない仕様なら、その待機中を「動かない」と誤認して設定を変えないようにします。
同じ1時間足の方向を複数の15分足で使い続けるのは、設計どおりの場合があります。上位足が変わるまで待つ条件なのか、下位足ごとに一度評価する条件なのかで、更新頻度は違います。一方、画面の表示は新しいのに内部の参照時刻が古いままなら不一致です。表示文言と実際に判定へ使った時刻の両方を並べて確認します。
再起動後は、既存ポジションや待機注文が残っている状態も確かめます。新規条件がもう一度成立したときに追加してよいか、同じ判断の再注文を防げるか、上位足が変わったときに保有管理を続けるかを見ます。EAを止める操作と、すでにある注文やポジションを処理する操作は同じではありません。
デモで想定外の動作が出たら、実口座で様子を見るのではなく、注文処理を止めて読み取りの確認へ戻します。まずどの判断時刻から仕様と違ったかを特定します。テスターとデモの差は、履歴、ティックの到着、コスト、注文処理など複数の要因があるため、上位足の条件だけを変更して埋め合わせないことが大切です。
EAのマルチタイムフレームを始める前の確認
EAのマルチタイムフレームでは、時間足を増やすことより、判断に使える情報の範囲を決めることが先です。上位足は方向を許可する、下位足は実行のきっかけを判定する、と役割を書き、その時点で閉じていた足を選びます。上位足と下位足で同じshiftを使うことを、時刻が一致する根拠にしないでください。
実装前には、銘柄と2つの時間足、使う指標の設定、確定足を評価する時刻、データ不足のときの見送り、起動直後の初回動作、重複注文の防止、保有中の管理を一枚の仕様表にします。答えが決まっていない欄があれば、コードを増やす前にそこを埋めます。
次に発注しない処理で境界時刻を照合し、同じ条件の単一時間足との比較、デモでの再起動と復旧確認へ進みます。期間・銘柄・設定を変えるたびに都合よく有利になる条件を探すのではなく、最初に決めた採用条件に照らして見送る判断も残しましょう。
MT4で標準の移動平均を読む場合は、iMAの公式仕様で時間足、適用価格、shiftの位置を確認できます。FX自動売買へ進める前の最初の作業は、二つのチャートを同じ判断時刻で並べ、参照した足の開始時刻が仕様と一致するか確かめることです。
