1. GlobalVariableCheck関数の概要と実務での活用法
MQL5のGlobalVariableCheckは、MetaTrader 5(MT5)ターミナル全体で共有される「グローバル変数(ターミナル・グローバル変数)」が、指定した名前で存在するかどうかをチェックするための関数です。
ここで注意が必要なのは、コードの冒頭(関数の外側)で宣言する「グローバルスコープの変数」とは全くの別物であるという点です。ターミナル・グローバル変数は、一度作成されると、EAを停止したりMT5を再起動したりしても、最後にアクセスしてから4週間はHDD(またはSSD)に保持され続けます。
実務での活用シーン
実務開発において、この関数は主に以下の用途で「守護神」として機能します。
- 多重起動の防止: 複数のチャートで同じEAを動かす際、特定のロジックが重複して注文を出さないよう、共有フラグが存在するか確認する。
- 障害復旧(リカバリー): EAが予期せぬエラーでクラッシュしたり、PCが再起動したりした際、前回のトレード状態が保存されているかを確認し、安全に取引を再開する。
- 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. 使用上の注意点とよくあるエラー
-
大文字・小文字の区別はない:
ターミナル・グローバル変数の名前は、内部的に大文字として処理されます。GlobalVariableCheck("MyVar")とGlobalVariableCheck("MYVAR")は同じ変数を指します。 -
有効期限(4週間の罠):
変数は最後にアクセス(作成、変更、読み取り)されてから4週間後に自動的に削除されます。長期にわたって保持したいデータの場合、定期的にアクセスするか、ファイル操作による保存を検討してください。 -
「値の更新」と「存在チェック」の順序:
GlobalVariableSetを実行すると、変数が存在しない場合は新規作成され、存在する場合は値が更新されます。したがって、単に値を設定したいだけであれば、事前にGlobalVariableCheckを呼ぶ必要はありません。「存在する場合のみ特殊な処理をしたい」というケースに限定して使うのがスマートです。 -
名前の最大長:
変数の名前は63文字以内である必要があります。これを超えると正しく認識されません。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、GlobalVariableCheckを活用した堅牢なロジックを構築することは非常に重要ですが、それ以上に重要なのが「実行環境」です。自宅のPCや一般的なWi-Fi環境でEAを稼働させることは、プロの視点からは極めてリスクが高いと言わざるを得ません。
FXの相場はミリ秒単位で変動しています。自宅PCからの注文は、物理的な距離やネットワークの経由地(ホップ数)が多いことにより、サーバーに届くまでに致命的な遅延(レイテンシ)が発生します。この遅延は「スリッページ」を誘発し、バックテストでは利益が出ていたロジックを瞬時に「負けトレード」へと変えてしまいます。
どれほど優れたコードを書いても、約定スピードが遅ければ、有利な価格でのエントリーは不可能です。極限まで有利にトレードを進めるためには、ブローカーのサーバーに物理的に近いデータセンターに設置された、自動売買専用のVPS(仮想専用サーバー)を利用することが必須条件です。安定した電源、24時間の稼働保証、そして最短のネットワーク経路を確保することこそが、システムトレーダーが最初に投資すべき「勝つためのインフラ」なのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント