【MQL5】iTime関数の使い方と自動売買実装コード

1. iTime関数の概要と実務での活用法

MQL5のiTime関数は、指定した通貨ペアおよび時間足において、特定のバーが「いつ開始されたか(オープン時間)」を取得するための非常に重要な関数です。

実務開発、特にEA(エキスパートアドバイザー)のロジック構築において、iTimeは主に以下の用途で活用されます。

  • 新しい足(確定足)の発生検知: 毎ティック動くEAにおいて、「新しい1分足や1時間足が始まった瞬間」にのみエントリー判断を行いたい場合に必須となります。
  • マルチタイムフレーム(MTF)分析: 例えば「5分足で動作しているEAが、1時間足の現在のオープン時間を参照して上位足のトレンド転換を確認する」といった処理が容易になります。
  • 計算負荷の軽減: 毎ティック重い計算をするのではなく、特定のバーの開始時刻が変わったときだけ計算を実行させることで、CPU負荷を劇的に抑えることができます。

初心者が特につまずきやすい点は、MQL4とMQL5での挙動の違いです。MQL5ではヒストリーデータが準備されていない場合、iTimeは「0」を返すことがあります。これを見越したエラーハンドリングが、堅牢なシステム構築の第一歩となります。

2. 構文と戻り値

iTime関数の基本的な構文は以下の通りです。

datetime iTime(
   string           symbol,          // 通貨ペア名(NULLまたは_Symbolで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,       // 時間足(PERIOD_M1, PERIOD_H1など)
   int              shift            // シフト(0が現在の足、1が1つ前の足)
);

パラメーター解説

  1. symbol: 取得したい通貨ペアを指定します。自身のチャートであれば _Symbol を指定します。
  2. timeframe: 参照したい時間軸を指定します。現在のチャートの時間足なら _Period を指定します。
  3. shift: どのバーの時間を取得するかを指定します。最新の足(形成中)なら 0、一つ前の確定足なら 1 を指定します。

戻り値

  • 成功した場合:指定されたバーのオープン時間を datetime 型(1970年1月1日からの経過秒数)で返します。
  • 失敗した場合:0 を返します。データがまだ読み込まれていない時などに発生します。

3. 具体的な使い方・実践サンプルコード

以下は、iTimeを使って「新しいバーが生成された瞬間」を検知し、そのタイミングでログを出力する実用的なEAのテンプレートです。

//+------------------------------------------------------------------+
//|                                              NewBarDetector.mq5  |
//|                                  Copyright 2024, Quant Engineer  |
//|                                             https://example.com  |
//+------------------------------------------------------------------+
#property strict

// 直前のバーの開始時刻を保持する変数
static datetime last_bar_time = 0;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 現在のチャートの最新の足(インデックス0)の開始時刻を取得
    datetime current_bar_time = iTime(_Symbol, _Period, 0);

    // データの取得に失敗(0が返ってきた)した場合は処理をスキップ
    if(current_bar_time == 0)
    {
        Print("データの準備ができていません。");
        return;
    }

    // 保存されている時刻と現在の時刻が異なる場合、新しいバーが発生したと判断
    if(last_bar_time != current_bar_time)
    {
        // 初回起動時(last_bar_timeが0)の誤作動防止
        if(last_bar_time != 0)
        {
            Print("新しいバーが発生しました: ", TimeToString(current_bar_time));

            // --- ここにエントリーロジックやインジケータ計算を記述 ---
            // 例: CheckEntrySignal();
        }

        // 比較用の時刻を更新
        last_bar_time = current_bar_time;
    }
}

このコードのポイントは、static 変数を使ってティックをまたいで時刻を保持している点です。これにより、一瞬のチャンスを逃さず、かつ無駄な重複処理を防ぐことができます。

4. 使用上の注意点とよくあるエラー

  1. データの未ロード(戻り値0)の罠
    EAをチャートに適用した直後や、MT5を起動した直後は、ヒストリーデータがメモリ上に展開されていないことがあります。この時 iTime0 を返します。これをチェックせずに計算に使うと、意図しないバグ(1970年として扱われるなど)の原因になります。

  2. 別通貨・別時間足の参照
    自身のチャート以外のデータ(例:EURUSDで稼働中にUSDJPYの時間を取得)を参照する場合、その通貨ペアのデータが同期されるまで時間がかかることがあります。ループ等で数回リトライするか、SeriesInfoInteger等で同期状態を確認するのがクオンツ流の作法です。

  3. MQL4とのインデックスの違い
    MQL4では配列として Time[0] のようにアクセスできましたが、MQL5では iTime 関数を呼び出すのが標準です。パフォーマンスを極限まで追求する場合は CopyTime 関数を使ってバルク(一括)で取得する方法もありますが、単一の時間を知るだけなら iTime が最もシンプルで可読性に優れています。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズム取引において、iTimeで正確なシグナルを検知できたとしても、それを注文として執行する環境が劣悪であれば、すべては水の泡となります。FX市場はミリ秒(1000分の1秒)単位で価格が変動しており、自宅のPCから一般的なインターネット回線を通じて注文を出す行為は、プロのクオンツから見れば極めてリスクの高い行為です。家庭用回線特有のネットワーク遅延(レイテンシ)や、物理的な距離による伝達ロスは、スリッページを増大させ、バックテストの結果を大きく下回る「負けの原因」を無意識のうちに作り出します。

約定スピードを極限まで高め、意図した価格で確実に約定させるためには、FX業者の取引サーバーと同じデータセンター内、あるいは至近距離に位置する専用のVPS(仮想専用サーバー)を利用することが必須条件です。24時間安定稼働し、物理的な距離による遅延を最小化するVPS環境は、単なる便利ツールではなく、自動売買エンジニアがマーケットで生き残るための「最低限のインフラ」であると認識すべきです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました