MQL5でiClose/iOpenの時系列アクセスなどを操作した場合の不具合。

 
こんにちは。
 

#property tester_everytick_calculate は問題を解決するかも?

MQL5:カスタムインジケータ用の新しいプロパティを追加しました #プロパティ tester_everytick_calculate.ストラテジーテスターで使用され、強制的に各ティックでの指標の計算を可能にすることができます。

25.テスター:非ビジュアルテスト/最適化時に、使用されるすべての指標(標準およびカスタム)は、データを要求することによってのみ計算されるようになりました。例外はEventChartCustom関数の呼び出しを含みOnTimerハンドラを使用 するインジケータ です。従来、ストラテジーテスターでは、任意のティックが来た場合(他のシンボルからでも)、すべての指標が無条件に計算されていました。この技術革新により、テストと最適化が大幅に加速されました。

指標を強制的に1ティックごとに計算させるには、#property tester_everytick_calculate をプログラムに追加してください。

旧バージョンのコンパイラーでコンパイルされた指標は、従来通り、1ティックごとに計算されます。
 

また、別のタイムフレームで作業する場合は、1分間に一度、このタイムフレームからOHLCを取得する必要があります(任意のCopyXXXXXX関数)ことを常に推奨しています。

つまり、他人のタイムフレームで作業する場合は、iXXXXXXアトビズムを使う必要はなく、CopyXXXXX関数を使えばいいということになります。

 
Vladimir Karputov:

また、別のタイムフレームで作業する場合は、1分間に一度、このタイムフレームからOHLCを取得する必要があります(任意のCopyXXXXXX関数)ことを常に推奨しています。

したがって、別の時間枠で作業する場合、-iXXXXXXのアトラクティブを使用する必要は ありませんが、CopyXXXXの関数を使用する必要があります。

本気じゃないんです!

なぜかというと、iHigh(Symbol(),TF,i) だからです。

追伸:mt4では発売当初から全て問題なく動作していますが、mt5でも同じようにすればタンバリンはなくなるのではないでしょうか?mt4で動作するのであれば、mt5でも動作させることは可能です。
 
Vitaly Muzichenko:

本気じゃない!?

なぜかというと、iHigh(Symbol(),TF,i) だからです。

P.S. mt4では、その存在の最初の日からすべてが問題なく動作していますが、なぜmt5でも同じことをしないのですか、そうすればタンバリンはなくなるでしょう。mt4で動作するのであれば、mt5でも動作させることが可能です。

また、他のタイムフレームで作業する場合は、このタイムフレームから1分ごとにOHLCを取得することが常に推奨されています(任意のCopyXXXX関数)。これは昔からそうでした。

 
double high_k = NormalizeDouble(iHigh(Symbol(),TimeFrames, k),DigitsM);
double low_k = NormalizeDouble(iLow(Symbol(),TimeFrames, k),DigitsM);
double open_k = NormalizeDouble(iOpen(Symbol(),TimeFrames, k),DigitsM);
double close_k = NormalizeDouble(iClose(Symbol(),TimeFrames, k),DigitsM);

RefreshRatesで行う前に、見積もり更新を試してみてください。

 
Dmitry Fedorchenko:

事前にRefreshRatesで見積もりを更新してみてください。

"RefreshRates "は存在しない関数です。

 
Vladimir Karputov:

"RefreshRates "は存在しない関数です。

私は、約
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinforefreshrates

EAだけに似たような問題があり、助かりました。

 
Farkhat Guzairov:
このインジケーターのMQL4バージョンは2年以上動作しており、そのような問題/エラーは見つかっていません。

CopyXXXは役に立ちません。これはMT5のバグで、ビルド30から始まり、ビルド44以降も修正されていません。https://www.mql5.com/ru/forum/285631/page29 の最後の5-6ページを読めば、一人じゃないことがわかります。

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.11.13
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Farkhat Guzairov:

ごきげんよう。

現在、以前書いたインジケーターを MQL4からMQL5へ移行しています。あまり踊っていないし、何も問題ないように思えるのですが......。

ある時点でインジケータのデータが更新されなくなり、どこでエラーになっているのか正確に把握できず、偶然にもiClose/iOpenなどが更新されなくなる、つまり同じ値を返すことに気付きました。

面白いのは、ソースコードを再コンパイルしてもインジケータが正しく更新されないことですが、関数は実行されているようですね。

インジケーターのプロパティを開いて「Ok」経由で閉じた場合のみ、データが更新されて正しく表示されますが、いつ発生するかわからないものまで(でも100%発生します)。今回は2018.11.14 00:00にインジケータがデータ更新を停止しましたが、一般的にはしばらくすると定期的に発生します。

以前、iBars(Symbol(),TimeFrames)/Bars(Symbol(),TimeFrames)関数がゼロ値を返すという別のバグが明らかにされたことがあります。幸いなことに、このバグは常時発生するものではありませんが、それでも発生してしまうので、コントロールしなければなりません。

MQがMQL4のサポートを停止することが判明しました。 これは素晴らしいことですが、MQL5ではそのようなバグが発生することになります。

では、上記の問題を解決するにはどうしたらよいのでしょうか。

1) OnTick/OnCalculateの1回の計算の実行時間をマイクロ秒単位で測定し、ログに出力する。

こうすることで、ダニ計算にどれだけの時間を費やしているかがわかります。そして、この速度で1秒間に何回カチカチと計算できるかを試算します。おそらく十数個のダニを見つけることはできないでしょうし、1秒間にもっと多くのダニを見つけることができるはずです。


2) データを抽出するチャート/タイムフレームに接続されているインジケータの各 OnCalculate の時間を測定します。

おそらく似たような状況があるのでしょう。計算が遅いため、端末は計算されたシンボル:タイムフレームのロックが解除されるまで待ちます。特に歴史の深い指標で遅いのは、他人のチャートのペイオフを凍結させることにつながるのです。


指標を開発する際には、パフォーマンスの問題や経済的な再計算を第一に考えるべきでしょう。そうでなければ、周りのものをすべて殺してしまうことになる。

 
Renat Fatkhullin:

特に深層史のブレーキ指標で、他の人のチャートがフリーズすることがあるんです。

では、なぜ私にフリーズが起こるのか、教えてください。M1のCopyTimeの 更新がトリガーとなり、OnTickの他の処理が開始されますが、CopyTimeの前にはインジケータの関数や問い合わせは存在しません。

また、build30以前はそのような問題はなく、2017年10月からすべて問題なく動作していたのはなぜですか?

理由: