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

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

MQL5における「グローバル変数(Terminal Global Variables)」は、特定のEA内だけで有効な変数ではなく、MetaTrader 5(MT5)ターミナル全体で共有される特殊な変数です。GlobalVariableGetはこの値を取得するための関数です。

実務開発において、この関数は主に以下の用途で活用されます。

  • 異なるチャート・EA間の通信: 例えば「通貨ペアAのEAがシグナルを出した時、通貨ペアBのEAも同時にエントリーさせる」といった相関トレードの制御。
  • リスク管理の統合: 複数のEAを稼働させている際、全体の合計含み損が一定を超えたら全EAの新規エントリーを停止させるための共有フラグ。
  • 外部ツール(スクリプト)からの指示: 手動で設定した「緊急停止フラグ」をEA側に読み込ませる。

初心者の方が陥りやすい罠は、「プログラムコード内で宣言するグローバルスコープの変数」と混同してしまうことです。GlobalVariableGetで扱う変数はMT5のメモリ(およびディスク)に保存されるため、MT5を再起動しても値が保持されるという特性があります。

2. 構文と戻り値

GlobalVariableGet関数の仕様は非常にシンプルですが、扱える型に制限がある点に注意が必要です。

構文

double GlobalVariableGet(
   string name      // グローバル変数名
);

パラメーター

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

戻り値

  • 指定した変数名の値を double型 で返します。
  • もし指定した名前の変数が存在しない場合、0 を返します。

【プロの視点】
この関数は「変数が存在しない場合」と「変数の値が実際に0である場合」の区別が戻り値だけではつきません。実務では GlobalVariableCheck() 関数を併用して、変数の存在を確認してから取得するのが定石です。

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

以下の例は、他のEAやスクリプトから設定された「トレード許可フラグ(TRADE_ALLOWED)」を確認し、エントリーを判断するシンプルなEAのロジックです。

//+------------------------------------------------------------------+
//|                                              GlobalVarSample.mq5 |
//+------------------------------------------------------------------+
#property strict

//--- グローバル変数の名前
input string GlobalVarName = "SYSTEM_TRADE_STOP";

void OnTick()
{
    // 1. まずグローバル変数が存在するかチェック
    if(GlobalVariableCheck(GlobalVarName))
    {
        // 2. 変数の値を取得(0なら停止、1なら許可とする運用想定)
        double stopFlag = GlobalVariableGet(GlobalVarName);

        if(stopFlag == 1.0)
        {
            Print("システム停止フラグが立っているため、エントリーをスキップします。");
            return;
        }
    }
    else
    {
        // 変数が存在しない場合のデフォルト処理
        // 初回起動時などはここにくる可能性がある
        Print("警告: グローバル変数が設定されていません。");
    }

    // --- ここにメインのエントリーロジックを記述 ---
    // 例: if(Signal) { Trade.Buy(...); }
}

このコードでは、GlobalVariableGet を使って外部からトレードの実行可否をコントロールしています。これにより、特定のEAを触ることなく、ターミナル全体の一括制御が可能になります。

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

  1. データ型は「double」固定
    グローバル変数は double 型(浮動小数点数)しか保持できません。整数(int)や日付(datetime)を保存したい場合は、一度 double にキャストして保存し、取得後に元の型へ戻す必要があります。
  2. 名称の打ち間違い(大文字・小文字の区別)
    グローバル変数名は大文字・小文字を区別しません。しかし、可読性のためにチーム内や自身の開発ルールで統一しておくことが重要です。
  3. 変数の生存期間
    グローバル変数は、最後にアクセスされてからデフォルトで4週間保持されます。プログラムが予期せず終了しても残るため、初期化処理(OnInitなど)で値をリセットするか、明示的に GlobalVariableDel で削除しない限り、古いデータが残ってしまうリスクがあります。
  4. 競合状態(レースコンディション)
    複数のEAが同時に一つのグローバル変数を書き換えようとすると、予期せぬ動作を招くことがあります。書き込みを行う際は GlobalVariableSet の戻り値を確認するなどのエラーハンドリングが必須です。

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

アルゴリズムトレードにおいて、GlobalVariableGet を使った高度なロジックを組んでも、それを実行するインフラが貧弱であればすべてが台無しになります。多くの初心者が「自宅のPCと光回線」で運用を開始しますが、これはプロの視点からは極めてリスクの高い行為です。家庭用回線はプロバイダー経由の複雑な経路を辿るため、ミリ秒単位の「ネットワーク遅延(レイテンシ)」が発生し、MT5上の表示価格と実際の約定価格に乖離(スリッページ)が生じます。

このコンマ数秒の遅れは、一見小さく見えても、累積すれば致命的な損失に繋がります。特にボラティリティが高い局面では、狙った価格から大きく外れて約定し、バックテスト通りのパフォーマンスを出すことは不可能です。極限まで約定スピードを高め、物理的な距離による遅延を最小限に抑えるためには、FX業者のサーバーに近いデータセンターに設置された「自動売買専用のVPS(仮想専用サーバー)」の導入が不可欠です。安定した電源、24時間の稼働保証、そして超低遅延なネットワーク環境こそが、クオンツエンジニアが最初に投資すべき最も重要なインフラと言えます。

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

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

コメント

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