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 // 終了時刻を受け取る変数
);
パラメーターの解説
- name:
"USDJPY"や_Symbolを指定します。 - day_of_week:
MONDAYからSUNDAYまでの列挙値を指定します。 - session_index: 0から始まるセッション番号です。1日に複数のセッション(昼休みがある場合など)がある銘柄に対応するため、通常は0から順に確認します。
- 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. 使用上の注意点とよくあるエラー
- インデックスのループに注意
CFD銘柄などは、前場と後場のようにセッションが分かれていることがあります。必ずwhile文などでsession_indexをインクリメントしながら、全てのセッションをチェックするようにしましょう。 - 日付情報の無視
fromとtoに格納される日付(1970/01/01)は意味を持ちません。比較する際は、TimeCurrentで取得した構造体MqlDateTimeの時刻コンポーネントのみを抽出して比較するか、現在の時刻を1970年基準の秒数に変換して計算する必要があります。 - 取引と見積(Quote)の違い
SymbolInfoSessionQuoteという似た関数がありますが、こちらは「価格配信時間」を取得するものです。自動売買において重要なのは、注文が受け付けられる「取引時間」であるため、必ずSymbolInfoSessionTradeを使用してください。 - ブローカーによる設定ミス
稀にブローカー側の設定ミスで、正確なセッション情報が取得できないケースがあります。取得に失敗した(falseが返った)場合の例外処理は必ず記述しておきましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境」です。どれほど完璧なエントリー条件を SymbolInfoSessionTrade で制御していても、自宅のPCや一般的な光回線で運用している場合、物理的な距離に起因するネットワーク遅延(レイテンシ)は避けられません。FX市場はミリ秒単位で価格が変動しており、ごくわずかな遅延が「スリッページ」を引き起こし、バックテスト通りの利益を削り取ってしまいます。
プロのクオンツエンジニアが運用するEAは、ブローカーのサーバーと同じデータセンター内、あるいは極めて近い場所に設置された「専用のVPS(仮想専用サーバー)」で稼働しています。100ミリ秒の遅延が1ヶ月でどれほどの損失を生むかを計算すれば、24時間安定稼働し、低レイテンシを保証するVPSの導入が、単なるコストではなく「必須の投資」であることが理解できるはずです。システムトレードで真に勝ち残るためには、コードの最適化だけでなく、インフラ環境を極限までプロ仕様に整えることが不可欠です。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント