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

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

インテリジェントな 前提は、残りのコードを実行せずに、転送をすぐに行うことです。そうだろ?

しかし、実際には TesterStop() はテストを全く止めません!

これ以上のコード実行を停止させたい場合は、returnを書けばそれ以上の実行は行われないと予想されます。TesterStop()と同様にExpertRemove()

ExpertRemove()が呼ばれてもExpert Advisorはすぐに停止せず、Expert Advisorの作業を停止するためのフラグが立てられるだけ です。つまり、Expert Advisor次のイベントを 処理せず、OnDeinit() を呼び出してチャートからアンロードします。

そして、2つ目に観察された欠点は

tester_stop = false;

は全く配置されていない。

 
Alexey Viktorov:

これ以上のコード実行を止める必要がある場合は、returnと書けばそれ以上実行されないというスマートさがあるはずだ。TesterStop()およびExpertRemove()

そして、私たちが気づいた2つ目のエラーは

が全く入っていない。

次のイベントは、OnTick() ?

OnTick()はどこに抜けるのですか?

なぜ、場違いなのか?TesterStop() がトリガーされた場合、この行に実行が到達しないことが予想されました。

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

次のイベントは、OnTick() ?

OnTick()はどこから出力を得ているのでしょうか?

なぜ、これがないのでしょうか?TesterStop()がトリガーされた場合、この行に実行が到達しないことが予想されました。

どこで終了し、何を継続するかは開発者次第です。

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

このコードのtester_stopフラグは、TesterStop() が実行されたかどうかに関わらず、falseに設定されます。

 
Alexey Viktorov:

どこへ行くのか、何を続けるのかは、開発者次第です。

このコードでは、TesterStop()が実行されたかどうかに関わらず、tester_stopフラグはfalseを取ります。

もう持ってる)))

問題は、どうすればいいかということです。テストを中止するには?具体的に言うとOnInit()でINIT_PARAMETERS_INCORRECTを 使用すると、開発者はほぼ悪態をつき、ゲンナリして しまうのだそうです。

出口を見つけ、最近まで何の問題もなかった。そして今.あらあら )))

また、それでもOnTick()から抜け出せる可能性があるのはどこでしょうか?

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

もうわかったよ)))

問題は、どうすればいいのか?テストを中止するにはどうしたらよいですか?具体的に言うとOnInit()でINIT_PARAMETERS_INCORRECTを 使うと開発者が悪態をつきそうになり、ジェネが吹っ飛んで しまう。

逃げ道は見つけたが、最近は問題なかった。そして今.あらあら )))

さて、何が問題なのか理解できたでしょうか?

         TesterStop();
      tester_stop = false;
      return;

TesterStopを 実行した後は、すべてのコードが実行されなくなります。つまり、すぐに動かなくなります。さらに進んで、tester_stopフラグを調整すると...。

もうひとつの質問:この数字は何ですか?マイナス9は、さらなる痛みを得るための試みなのでしょうか?そこからが大変なんです...。

 
Alexey Viktorov:

さて、あなたは問題が残っているものを理解した場合?

TesterStopを実行した後は、すべてのコードが実行されなくなります。つまり、すぐに動かなくなるのです。そこから、tester_stopフラグを使って規制をかけると...。

もうひとつの質問:この数字は何ですか?マイナス9は、さらなる痛みを得るための試みなのでしょうか?そこからが大変なんです...。

マイナスたくさんの9は、まさにTesterStop()によって出力されたと判断することです。INIT_PARAMETERS_INCORRECTの 代用品としてのみ使用しています。だから、それ以降のものは必要ないんです。しかし、今起こっていることは、コード全体が実行され、プログラマーがゼロによる除算の エラーを得ることです。確かに、配列のサイズが1であれば、後者の値から前者の値を引いた値は常に0になりますね!しかし、配列のサイズが1であれば、後者の値から前者の値を引いた値は常に0になります。そして、このバグと いうか、あ、失礼、誤解に対して保険を掛けていなかったのです。

リターンを挿入しようとしたのですが・・・。ちょっとだけ間違っている ))):

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

で終わってしまいました。

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

ただただ素晴らしい ))))

最高のTHANK YOU!!!

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

マイナス9が多いのは、まさにTesterStop()で出力されたと判断するためです。INIT_PARAMETERS_INCORRECTの 代用品としてのみ使用しています。だから、それ以降のものは必要ないんです。しかし、今起こっていることは、コード全体が実行され、プログラマーがゼロによる除算の エラーを得ることです。確かに、配列のサイズが1であれば、後者の値から前者の値を引いた値は常に0になりますね!しかし、配列のサイズが1であれば、後者の値から前者の値を引いた値は常に0になります。そして、このバグと いうか、あ、失礼、誤解に対して保険を掛けていなかったのです。

リターンを挿入しようとしたのですが・・・。ちょっとだけ間違っている ))):

で終わってしまいました。

ただただ素晴らしい ))))

大感謝です!!!

セルゲイ・タボリン

ありがとう、もうわかったよ。しかし、それで問題が解決するわけではありません。MQL_TESTER_STOP 定数で解決するか、戻り値をvoidからboolに 変更することで解決できます。

Alexey Viktorovによって 予想外の解決策が提案されました:TesterStop()の後にreturnが使われると、すべてがOKになるようです。どうしてそうなるのか、個人的には理解できない。 それにしても...。

したがって、この点をドキュメントに追加するか、voidをboolに 変更する必要があります。

追伸:ビルド2085でこの問題に遭遇しました。それ以前は何の問題もなかったのです。私に何か言っているのでしょうか?)))

セルゲイ 想定外ということはないですね。逆に言えば、論理的で一貫性があるということです。さまざまなケースがあります。Expert Advisorが終了する前にイベントの処理を終了しなければならないこともあれば、あなたのケースのようにすぐに終了しなければならないこともあるのです。開発者は、イベント処理を終える必要のある人の不満を招いてすぐに止めるか、イベント処理の完了後に止めるか、どちらが正しいかという問題に直面する。プログラマなら誰でも持っているリターン演算子ですが、強制終了の場合は何もありません。

また、なぜboolのvoid型を変更する必要があるかというと、やはりプログラマの武器として、TesterStop()の前か後に変更できる静的変数があり、原則的にすべてが思い通りになるからです。そして、あなたはなぜか私の例からそれを省きました。

 
Alexey Viktorov:

セルゲイ 意外性はないんですよ。逆に言えば、すべてが論理的で一貫しているのです。さまざまなケースがあります。Expert Advisorが終了する前にイベントの処理を終了しなければならないこともあれば、あなたのケースのようにすぐに終了しなければならないこともあるのです。開発者は、イベント処理を終える必要のある人の不満を招いてすぐに止めるか、イベント処理の完了後に止めるか、どちらが正しいかという問題に直面する。プログラマなら誰でも持っているリターン演算子ですが、強制終了の場合は何もありません。

また、なぜboolのvoid型を変更する必要があるかというと、やはりプログラマの武器として、TesterStop()の前か後に変更できる静的変数があり、原則的にすべてが思い通りになるからです。そして、あなたはなぜか私の例からそれを省きました。

アレクセイ、どうもありがとうございました。

開発者が直面している問題を理解しているからこそ、このような解決策を提案するのです。正しく対応できるようになるために。

静的変数と、私が「捨てた」あなたの例については......。申し訳ないが、何を言っているのかよくわからない。よろしければご説明ください。

そして、多少の寛容と忍耐を求めます。私は生活環境がとても悪いので、とてもイライラしやすく(自覚はあるのですがどうにもなりません)、注意力がないことがあります。

まったく理解できないんです。頭がクラクラする...。

以下はその一例です。

私のコードでは、最後の配列値から最初の配列値を引いた値が初期値ゼロであれば、結果は-9999999999.88でなければなりません。

しかし、最適化の際にこのような結果になってしまいました。

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000は決してゼロにはならず、結果は-9999999999.88となります。どうやって!!!?もう、ハングリー精神が旺盛で・・・。

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

アレクセイ、どうもありがとうございました。

開発者が直面している問題を理解しているからこそ、このような解決策を提案するのです。正しく対応できるようになるために。

静的変数と、私が「捨てた」あなたの例については......。申し訳ないが、何を言っているのかよくわからない。よろしければご説明ください。

そして、多少の寛容と忍耐を求めます。私は生活環境がとても悪いので、とてもイライラしやすく(自覚はあるのですがどうにもなりません)、注意力がないことがあります。

まったく理解できないんです。頭がクラクラする...。

以下はその一例です。

私のコードでは、最後の配列値から最初の配列値を引いた値が初期値ゼロの場合、結果は-9999999999.88でなければならないことを示しています。

しかし、最適化の際にこのような結果になってしまいました。

9587 - 10000は決してゼロにはならず、結果は-9999999999.88となります。どうやって!!!?ハングアップしてきた・・・。

良いのか悪いのかわかりませんが、私はコード全体に手を入れることはありません、だからスタティック変数の話をしていたのです。そして、tester_stopフラグがプログラムの様々な部分で使われていることから判断して、このフラグはグローバル変数のレベルで宣言されている必要があります。

私の例からフラグの値を変更することを軽率に「捨てた」ことが確認できます。

を使用したものです。

   if(tester_stop) return(-99999999999.99);

そして、どうやらこのフラグは、全く変化しないか、変化するところがないから変化しないかのどちらかのようです。

 
Alexey Viktorov:
アドバイザが終了する前に イベント処理を終了させる必要がある場合もあります。

プログラマーなら誰でも持っているreturn演算子に対し、強制終了には何も ない。


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

if(IsStopped())
if(!IsStopped())