【MQL5】ObjectsDeleteAllの注意点

投資関連
スポンサーリンク
スポンサーリンク

ObjectsDeleteAll関数とは

オリジナルのインジケーターでチャートに水平ラインや垂直ライン等のオブジェクトを表示させるのはよくある事かと思いますが、それらオブジェクトを一括で削除してくれるのが「ObjectsDeleteAll」関数になります。ただ、一見便利そうに見えるこの関数も気を付けないと思わぬ失敗を引き起こしてしまいますので、今回はその注意点について記載したいと思います。

ObjectDeleteとの違い

似たような関数に「ObjectDelete」があります。この関数もオブジェクトを削除する関数ですが、オブジェクト名を指定するため1しか削除できません。そのため、複数のオブジェクトを削除する場合はその個数分の記述が必要となります。対して「ObjectsDeleteAll」は一括削除が行えます。

例えばあるウインドウの全てのオブジェクトを削除する場合は
ObjectsDeleteAll(0,-1,-1);
の1行で済みます。

全ての水平線オブジェクトを削除する場合は
ObjectsDeleteAll(0,-1,OBJ_HLINE);
で済みます。
「OBJ_HLINE」はパラメータの一つですので、これを「OBJ_VLINE」とすれば全ての垂直線オブジェクトを一括削除できます。

上記のように、あらゆるオブジェクトもしくは条件に当てはまるオブジェクトを一括削除できますので、プログラムの修正により新たなオブジェクトを追加した場合でも、削除に関しては特に気にする必要はありません。「ObjectDelete」だと毎回削除処理の修正も必要となり、抜け/漏れの原因となるため、場合によりますが「ObjectsDeleteAll」は秀逸な関数と言えます。

注意点(失敗談)

私の失敗談になりますが、自作インジケーターで多くの垂直ラインを描画しており、手動削除が大変という理由からDeInit関数にObjectsDeleteAllを記述し、インジケーター削除時にオブジェクトを一括削除するようにしていました。また、チャートには水平ラインやトレンドラインを手動で追加しながら分析を行っていました。同一通貨ペアで異なるタイムフレームのチャートを表示させながら分析していたので、タイムフレームを変更する事は無かったのですが、たまたま変更してしまった時に手動追加したオブジェクトが全部消えてしまい、一瞬パニックになってしまいました。

そう、タイムフレームを変更するとDeInitが実行されてしまうのです。DeInit関数にはObjectsDeleteAll関数を記述していたので、全てのオブジェクトが削除されてしまったのです。

実は下記の記事はこれがきっかけで調べました。


【MQL5】OnInit と DeInit が実行されるタイミング
はじめに 私個人の備忘録的な要素が強いですが、参考情報として記載しておきます。 それぞれの関数が実行されるタイミング OnInitはインジケーターやEAの初回読み込み時に実行される関数で、DeInitはインジケーターやEAを終了させる時に実...

それでもObjectsDeleteAllは便利

ObjectsDeleteAllにはオブジェクト名のプレフィックスをパラメータとして設定できます。これにより、例えば自作インジケーターで作成するオブジェクト名には「ORIGINAL_」のプレフィックスを付けるルールとすれば、以下の記述で余計なオブジェクトを削除せずに自作インジケーターのオブジェクトのみ一括削除できます。
ObjectsDeleteAll(0,”ORIGINAL_”,-1,-1);

そんな訳で、私は3つ程度のオブジェクトであれば「ObjectDelete」を使い、それ以上の場合は「ObjectsDeleteAll」で一括削除するようにしています。

以上になりますが、今回の記事がどなたかのお役に立てば幸いです。

投資関連
スポンサーリンク
スポンサーリンク
カッテラをフォローする
スポンサーリンク
タイトルとURLをコピーしました