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

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点です。

  1. 夏時間(サマータイム)の考慮
    多くの海外業者は、3月と11月にタイムゾーンが切り替わります。TimeTradeServer が返す値もこれに従って1時間前後します。「日本時間の午前9時」をターゲットにする場合、サーバー時間では夏と冬で数値が変わるため、可変的に対応できるロジックにするのが理想的です。

  2. バックテストでの挙動
    ストラテジーテスターで実行する場合、TimeTradeServer はヒストリカルデータの時刻を模倣します。実際のPCの時計とは連動しません。

  3. 型変換の忘れ
    datetime 型は内部的には「秒数」を示す整数です。if(TimeTradeServer() == 10) のような書き方をしても、「10時」を判定することはできません。必ず上述のサンプルコードのように MqlDateTime 構造体を使うか、時刻計算のロジックを挟む必要があります。

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

シストレ開発において、プログラムのロジックと同じくらい勝敗を分けるのが「実行環境」です。どれほど優れたエントリーロジックを組み込んでも、自宅のデスクトップPCから一般的な光回線で注文を出している限り、プロのクオンツや機関投資家には勝てません。FXの価格はミリ秒(1000分の1秒)単位で変動しており、自宅PCから取引サーバーまでのネットワーク遅延(レイテンシ)は、注文価格の滑り(スリッページ)を引き起こし、期待期待値を確実に削り取ります。

約定スピードを極限まで高め、ロジック通りのパフォーマンスを発揮させるためには、取引サーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間安定稼働させることはもちろん、ネットワークの物理的な距離を短縮することで、コンマ数秒の遅延による致命的な損失を回避できます。本気で収益を狙うエンジニアにとって、VPSはコストではなく、勝つための必須装備と言えるでしょう。

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

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

コメント

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