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

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

ObjectsTotal関数は、チャート上に存在するオブジェクト(水平線、トレンドライン、テキスト、ボタンなど)の総数を取得するための関数です。

実務開発において、この関数は単に「何個あるか」を数えるためだけではなく、主に「描画したオブジェクトの一括削除」や「特定の条件に合致するオブジェクトの探索」の起点として利用されます。

初心者が特につまずきやすいのは、「プログラムで描画したオブジェクトがチャートに残ってしまう」という問題です。EAやインジケーターをチャートから削除しても、コード内で適切にオブジェクトを管理(削除)していないと、古いラインが残り続け、視認性を損なうだけでなく、誤認によるトレードミスを誘発します。ObjectsTotalを使いこなすことは、クリーンで信頼性の高いシステムを構築するための第一歩です。

2. 構文と戻り値

ObjectsTotal関数の構文は以下の通りです。

int  ObjectsTotal(
   long  chart_id,           // チャート識別子
   int   sub_window=-1,      // サブウィンドウ番号
   int   type=-1             // オブジェクトの型
   );

パラメーターの解説

  1. chart_id: 対象とするチャートのIDを指定します。現在のチャートであれば 0 または ChartID() を指定します。
  2. sub_window: オブジェクトを探すウィンドウを指定します。
  3. -1: すべてのサブウィンドウが対象
  4. 0: メインウィンドウ(価格チャート)のみが対象
  5. type: 特定のオブジェクト型(例:水平線だけ)を数えたい場合に指定します。
  6. -1: すべてのオブジェクト型が対象
  7. OBJ_HLINE(水平線)や OBJ_LABEL(ラベル)などの定数を指定可能

戻り値

指定した条件に一致するオブジェクトの数を int 型で返します。

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

実務で最も頻繁に使用される「EAを終了する際に、そのEAが作成したオブジェクトだけをすべて削除する」という処理の例を紹介します。

//+------------------------------------------------------------------+
//| エキスパートアドバイザーの終了時に呼ばれる関数                      |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // チャート上の全オブジェクト数を取得
   int total = ObjectsTotal(0, -1, -1);

   // オブジェクトのインデックスは「総数 - 1」から 0 に向かってカウントダウンするのが鉄則
   // 理由:削除するとインデックス番号がずれるため
   for(int i = total - 1; i >= 0; i--)
   {
      string objName = ObjectName(0, i);

      // 特定の接頭辞(例: "MyEA_")で始まるオブジェクトのみを削除
      // これにより、ユーザーが手動で引いたラインを誤って消すのを防ぐ
      if(StringFind(objName, "MyEA_") == 0)
      {
         ObjectDelete(0, objName);
      }
   }

   Print("EAによる描画オブジェクトのクリーンアップが完了しました。");
}

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

ループの方向に注意(最大の落とし穴)

オブジェクトを削除する際に for(int i = 0; i < total; i++) のように昇順でループを回してはいけません。
オブジェクトを1つ削除するたびに、残りのオブジェクトのインデックス番号(整理番号)が一つずつ前に詰められます。そのため、昇順で処理すると削除し損ねるオブジェクトが発生し、配列外参照のようなバグの原因になります。必ず降順(大きい数字から 0 へ)でループを回してください。

chart_id の指定

複数のチャートで動作するツールを作る場合、0 を指定すると「コードが実行されている現在のチャート」のみが対象になります。他のチャートのオブジェクトを操作したい場合は、正しいチャートIDを取得して渡す必要があります。

計算負荷の考慮

OnTick(ティックが動くたび)の中で ObjectsTotal を何度も呼び出し、数千個のオブジェクトをループでチェックするような処理は、PCのCPU負荷を高め、動作を重くする原因になります。必要な時だけ呼び出す設計を心がけましょう。

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

アルゴリズムトレードにおいて、ロジックの正確さと同様に重要なのが「インフラ環境」です。どれほど ObjectsTotal を駆使して完璧な描画管理を行っても、注文を出す際のネットワーク遅延(レイテンシ)が大きければ、プロの世界では勝負になりません。自宅のPCから一般的なインターネット回線を通じて自動売買を行う場合、物理的な距離やプロバイダー経由の通信の揺らぎにより、ミリ秒単位での約定遅延が確実に発生します。

この遅延は、本来得られるはずだった利益を削る「スリッページ」を肥大化させ、バックテストの結果とリアルトレードの結果が乖離する最大の要因となります。FXトレードにおいて約定スピードを極限まで高め、安定した利益を追求するには、証券会社のサーバーに物理的に近いデータセンターに設置された、24時間稼働の「専用VPS」の活用が不可欠です。低遅延な環境を整えることは、手法を磨くことと同じ、あるいはそれ以上に重要な投資であることを忘れないでください。

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

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

コメント

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