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

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

MQL5の SymbolInfoSessionQuote 関数は、特定の銘柄(通貨ペアやCFDなど)における「クォート(価格配信)セッション」の開始時間と終了時間を取得するための関数です。

FX取引において、多くの開発者は「24時間いつでも動いている」と考えがちですが、実際には土日の閉場や、CFD銘柄(日経225やゴールド等)における休憩時間、さらにはメンテナンス時間による配信停止が存在します。

実務での活用シーン

  • セッション開始直後の挙動制御: 市場が動き出した瞬間のスプレッド拡大を回避するために、開始時刻を正確に把握する。
  • セッション終了前の手仕舞い: 取引が停止する数分前にポジションをクローズし、窓開けリスクを回避する。
  • バックテストの精度向上: サーバーごとの正確な取引時間を考慮したロジックを組み込む。

初心者が特につまずきやすいのは、この関数が取得するのは「価格が配信される時間(Quote)」であり、「実際に売買ができる時間(Trade)」とは異なる場合がある点です。実務では SymbolInfoSessionTrade と組み合わせて、取引可能な時間を厳密に判定するのが定石です。


2. 構文と戻り値

SymbolInfoSessionQuote 関数の構文は以下の通りです。

bool  SymbolInfoSessionQuote(
   string            name,                // 銘柄名(通貨ペア名)
   ENUM_DAY_OF_WEEK  day_of_week,         // 曜日(ENUM_DAY_OF_WEEK)
   uint              session_index,      // セッションのインデックス(0から開始)
   datetime&         from,                // セッション開始時刻(参照渡し)
   datetime&         to                   // セッション終了時刻(参照渡し)
   );

パラメーター解説

  1. name: 対象とする銘柄名(例: "USDJPY", _Symbol)を指定します。
  2. day_of_week: SUNDAY, MONDAYSATURDAY のいずれかを指定します。
  3. session_index: 1日に複数のセッションがある場合(昼休憩があるCFDなど)、0, 1, 2…と指定します。
  4. from / to: datetime 型の変数を用意し、参照渡しすることで、関数実行後にその変数に時刻が格納されます。※格納される値は「1970年1月1日」からの経過秒ですが、日付部分は無視され、時間情報のみを利用します。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。指定したインデックスにセッションが存在しない場合も false となるため、ループ処理の終了条件として利用されます。

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

以下のコードは、現在の銘柄における「本日の全クォートセッション」を取得し、エキスパートログに出力するサンプルです。

void OnStart()
{
    // 現在のサーバー時刻を取得
    datetime serverTime = TimeTradeServer();
    MqlDateTime dt;
    TimeToStruct(serverTime, dt);

    // 現在の曜日を取得(ENUM_DAY_OF_WEEKにキャスト)
    ENUM_DAY_OF_WEEK today = (ENUM_DAY_OF_WEEK)dt.day_of_week;

    datetime from, to;
    uint sessionIndex = 0;

    Print("--- 本日のクォートセッション情報 ---");

    // 全てのセッションをループで取得
    // SymbolInfoSessionQuoteがfalseを返すまで繰り返す
    while(SymbolInfoSessionQuote(_Symbol, today, sessionIndex, from, to))
    {
        // fromとtoから時間・分を抽出
        MqlDateTime dtFrom, dtTo;
        TimeToStruct(from, dtFrom);
        TimeToStruct(to, dtTo);

        string sessionInfo = StringFormat("セッション [%d]: %02d:%02d ~ %02d:%02d", 
                                          sessionIndex, 
                                          dtFrom.hour, dtFrom.min, 
                                          dtTo.hour, dtTo.min);
        Print(sessionInfo);

        sessionIndex++;
    }

    if(sessionIndex == 0)
    {
        Print("本日はクォートセッションが設定されていません(休場など)。");
    }
}

このコードをEAやスクリプトで実行すると、MT5の「操作履歴」タブに、その銘柄の正確な稼働時間(サーバー時間基準)が表示されます。


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

① 日付情報の扱いに注意

fromto に格納される datetime 値は、日付部分が「1970.01.01」固定となっています。そのため、単純に TimeCurrent() > from と比較しても意図した動作になりません。時刻のみを比較するために、必ず TimeToStruct で構造体に分解するか、日付部分を当日に補正する処理を入れてください。

② セッションの複数存在

FXは通常1セッションですが、日経225などの指数CFDは「前場・後場」のようにセッションが分かれていることがあります。session_index = 0 だけを確認して安心せず、必ず while 文などで全てのセッションを確認する癖をつけましょう。

③ Quote(価格配信)とTrade(取引可能)の乖離

価格は配信されている(=チャートは動いている)が、注文は受け付けていないという時間帯が存在します。取引ロジックに組み込む場合は、SymbolInfoSessionTrade(取引セッション取得)も併用して、ダブルチェックを行うのが安全です。


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

アルゴリズムトレードにおいて、ロジックの正確さと同じ、あるいはそれ以上に重要なのが「実行環境の物理的距離」です。自宅のPCや一般的な光回線から自動売買を行う場合、MT5のサーバーとの間で数十〜数百ミリ秒のネットワーク遅延(レイテンシ)が発生します。この遅延は、ボラティリティが高い局面や、セッション開始直後の価格急変時において、致命的なスリッページや約定拒否(リクオート)を引き起こす原因となります。

プロのクオンツや専業トレーダーにとって、取引サーバーの目と鼻の先に位置するデータセンター内のVPS(仮想専用サーバー)を利用することは、もはや選択肢ではなく「必須条件」です。1ミリ秒の遅延が、年間収益を数百pips単位で悪化させることも珍しくありません。極限まで約定スピードを高め、ロジック通りのパフォーマンスを発揮させるためには、ネットワーク遅延を最小限に抑えた専用のVPS環境を構築することが、自動売買における最初の成功戦略といえます。

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

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

コメント

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