MT5とスピードの関係 - ページ 54

 
Roman:

なるほど、言い直します。mql以内であれば、プロセッサのクロック周波数にもよりますが、おおよそ可能です。
PWMについてはどうでしょうか?- 周波数が一定で、デューティサイクルが可変のパルス信号
定数を設定しないのですか?

まず、WinAPIのSleep 関数とは何か、そして実際に何をするのかを読みます。

PS Windowsはリアルタイムシステムではない

 
Slava:

まず、WinAPIのSleep関数がどのようなもので、実際に何をするものなのかについて読んでみましょう。

PS Windowsはリアルタイムシステムではない

エヘン、WinAPI Sleepがどう関係するんだ?
マイクロ秒のスリップについて話して いるとき
個別に、プロセッサのために、タイマーの周波数を決定し、繰り返し数を計算することができます。
では、mqlで独自のMicrosecondCountを書くことは可能だが、その意味は何だろうか?標準のもので十分です。

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

エヘン、お恥ずかしい話ですが、WinAPI Sleepはどんな関係があるのでしょうか?
マイクロ秒スリップの 話をするとき
個別に、プロセッサのために、タイマーの周波数を定義し、繰り返し回数を計算することができます。
では、mqlで独自のMicrosecondCountを書くことは可能だが、その意味は何だろうか?標準のもので十分です。

コンテキストスイッチなしで自分の保留中のスリップが100%コアを食いつぶすことになる。

これはキワモノ的なプログラミング手法だ。そのようなコードが市場に流出することを神は禁じています。

 
Renat Fatkhullin:

コンテキストスイッチのない待ち受けは、コアを100%食いつぶしてしまいます。

恐ろしいプログラミング方法です。そのようなコードが市場に流出することを神は禁じています。

そして、誰もそのハードコアを否定しなかった ))
コンテキストスイッチングの例を示せば、改善されるかも?

2コア4スレッドしかないVirtualBox上でのμsSLEEP(μsRange)のCPU負荷はこんな感じです。
鉱夫はもっとひどいことをする ))

シーピー

 

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

ライブラリ:配列

fxsaber, 2020.10.13 12:54

ほとんどのVPSを殺すEAの一例。
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


異なるシンボルのいくつかのチャートで動作させています。この 動作を自動化するために、inAmount = 5で このスクリプトを 使用しました。


結果

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

これら6つのExpert Advisorを実行するには、Terminalに4Gb以上のメモリが必要です。初期化にのみ必要で、これらのEAの運用には必要ないことにご注意ください。Expert Advisorをぶら下げた状態でターミナルを起動することを想像してください。正直4GbのRAMが使えないと......ほとんどダメですね。


では、この行のコメントをソースコードから削除してみましょう。

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

このように、Expert Advisorの逐次初期化を可能にしました。


結果を見てみましょう(再コンパイル後)。

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


Expert Advisors の起動時に、Terminal のメモリ消費量を 2.5 Gb 以上削減することに成功しました。VPSがクラッシュする(自宅のパソコンが弱くなる)確率が大幅に減少した。


両ランをダイナミクスで見るとこのようになります。

順次起動することで、全体の初期化時間は伸びますが、ターミナルが膨大な量のRAMを消費することは何とか抑えられました。


上下のグラフは、並列の初期化処理(左の高いピーク)と6回連続の初期化(中央の6つのピーク)を明確に示して います。


SZY 実験中にスリープの不快なニュアンスが明らかになりました - ソースコード参照。


CopyTicksを使用した後、強制的にメモリを解放できるようにしたいのですが。そんなSleepの松葉杖を作らないこと。

 
指定された間隔でティック履歴を照会するために、最も安くメモリを消費する方法を教えてください。
 
fxsaber:
一定間隔でダニ履歴を要求する最も安価な方法を教えてください。

安いものを探しているのではなく、早くメモリを解放する方法を探しているように思えます。

をオプションでチェックすることができます。

- 動的配列MqlTick Ticks[]をクラスでラップし、newでオブジェクトを作成(つまり動的オブジェクト)、不要になったら削除する。

- 同じですが、構造体があり、ローカルスコープ(または関数、ローカルブロック{ } - または1回の繰り返しによるループ?私はEAコードの大半をクラスからデータ構造に置き換えたところ、最適化速度が大幅に向上しました。

- デストラクタにArrayFree()を追加してみる。

 
Igor Makanu:

安いものを求めているわけではなく、手っ取り早くメモリを解放する方法を探しているのだと思います

ターミナルはメモリーを解放しません。MQLの変数は関係ありません。

 
fxsaber:

端末がメモリを解放していない。MQLの変数は関係ありません。

強制的にsize = 1にしたらどうでしょう?

したらどうだろう

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

で、もし

CopyTicksを呼び出した後、端末はすべてのデータを数秒間メモリに保持します。ティックの歴史の 一端を読み直したい人がいるかもしれないので、念のため。

つまり、Terminal が消費するメモリ量は、MQL 変数のサイズに依存しません。


タスクは、ターミナルにメモリーを強制的に解放させることです。