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

 
Renat Fatkhullin:

コードと作品に直球勝負。

  1. インジケーターのCopyXXX関数は、データの完全な同期ダウンロードを待たず、利用可能なものを提供します。そうしないと、インジケータが本当に遅くなってしまうのです。

  2. 初回にすべてのデータが同期されていない場合、フォローアップに問題があるようです。
    ダウンロードが成功するのをじっくり待つ」という優しいモードに変更する必要があるのです。例えば、OnCalculateは呼び出されない。

  3. 悪い点は、最大の負荷がかかるグローバルな初期化が、インジケータがカウントして待つのに非常に長い時間がかかるOnInitに置かれていることです。
    この場合、このシンボルのチャートの更新はブロックされ、他の多くの参加者は新鮮なデータを受け取ることなく待機しなければなりません。インジケータは長時間リソースを取らないようにする必要があります。OnCalculateで長い初期化ステップを一歩一歩カウントしながら伸ばしていく・シンボル初期化するのがよいでしょう。

  4. このインジケーターは、同期のためにネットワーク経由で約800MBのヒストリカルデータを送り出しているんだ

  5. インジケータには512本の描画線があり、そのために明示的にメモリが割り当てられている。これは非常に高価なものです。使用するのは100ラインのみ。

  6. コードの可読性が悪い

1. はい、そのため、一時停止して何度も呼び出したり、手動で何度もインジケータを再起動したりする必要がありますが、それでもいつもうまくいかず、しばらくするとインジケータの計算が止まってしまいます。

2.現在のバージョンが最適でないことは認めます。ドキュメント(「データへのアクセスの整理」セクション)の推奨関数を含め、さまざまなバリエーションを試しました。最後のバージョンでは、それを少し簡略化しました。iBarShift関数を何度も呼び出すことも最適ではないでしょう。一方、それを拒否すると、まだ書けない同期データの 準備のための特別な関数を作る必要があり、非常に面倒ですし、標準関数もありません。さらに、言語に時間nを求めるための標準機能があるとします。

3.OnInitではポートフォリオの組み合わせを定義し、バッファを割り当てるだけで、リクエストはありません。 オプションとして、キャッシュの消失を防ぐために、バックグラウンドですべてのM1商品のチャートを開いてみましたが、これは役に立つようです。もちろん、最大ロードでは、すべてが28チャートというひどい状態です。データへの最初のリクエストはOpsCalculateで、データをキャッシュするために一時停止(RequestData関数)してループ内でCopyCloseを呼び出し、すべての楽器を集めてから(SetupIntervals、CalculateEquityなど)呼び出すと、すべてのデータの準備ができて、iBarShiftやiClose、その他の有用な関数のすべての呼び出しはキャッシュされたデータを返すと思っていましたが、なぜかいつもうまくいかないんです。

4.これは800mbのティックデータであるはずだが...?しかし、私は28の商品で多くのポートフォリオを形成することができる他の方法を知りません、彼らはとにかく要求されるべきである、mt4では何の問題もありませんでした(おそらくmt4ではすべてのタイムフレームが別々に存在するため)。

5.インディケータは多くのポートフォリオの組み合わせを想定していることです。現在、420ライン+サービスライン(各種ワンド、チャンネルなど)のプリセット組み合わせがありますが、理論的にはユーザーは512ラインすべてを要求する可能性があります。ユーザーによっていくつ要求されるかが不明なので、#property indicators_buffersを使ってバッファの数をあらかじめ制限することができません。

6.必要であれば、コメントします。


追伸:最初に間違えて別バージョンを投稿し、その後添付ファイルを修正したので、もしかしたら間違ったバージョンをダウンロードされたのではないかと思いました。

P.P.S. この機会に合成チャートの機能を明確にしたいのですが、この機能は何とか開発されないでしょうか? 例えば、私は数式インデックスだけでなく、商品群の売買ポジションをシミュレーションしたいのですが、今はポイント値と契約サイズの面倒な数式を書かなければならず、ポイント値も履歴上変化しないので難しいのですが・・・。

 

Renat Fatkhullin:

インジケータは長時間リソースを占有しないようにする必要があります。長い初期化をOnCalculateでステップバイステップ/文字単位でバラバラに計算することで均等に引き伸ばした方が良い。

それは、端末内の他のプログラムを遅くしないように、明確ですが、矛盾がある:ポートフォリオのモデルを計算するとき、インジケータは、一度にデータのすべての行を必要とする、ポートフォリオの株式は、それらによって計算されるので、すなわちそれは準備ができてデータがなければ何も計算できません、ポートフォリオは一度にすべてのコンポーネントを必要とし、いくつかのポートフォリオがある場合、ポートフォリオの比較や合計が行われる場合は、それはすべてのポートフォリオが必要ですし、それはあまりストレッチではありません - それは部分に計算できるスライドウィンドウではない、ここで最初の計算が行われます。- だから、同期データの 配列を正しく演算処理する普遍的な標準関数がないかと問題提起したのです。

 
Vladimir Karputov:

からダウンロードしたものです。

今は18.10で、すべてうまくいっています。


おめでとうございます!あなたは運が良かっただけで、CPUやメモリ、OSなどが合っていないわけではありません...だからといって、バグが実在しないわけではありませんよ。

それは現実であり、私にだけ起こっていることではないのです。

 
transcendreamer:

これは、端末内の他のプログラムを遅くしないために、理解できるが、矛盾がある:ポートフォリオのモデルを計算するとき、インジケータは、一度にすべての行のデータが必要になり、ポートフォリオの株式は、それらを使用して計算されるので、つまり、準備ができてデータがなければ、何かを計算することは不可能で、ポートフォリオは、一度にすべてのコンポーネントを必要とし、いくつかのポートフォリオがある場合、ポートフォリオ間の比較や合計がある場合は、いくつかのポートフォリオのため、それは、ストレッチできないそれは部品で計算できるスライドウィンドウではありませんので、ここで最初の計算が行われます。- だから、同期データの 配列を正しく計算して準備する普遍的な標準関数について質問したのです。

それが重要な欠点です。私も同じ悩みを抱えています。

mt4では計算と表示が瞬時に行われますが、mt5では価格を取得する必要があるすべてのチャートが常に開いている状態で、インジケーターには何の問題もありません。シングルバッファのMAのような簡単なインジケータしか書けないことが判明しました(

 

確かにバグはついていますね。

1) Hyper-V x64上のServer 2012 (build 9200), IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64、IE 11、RDP、UAC、QEMU 仮想バージョン (cpu64-rhel6)、メモリ:1340 / 2047 Mb、ディスク:15 / 28 Gb、GMT+2。


 
Stanislav Dray:

確かにバグはついていますね。

1) Hyper-V x64上のServer 2012 (build 9200), IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memory: 3033 / 3839 Mb, Disk: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64、IE 11、RDP、UAC、QEMU 仮想バージョン (cpu64-rhel6)、メモリ:1340 / 2047 Mb、ディスク:15 / 28 Gb、GMT+2。

持っています。

Windows 7 Service Pack 1 (build 7601) x64、IE 11、Intel Core i5-2400 @ 3.10GHz、メモリ:469 / 8182 Mb、ディスク:96 / 148 Gb、GMT+2。

 
transcendreamer:

これは、端末内の他のプログラムを遅くしないために、理解できるが、矛盾がある:ポートフォリオのモデルを計算するとき、インジケータは、一度にすべての行のデータが必要になり、ポートフォリオの株式は、それらを使用して計算されるので、つまり、準備ができてデータがなければ、何かを計算することは不可能で、ポートフォリオは、一度にすべてのコンポーネントを必要とし、いくつかのポートフォリオがある場合とポートフォリオ間の比較や合計がある場合は、いくつかのポートフォリオのため、それは、ストレッチできないそれは部品で計算できるスライドウィンドウではありませんので、ここで最初の計算が行われます。- だから、同期データの 配列を正しく計算して準備する普遍的な標準関数について質問したのです。

一度にすべてが手に入るわけではないことを明確に理解した上で、指標を書くべきです。

OnInitでは、CopyXXXを1回呼び出すことで、必要な計測器の履歴の読み込みを促す必要がありますが、OnCalculateでは完全な初期化を待つ必要があります。

初期化フェーズにエラーがあるようです - データの待機とブロックが正しくありません。

 
Renat Fatkhullin:

コードを実行に移す。今のところ順調です。

ちなみにボディなしのファイル。

2時間後にはすべてがうまくいき、コメントには正しい日付のタイマーが刻まれています。
 
Vitaly Muzichenko:

これが重要な欠点です。私も同じ悩みを抱えています。

mt4では計算と表示が瞬時に行われますが、mt5では、価格を受け取りたいすべてのチャートが常に開かれているにもかかわらず、インジケータに完全に問題があります。シングルバッファのMAのような簡単なインジケータしか書けないことが判明しました(

必要なチャートを別の方法で取得しようと思っても、普遍的で快適な方法が見当たりません。 全ては端末とその中のプログラムの速度に合わせて設計されていることは理解しています。

 
Vitaly Muzichenko:

これが重要な欠点です。私も同じ悩みを抱えています。

mt4では計算と表示が瞬時に行われますが、mt5では、価格を受け取りたいすべてのチャートが常に開かれているにもかかわらず、インジケータに完全に問題があります。シングルバッファのMAなど、単純なインジケータしか書けないことが判明(

コードを見なければならない。

ここで、上記のコードには、明らかに論理的、資源的な問題が山積しています。