1. GlobalVariableTemp関数の概要と実務での活用法
MQL5における「グローバル変数(Terminal Global Variables)」は、異なるチャートで動作している複数のEAやスクリプト、インジケーター間でデータを共有するための強力な共有メモリ領域です。
通常、GlobalVariableSet関数などで作成された変数は、MT5を閉じてもハードディスクに保存され、次回起動時にも値が保持されます。しかし、実務開発においては「ターミナルを再起動した際にはリセットしたい一時的なフラグ」が必要になる場面が多々あります。
ここで活躍するのが GlobalVariableTemp 関数です。この関数を使用すると、「MT5が起動している間だけメモリ上に存在し、終了時には自動的に破棄される一時的なグローバル変数」を作成できます。
実務での主な活用例:
– 多通貨ペアの同時エントリ制限(セマフォ): 複数の通貨ペアでEAを動かしている際、1つのEAが注文処理中のときは他のEAに待機を命じる「排他制御」のフラグとして利用。
– 計算負荷の分散: 特定の重い計算を行うEAが「現在計算中」というフラグを立て、他のEAがその結果を待つような仕組み。
– ゴミデータの防止: 永続的に保存する必要のないステータス情報をディスクに書き込まないことで、ストレージの摩耗を防ぎ、ターミナル終了時のクリーンアップ作業を自動化する。
初心者の方は、全てのデータをファイルや通常のグローバル変数に保存しがちですが、再起動時に古いデータが残っていることで「意図しないエントリー」を招くバグに直面することがあります。GlobalVariableTempを適切に使うことで、こうした再起動時の事故を未然に防ぐことができます。
2. 構文と戻り値
GlobalVariableTemp 関数の使い方は非常にシンプルです。
構文
bool GlobalVariableTemp(
string name // 変数名
);
パラメーター
- name: 作成したい一時的なグローバル変数の名前を指定します。
戻り値
- true: 変数の作成に成功した場合、または既に同じ名前の変数が存在している場合。
- false: 作成に失敗した場合。エラー詳細は
GetLastError()関数で取得できます。
ポイント:
この関数は「変数を作成する」ためのものです。値を代入するには、この関数を呼び出した後に通常の GlobalVariableSet を使用します。また、既に通常の(永続的な)グローバル変数として存在している名前を指定した場合、その変数は「一時的」な属性に上書きされ、MT5終了時に保存されなくなります。
3. 具体的な使い方・実践サンプルコード
以下は、複数のEAが同時に注文を出さないようにするための「エントリー・ロック機構」の例です。
//+------------------------------------------------------------------+
//| エントリー制限用のロックを取得する関数 |
//+------------------------------------------------------------------+
bool AcquireTradeLock()
{
string lockName = "Global_Trade_Lock";
// 1. 一時的なグローバル変数を作成(存在しない場合のみ作成される)
// MT5を閉じれば消えるため、不慮のクラッシュでもロックが残り続けない
if(!GlobalVariableTemp(lockName))
{
Print("グローバル変数の作成に失敗: ", GetLastError());
return false;
}
// 2. ロックの状態を確認
// 値が 1.0 の場合は、他のEAが使用中とみなす
if(GlobalVariableCheck(lockName) && GlobalVariableGet(lockName) == 1.0)
{
return false; // ロック中なので失敗を返す
}
// 3. ロックをかける(値を1.0に設定)
GlobalVariableSet(lockName, 1.0);
return true;
}
//+------------------------------------------------------------------+
//| エントリー制限用のロックを解放する関数 |
//+------------------------------------------------------------------+
void ReleaseTradeLock()
{
string lockName = "Global_Trade_Lock";
if(GlobalVariableCheck(lockName))
{
// 値を 0.0 にして解放
GlobalVariableSet(lockName, 0.0);
}
}
// EAのオンティックイベント内での使用例
void OnTick()
{
// 何らかのエントリー条件
bool entryCondition = (/* ロジック */ true);
if(entryCondition)
{
// ロック取得を試みる
if(AcquireTradeLock())
{
Print("ロック取得成功。注文処理を開始します。");
// --- ここに OrderSend 等の注文処理を記述 ---
// 処理が終わったらロックを解放
ReleaseTradeLock();
}
else
{
Print("現在、他のEAが注文処理中のため待機します。");
}
}
}
4. 使用上の注意点とよくあるエラー
-
データ型の制限
MQL5のグローバル変数は、すべてdouble型として扱われます。文字列や構造体を直接保存することはできません。整数を保存したい場合も、内部的には double として処理されるため、比較時には誤差を考慮するか、適切なキャストが必要です。 -
名称の衝突
グローバル変数はターミナル全体で共有されます。他の開発者が作ったEAと同じ変数名(例:「Lock」など)を使ってしまうと、予期せぬ干渉が起こります。必ずEA名_通貨ペア_Lockのように、ユニークなプレフィックスを付けるのがプロの作法です。 -
バックテストでの挙動
グローバル変数はバックテスト環境でも動作しますが、バックテスト終了時にクリアされます。また、ストラテジーテスターでは「複数のEAを同時に動かすテスト」が標準では難しいため、GlobalVariableTempを使った複数EA間の排他制御ロジックのデモは実機(デモ口座)での検証がメインとなります。 -
「削除」ではない
GlobalVariableTempは変数を一時的にするだけで、即座に値を消去するものではありません。プログラムの途中で完全に消去したい場合はGlobalVariableDelを使用してください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、GlobalVariableTemp を活用した効率的なコードを書くことは重要ですが、それ以上に重要なのが「実行環境」です。どれだけプログラムを高速化しても、自宅のPCから一般的なインターネット回線経由で発注している限り、物理的な距離に起因する数ミリ秒から数百ミリ秒の「ネットワーク遅延(レイテンシ)」は避けられません。
FX市場はミリ秒単位で価格が変動します。自宅PCでの運用は、急激な相場変動時にスリッページを増大させ、バックテストの結果とはかけ離れた「致命的な損失」を生む原因となります。極限まで約定スピードを高め、優位性を確保するためには、取引サーバーの至近距離に位置する「専用のVPS(仮想専用サーバー)」での運用が不可欠です。低遅延な環境こそが、クオンツエンジニアにとっての生命線であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント