1. GlobalVariablesDeleteAll関数の概要と実務での活用法
MQL5における「グローバル変数(Global Variables of the terminal)」は、MT5ターミナル全体で共有されるデータ保持領域です。これは、特定のEA内だけで有効な変数とは異なり、MT5を再起動しても値が保持され、異なるチャートで動いているEA同士でデータをやり取りする際にも重宝します。
GlobalVariablesDeleteAll関数は、このターミナル内に保存されたグローバル変数を一括で削除するための関数です。
実務での活用シーン:
FXのシステムトレード開発において、この関数は主に「クリーンアップ(掃除)」の目的で使用されます。例えば、EAが異常終了した後に残ってしまった古いフラグの削除や、週明けに前週の計算用データをリセットする場合などです。
初心者が陥りやすい罠として、「引数を指定せずにこの関数を呼び出すと、他のEAが使用している大事な変数まで全て消去してしまう」という点があります。実務では特定の接頭辞(Prefix)を指定して、自分のEAに関連するものだけを安全に消去する運用が必須となります。
2. 構文と戻り値
GlobalVariablesDeleteAll関数の構文は以下の通りです。
int GlobalVariablesDeleteAll(
string prefix_name=NULL, // 削除対象とする接頭辞(前方一致)
datetime limit_data=0 // 最後にアクセスされた日時による制限
);
パラメーター
- prefix_name
- 削除したい変数名の先頭文字列を指定します。
NULLまたは空の文字列を指定した場合、名前に関わらず全てのグローバル変数が削除対象となります。- limit_data
- 指定した日時よりも古い(最終アクセス日時がこれより前)変数を削除します。
0を指定した場合、日時は無視して全ての対象変数を削除します。
戻り値
- 実際に削除された変数の個数が
int型で返されます。
3. 具体的な使い方・実践サンプルコード
以下のコードは、特定のEAが管理しているグローバル変数を、EAの終了時(OnDeinit)に一括削除する実用的なテンプレートです。
//+------------------------------------------------------------------+
//| GVar_Cleanup_EA.mq5 |
//| Copyright 2023, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// EAを識別するためのユニークな接頭辞
input string TargetPrefix = "EA_GOLD_01_";
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 初期化時にテスト用の変数を作成してみる
GlobalVariableSet(TargetPrefix + "LastTradeTime", TimeCurrent());
GlobalVariableSet(TargetPrefix + "TradeCount", 5);
Print("初期設定完了:グローバル変数を作成しました。");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 引数にPrefixを指定することで、このEAが作成した変数だけを削除する
// 他のEA(例えば EA_USDJPY_... など)の変数は影響を受けない
int deletedCount = GlobalVariablesDeleteAll(TargetPrefix);
PrintFormat("%d 個のグローバル変数を削除しました。終了理由コード: %d", deletedCount, reason);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// メインロジックをここに記述
}
4. 使用上の注意点とよくあるエラー
-
予期せぬ全削除の回避
もっとも多いミスは、GlobalVariablesDeleteAll()と引数なしで実行してしまうことです。これにより、他のEAの稼働状況や、ライセンス認証用のデータ、手動で設定したフラグなどが全て消滅します。必ずプロジェクトごとに固有のPrefix(接頭辞)を設計し、それを指定して呼び出す習慣をつけてください。 -
「limit_data」の勘違い
第2引数のlimit_dataは、「指定した時間よりも新しいものを消す」のではなく「指定した時間よりも古いものを消す」という仕様です。古いログデータなどを掃除する際には便利ですが、使いどころを間違えると「消したい最新データが残り、古いデータが消える」という結果になります。 -
反映タイミング
グローバル変数はディスクに保存されますが、頻繁に削除と作成を繰り返すと、ターミナルの動作に負荷がかかる場合があります。ミリ秒単位のループ内などで無闇に呼び出すのは避けましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確性と同じくらい重要なのが「実行環境」です。どれほど高度なMQL5コードを記述し、グローバル変数で緻密な状態管理を行ったとしても、自宅PCなどの一般的なインターネット環境で稼働させている場合、致命的なリスクに晒されています。
FX市場はミリ秒単位で価格が変動します。自宅PCから海外にある証券会社のサーバーへ注文を出す際、ネットワークのホップ数(経由地)が多いほど遅延(レイテンシ)が発生し、MT5上の表示価格と実際の約定価格に「滑り(スリッページ)」が生じます。この数ミリ秒の遅れが、本来利益になるはずのトレードを損失に変え、バックテストの結果を根底から破壊します。プロのクオンツ環境において、24時間安定した電源供給と、ブローカーのサーバーに物理的・ネットワーク的に近接した低レイテンシな専用VPS(仮想専用サーバー)の導入は、もはやオプションではなく「必須のインフラ」と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント