mt5のObjectDeleteにはバグがあるのでしょうか? - ページ 3

 
Fernando Carreiro:
どのビルドを使用されましたか?最新ビルドでは「ObjectDelete()」関数に バグがある可能性があるようなので、「ObjectFind()」にも問題がある可能性がありますね。

MT5:ビルド1495(2016年12月09日)

 
honest_knave:

MT5: ビルド 1495 (2016年12月09日)

ビルド1491であなたのコードを実行したところ、同様の結果が得られました。

2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectFind took 20126 μs
2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectDelete took 247 μs
 
Fernando Carreiro:

あなたのコードをbuild 1491で実行したところ、同様の結果が得られました。

一貫して奇妙です。おそらく、良い説明があるのではないでしょうか...?
 
honest_knave:

これはバグというより、セマンティックなものかもしれません。

ObjectDeleteの目的は、「指定された名前のオブジェクトを削除する」ことです。

この関数を 実行した結果、チャート上に "Non-existing Object "というオブジェクトがまだ残っているのでしょうか?いいえ...では、これは成功なのでしょうか?

別の見方をすれば、ObjectDeleteは "Non-existing Object "という名前のオブジェクトを削除したか?いいえ...これは失敗でしょうか?

成功の基準は、結果なのでしょうか、それとも行動なのでしょうか?

おそらく、関数を 実行した後、その名前のオブジェクトがチャート上に残っていれば、falseが予想されるでしょう。そうでなければ、それは成功です。

おっしゃる通りかもしれませんが、MQL4からMQL 5に移行している私たちは、同じ結果か、少なくとも参照の戻り値に明確に書かれている結果を期待しています。

この最初の問題を通過して、ObjectMove関数をテストしてみましたが、やはりTRUEの結果が出ました!これは、オブジェクトが最終的に利用できないので、Trueが正しいという説明の域を超えています。

利用できないオブジェクトに対してObjectMoveを実行すると、falseが返されるはずです。

moveResult=ObjectMove(ChartID(), "not available trend line",1,time[4950],low[4980]);

Print(__LINE__,"-moveResult=",moveResult)を実行します。

2016.12.11 17:22:39.367 Far-Test-ChangeTrendLine (EURUSD,H1) 44-moveResult=true

 
Farzin Sadeghi:

こんにちは、私はMQL5でインジケータを書いているのですが、文字列名として何を書いてもObejectDeleteは真を返します!オブジェクトのない空のチャート上でもです!私はMQL5でインジケータを書いているのですが、文字列名として何を書いてもObejectDeleteは真を返します。


オブジェクト関数の 説明を読む

これは、指定されたチャートに関連するグラフィック・オブジェクトを操作するための関数群です。

グラフィック・オブジェクトのプロパティを定義する関数や、オブジェクトを作成したりチャートに沿って移動させるためのObjectCreate(),ObjectMove() 操作は、実際には チャートへのコマンド送信に使用さ れます。 これらの関数が正常に実行された場合、コマンドはチャートイベントの共通キューに含まれます。 グラフィカル・オブジェクトのプロパティの視覚的な変更は、チャート・イベントのキューを処理するときに実装されます。

このオブジェクトを削除する" コマンドが正常に受け入れられたことを意味します。コマンドの結果は、GetLastError()で制御できます。どのようなコードが返されるか、試してみてください。
 
Rashid Umarov:

オブジェクト関数の 説明を読む

これは、「このオブジェクトを削除する」というコマンドが正常に受理されたことを意味します。GetLastError()でコマンドの結果を制御することができます。どのようなコードが返されるか試してみてください。

私は、コードをこのように変更しました。

int ObjCount = ObjectsTotal(ChartID(),/*0=main subwindow*/0,/*all objectTypes*/-1).ResetLastError()関数で、オブジェクトを読み込む。

ResetLastError()を実行する。

bool deleteResult=ObjectDelete(ChartID(), "non existing object");

Print(__LINE__,"-",deleteResult," | ObjCount=",ObjCount," | LastError=",GetLastError());

以下はその結果です。

2016.12.12 12:38:43.373 Far-TestObjectDelete (EURUSD,H1) 38-true|ObjCount=0|LastError=0

ERR_SUCCESS

0

操作は正常に完了しました。


というように、そのオブジェクトにアクセスできなかったなどのエラーは返しませんが、MT4ではエラーを返します。

 
Farzin Sadeghi:

ERR_SUCCESS

0

操作は正常に終了しました。


というように、そのオブジェクトにアクセスできなかったなどのエラーは返さないが、MT4ではエラーを返す。

OKです。MQL5では非同期処理なので、このようなケースでエラーは発生しません。 そこで、2つの選択肢があります。

  • 削除する前に、オブジェクトが存在するかどうかを確認 する
  • オブジェクトが存在しなくても気にせず削除してみる。
 
Rashid Umarov:

OKです。MQL5ではこのような場合、エラーは発生しません。 つまり、2つの選択肢があります。

  • 削除する前に、オブジェクトが存在するかどうかを確認する。
  • オブジェクトが存在しなくても気にせず削除してみる。
この方法では、MQL5でObjectDeleteやObjectMoveの結果をチェック する意味がありません。 MQL4で使われていた方法に戻した方が良いのではないでしょうか?
 
Rashid Umarov:

OKです。私が調べたところ、MQL5ではこのような場合、これらの操作は非同期なので、エラーは発生しません。 そこで、2つの選択肢があります。

  • 削除する前に、オブジェクトが存在するかどうかを確認する
  • オブジェクトが存在しない場合でも、気にせず削除してみてください。

この場合、どうして false を返すのでしょうか?

ObjectDelete()のドキュメントには以下のように書かれて います。

戻り値

削除が成功 した場合はtrueを、失敗した場合はfalseを返します。

ドキュメントには、「コマンドが受け入れられたらtrue」とは書かれていないので、もっと明確にすべきです。

オブジェクトが削除されたことを確認したいのなら、deleteコマンドの後に オブジェクトが存在するかどうかをチェックしなければならない。

Documentation on MQL5: Object Functions / ObjectDelete
Documentation on MQL5: Object Functions / ObjectDelete
  • www.mql5.com
Object Functions / ObjectDelete - Reference on algorithmic/automated trading language for MetaTrader 5
 
Alain Verleyen:

この場合、どうして false を返すのでしょうか?

ObjectDelete() のドキュメントには、以下のように書かれています。

ドキュメントには、「コマンドを受け付けたらtrue」とは書かれていません。

このように修正される予定です。

戻り値

コマンドがチャートイベントの共通キューに 入れられたらtrueを 返し、そうでなければfalseを返す
理由: