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

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

MQL5のGlobalVariableCheckは、MetaTrader 5(MT5)ターミナル全体で共有される「グローバル変数(ターミナル・グローバル変数)」が、指定した名前で存在するかどうかをチェックするための関数です。

ここで注意が必要なのは、コードの冒頭(関数の外側)で宣言する「グローバルスコープの変数」とは全くの別物であるという点です。ターミナル・グローバル変数は、一度作成されると、EAを停止したりMT5を再起動したりしても、最後にアクセスしてから4週間はHDD(またはSSD)に保持され続けます。

実務での活用シーン

実務開発において、この関数は主に以下の用途で「守護神」として機能します。

  1. 多重起動の防止: 複数のチャートで同じEAを動かす際、特定のロジックが重複して注文を出さないよう、共有フラグが存在するか確認する。
  2. 障害復旧(リカバリー): EAが予期せぬエラーでクラッシュしたり、PCが再起動したりした際、前回のトレード状態が保存されているかを確認し、安全に取引を再開する。
  3. EA間の通信: Aという通貨ペアのEAがエントリーした際にフラグを立て、Bという通貨ペアのEAがGlobalVariableCheckでそのフラグを検知して相関トレードを行う。

初心者が特につまずきやすいのは、「存在チェックをせずに値を取得しようとする」ことです。存在しない変数を参照してもエラーにはなりませんが、予期せぬ動作を防ぐために、まずはこの関数で「その変数が今この瞬間に存在するか」を確認するのがクオンツ流の堅牢な書き方です。


2. 構文と戻り値

GlobalVariableCheck関数の仕様は非常にシンプルです。

bool GlobalVariableCheck(
   string name      // グローバル変数の名前
);

パラメーター

  • name: 検索したいターミナル・グローバル変数の名前を文字列で指定します。最大文字数は63文字です。

戻り値

  • true: 指定した名前の変数が既に存在する場合。
  • false: 指定した名前の変数が存在しない場合。

この関数自体は「値」を取得するものではなく、あくまで「箱が存在するかどうか」の有無だけを返します。


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

以下は、EAの初期化時(OnInit)に、以前のセッションで保存された「取引停止フラグ」が存在するかを確認し、リスク管理を行う実用的なコード例です。

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

// 変数名の定義(重複を避けるためEA名やマジックナンバーを含めると安全)
const string GV_STOP_NAME = "EA_Trade_Stop_Flag";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. ターミナル・グローバル変数が存在するかチェック
    if(GlobalVariableCheck(GV_STOP_NAME))
    {
        Print("警告: 前回のセッションから取引停止フラグを引き継ぎました。");

        // 必要に応じて値を取得(0以外なら停止など)
        double stopValue = GlobalVariableGet(GV_STOP_NAME);
        if(stopValue > 0)
        {
            Print("取引停止フラグが有効なため、新規注文を抑制します。");
        }
    }
    else
    {
        Print("新規セッションを開始します。取引フラグは存在しません。");

        // 初回のフラグ作成(例:初期値0で作成)
        GlobalVariableSet(GV_STOP_NAME, 0);
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // トレード前に再度チェック(外部ツールや他のEAからフラグが立てられていないか)
    if(GlobalVariableCheck(GV_STOP_NAME))
    {
        if(GlobalVariableGet(GV_STOP_NAME) > 0)
        {
            // フラグが立っている場合は何もしない
            return;
        }
    }

    // ここにエントリーロジックを記述
}

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

  1. 大文字・小文字の区別はない:
    ターミナル・グローバル変数の名前は、内部的に大文字として処理されます。GlobalVariableCheck("MyVar")GlobalVariableCheck("MYVAR") は同じ変数を指します。

  2. 有効期限(4週間の罠):
    変数は最後にアクセス(作成、変更、読み取り)されてから4週間後に自動的に削除されます。長期にわたって保持したいデータの場合、定期的にアクセスするか、ファイル操作による保存を検討してください。

  3. 「値の更新」と「存在チェック」の順序:
    GlobalVariableSetを実行すると、変数が存在しない場合は新規作成され、存在する場合は値が更新されます。したがって、単に値を設定したいだけであれば、事前にGlobalVariableCheckを呼ぶ必要はありません。「存在する場合のみ特殊な処理をしたい」というケースに限定して使うのがスマートです。

  4. 名前の最大長:
    変数の名前は63文字以内である必要があります。これを超えると正しく認識されません。


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

アルゴリズムトレードにおいて、GlobalVariableCheckを活用した堅牢なロジックを構築することは非常に重要ですが、それ以上に重要なのが「実行環境」です。自宅のPCや一般的なWi-Fi環境でEAを稼働させることは、プロの視点からは極めてリスクが高いと言わざるを得ません。

FXの相場はミリ秒単位で変動しています。自宅PCからの注文は、物理的な距離やネットワークの経由地(ホップ数)が多いことにより、サーバーに届くまでに致命的な遅延(レイテンシ)が発生します。この遅延は「スリッページ」を誘発し、バックテストでは利益が出ていたロジックを瞬時に「負けトレード」へと変えてしまいます。

どれほど優れたコードを書いても、約定スピードが遅ければ、有利な価格でのエントリーは不可能です。極限まで有利にトレードを進めるためには、ブローカーのサーバーに物理的に近いデータセンターに設置された、自動売買専用のVPS(仮想専用サーバー)を利用することが必須条件です。安定した電源、24時間の稼働保証、そして最短のネットワーク経路を確保することこそが、システムトレーダーが最初に投資すべき「勝つためのインフラ」なのです。

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

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

コメント

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