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

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

MQL5のGlobalVariableSetは、MetaTrader 5(MT5)ターミナル全体で共有される「ターミナル・グローバル変数」を作成、または更新するための関数です。

初心者の方がよく混同しがちなのが、コードの冒頭(関数外)で宣言する通常の「グローバル変数」です。通常の変数はEAをチャートから外したりターミナルを閉じたりすると消えてしまいますが、GlobalVariableSetで作成した変数は、MT5自体が終了してもハードディスクに保存され、次回起動時にも値を保持し続けるという強力な特性を持っています。

実務での活用シーン

  • 複数EA間の連携: EA「A」で計算したトレンドの方向を、EA「B」で読み取ってエントリーの判断材料にする。
  • リカバリー処理: EAが不意のクラッシュやPCの再起動で停止しても、停止直前の累積利益や特定のステータスを保持しておく。
  • 一括停止スイッチ: 1つの変数を監視し、その値が「1」になったら稼働中の全EAにトレードを停止させる「緊急停止ボタン」の実装。

実務レベルでは、単一のEA内で完結しない「システム全体の状態管理」に不可欠な関数です。

2. 構文と戻り値

GlobalVariableSet関数の構文は非常にシンプルです。

datetime GlobalVariableSet(
   string name,    // 変数名
   double value    // 設定する値
);

パラメーター

  • name: 保存したい変数の名前を文字列で指定します。最大63文字までです。
  • value: 保存したい数値を指定します。

戻り値

  • 成功した場合、変数の最終設定時刻(datetime型)を返します。
  • 失敗した場合は 0 を返します。エラーの詳細を確認するには GetLastError() を呼び出します。

注意点: 保存できるデータ型は double 型のみです。整数(int)や真偽値(bool)を保存したい場合は、キャスト(型変換)して保存し、読み取る際に元の型に戻す必要があります。

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

以下は、EAが最後に取引した際の状態を保存し、他のEAやインジケーターからも参照できるようにする実践的なコード例です。

//+------------------------------------------------------------------+
//| タイマーイベントでのグローバル変数更新例                             |
//+------------------------------------------------------------------+
void OnTimer()
{
   string varName = "MyEA_TotalProfit"; // 変数名
   double currentProfit = AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE);

   // グローバル変数を設定(存在しない場合は新規作成、存在する場合は更新)
   datetime lastUpdateTime = GlobalVariableSet(varName, currentProfit);

   if(lastUpdateTime > 0)
   {
      // 成功した場合
      PrintFormat("グローバル変数 '%s' を更新しました。値: %.2f, 更新時刻: %s", 
                  varName, currentProfit, TimeToString(lastUpdateTime));
   }
   else
   {
      // 失敗した場合
      Print("グローバル変数の設定に失敗しました。エラーコード: ", GetLastError());
   }
}

//+------------------------------------------------------------------+
//| 初期化時にタイマーを設定                                           |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(10); // 10秒ごとに更新
   return(INIT_SUCCEEDED);
}

このコードを実行すると、MT5の「ツール」メニュー > 「グローバル変数(F3キー)」から、実際に値がリアルタイムで更新されている様子を確認できます。

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

開発時にハマりやすいポイントをいくつか挙げます。

  1. データ型の制約:
    前述の通り double 型しか扱えません。文字列(string)を保存したい場合は、別途「GlobalVariableSetString」のような関数は存在しないため、ファイル操作関数(FileOpenなど)を検討する必要があります。
  2. 変数の生存期間:
    ターミナル・グローバル変数は、最後にアクセス(読み書き)してから4週間経過すると自動的に削除されます。長期稼働するEAでは問題になりにくいですが、長期間停止させる場合は注意が必要です。
  3. 書き込み頻度によるパフォーマンス低下:
    GlobalVariableSet は内部的にディスクへの書き込みを行うため、OnTick 内で毎秒何十回も実行すると、PCのパフォーマンスに悪影響を与える可能性があります。必要な時だけ、あるいはタイマー関数(OnTimer)を利用して適切な頻度で更新するのがベストプラクティスです。
  4. 名前の衝突:
    他の開発者が作ったEAと同じ変数名を使ってしまうと、値が上書きされてシステムが暴走する危険があります。変数名には「EA名 + マジックナンバー」など、ユニークな接頭辞を付けることを推奨します。

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

アルゴリズムトレードにおいて、GlobalVariableSet を使ったロジックの構築と同じか、それ以上に重要なのが「実行環境」です。多くの初心者が自宅のPCや一般的な光回線でEAを運用しようとしますが、これはプロの視点から見ると極めてリスクの高い行為です。

FXの自動売買では、ミリ秒(1000分の1秒)単位の遅延が、本来得られるはずだった利益を「スリッページ」という形で奪い去ります。自宅PCからの注文は、物理的な距離によるネットワーク遅延(レイテンシ)が発生し、プロバイダーの混雑状況にも左右されます。相場急変時に注文を出しても、サーバーに届く頃には価格が数ピップス動いてしまい、結果として「バックテストでは勝てるのにリアルトレードでは勝てない」という致命的な損失を生む原因となります。約定スピードを極限まで高め、24時間365日の安定稼働を実現するには、取引サーバーに物理的に近いデータセンターに設置された、自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。

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

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

コメント

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