voidOnStart() { string name = "MysteryObject"; ulong begin;
begin = GetMicrosecondCount(); for(int i=0; i<1000; i++) int result = ObjectFind(0,name); printf("ObjectFind took %i μs", GetMicrosecondCount()-begin);
begin = GetMicrosecondCount(); for(int i=0; i<1000; i++) bool result = ObjectDelete(0,name); printf("ObjectDelete took %i μs", GetMicrosecondCount()-begin); }
これはバグというより、セマンティックなものかもしれません。
ObjectDeleteの目的は、「指定された名前のオブジェクトを削除する」ことです。
この関数を 実行した結果、チャート上に "Non-existing Object "というオブジェクトがまだ残っているのでしょうか?いいえ...では、これは成功なのでしょうか?
別の見方をすれば、ObjectDeleteは"Non-existing Object "という名前のオブジェクトを削除したか?いいえ...これは失敗でしょうか?
成功の基準は、結果なのでしょうか、それとも行動なのでしょうか?
おそらく、関数を 実行した後、その名前のオブジェクトがチャート上に残っていれば、falseが期待されるでしょう。そうでなければ、成功です。
はい、書こうと思っています。確認を待ってました。
サービスデスクで報告しようとしたところ、「Error saving data」と言って、私のメッセージを受け付けてくれません。
別の場所、PC、ブラウザ(私のVPSを 使用)からも試してみましたが、同じでした。
あなたの方では報告できましたか?
これはバグというより、セマンティックなものかもしれません。
ObjectDeleteの目的は、「指定された名前のオブジェクトを削除する」ことです。
この関数を 実行した結果、チャート上に "Non-existing Object "というオブジェクトがまだ残っているのでしょうか?いいえ...では、これは成功なのでしょうか?
別の見方をすれば、ObjectDeleteは "Non-existing Object "という名前のオブジェクトを削除したか?いいえ...これは失敗でしょうか?
成功の基準は、結果なのでしょうか、それとも行動なのでしょうか?
おそらく、関数を 実行した後、その名前のオブジェクトがチャート上に残っていれば、falseが予想されるでしょう。そうでなければ、成功です。
もしそうなら、MQL4とMQL5の機能的な 違いは、ドキュメントに報告されていませんし、説明もされていないことになりますね。
そうですね。ただ、「彼ら」がどちらを正しいと言うのかが気になるところです :-)
個人的には、trueを返す方が良いと思います。そうでないと、オブジェクトが存在するかどうかを確認するために余分なコードを追加する必要がありますし、4202エラーで我慢する必要があります。
そうですね。ただ、「彼ら」がどちらを正しいと言うのかが気になるところです :-)
個人的には、trueを返す方が良いと思います。そうしないと、オブジェクトが存在することを確認するために余分なコードを追加する必要がありますし、4202エラーで我慢する必要があります。
私の意見では、どちらのバージョンが「正しい」かに関係なく、どちらの場合も削除する前にオブジェクトの存在を確認 する必要があります。
EDIT: しかし、MQL4と同じように動作するように「修正」してほしいですね。そうでないと、両バージョンでコンパイルするコードに条件付きコンパイルを配置しなければならないような機能の 違いがまた出てきてしまいます。
私の意見では、どちらのバージョンが「正しい」かにかかわらず、どちらの場合も削除前にオブジェクトの存在を確認する必要があります。
面白い!消したいのに、なぜ存在を確認 する必要があるのでしょうか?
存在しないオブジェクトが存在するかどうかをチェックするのにかかる時間は、MT4で存在しないオブジェクトを削除しようとするのとほぼ同等です(MT5でざっと調べたところ、かなり遅いことが分かりました)ので、チェックを実行しても目に見えるパフォーマンス上の利点は見当たりません。しかし、コードの行数は増えます。
EDIT: しかし、MQL4と同じように動作するように「修正」してほしいですね。そうでないと、両バージョンでコンパイルするコードに条件付きコンパイルを入れなければならないという、また別の機能 差が生じてしまいます。
面白い!消したいのに、なぜ存在を確認する必要があるのでしょうか?
存在しないオブジェクトが存在するかどうかをチェックするのにかかる時間は、MT4で存在しないオブジェクトを削除しようとするのとほぼ同等です(MT5でざっと調べたところ、かなり遅いことが分かりました)ので、チェックを実行しても目に見えるパフォーマンス上の利点は見当たりません。しかし、コードの行数は増えます。
ユーザーが誤って削除してしまい、再作成する必要があるかどうかを検出したい場合。これは一般的な「ハウスキーピング」としての意味であり、一度だけ削除する機能の ためのものではありません。
しかし、そうですね、"OnDeinit()"機能については、最初にテストする必要はないですね。
ユーザーが誤って削除し、再作成する必要があるかどうかを検出したい場合。これは一般的な「家計簿」としての意味であり、一度だけ削除する機能の ためのものではありません。
しかし、そうですね、"OnDeinit() "機能については、最初にテストする必要はないでしょう。
ああなるほど。
余談ですが
void OnStart()
{
string name = "MysteryObject";
ulong begin;
begin = GetMicrosecondCount();
for(int i=0; i<1000; i++) int result = ObjectFind(0,name);
printf("ObjectFind took %i μs", GetMicrosecondCount()-begin);
begin = GetMicrosecondCount();
for(int i=0; i<1000; i++) bool result = ObjectDelete(0,name);
printf("ObjectDelete took %i μs", GetMicrosecondCount()-begin);
}
MT4で動かしてみると というのは、あまり意味がないからです。
MT5で実行中, 50倍以上遅いです。
どなたか、その理由をご存知の方はいらっしゃいますか?
余談ですが
MT4で実行する, あまり入っていません。
MT5で動作させる, 50倍以上遅いです。
どなたか、その理由をご存知の方はいらっしゃいますか?