1. ObjectsTotal関数の概要と実務での活用法
ObjectsTotal関数は、チャート上に存在するオブジェクト(水平線、トレンドライン、テキスト、ボタンなど)の総数を取得するための関数です。
実務開発において、この関数は単に「何個あるか」を数えるためだけではなく、主に「描画したオブジェクトの一括削除」や「特定の条件に合致するオブジェクトの探索」の起点として利用されます。
初心者が特につまずきやすいのは、「プログラムで描画したオブジェクトがチャートに残ってしまう」という問題です。EAやインジケーターをチャートから削除しても、コード内で適切にオブジェクトを管理(削除)していないと、古いラインが残り続け、視認性を損なうだけでなく、誤認によるトレードミスを誘発します。ObjectsTotalを使いこなすことは、クリーンで信頼性の高いシステムを構築するための第一歩です。
2. 構文と戻り値
ObjectsTotal関数の構文は以下の通りです。
int ObjectsTotal(
long chart_id, // チャート識別子
int sub_window=-1, // サブウィンドウ番号
int type=-1 // オブジェクトの型
);
パラメーターの解説
- chart_id: 対象とするチャートのIDを指定します。現在のチャートであれば
0またはChartID()を指定します。 - sub_window: オブジェクトを探すウィンドウを指定します。
-1: すべてのサブウィンドウが対象0: メインウィンドウ(価格チャート)のみが対象- type: 特定のオブジェクト型(例:水平線だけ)を数えたい場合に指定します。
-1: すべてのオブジェクト型が対象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を使わないと、このロジックは再現できません。

コメント