1. TimeTradeServer関数の概要と実務での活用法
TimeTradeServerは、「取引サーバーの現在時刻」を取得するための関数です。FXのシステムトレード(EA開発)において、時間はエントリー判断や強制決済のロジックに直結する極めて重要な要素です。
多くの初心者が陥る罠として、自分のパソコンの時刻(TimeLocal)を基準にプログラムを組んでしまうことが挙げられます。しかし、FX業者のチャートは「GMT+2(冬)/ +3(夏)」などの独自タイムゾーンで動いています。日本時間の深夜に動くEAを作ったつもりが、サーバー時間とのズレのせいで「指標発表の真っ只中にエントリーしてしまった」という失敗は後を絶ちません。
実務では、主に以下のようなシーンで活用します。
– 特定時間帯の取引制限: 「日本時間の早朝(スプレッド拡大時)はトレードしない」といった制御。
– 週末の強制クローズ: 金曜日の市場閉場間際にポジションを決済する。
– サーバー時間ベースの計算: ろうそく足の確定までの残り時間を算出する。
この関数を使いこなすことが、堅牢な自動売買システムへの第一歩となります。
2. 構文と戻り値
TimeTradeServer関数の仕様は非常にシンプルです。
構文
datetime TimeTradeServer();
パラメーター
なし。
戻り値
取引サーバーの現在時刻を datetime 型(1970年1月1日からの経過秒数)で返します。
補足
似た関数に TimeCurrent() がありますが、TimeCurrent() は「最後に受信したティックの時刻」を返すのに対し、TimeTradeServer() は「計算された現在のサーバー時刻」を返します。週末などティックが動いていない時でも、正確なサーバー時間を知りたい場合は TimeTradeServer() を使用するのが正解です。
3. 具体的な使い方・実践サンプルコード
以下は、特定の時間帯(例:サーバー時間10時〜20時)のみ取引を許可し、それ以外の時間はエントリーを制限する実用的なEAのスケルトンコードです。
//+------------------------------------------------------------------+
//| TimeTradeServer_Ex.mq5|
//| Copyright 2023, Quant Developer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int StartHour = 10; // 取引開始時間 (サーバー時間)
input int EndHour = 20; // 取引終了時間 (サーバー時間)
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 1. サーバーの現在時刻を取得
datetime serverTime = TimeTradeServer();
// 2. 時刻構造体に変換して「時」や「分」を取り出せるようにする
MqlDateTime dt;
TimeToStruct(serverTime, dt);
// 3. 現在の「時」をチェックしてログに出力
Print("現在のサーバー時刻: ", dt.hour, ":", dt.min);
// 4. 取引時間内かどうかの判定ロジック
if(dt.hour >= StartHour && dt.hour < EndHour)
{
// ここにエントリーロジックを記述
// Print("取引時間内です。ロジックをスキャンします...");
}
else
{
// 取引時間外の処理
// Print("取引時間外のため、エントリーを制限しています。");
}
}
このコードでは、TimeTradeServer で取得した値を TimeToStruct 関数で分解することで、人間が理解しやすい「時(hour)」や「分(min)」として扱っています。
4. 使用上の注意点とよくあるエラー
開発時に注意すべき点は以下の3点です。
-
夏時間(サマータイム)の考慮
多くの海外業者は、3月と11月にタイムゾーンが切り替わります。TimeTradeServerが返す値もこれに従って1時間前後します。「日本時間の午前9時」をターゲットにする場合、サーバー時間では夏と冬で数値が変わるため、可変的に対応できるロジックにするのが理想的です。 -
バックテストでの挙動
ストラテジーテスターで実行する場合、TimeTradeServerはヒストリカルデータの時刻を模倣します。実際のPCの時計とは連動しません。 -
型変換の忘れ
datetime型は内部的には「秒数」を示す整数です。if(TimeTradeServer() == 10)のような書き方をしても、「10時」を判定することはできません。必ず上述のサンプルコードのようにMqlDateTime構造体を使うか、時刻計算のロジックを挟む必要があります。
5. 【重要】自動売買における約定スピードと環境の罠
シストレ開発において、プログラムのロジックと同じくらい勝敗を分けるのが「実行環境」です。どれほど優れたエントリーロジックを組み込んでも、自宅のデスクトップPCから一般的な光回線で注文を出している限り、プロのクオンツや機関投資家には勝てません。FXの価格はミリ秒(1000分の1秒)単位で変動しており、自宅PCから取引サーバーまでのネットワーク遅延(レイテンシ)は、注文価格の滑り(スリッページ)を引き起こし、期待期待値を確実に削り取ります。
約定スピードを極限まで高め、ロジック通りのパフォーマンスを発揮させるためには、取引サーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間安定稼働させることはもちろん、ネットワークの物理的な距離を短縮することで、コンマ数秒の遅延による致命的な損失を回避できます。本気で収益を狙うエンジニアにとって、VPSはコストではなく、勝つための必須装備と言えるでしょう。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント