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

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

MQL5におけるGlobalVariableTimeは、クライアント端末のグローバル変数(端末全体で共有される変数)に最後にアクセス(更新または参照)した時刻を取得するための関数です。

実務開発において、グローバル変数は「複数のEA間でのデータ共有」や「EAを再起動しても保持したい設定値」の保存によく利用されます。しかし、単に値を取得するだけでは、そのデータが「1秒前に更新された最新のもの」なのか「3日前の古いもの」なのかを判別できません。

ここでGlobalVariableTimeが活躍します。例えば、以下のようなシナリオで非常に有効です。

  • データ鮮度の確認: 通貨強弱データなどを一つのEAで計算しグローバル変数に書き込んでいる場合、他方のEAでそのデータを使う前に「直近1分以内に更新されているか」を確認し、古いデータによる誤発注を防ぐ。
  • 多重起動の制御: EAが最後に生存確認(ハートビート)を書き込んだ時刻をチェックし、一定時間更新がなければ異常終了とみなしてリカバリ処理を行う。

初心者は「変数の値」だけに注目しがちですが、中級者以上のクオンツエンジニアは「そのデータがいつ生成されたか(タイムスタンプ)」をセットで管理し、システムの堅牢性を高めます。

2. 構文と戻り値

GlobalVariableTime関数の構文は非常にシンプルです。

datetime GlobalVariableTime(
   string  name      // グローバル変数名
);

パラメーター

  • name: 取得したいグローバル変数の名前を文字列で指定します。

戻り値

  • 指定したグローバル変数に最後にアクセスした時刻を datetime 型で返します。
  • もし指定した名前のグローバル変数が存在しない場合は、0 を返します。

※「アクセス」には、GlobalVariableSet による値の書き込みだけでなく、GlobalVariableGet による読み込みも含まれる点に注意してください。

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

以下のサンプルコードは、特定のグローバル変数が「一定時間(ここでは60秒)以内に更新されているか」をチェックし、データの信頼性を判定する実用的な例です。

//+------------------------------------------------------------------+
//| データの鮮度をチェックする関数                                     |
//+------------------------------------------------------------------+
bool IsDataFresh(string varName, int maxSeconds)
{
    // グローバル変数の最終アクセス時刻を取得
    datetime lastTime = GlobalVariableTime(varName);

    // 変数が存在しない場合
    if(lastTime == 0)
    {
        Print("エラー: グローバル変数 ", varName, " が存在しません。");
        return false;
    }

    // 現在時刻と最終アクセス時刻の差分を計算
    long secondsPassed = TimeCurrent() - lastTime;

    // 指定した秒数以内に更新されていればtrueを返す
    if(secondsPassed <= maxSeconds)
    {
        Print("データは正常です。経過秒数: ", secondsPassed);
        return true;
    }
    else
    {
        Print("警告: データが古すぎます。最終更新から ", secondsPassed, " 秒経過しています。");
        return false;
    }
}

//+------------------------------------------------------------------+
//| EAのオンチックイベント                                            |
//+------------------------------------------------------------------+
void OnTick()
{
    string myGlobalVar = "Signal_Strength";

    // 60秒以内に更新されたデータかどうかを判定して処理を行う
    if(IsDataFresh(myGlobalVar, 60))
    {
        double signalValue = GlobalVariableGet(myGlobalVar);
        // この値を使ってトレードロジックを継続
    }
    else
    {
        // データの信頼性が低いため、取引を控えるなどの安全策をとる
    }
}

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

開発時に陥りやすい注意点を整理します。

  1. 「グローバル変数」の混同に注意
    MQL5には、プログラム内で宣言する「グローバルスコープの変数」と、端末に保存される「グローバル変数(Terminal Global Variables)」の2種類があります。GlobalVariableTimeが対象とするのは、F3キーで表示される「端末のグローバル変数」のみです。

  2. 有効期限による自動消去
    端末のグローバル変数は、最後にアクセスしてから4週間が経過すると自動的に削除されます。長期間稼働させない環境で、設定値を永続的に保持したい場合は、ファイル保存(FileWrite)など別の手段を検討する必要があります。

  3. アクセス時刻の定義
    前述の通り、GlobalVariableGet(読み取り)だけでもアクセス時刻は更新されます。「誰かが値を書き換えた時刻」を知りたい場合は、値の更新時に別の「タイムスタンプ専用のグローバル変数」をセットする設計の方が確実です。

  4. 大文字・小文字の区別
    グローバル変数名は、内部的に大文字として処理されますが、コードの可読性のために一貫した命名規則(プレフィックスを付けるなど)を持つことを推奨します。

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

アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境」です。どれほど精密なコードを書いても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、物理的な距離とネットワーク遅延(レイテンシ)という壁に突き当たります。為替相場はミリ秒単位で価格が変動しており、ごく僅かな遅延がスリッページを引き起こし、期待した利益を削り取ってしまいます。

特に、指標発表時やボラティリティが高い局面では、ネットワークの不安定さが原因で「約定拒否」や「想定外の損失」を招くリスクが飛躍的に高まります。プロのクオンツエンジニアが極限まで約定スピードを追求するのは、それが期待値に直結することを知っているからです。本格的な運用を目指すのであれば、ブローカーのサーバーに近いロケーションに設置された「自動売買専用のVPS」を利用することが、技術的な必須条件と言っても過言ではありません。安定した電源、24時間の稼働保証、そして超低遅延のネットワーク環境を備えたVPSこそが、EAの真の性能を引き出し、あなたの資産を守るための最強のインフラとなります。

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

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

コメント

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