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型(浮動小数点数)しか保存できません。datetimeやintを保存したい場合は、キャスト(型変換)して保存し、読み取る際にもとに戻す必要があります。
③ インデックスの変動
GlobalVariablesTotalを使ってループ処理を行っている最中に、別のEAが変数を追加したり削除したりすると、インデックス(順番)がずれて意図しない動作をすることがあります。厳密な制御が必要な場合は、GlobalVariableTemp(一時的な変数)の使用や、名前による直接指定を検討してください。
④ 4週間の生存期間
グローバル変数は、最後にアクセス(読み書き)されてから4週間が経過すると自動的に削除されます。長期にわたる統計データを保持したい場合は、ファイル出力(FileOpen等)やデータベース(SQLite)の利用が適切です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックと同じくらい重要なのが「実行環境」です。GlobalVariablesTotalを活用して高度なデータ同期を行っても、プログラムが動作する物理的な場所に欠陥があれば、その優位性は一瞬で消失します。
多くの初心者は自宅のPCや一般的な光回線でEAを稼働させますが、これはプロの視点から見ると非常に危険な行為です。自宅のネットワークは、プロバイダーによる揺らぎ(ジッター)や、ブローカーのサーバーとの物理的距離による「レイテンシ(遅延)」を抱えています。わずか数十ミリ秒の遅延が、滑り(スリッページ)を引き起こし、バックテスト通りの利益を削り取ってしまうのです。
極限まで約定スピードを高め、不慮の停電や通信障害を回避するためには、ブローカーのデータセンターに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」の導入が不可欠です。24時間365日、低遅延で安定した実行環境を確保することは、もはやオプションではなく、勝つための「インフラ」であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント