記事"予備インディケータによるメモリ消費削減"についてのディスカッション

 

新しい記事 予備インディケータによるメモリ消費削減 はパブリッシュされました:

インディケータが計算のために他の多くのインディケータ値を使用すれば、それは多くのメモリを費やすこととなります。本稿では予備インディケータを使用する際のメモリ消費を減らす方法についていくつか述べていきます。保存されたメモリにより、クライアント端末において同時に使用する通貨ペア数、インディケータ、戦略を増やすことができるようになります。それはトレード ポートフォリオの信頼性も向上します。単純にご自身のコンピュータの技術的リソースを気に掛けることで、それはデポジットの資金リソースに変わる可能性があるのです。

作者: Andrew

 

アプローチは理解できる。しかし、タスクの関連性が混乱している。

64ビットシステムは膨大な量のRAMをサポートしているが、このタスクの関連性は薄い。3ギガバイトの32ビットでさえ、あなたが節約しようとしているようなメモリサイズをかなり引き出せる。結局のところ、どう考えても、新しいインジケーターをロードするときにメモリは直線的に増加する。

さて、このタスクが関連性があると仮定しよう(それを気にする人がいることには同意する)。しかし考えてみてほしい。メモリ節約というタスクは、パフォーマンスというタスクと真っ向から対立しているのだ。

だから、この点にも注意を払うべきだ。

私の目から見る限り、MQはパフォーマンスのために戦っており、そこにすべての努力が集中している。

非描画インジケータのメモリリソースを節約する必要がある場合は、インジケータのコードをExpert Advisorに転送してください。ここで、割り当てられたメモリを完全に制御することができます。同時に、同じ種類のデータの 受信を節約することができます。多くのインジケータは、それぞれ独自の処理を行うために同じデータを要求します。一度データを受信すれば、次回からはそのデータを処理する必要はありません。

次に、処理速度とメモリサイズの両方を組み合わせてみましょう。ほとんどの非描画インジケータは、最後のバーの計算に従事し、これは全体の配列の再計算をブロックするビルトインメカニズムによって示されています。Expert Advisorでは、154個のメモリセルを割り当てることが可能であることがわかりま した(例えば、153周期のマスクの計算のため)。

しかし、Expert Advisorでは、計算を並列化する可能性が失われ、これはパフォーマンスへの直接的な打撃となります。実際、インジケーターは並列計算のためにメモリーを消費します。結局のところ、各インジケーターは独自のスレッドで動作し、このスレッドはソースデータの独自のインスタンスを持っていなければなりません。

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

パフォーマンスが最優先であり、メモリを節約する意味はない(もちろん、1Gb以上使う場合は別だが、それはありえない)。

 
Urain:

そのアプローチは理解できる。しかし、その作業の緊急性が分かりにくい。

実は、この記事を書こうと思ったのは、ある複合インジケーターを書いたある人から、このインジケーターがいくつかのペアにインストールされていないとクレームを受けたことがきっかけだった。調べてみると、非常に永続的なインジケーターがあり、その多くがターミナルに収まらないことが判明した(つまり、問題はペアにあるのではなく、このペアの前に、同じ永続的なインジケーターでさらに何十個もオープンされていることにあった)。そのインジケータは、記事のテスト・インジケータよりも2倍多く消費した。

3GBの32ビットでさえ、このようなメモリ・サイズを消費します。

多くのペアで取引する場合は、そうではありません。

ちなみに、ターミナルは2Gb以上のメモリを割り当てられません(RAM+仮想メモリの合計)。私の実験では、このマークで終了した。

もちろん、64ビットではこの問題は存在しないはずだ。

よし、このタスクが関連していると仮定しよう(それを気にする人がいることには同意する)。しかし、考えてみてほしい。メモリ節約というタスクは、パフォーマンスというタスクと正反対なのだ。

必ずしもそうではない。この記事では、ほとんどの方法はパフォーマンスを低下させない。

描画できないインジケータのメモリリソースを節約する必要がある場合は、インジケータのコードをExpert Advisorに移動するだけです。

インジケーターから最後のバーのみを要求するExpert Advisorは、記事で考慮されているプログラムとは異なるクラスのプログラムです。また、どちらか一方を他方に置き換えることが常に可能とは限りません。

しかし、Expert Advisorでは、計算を並列化する可能性が失われ、これはパフォーマンスに直接打撃を与える。実際、インジケータは並列計算のためにメモリを消費します。結局のところ、各インディケーターは独自のスレッドで動作し、このスレッドはソースデータの独自のインスタンスを持っていなければなりません。

並列計算に関する記事の 中に興味深い表があり、"2 indicators "というキーワードで見つけることができます。

 
ds2:

インジケーターの問題点は、それぞれのインジケーターが独自のスレッドで動作し、動作するために必要なデータをすべてスレッド自体に保存しなければならないことである。

スレッド間のデータはCopyBuffer()によってコピーされる。しかし、ここで問題が発生します。スレッドからデータを取得することはできますが、そこでデータを転送することはできません。そのため、1つのインジケータの複数のインスタンスが同じ前処理済みデータを受け取るようなモゴステージ・インジケータを構築することはできません。しかし、この平面にこそ、計算を最適化する 大きなチャンスが潜んでいます。

MQがこの問題を解決すれば、インジケーターを使った作業はより便利で柔軟なものになると思います。現在、データは外部パラメータとして、スレッドの開始時にのみ渡すことができます。



Как написать индикатор в MQL5
Как написать индикатор в MQL5
  • 2010.01.12
  • MetaQuotes Software Corp.
  • www.mql5.com
Что представляет собою индикатор? Это набор вычисленных значений, которые мы хотим отобразить на экране монитора удобным для нас образом. Наборы значений представляются в программах в виде массивов. Таким образом, создание индикатора - это написание алгоритма, который обрабатывает одни массивы (массивы цен) и записывает результаты обработки в другие массивы (значения индикаторов). На примере создания индикатора True Strength Index в статье рассказывается, как писать индикаторы на MQL5
 

とても役に立つ

この主旨を正しく理解すると、疑問が出てきます:

MT5の 標準的なインジケーターは、なぜ「クラス」として設計されていないのでしょうか?

では、なぜマスターウィザードはそのような考えを気にしないのでしょうか?

 
インジケータを使用するクラスを 参照してください。
 

ツール>オプションから最大バーを 制限することなく、バッファスペースを減らすために私が使っている簡単な方法は次のとおりです。

int maxbars =100;// 最後の小節
limit = rates_total-rates_total+maxbars;