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

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

SeriesInfoIntegerは、指定した通貨ペアや時間足の「時系列データに関する状態」を取得するための関数です。具体的には、チャート上に何本のバーが存在するか、データがサーバーと同期されているか、あるいはヒストリカルデータの最も古い日付はいつか、といった情報を取得できます。

実務開発において、初心者が最も陥りやすい罠は「データが準備できていないのに計算を開始してしまうこと」です。MQL5はマルチスレッドで動作しており、EAが起動した瞬間にすべての過去データがメモリ上に展開されているとは限りません。同期が不完全な状態で CopyRates やインジケーターの計算を行うと、意図しないエラーや、最悪の場合「本来のロジックとは異なる価格での誤発注」を招きます。

SeriesInfoIntegerを適切に使い、データの準備状況を「検閲」することで、シストレの堅牢性は飛躍的に向上します。

2. 構文と戻り値

この関数は、取得したい情報の種類を識別子(プロパティID)で指定し、結果を「参照渡し」で受け取る形式をとります。

構文

bool SeriesInfoInteger(
   string                     symbol_name,     // 通貨ペア(NULLは現在のペア)
   ENUM_TIMEFRAMES            timeframe,       // 時間足(0は現在の時間足)
   ENUM_SERIES_INFO_INTEGER   prop_id,         // 取得したい情報の識別子
   long&                      long_var         // 値を受け取る変数(参照渡し)
);

主な戻り値とプロパティ

  • 戻り値: 成功すれば true、失敗すれば false を返します。
  • 主な識別子(prop_id):
    • SERIES_BARS_COUNT: チャートに存在するバーの総数。
    • SERIES_SYNCHRONIZED: データがサーバーと同期済みかどうか(bool値として判定)。
    • SERIES_FIRSTDATE: その時間足で利用可能な最も古いバーの日付。

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

以下は、EAの初期化時(OnInit)や計算開始時に、データの準備が整っているかを確認するための実用的なコード例です。

// データの同期状態とバー数を確認する関数
bool IsDataReady(string symbol, ENUM_TIMEFRAMES period, int minBars) {
    long barsCount;
    long isSynchronized;

    // 1. サーバーとの同期状態を確認
    if(!SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED, isSynchronized)) {
        Print("同期情報の取得に失敗しました。");
        return false;
    }

    if(!isSynchronized) {
        Print(symbol, " のデータが現在同期中です...待機します。");
        return false;
    }

    // 2. 利用可能なバー数を確認
    if(!SeriesInfoInteger(symbol, period, SERIES_BARS_COUNT, barsCount)) {
        Print("バー数の取得に失敗しました。");
        return false;
    }

    if(barsCount < minBars) {
        Print("エラー: 必要なバー数に達していません。必要:", minBars, " 現在:", barsCount);
        return false;
    }

    // すべての条件を満たした場合
    return true;
}

// EAのメイン処理での使用例
void OnTick() {
    // 100本以上のバーが必要なロジックの場合
    if(!IsDataReady(_Symbol, _Period, 100)) {
        return; // データが不完全なら今回のティックはスキップ
    }

    // ここにメインのロジックを記述
    Print("データ準備完了。ロジックを実行します。");
}

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

  1. 参照渡しのミス: SeriesInfoInteger の第4引数は long 型の変数そのものを渡す必要があります。関数が直接値を返すわけではなく、成功・失敗の bool 値を返す点に注意してください。
  2. ターミナルの設定上限: SERIES_BARS_COUNT で取得できるバーの数は、MT5の「ツール」→「オプション」→「チャート」タブにある「チャートの最大バー数」の設定に依存します。無限に過去データが取れるわけではないため、バックテストとライブ環境の設定を合わせておく必要があります。
  3. 初期化直後の空振り: MT5を起動した直後や、新しい通貨ペアのチャートを開いた直後は、SERIES_SYNCHRONIZEDfalse を返す時間が数秒発生することがあります。この間をループ等で待機するか、次のティックを待つ設計にすることが重要です。

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

アルゴリズム取引において、SeriesInfoIntegerを使ってデータ同期を完璧に管理しても、実行環境が貧弱であればすべてが無意味になります。一般的な日本の家庭用インターネット回線や無線LAN環境では、海外にあるブローカーのサーバーとの間に数百ミリ秒(ms)単位のレイテンシ(遅延)が発生します。この遅延は、急激な価格変動時に致命的な「スリッページ」を引き起こし、バックテストでは利益が出ていたロジックを瞬時に損失へと変えてしまいます。

プロレベルの約定スピードと安定性を確保するには、ブローカーのデータセンターに近い場所に設置された「専用のVPS(仮想専用サーバー)」での運用が不可欠です。24時間365日、物理的な切断リスクを排除し、ネットワーク遅延を極限まで抑えることで、初めてプログラムは設計通りのパフォーマンスを発揮します。本気で自動売買で利益を追求するエンジニアにとって、VPSはコストではなく、勝つための「必須装備」であることを理解してください。

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

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

コメント

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