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

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

MQL5の大きな魅力の一つに「カスタムシンボル(独自の通貨ペア)」の作成機能があります。CustomSymbolSetSessionTradeは、このカスタムシンボルに対して「どの時間帯に取引(発注)を許可するか」という取引セッションを定義するための関数です。

実務レベルの開発、特にバックテストや独自のインデックス(合成通貨)を作成する際、以下のようなシーンで活用されます。

  • 特定の時間帯のみバックテストしたい場合: 東京時間だけ、あるいはロンドン市場の開始時間だけを取引対象とするカスタムシンボルを作成し、EAの挙動を検証する。
  • 休場日の設定: 特定の国の祝祭日を考慮したシミュレーションを行う。
  • 合成チャートの作成: 複数の通貨ペアを合成したオリジナル銘柄に対し、正しい市場時間を割り当てる。

初心者~中級者がよく陥る罠として、「価格データ(Quotes)は表示されているのに、バックテストで注文が通らない」という現象があります。これは、CustomSymbolSetSessionQuote(気配り値セッション)だけを設定し、このCustomSymbolSetSessionTrade(取引セッション)を設定し忘れていることが原因であることがほとんどです。

2. 構文と戻り値

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

bool CustomSymbolSetSessionTrade(
   string           symbol_name,      // カスタムシンボル名
   ENUM_DAY_OF_WEEK day_of_week,      // 曜日
   uint             session_index,    // セッションのインデックス(0から開始)
   datetime         from,             // 開始時刻
   datetime         to                // 終了時刻
);

パラメーター解説

  1. symbol_name: 設定対象となるカスタムシンボル名。あらかじめCustomSymbolCreateで作成しておく必要があります。
  2. day_of_week: 設定する曜日をENUM_DAY_OF_WEEK列挙型(例:MONDAY, TUESDAYなど)で指定します。
  3. session_index: その曜日に複数の取引時間帯を設ける場合の番号です。1つ目の時間帯なら0、2つ目なら1を指定します。
  4. from: セッション開始時刻。日付部分は無視され、時刻(時・分・秒)のみが参照されます。
  5. to: セッション終了時刻。同様に時刻のみが参照されます。

戻り値

設定に成功した場合は true、失敗した場合は false を返します。失敗した場合は GetLastError() 関数で詳細なエラーコードを確認できます。

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

以下のコードは、既存の「USDJPY」をベースにしたカスタムシンボルを作成し、月曜日から金曜日まで「東京市場の時間帯(日本時間09:00〜15:00 = 冬時間GMT+2想定で02:00〜08:00)」のみ取引を許可する設定例です。

void CreateTokyoOnlySymbol()
{
    string customSymbol = "USDJPY_Tokyo";

    // 1. 既存のカスタムシンボルがあれば削除してリセット
    if(SymbolInfoInteger(customSymbol, SYMBOL_CUSTOM))
    {
        CustomSymbolDelete(customSymbol);
    }

    // 2. USDJPYのプロパティをコピーして新規作成
    if(!CustomSymbolCreate(customSymbol, "Custom\\Forex", "USDJPY"))
    {
        Print("カスタムシンボルの作成に失敗しました。Error: ", GetLastError());
        return;
    }

    // 3. 月曜日〜金曜日の取引セッションを設定(02:00 - 08:00)
    datetime from = D'1970.01.01 02:00';
    datetime to   = D'1970.01.01 08:00';

    for(int i = MONDAY; i <= FRIDAY; i++)
    {
        ENUM_DAY_OF_WEEK day = (ENUM_DAY_OF_WEEK)i;

        // 取引セッションを設定
        if(!CustomSymbolSetSessionTrade(customSymbol, day, 0, from, to))
        {
            Print(EnumToString(day), " のセッション設定に失敗。Error: ", GetLastError());
        }

        // 注意:バックテスト等で動かすには気配値セッション(Quote)の設定も通常必要
        if(!CustomSymbolSetSessionQuote(customSymbol, day, 0, from, to))
        {
            Print(EnumToString(day), " の気配値設定に失敗。");
        }
    }

    Print("カスタムシンボル ", customSymbol, " の取引セッション設定が完了しました。");
}

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

① 気配値セッションとの不整合

CustomSymbolSetSessionTrade(取引可能時間)は、必ずCustomSymbolSetSessionQuote(価格表示時間)の範囲内で設定する必要があります。価格が動いていない時間に取引だけを許可することはできません。

② 日付指定の無視

datetime型を使用しますが、MQL5の仕様上、日付部分は無視されます。D'1970.01.01 09:00' と書いても D'2023.12.31 09:00' と書いても、システムは「午前9時」として認識します。

③ インデックスの順番

同じ曜日に複数のセッション(例:午前と午後)を作る場合、session_index は 0, 1, 2… と順番に指定する必要があります。いきなり index=1 から設定するとエラーになります。

④ 24時間をまたぐ設定

例えば「22:00〜翌日04:00」のような設定はできません。この場合は、当日の「22:00〜23:59:59」と、翌日の「00:00〜04:00」の2つのセッションに分けて登録する必要があります。

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

カスタムシンボルや独自のロジックを組み上げたEAが完成しても、それを動かす「環境」が適切でなければ、全ての努力は水の泡になります。自宅のPCや一般的な光回線で自動売買を行うことは、プロのクオンツの視点からは極めてリスクが高い行為です。

FXの世界では「1ミリ秒(0.001秒)」の遅延が、数ピップスの滑り(スリッページ)を引き起こし、月単位で見れば致命的な収益の悪化を招きます。また、自宅PC特有のOSアップデートによる再起動や、ネットワークの不安定さは、予期せぬエラーによる強制ロスカットを引き起こしかねません。プロレベルの約定スピードと24時間365日の安定稼働を実現するには、ブローカーのサーバーと同じデータセンター内、あるいは極めて物理的距離が近い場所に位置する「専用VPS」の導入が不可欠です。インフラを制する者がFXトレードを制すると言っても過言ではありません。

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

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

コメント

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