MT版アーカイブ。 - ページ 4

 
Roman:

その中で、チェックはできないのでしょうか?

残念ながら、このチェックでは何も出ませんでしたが...。

 
Roman:

IsStopped()を使った例を出すことで、最初の部分に答えようとしていただけなのです。
事前に処理を完了させる必要がある場合もあれば、今回のように急を要する場合もあります。
この関数IsStopped() の説明をドキュメントで読むと、何かヒントがあるかもしれません。
しかし、あなたにはそれが別の方向から見えるようです。もしそうなら、可能な限りの推測で申し訳ありません。
しかし、彼らは可能な提案で言うように、そして問題を解決します。
誰も彼のコードのすべてのロジックを知らないので、明確な解決策は、誰にも言わないだろうし、おそらくそれを掘り下げることはありません。

ローマン、またしても最後まで引用していませんね。そして、数あるハイライトの中から、それを取り上げていただきました。

まあいいや、強制シャットダウンが開始されたとしよう。そして、この終了イベントを最後まで実行させ、計算の複雑さが3秒を超えるようにする必要があるんだ。また、プログラムの終了を防ぎ、最後まで実行させるにはどうしたらよいのでしょうか。まさにそれが問題なのです。終了の仕方ではなく、間違って発動した終了をどう防ぐか、という話でした。あるいは、阻止するのではなく、ある時点まで、特にイベント処理が完了するまで延期すること。

 
Сергей Таболин:

ここで、オプションの確認です。このようなメッセージで終了しました。

行き止まりだ...。

そこで提案されたオプションは

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

は全く同じように動作します。そして、再び「デッドロック」に陥ってしまうのです。しかし、デッドロックはmqlの中ではなく、あなたの心の中にあるのです。これでは、プログラミングはできない。コードに何かを期待する前に、自分がバカの立場であることを想像し、コンピュータがするように、コード全体を何度も盲目的に歩き回ることだ。特定のケースで実行を渡さなければならない場所を確認する。特定のケースでどのパラメータを受け取るべきかを示す。その後、実行を開始し、期待通りの結果が得られるかどうかを確認します。もしそうでないなら、デバッグ中に見えるものをどこから得ているのかを調べなければなりません。

そうでなければならないのです。そして、コードの断片をデバッグすることは絶対に不可能です。

 
Alexey Viktorov:

ローマン、またしても引用しきれてないぞ。そして、その中でも特に強調されていますね。

まあいいや、強制終了が発動されたとしよう。そして、この終了のトリガーとなるイベントが最後まで実行され、計算の複雑さが3秒を超える必要があるのです。また、プログラムの終了を防ぎ、最後まで実行させるにはどうしたらよいのでしょうか?まさにそれが問題なのです。終了の仕方ではなく、間違って発動した終了をどう防ぐか、という話でした。あるいは、阻止するのではなく、ある時点まで、特にイベント処理が完了するまで遅延させること。

計算が完了するのを待つしかない。

残念ながら、mqlにはawaitのような関数はありません。
Sleep() で実験してみることもできますが、slipは終了の明示的なサインではないので、あまり適しません。
もし(計算が実行されたら)、すでに強制終了が始まっている、という条件をもう一つ作ってみてください。

 
Alexey Viktorov:

そこで、私が提案するオプションは

は、まったく同じ方法で解決されます。そして再び「デッドロック」に陥ってしまうのです。しかし、デッドロックはmqlの中ではなく、あなたの心の中にあるのです。そんなんじゃ、番組に出られない。コードに何かを期待する前に、自分がバカの立場であることを想像し、コンピュータが行うように、コード全体を何度も盲目的に歩き回ることだ。特定のケースで実行を渡さなければならない場所を確認する。特定のケースでどのようなパラメータを受信しなければならないか。その後、実行を開始し、期待通りの結果が得られるかどうかを確認します。もしそうでないなら、デバッグ中に見えるものをどこから得ているのかを調べなければなりません。

そうでなければならないのです。しかし、コードを断片的にデバッグすることはできません。

まあ、それはそれとして、アップデート前はすべてうまくいっていたのに、今はどうしたらいいかわからないということです。

そのうえ、コードはすべて原則オープンです。

さらに、私のバージョンOnTester()の改良について議論するスレッドを開きたいと思い、ここに書きました...。

結局、問題はそれではなく、変更されたTesterStop()の 実行にあることが判明しました。実はOnTester()とは直接関係ないのですが、気分が台無しになりました...。

今度は別のことをやってみようかな...。

 
Сергей Таболин:

それが、アップデート前はすべてうまくいっていたのに、今はどうしたらいいのかわからないんです。

それに、原則的にすべてのコードがオープンになっています。

さらに、私はすでに私のバージョンOnTester()の改良について議論するスレッドを開きたいと考えており、ここにそれがあります...。

結局、問題はそれではなく、変更されたTesterStop()の実行にあることが判明しました。実はOnTester()とは直接関係ないのですが、気分が台無しになりました...。

今度は別のことをやってみようかな...。

過去のビルドのリンクが貼られていますね。ファイルを入れ替えて確認してください。そうすれば、今どのビルドが動作しているのかを皆に伝えることができます。うまくいかない場合は、今問題が現れているこの部分につながらないパラメータが単に同じだったということです。

 
Alexey Viktorov:

そこで、過去のビルドのリンクを紹介しました。ファイルを入れ替えて確認してください。そして、どのビルドが今動くのか、みんなに教えてあげてください。うまくいかない場合は、今問題が現れたこの部分につながらないパラメータが、単に同じだったということです。

そうやって試してみたんです。2007年のビルドを載せれば、これらの問題はすべて解消されます。具体的には、最適化後のログ全体に目を通しました。ゼロによる除算のミスを4つ(たった4つ!)発見しました。それらは、トレードがないときに発生したものです。もちろん、これは修正する必要がありましたが、全体の最適化結果には全く影響がありませんでしたしかし、新しいビルドでは驚くほど多くのエラーが発生し、最適化が不可能になりました。

さて、@Romanさんの ヒントについて。

ありがとうございます。しかし、私の場合、TesterStop()は、テストがすでにいくつかの未知のパーセントを通過している必要があるため、TesterStop()には役に立たないように見えました。しかも、ドキュメントにはそのことが一言も書かれていない。

しかし、ExsprtRemove()ではうまく動作しました。この関数では、そこにいくつのテストが通ったかは重要ではありません。しかし、作業コード全体をifで包む必要がありました。

   if(!IsStopped())
   {
      тут рабочий код
   }

まあ、松葉杖でなんとかコードを直したんですけどね。いつもありがとうございます。

P.S. 実はもう一本、松葉杖を作ることになったんです。面白い )))

 
Сергей Таболин:

P.S. 実はもう一本松葉杖を作らなければならなかった。それは面白い ))))

選択肢がないとは思っていません。あなたが松葉杖にプログラミングするのが好きなら、私には阻止する権利はありません。この件に関して、スラバはこう答えた。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

スラバ さん 2019.06.16 14:04

Expert Advisor をすぐに停止すると、メモリが破壊されます。E xpert Advisor の即時停止後、未解放のメモリブロックが存在する場合があります。そのため、Expert Advisorの即時停止は、クライアント端末やテスターエージェントが終了した場合、Expert Advisorが停止フラグを処理せず、実行を継続する場合のみ使用されます。

TesterStopはテストを終了させるコマンドを与えます。現在のハンドラOnInit, OnTick, OnTimer, OnChartEventが終了すると、処理サイクルが終了するため、テスターのイベントはそれ以上処理されないことを意味します。代わりにOnTesterとOnDeinitが呼び出されます。

おそらく、以前のビルドのバグを使用してしまったのでしょう。現在、このバグは修正され、適切な解決策を探さなければなりません。
 
Сергей Таболин:

そうやって試してみたんです。2007年のビルドを載せれば、これらの問題はすべて解消されます。具体的には、最適化後のログ全体に目を通しました。ゼロによる除算のミスを4つ(たった4つ!)発見しました。それらは、トレードがないときに発生したものです。もちろん、これは修正する必要がありましたが、全体の最適化結果には全く影響がありませんでしたしかし、新しいビルドでは驚くほど多くのエラーが発生し、最適化が不可能になりました。

さて、@Romanさんの ヒントについて。

ありがとうございます。しかし、私の場合、TesterStop()は、テストがすでにいくつかの未知のパーセントを通過している必要があるため、TesterStop()には役に立たないように見えました。しかも、ドキュメントにはそのことが一言も書かれていない。

しかし、ExsprtRemove()ではうまく動作しました。この関数では、そこにいくつのテストが通ったかは重要ではありません。しかし、作業コード全体をifで包む必要がありました。

まあ、松葉杖でなんとかコードを直したんですけどね。いつもありがとうございます。

P.S. 実はもう一本、松葉杖を作ることになったんです。面白い )))

これは松葉杖ではなく、開発者が推奨している方法です。
whileループの説明の中に、こんな関数がありました。

while(!IsStopped())
{

}

そこで、この関数が強制終了の事実を チェックするのであれば、TesterStop()に使ってはどうかと思いつきました。
TesterStop()で動作しないのは残念です、これから知ることになります。
しかし、IsStopped() 関数がTesterStop()関数に対して機能しなければならないのか、開発者に尋ねるのは妥当なことです。
もしかして、バグ?

しかし、肝心なのは、その解決策です。

 
Alexey Viktorov:

選択肢がないとは思っていません。松葉杖にプログラミングするのが好きなら、私には口出しする権利はない。この件に関するSlavaの回答

もしかしたら、以前のビルドで開発者が犯した手違いを利用したのかもしれません。現在、このバグは修正され、適切な解決策を探さなければなりません。

すべてを理解し、松葉杖も必要ない。そして私はここで、何のために読む のか、松葉杖を探さなければならなかったのです。

おそらく。でも、誰かが文句を言った覚えはない。