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

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

MQL5でEA(エキスパートアドバイザー)やインジケーターを開発していると、チャート上に矢印(OBJ_ARROW)やテキスト(OBJ_LABEL)、水平線(OBJ_HLINE)などを描画する機会が多くあります。ObjectsDeleteAllは、それらのオブジェクトを一括で削除するための非常に強力な関数です。

実務レベルの開発において、この関数は主に以下の2つのシーンで活用されます。

  1. 終了時のクリーンアップ: EAをチャートから削除した際、描画したオブジェクトが残ってしまうとチャートが汚れてしまいます。OnDeinitイベント内で呼び出すことで、後片付けを自動化します。
  2. 描画のリフレッシュ: ティックが動くたびに計算し直すインジケーターなどで、古い描画を一度全て消してから新しい状態を描画し直す際に使用します。

初心者が特につまずきやすいポイントは、「意図しないものまで消してしまう」ことです。この関数は指定したウィンドウ内のオブジェクトを文字通り「全て」消し去るため、裁量トレードで引いた重要なラインまで消してしまわないよう、パラメーターの制御を正しく理解する必要があります。


2. 構文と戻り値

ObjectsDeleteAll関数の基本構文は以下の通りです。

int ObjectsDeleteAll(
   long  chart_id,           // チャートID(0は現在のチャート)
   int   sub_window = -1,    // サブウィンドウのインデックス(-1は全ウィンドウ)
   int   type       = -1     // オブジェクトの型(-1は全タイプ)
);

パラメーターの解説

  • chart_id: 操作対象のチャートを指定します。自身のチャートであれば 0 を指定するのが一般的です。
  • sub_window: どのウィンドウを対象にするかです。メインウィンドウ(価格チャート)は 0 です。-1 を指定すると、メインウィンドウと全てのサブウィンドウ(RSIやMACDなどが表示されている枠)のオブジェクトが削除されます。
  • type: 削除したいオブジェクトの種類を指定します。例えば OBJ_LABEL を指定すればラベルだけを消し、トレンドラインなどは残すことができます。-1 は全種類が対象です。

戻り値

  • 削除に成功したオブジェクトの個数int 型で返します。

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

以下は、EAの終了時に「そのEAが描画した可能性のある特定のオブジェクト」のみを削除する、実戦的なコード例です。

//+------------------------------------------------------------------+
//| エキスパート終了時に呼び出される関数                                     |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 例1: 現在のチャートの全ウィンドウから、全てのオブジェクトを削除する
   int deletedCount = ObjectsDeleteAll(0, -1, -1);
   Print("削除されたオブジェクト数: ", deletedCount);

   // 例2: メインウィンドウ(0)から「水平線(OBJ_HLINE)」だけを削除する
   // 裁量で引いたラインを保護したい場合は、typeを指定するのが安全です
   ObjectsDeleteAll(0, 0, OBJ_HLINE);

   // オブジェクト操作後はチャートの強制再描画を行うのがベストプラクティス
   ChartRedraw(0);
}

//+------------------------------------------------------------------+
//| 特定の条件で描画をリセットする関数(自作)                                |
//+------------------------------------------------------------------+
void ResetChartDrawings()
{
   // サブウィンドウ1にある「テキストラベル」だけを全て消去する
   // インジケーター開発などで特定のエリアだけリセットしたい場合に有効
   ObjectsDeleteAll(0, 1, OBJ_LABEL);

   ChartRedraw(0);
}

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

① 他のインジケーターの描画まで消してしまう

ObjectsDeleteAll(0, -1, -1) を実行すると、ユーザーが手動で引いたラインや、他のインジケーターが表示している情報まで全て消えてしまいます。特定のEAが作ったオブジェクトだけを消したい場合は、ObjectsDeleteAll ではなく、オブジェクト名に共通の接頭辞(例: “MyEA_Line_1″)をつけて ObjectsDeleteByPrefix を使うのがプロの定石です。

② 削除後に画面が更新されない

オブジェクトを削除した直後は、MT5の画面上では消えていないように見えることがあります(描画の遅延)。これを防ぐために、削除処理の直後には必ず ChartRedraw(0); を呼び出して、チャートを強制的に再描画させるようにしましょう。

③ 戻り値を無視しない

「なぜかオブジェクトが消えない」というバグに遭遇した際は、戻り値を確認してください。もし 0 が返ってきているなら、指定した sub_window の番号や type が間違っている可能性が高いです。


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

アルゴリズムトレードにおいて、プログラムの論理的正確さと同じくらい重要なのが「実行環境」です。ObjectsDeleteAll を使って視覚的に完璧なツールを作成しても、それを動かすインフラが貧弱であれば、実弾トレードでは勝てません。

日本の自宅PCから家庭用回線を経由して注文を出す場合、物理的な距離に起因するネットワーク遅延(レイテンシ)が避けられません。FXのサーバーは多くの場合、世界的な金融データセンター(ニューヨークのNY4やロンドンのLD4など)に設置されています。自宅からの注文がこのサーバーに届くまでのわずかコンマ数秒の間に価格は変動し、スリッページや約定拒否が発生して、バックテストの結果とはかけ離れた「致命的な損失」を生む原因となります。

プロのクオンツエンジニアが極限まで約定スピードを追求する場合、証券会社のサーバーと同じデータセンター内に設置された「専用VPS」の使用はもはや前提条件です。ネットワーク遅延を1ミリ秒でも短縮することが、高頻度な取引やシビアなスキャルピングEAにおいて、収益曲線を右肩上がりに保つための最も確実な技術的投資となります。

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

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

コメント

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