オブジェクトを全て削除したい!

全オブジェクトの削除

オブジェクトを削除するにはObjectDelete関数を使用しますが、MQL4のプログラムではチャート上の全てのオブジェクトを削除する関数がObjectDelete関数とは別に用意されています。全てのオブジェクトをループで処理してObjectDelete関数で削除しても良いのですが、開発工数の削減や不具合の防止、動作確認作業の軽減という観点で考えると、公式に用意されている関数がある場合はそちらを使用した方が最終的なMQL4プログラムの品質向上に繋がる事になります。

全オブジェクトを削除するObjectsDeleteAll関数

全てのオブジェクトを削除するには、MQL4で提供されているObjectsDeleteAll関数を使用します。

int ObjectsDeleteAll(
    long chart_id,              // chart ID
    int  sub_window = EMPTY,    // window index
    int  object_type = EMPTY    // object type
);

引用元:ObjectsDeleteAll – MQL4 Reference

引数

chart_id

第一引数のchart_idには、削除するオブジェクトが表示されているチャートのIDを指定します。MQL4プログラムが設定されたチャートの場合はChartID関数でチャートIDを取得できるためChartID関数の戻り値、または「0」を指定します。それ以外のチャートの場合は削除対象のオブジェクトが表示されているチャートIDを取得して指定します。

sub_window

第二引数のsub_windowには、削除対象のウィンドウを指定します。ローソク足が表示されているメインウィンドウからオブジェクトを削除する場合は「0」、サブウィンドウのオブジェクトを削除する場合はサブウィンドウの番号を指定します。この引数は省略可能となり、省略した場合はメインウィンドウやサブウィンドウに関わらず、チャート上の全てのオブジェクトが削除対象となります。

object_type

第三引数のobject_typeには、削除対象となるオブジェクトの種類を定数で指定します。省略した場合はオブジェクトの種類に関わらず、全てのオブジェクトが削除対象となります。オブジェクトの種類と定数については以下のリンク先をご参照ください。

オブジェクトを作りたい! – MQL4逆引きリファレンス
https://www.mql4-encyclopedia.com/objectcreate/

戻り値

全てのオブジェクトの削除に成功した場合はtrue、失敗した場合はfalseが返却されます。

使用例

1.チャート上の全てのオブジェクトを削除

ObjectsDeleteAll(ChartID());

全てのウィンドウに表示された全てのオブジェクトを削除します。

2.メインウィンドウ上の全ての売りサインを削除

ObjectsDeleteAll(ChartID(), 0, OBJ_ARROW_SELL);

第二引数に「0(メインウィンドウ)」、第三引数に「OBJ_ARROW_SELL(売りサイン)」と指定する事で、メインウィンドウ上にある全ての売りサインを削除します。

3.チャート上の全てのトレンドラインを削除

ObjectsDeleteAll(ChartID(), EMPTY, OBJ_TREND);

チャート上の全てのトレンドライン、という条件を指定するには第二引数を省略した上で第三引数に「OBJ_TREND(トレンドライン)」を指定する必要があります。この場合の第二引数は「EMPTY(-1)」を指定するこで第二引数を省略扱い、つまりチャート上の全てのオブジェクトを対象とする、という指定が可能となります。

同じ接頭辞のオブジェクトだけを削除

ObjectsDeleteAll関数には引数が異なるパターンが用意されており、接頭辞(prefix)を指定して該当する名前のオブジェクトだけを削除することも可能です。そのため一部のオブジェクトを複数同時に削除することがあるMQL4プログラムの場合は、それらのオブジェクトに同じ接頭辞を付与しておくことでObjectsDeleteAll関数が使える事になります。接頭辞を指定してObjectsDeleteAll関数を使うパターンについては以下のリンク先もご参照ください。

ObjectsDeleteAll – MQL4 Reference
https://docs.mql4.com/objects/objectsdeleteall

オブジェクトの削除タイミング

ObjectsDeleteAll関数によるオブジェクト削除のタイミングは、オブジェクトの作成や削除と同じく一連の処理が終了するか、もしくは処理中にChartRefresh関数を実行したタイミングとなります。詳細については以下のリンク先をご参照ください。

オブジェクトを作りたい! – MQL4逆引きリファレンス
https://www.mql4-encyclopedia.com/objectcreate/

まとめ

全てのオブジェクトを削除するにはObjectsDeleteAll関数を使用する
第一引数は削除するオブジェクトが表示されているチャートのID
第二引数は削除するオブジェクトが表示されているウィンドウ番号(省略可能)
第二引数は削除するオブジェクトの種類(省略可能)
接頭辞を指定して該当するオブジェクトだけを一括で削除することも可能
オブジェクトをすぐに削除するにはChartRefresh関数を使用する

参考URL

ObjectsDeleteAll – MQL4 Reference
https://docs.mql4.com/objects/objectsdeleteall