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

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

MQL5のGlobalVariablesTotalは、MT5(MetaTrader 5)のターミナル全体で共有される「ターミナル・グローバル変数」の総数を取得するための関数です。

ここで注意が必要なのは、プログラムの冒頭(スコープ外)で宣言する「グローバル変数」とは全く別物であるという点です。GlobalVariablesTotalが扱う変数は、一度作成すればEAを停止させたり、MT5を再起動したりしてもメモリ上(およびディスク上)に保持され、異なるチャートで稼働している複数のEA間でデータを共有するためにも利用されます。

実務での活用シーン

実務開発において、この関数は主に以下の用途で活用されます。

  • 変数の全削除(クリーンアップ): 稼働終了時や初期化時に、不要になったターミナル・グローバル変数を一括で削除する。
  • データの走査: 現在どのような共有データが保存されているかを一覧表示、または特定のプレフィックス(接頭辞)を持つ変数だけを探し出す。
  • 複数EAの同期管理: 複数のEAが共通の情報を参照している場合、現在の変数総数を確認して、データの整合性をチェックする。

初心者が特につまずきやすいのは、「自分のEAで作った変数以外もカウントされる」という点です。他のEAやインジケーターが作成した変数もすべて含まれるため、個別に操作する場合はループ処理と名前の照合が必須となります。


2. 構文と戻り値

GlobalVariablesTotal関数の仕様は非常にシンプルです。パラメーター(引数)は存在しません。

int  GlobalVariablesTotal();

戻り値

  • : int
  • 内容: クライアントターミナルに現在保存されているグローバル変数の総数を返します。

この戻り値を利用して、for文などのループ処理を回し、各変数の名前や値を取得するのが一般的な実装パターンです。


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

以下のサンプルコードは、現在ターミナルに存在するすべてのグローバル変数を取得し、その「変数名」と「値」をエキスパートログに出力するスクリプトです。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // 1. ターミナル・グローバル変数の総数を取得
   int total = GlobalVariablesTotal();

   PrintFormat("現在のグローバル変数総数: %d件", total);

   // 2. インデックスを使って全ての変数を走査
   for(int i = 0; i < total; i++)
   {
      // インデックスから変数名を取得
      string varName = GlobalVariableName(i);

      // 変数名から値を取得
      if(GlobalVariableCheck(varName))
      {
         double varValue = GlobalVariableGet(varName);
         PrintFormat("Index [%d] | 名前: %s | 値: %.2f", i, varName, varValue);
      }
   }

   // 3. 実践的なクリーンアップ例(特定のプレフィックスを持つ変数を全て削除する場合)
   // ※逆順でループするのが定石(削除によってインデックスがズレるのを防ぐため)
   string prefix = "MyEA_";
   for(int i = total - 1; i >= 0; i--)
   {
      string name = GlobalVariableName(i);
      if(StringFind(name, prefix) == 0) // 名前が "MyEA_" で始まる場合
      {
         GlobalVariableDel(name);
         Print("削除されました: ", name);
      }
   }
}

このコードでは、GlobalVariablesTotalで取得した個数を上限としてループを回しています。特に「逆順でのループによる削除処理」は、実務でよく使われるテクニックです。


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

① ローカルのグローバル変数との混同

前述の通り、コードの先頭で int g_count; のように定義した変数(グローバルスコープ変数)は、GlobalVariablesTotalではカウントされません。あくまで「ツール」メニューの「グローバル変数(F3)」で確認できるものだけが対象です。

② データ型の制限

ターミナル・グローバル変数は、double型(浮動小数点数)しか保存できませんdatetimeintを保存したい場合は、キャスト(型変換)して保存し、読み取る際にもとに戻す必要があります。

③ インデックスの変動

GlobalVariablesTotalを使ってループ処理を行っている最中に、別のEAが変数を追加したり削除したりすると、インデックス(順番)がずれて意図しない動作をすることがあります。厳密な制御が必要な場合は、GlobalVariableTemp(一時的な変数)の使用や、名前による直接指定を検討してください。

④ 4週間の生存期間

グローバル変数は、最後にアクセス(読み書き)されてから4週間が経過すると自動的に削除されます。長期にわたる統計データを保持したい場合は、ファイル出力(FileOpen等)やデータベース(SQLite)の利用が適切です。


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

アルゴリズムトレードにおいて、ロジックと同じくらい重要なのが「実行環境」です。GlobalVariablesTotalを活用して高度なデータ同期を行っても、プログラムが動作する物理的な場所に欠陥があれば、その優位性は一瞬で消失します。

多くの初心者は自宅のPCや一般的な光回線でEAを稼働させますが、これはプロの視点から見ると非常に危険な行為です。自宅のネットワークは、プロバイダーによる揺らぎ(ジッター)や、ブローカーのサーバーとの物理的距離による「レイテンシ(遅延)」を抱えています。わずか数十ミリ秒の遅延が、滑り(スリッページ)を引き起こし、バックテスト通りの利益を削り取ってしまうのです。

極限まで約定スピードを高め、不慮の停電や通信障害を回避するためには、ブローカーのデータセンターに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」の導入が不可欠です。24時間365日、低遅延で安定した実行環境を確保することは、もはやオプションではなく、勝つための「インフラ」であることを忘れないでください。

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

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

コメント

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