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

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

SymbolInfoSessionTradeは、特定の銘柄(通貨ペアやCFDなど)における「取引可能な時間帯(セッション)」を取得するための関数です。

FXの自動売買(EA)開発において、多くの初心者は「月曜のサーバー時間0時になったらエントリー」といった定数での条件分岐を書きがちです。しかし、実際の実務では以下の理由から、この関数による動的な時間取得が不可欠です。

  • 銘柄による違い: FX通貨ペアとゴールド(XAUUSD)、株価指数(Nikkei 225など)では取引開始・終了時間が異なります。
  • サマータイムの影響: サーバー時間は夏時間・冬時間で切り替わるため、固定値でプログラミングすると、年に2回、意図しない時間帯に取引を行ってしまうリスクがあります。
  • 休場日の把握: クリスマスや年末年始など、市場が早く閉まる日のスケジュールを正確に把握するために利用します。

実務では、この関数を使って「現在のサーバー時間が取引セッション内にあるか」を判定し、セッション終了間際の駆け込みエントリーを抑制したり、週明けの窓開けを回避したりするロジックを構築します。

2. 構文と戻り値

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

bool SymbolInfoSessionTrade(
   string            name,                // 銘柄名(通貨ペア名)
   ENUM_DAY_OF_WEEK  day_of_week,         // 曜日
   uint              session_index,       // セッションのインデックス
   datetime&         from,                // 開始時刻を受け取る変数
   datetime&         to                   // 終了時刻を受け取る変数
);

パラメーターの解説

  1. name: "USDJPY"_Symbol を指定します。
  2. day_of_week: MONDAY から SUNDAY までの列挙値を指定します。
  3. session_index: 0から始まるセッション番号です。1日に複数のセッション(昼休みがある場合など)がある銘柄に対応するため、通常は0から順に確認します。
  4. from / to: セッションの開始・終了時刻が格納される datetime 型の変数です。日付部分は「1970年1月1日」となり、時刻部分のみを利用します。

戻り値

指定した条件のセッションデータが存在すれば true、存在しなければ false を返します。

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

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

//+------------------------------------------------------------------+
//|                                     CheckTradingSessionSample.mq5|
//+------------------------------------------------------------------+
#property strict

void OnTick()
{
    // 今日の曜日を取得
    MqlDateTime today;
    TimeCurrent(today);
    ENUM_DAY_OF_WEEK day = (ENUM_DAY_OF_WEEK)today.day_of_week;

    uint session_index = 0;
    datetime from, to;

    PrintFormat("--- %s の取引セッション情報 ---", _Symbol);

    // 全てのセッションをループで取得(1日に複数ある場合に対応)
    while(SymbolInfoSessionTrade(_Symbol, day, session_index, from, to))
    {
        // datetime型から時刻部分のみを抽出して表示
        string startTime = TimeToString(from, TIME_MINUTES);
        string endTime   = TimeToString(to, TIME_MINUTES);

        PrintFormat("セッション [%d]: %s ~ %s", session_index, startTime, endTime);

        session_index++;
    }

    if(session_index == 0)
    {
        Print("本日は休場、または取引セッションが設定されていません。");
    }
}

実践的な応用

実際のEAでは、to(終了時刻)の30分前になったら新規エントリーを停止し、ポジションをクローズするといった「クローズ戦略」に組み込むのが一般的です。これにより、週末の持ち越しリスクを自動的に回避できるようになります。

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

  1. インデックスのループに注意
    CFD銘柄などは、前場と後場のようにセッションが分かれていることがあります。必ず while 文などで session_index をインクリメントしながら、全てのセッションをチェックするようにしましょう。
  2. 日付情報の無視
    fromto に格納される日付(1970/01/01)は意味を持ちません。比較する際は、TimeCurrent で取得した構造体 MqlDateTime の時刻コンポーネントのみを抽出して比較するか、現在の時刻を1970年基準の秒数に変換して計算する必要があります。
  3. 取引と見積(Quote)の違い
    SymbolInfoSessionQuote という似た関数がありますが、こちらは「価格配信時間」を取得するものです。自動売買において重要なのは、注文が受け付けられる「取引時間」であるため、必ず SymbolInfoSessionTrade を使用してください。
  4. ブローカーによる設定ミス
    稀にブローカー側の設定ミスで、正確なセッション情報が取得できないケースがあります。取得に失敗した(false が返った)場合の例外処理は必ず記述しておきましょう。

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

アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境」です。どれほど完璧なエントリー条件を SymbolInfoSessionTrade で制御していても、自宅のPCや一般的な光回線で運用している場合、物理的な距離に起因するネットワーク遅延(レイテンシ)は避けられません。FX市場はミリ秒単位で価格が変動しており、ごくわずかな遅延が「スリッページ」を引き起こし、バックテスト通りの利益を削り取ってしまいます。

プロのクオンツエンジニアが運用するEAは、ブローカーのサーバーと同じデータセンター内、あるいは極めて近い場所に設置された「専用のVPS(仮想専用サーバー)」で稼働しています。100ミリ秒の遅延が1ヶ月でどれほどの損失を生むかを計算すれば、24時間安定稼働し、低レイテンシを保証するVPSの導入が、単なるコストではなく「必須の投資」であることが理解できるはずです。システムトレードで真に勝ち残るためには、コードの最適化だけでなく、インフラ環境を極限までプロ仕様に整えることが不可欠です。

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

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

コメント

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