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

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          // 最後にアクセスされた日時による制限
);

パラメーター

  1. prefix_name
  2. 削除したい変数名の先頭文字列を指定します。
  3. NULL または空の文字列を指定した場合、名前に関わらず全てのグローバル変数が削除対象となります。
  4. limit_data
  5. 指定した日時よりも古い(最終アクセス日時がこれより前)変数を削除します。
  6. 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. 使用上の注意点とよくあるエラー

  1. 予期せぬ全削除の回避
    もっとも多いミスは、GlobalVariablesDeleteAll() と引数なしで実行してしまうことです。これにより、他のEAの稼働状況や、ライセンス認証用のデータ、手動で設定したフラグなどが全て消滅します。必ずプロジェクトごとに固有のPrefix(接頭辞)を設計し、それを指定して呼び出す習慣をつけてください。

  2. 「limit_data」の勘違い
    第2引数の limit_data は、「指定した時間よりも新しいものを消す」のではなく「指定した時間よりも古いものを消す」という仕様です。古いログデータなどを掃除する際には便利ですが、使いどころを間違えると「消したい最新データが残り、古いデータが消える」という結果になります。

  3. 反映タイミング
    グローバル変数はディスクに保存されますが、頻繁に削除と作成を繰り返すと、ターミナルの動作に負荷がかかる場合があります。ミリ秒単位のループ内などで無闇に呼び出すのは避けましょう。


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

アルゴリズムトレードにおいて、ロジックの正確性と同じくらい重要なのが「実行環境」です。どれほど高度なMQL5コードを記述し、グローバル変数で緻密な状態管理を行ったとしても、自宅PCなどの一般的なインターネット環境で稼働させている場合、致命的なリスクに晒されています。

FX市場はミリ秒単位で価格が変動します。自宅PCから海外にある証券会社のサーバーへ注文を出す際、ネットワークのホップ数(経由地)が多いほど遅延(レイテンシ)が発生し、MT5上の表示価格と実際の約定価格に「滑り(スリッページ)」が生じます。この数ミリ秒の遅れが、本来利益になるはずのトレードを損失に変え、バックテストの結果を根底から破壊します。プロのクオンツ環境において、24時間安定した電源供給と、ブローカーのサーバーに物理的・ネットワーク的に近接した低レイテンシな専用VPS(仮想専用サーバー)の導入は、もはやオプションではなく「必須のインフラ」と言えます。

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

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

コメント

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