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

 
fxsaber:

開発者の皆様、MQL_MEMORY_USEDの計算方法を教えていただけませんか?

すべてのEAの変数が消費しているメモリを計算しました。

10%未満である。私の理解が正しければ、MQL_MEMORY_USEDはHistoryキャッシュとCopyTicksキャッシュを含んでいます。それでもだいぶ減りましたね。

同時に、パラレルExpert Advisorの消費電力は数倍少なくなっています。しかし、原理は同じです。

一般的に、この値には何が含まれているのでしょうか?


Expert Advisorでテンプレートを保存し、リロードを発生させて同じチャートに適用しています。こんな風に見たことがあります。

メモリ使用量がほぼ一桁変わりました。今のところ、その意味を説明するのは難しい。

多くのプログラムには、メモリ使用量の累積効果があります。これはブラウザの罪であり、時にはWordの罪でもある。ターミナルにも罪があるかもしれない。それに、デフォルトですべてのログが書き込まれるので、1ギガにアクションが多すぎると1週間くらいかかってしまいがちです。これは、管理しなければならない悪です。しかし、その方法は明らかではありません。

 
Vladimir Pastushak:

金融商品をプログラム上で選択し、何度もハングアップしない方法をご存知ですか?

インジケーターを通して

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.10.22
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 

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

MT5とスピードの関係

レナート・ファットフーリン, 2020.10.14 04:15

大量のカチカチ音を出すには、メモリを増設します。

4gb(価格20ユーロ)では、2020年の分析・調査には不利です。

マーケットプロダクツでは、このやり方はどこにも通用しない。そんな松葉づえで、不要なデータの10秒保持を回避しなければならないのです。

      while (!IsStopped() && ::TerminalInfoInteger(TERMINAL_MEMORY_USED) > inMaxMemory)
      {
        Alert("::TerminalInfoInteger(TERMINAL_MEMORY_USED) = " + (string)::TerminalInfoInteger(TERMINAL_MEMORY_USED));
        
        Sleep(1000);
      }

Market Screenerのような些細なMarket Productを作ることは、メモリ消費量が多すぎるため、実はMT5では実現不可能な作業なのです。

 
fxsaber:

マーケットスクリーナーのような些細なマーケットプロダクトを作ることは、実はMT5ではメモリ消費量が多すぎて実現不可能なのです。

端末が起動後にメモリを大量に食う。

スクリーナー実行後、2ギガ(TERMINAL_MEMORY_USED、時間経過後も減少しない)を食うようになった。これは、5000M1-barsの1つのオープンチャートのみである。


スクリーンショットを保存していない。しかし、それはちょうど愚かであるところ、それ自体ではなく、メモリを食べるターミナルを示し、例をスローすることにしました。

// Создание копий оригинальных символов из Обзора рынка в виде пользовательских.
#property script_show_inputs

input datetime inStartTime = D'2020.06.01'; // С какого времени закачивать тики

void OnStart()
{
  for (int i = SymbolsTotal(true) - 1; !IsStopped() && (i >= 0); i--)
  {
    const string Symb = SymbolName(i, true);
    
    if (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM)) // Если символ не кастомный.
    {
      Alert(Symb + " - Start.");
      
      MqlTick Ticks[];
      
      if (CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, (long)inStartTime * 1000) > 0) // Взяли с него тики.
      {
        const string CustomSymb = "CUSTOM_" + Symb;
      
        if (SymbolInfoInteger(CustomSymb, SYMBOL_EXIST) || CustomSymbolCreate(CustomSymb, AccountInfoString(ACCOUNT_SERVER), Symb)) // Содали кастомный.
        {
          Alert((string)i + ": " + Symb + " - " + (string)CustomTicksReplace(CustomSymb, 0, LONG_MAX, Ticks)); // Поместили в него тики.
          
          SymbolSelect(CustomSymb, true);
        }
       }
    }
  }
}


このスクリプトは、Market Watchから元のシンボルのコピーを作成するだけです。MQ-Demoにすべてのシンボルを追加し、このスクリプトを最初にコールドで、次にホットで実行する予定でした。

そして、ホットランの後(tkc-filesの形ですでにSSD上にあるとき)、適切な実装では必要ないところで、膨大なメモリの枯渇を観察することになります。


しかし、このスクリプトを実行すると、MQ-Demoでハングアップすることがあります。異常終了によってのみアンロードすることができ、その後、ターミナルは1GB以上のメモリーを解放することはありません。


このスクリーンショットと冒頭のスクリーンショットを比較するとわかりやすいですね。

 

すみません、これがバグなのか機能なのかよくわかりません。自分では答えが見つかっていないんです。しかし、この質問は性能に関わることなので、ここで聞いたほうがいいのでしょう。

例えば、空のインジケータにDRAW_SECTIONタイプのバッファを22個追加した場合、1000000本以上のバーを含む1つのチャートでそのようなインジケータを起動すると、何も計算していなくても、ターミナルが大きく遅れ(CPU負荷が大きくなる)、かなりの量のメモリを消費してしまうのです。

他の型のバッファを使用した場合、すべて問題なく動作し、このような速度低下は見られないという事実に興味を持ちました。

例えば、1000000本のバーを持つ1つのチャートで以下のコードを実行したところ、約500MBytesを消費し、特にチャート自体が遅延してしまいました。

#property indicator_chart_window

#property indicator_buffers   22
#property indicator_plots     22

#property indicator_type1     DRAW_SECTION
#property indicator_type2     DRAW_SECTION
#property indicator_type3     DRAW_SECTION
#property indicator_type4     DRAW_SECTION
#property indicator_type5     DRAW_SECTION
#property indicator_type6     DRAW_SECTION
#property indicator_type7     DRAW_SECTION
#property indicator_type8     DRAW_SECTION
#property indicator_type9     DRAW_SECTION
#property indicator_type10     DRAW_SECTION
#property indicator_type11     DRAW_SECTION
#property indicator_type12     DRAW_SECTION
#property indicator_type13     DRAW_SECTION
#property indicator_type14     DRAW_SECTION
#property indicator_type15     DRAW_SECTION
#property indicator_type16     DRAW_SECTION
#property  indicator_type17     DRAW_SECTION
#property  indicator_type18     DRAW_SECTION
#property  indicator_type19     DRAW_SECTION
#property  indicator_type20     DRAW_SECTION
#property  indicator_type21     DRAW_SECTION
#property  indicator_type22     DRAW_SECTION

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{  
   return INIT_SUCCEEDED;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}

しかし、バッファのタイプを例えばDRAW_LINEに変更すると、プロセッサの負荷が劇的に減り、ラグが発生しなくなり、メモリの消費量も5倍(約100MBytes消費)になります。

#property indicator_chart_window

#property indicator_buffers   22
#property indicator_plots     22

#property indicator_type1     DRAW_LINE
#property indicator_type2     DRAW_LINE
#property indicator_type3     DRAW_LINE
#property indicator_type4     DRAW_LINE
#property indicator_type5     DRAW_LINE
#property indicator_type6     DRAW_LINE
#property indicator_type7     DRAW_LINE
#property indicator_type8     DRAW_LINE
#property indicator_type9     DRAW_LINE
#property indicator_type10     DRAW_LINE
#property indicator_type11     DRAW_LINE
#property indicator_type12     DRAW_LINE
#property indicator_type13     DRAW_LINE
#property indicator_type14     DRAW_LINE
#property indicator_type15     DRAW_LINE
#property indicator_type16     DRAW_LINE
#property  indicator_type17     DRAW_LINE
#property  indicator_type18     DRAW_LINE
#property  indicator_type19     DRAW_LINE
#property  indicator_type20     DRAW_LINE
#property  indicator_type21     DRAW_LINE
#property  indicator_type22     DRAW_LINE

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
{  
   return INIT_SUCCEEDED;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}   

同様のテストを2019年のビルドまで、異なるビルドで行いましたが、状況は同じです。

これはどういうことなのか、原理的に普通なのか、教えていただけるとありがたいです。
 
fxsaber:

ある 個人が、広いズボンの中から貴重な MQLコードの複製を 取り出し、同じ条件下で、松葉杖が通常の関数より速く動作することを示した。

とても簡単なテストです。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   TestSymbolInfoTick();
   TestPositionSelectByTicket();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestSymbolInfoTick()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0,counter=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //---
      if(end>max_time)
         max_time=end;
      if(end>100)
        {
         avr_time+=end;
         counter++;
        }
     }
   Print("SymbolInfoTick max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
  }  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestPositionSelectByTicket()
  {
//---
   ulong start,end,max_time=0,avr_time=0,counter=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      GetBid();
      end=GetMicrosecondCount()-start;
      //---
      if(end>max_time)
         max_time=end;
      if(end>100)
        {
         avr_time+=end;
         counter++;
        }
     }
   Print("GetBid max bad time: ",DoubleToString(max_time/1000.0,3)," ms; avr bad time: ",counter ? DoubleToString(avr_time/1000.0/counter,3):"0"," ms; bad iterations: ",counter," total iterations: ",count);
  }

EURUSDに20のExpert Advisor、すなわちすべてのOnTick処理を同時に行う。端末のビルドは2664です。このテストは、最適化、コンパイル、その他の追加ロードなしに、CPU100%で実行されています。このバックグラウンドで、本物の「hft」取引を実行するつもりはないですよね?

典型的なテストログ。

2020.10.29 11:10:49.133 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 28.004 ms; avr bad time: 0.393 ms; bad iterations: 1569 total iterations: 100000
2020.10.29 11:10:49.136 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 4.795 ms; avr bad time: 0.361 ms; bad iterations: 1783 total iterations: 100000
2020.10.29 11:10:49.137 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 25.367 ms; avr bad time: 0.425 ms; bad iterations: 1496 total iterations: 100000
2020.10.29 11:10:49.138 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.681 ms; avr bad time: 0.352 ms; bad iterations: 1804 total iterations: 100000
2020.10.29 11:10:49.139 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.264 ms; avr bad time: 0.370 ms; bad iterations: 1734 total iterations: 100000
2020.10.29 11:10:49.142 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 7.049 ms; avr bad time: 0.362 ms; bad iterations: 1803 total iterations: 100000
2020.10.29 11:10:49.142 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.376 ms; avr bad time: 0.365 ms; bad iterations: 1754 total iterations: 100000
2020.10.29 11:10:49.144 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 18.048 ms; avr bad time: 0.417 ms; bad iterations: 1516 total iterations: 100000
2020.10.29 11:10:49.144 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 21.280 ms; avr bad time: 0.372 ms; bad iterations: 1769 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.631 ms; avr bad time: 0.143 ms; bad iterations: 205 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.134 ms; bad iterations: 170 total iterations: 100000
2020.10.29 11:10:53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.483 ms; avr bad time: 0.144 ms; bad iterations: 178 total iterations: 100000
2020.10.29 11:10:53.838 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.147 ms; bad iterations: 182 total iterations: 100000
2020.10.29 11:10:53.844 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.582 ms; avr bad time: 0.134 ms; bad iterations: 165 total iterations: 100000
2020.10.29 11:10:53.845 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.518 ms; avr bad time: 0.137 ms; bad iterations: 195 total iterations: 100000
2020.10.29 11:10:53.845 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.530 ms; avr bad time: 0.139 ms; bad iterations: 160 total iterations: 100000
2020.10.29 11:10:53.846 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.575 ms; avr bad time: 0.138 ms; bad iterations: 143 total iterations: 100000
2020.10.29 11:10:53.848 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.593 ms; avr bad time: 0.143 ms; bad iterations: 206 total iterations: 100000
2020.10.29 11:10:53.849 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.446 ms; avr bad time: 0.138 ms; bad iterations: 147 total iterations: 100000
2020.10.29 11:10:53.850 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.661 ms; avr bad time: 0.146 ms; bad iterations: 191 total iterations: 100000
2020.10.29 11:10:53.850 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.471 ms; avr bad time: 0.141 ms; bad iterations: 219 total iterations: 100000
2020.10.29 11:10:53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.442 ms; avr bad time: 0.137 ms; bad iterations: 198 total iterations: 100000
2020.10.29 11:10:53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.574 ms; avr bad time: 0.140 ms; bad iterations: 215 total iterations: 100000
2020.10.29 11:10:53.853 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.507 ms; avr bad time: 0.140 ms; bad iterations: 222 total iterations: 100000
2020.10.29 11:10:53.857 SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 0.776 ms; avr bad time: 0.165 ms; bad iterations: 341 total iterations: 100000
2020.10.29 11:10:53.858 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.568 ms; avr bad time: 0.156 ms; bad iterations: 381 total iterations: 100000
2020.10.29 11:10:53.860 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.896 ms; avr bad time: 0.164 ms; bad iterations: 293 total iterations: 100000
2020.10.29 11:10:53.861 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 6.124 ms; avr bad time: 0.178 ms; bad iterations: 219 total iterations: 100000
2020.10.29 11:10:53.862 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.794 ms; avr bad time: 0.164 ms; bad iterations: 356 total iterations: 100000
2020.10.29 11:10:54.686 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.870 ms; avr bad time: 0.339 ms; bad iterations: 1575 total iterations: 100000
2020.10.29 11:10:54.728 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 6.442 ms; avr bad time: 0.343 ms; bad iterations: 1691 total iterations: 100000
2020.10.29 11:10:54.732 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 7.568 ms; avr bad time: 0.349 ms; bad iterations: 1671 total iterations: 100000
2020.10.29 11:10:54.755 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.354 ms; avr bad time: 0.365 ms; bad iterations: 1634 total iterations: 100000
2020.10.29 11:10:54.773 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 9.385 ms; avr bad time: 0.352 ms; bad iterations: 1734 total iterations: 100000
2020.10.29 11:10:54.778 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.526 ms; avr bad time: 0.342 ms; bad iterations: 1748 total iterations: 100000
2020.10.29 11:10:54.785 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.195 ms; avr bad time: 0.356 ms; bad iterations: 1708 total iterations: 100000
2020.10.29 11:10:54.790 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 5.180 ms; avr bad time: 0.347 ms; bad iterations: 1796 total iterations: 100000
 
Anton:

とても簡単なテストです。

EURUSDのEAを20個、つまり全てのOnTick処理を同時に行う。ターミナルビルド2664。このテストは、最適化、コンパイル、その他の追加ワークロードなしに100%のCPUで実行されています。このバックグラウンドで本物の「hft」取引を実行するつもりはないですよね?

典型的なテストログ。

同じtickで1.5秒間に100K回の反復処理を行うことで、温室状態を作り出しているんですね。一方私は、OnTickが発生しないティックを意図的に待ちました。

トレードログを見ると、SymbolInfoTickが数ミリ秒以内に実行されていることに気づきます。そして、その時CPUがフルIdleであったことは100%わかっています。


それはとてもシンプルなことです。条件付きで1日100万匹のダニがいる。0.01%のティックダウンでも、ラグがあれば1日100ティックになります。そんなのナンセンスだと言われそうですが。悪いと言えば悪い。注文時にラグが発生すると、金銭的なロスになる可能性がありますからね。


このブランチが気づかれないように、特にこの機能については、スピードアップのために多くの作業が行われ、非常にありがたいことです。しかし、ある状況下では、ひどい松葉杖が通常の機能を凌駕することがあるというのは、ちょっと驚きでした。そしておそらく、それを整理してそのラグをなくせば、1日100回の潜在的なラグは10回になるはずです。


スレッドの最初の頃に比べれば、だいぶマシになったと言うことです。しかし、よくない時期があることも事実です。そして、調べようとしないのが見え見えです。あなたの選択を尊重します。


上記では、現在の価格を取得するための スナップショットのオプションを挙げました。アイドルCPUのマシンでミリ秒単位のラグをとらなければ、完全に私に合っている。

また、SymbolInfoTickのスピードだけでなく、返す価格の妥当性についても心配です。この問いは出さないんですね。どうやら後で見ることにしたようですね。

 
fxsaber:

同じtickで1.5秒間に100K回の反復処理を行うことで、温室状態を作り出しているんですね。一方、私は、OnTickを生まないtickを具体的に待ちました。

トレードログを確認すると、SymbolInfoTickが数ミリ秒間動作していることに気づきます。その時、CPUがフルIdleであったことは100%わかっています。

それはとてもシンプルなことです。1日に100万匹のダニがいると言われています。0.01%のラグでも、ラグで1日100ティックになります。そんなのナンセンスだと言われそうですが。悪いと言えば悪い。注文時にラグが発生すると、金銭的なロスになる可能性がありますからね。

このブランチが気づかれないように、特にこの機能については、スピードアップのために多くの作業が行われ、非常にありがたいことです。しかし、ある状況下では、ひどい松葉杖が通常の機能を凌駕することがあるというのは、ちょっと驚きでした。そしておそらく、それを整理してそのラグをなくせば、1日100回の潜在的なラグは10回になるはずです。

スレッドの最初の頃に比べれば、だいぶマシになったと言うことです。しかし、よくない時期があることも事実です。そして、調べようとしないのが見え見えです。あなたの選択を尊重します。

上記では、現在の価格を取得するための スナップショットの選択肢を挙げました。アイドルCPUのマシンでミリ秒単位のラグをとらなければ、完全に私に合っている。

また、SymbolInfoTickのスピードだけでなく、返す価格の妥当性についても心配です。この問いは出さないんですね。どうやら後で見ることにしたようですね。

これは決して暖かい条件ではありません。Sleep()などを使わず、20スレッドで同時に100000件の価格要求のループは、明らかなストレステストです。実際の条件では、そんなことはないはずです。

1.5秒後に他のティックが来ないと思うなら - OK、1000万回クエリーを作ってください、それは何も変えません、あなたの「松葉杖」はもっと悪く働きます。
NG      0       10:26:22.903    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 2.223 ms; avr bad time: 0.146 ms; bad iterations: 22369 total iterations: 10000000
OK      0       10:26:22.934    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 1.759 ms; avr bad time: 0.144 ms; bad iterations: 22462 total iterations: 10000000
KO      0       10:26:22.944    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.587 ms; avr bad time: 0.145 ms; bad iterations: 22620 total iterations: 10000000
RS      0       10:26:23.443    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.162 ms; bad iterations: 36242 total iterations: 10000000
LG      0       10:26:23.487    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 9.660 ms; avr bad time: 0.163 ms; bad iterations: 36378 total iterations: 10000000
KH      0       10:26:23.492    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.163 ms; bad iterations: 36208 total iterations: 10000000
HK      0       10:26:23.505    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 14.355 ms; avr bad time: 0.164 ms; bad iterations: 36292 total iterations: 10000000
QN      0       10:27:26.728    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 18.589 ms; avr bad time: 0.373 ms; bad iterations: 122026 total iterations: 10000000
HQ      0       10:27:27.042    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 15.544 ms; avr bad time: 0.371 ms; bad iterations: 123026 total iterations: 10000000
RD      0       10:27:29.190    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 16.207 ms; avr bad time: 0.370 ms; bad iterations: 127228 total iterations: 10000000
QJ      0       10:27:32.661    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.465 ms; avr bad time: 0.495 ms; bad iterations: 994 total iterations: 10000000
CL      0       10:27:32.799    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 16.999 ms; avr bad time: 0.585 ms; bad iterations: 1081 total iterations: 10000000
EP      0       10:27:33.056    SymbolInfoTick (EURUSD,H1)      SymbolInfoTick max bad time: 11.774 ms; avr bad time: 0.515 ms; bad iterations: 1122 total iterations: 10000000
EE      0       10:27:33.555    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.385 ms; avr bad time: 0.368 ms; bad iterations: 134761 total iterations: 10000000
FG      0       10:27:35.581    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 10.428 ms; avr bad time: 0.502 ms; bad iterations: 373 total iterations: 10000000
CJ      0       10:27:46.372    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.278 ms; avr bad time: 0.360 ms; bad iterations: 153668 total iterations: 10000000
QO      0       10:27:46.819    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 12.494 ms; avr bad time: 0.361 ms; bad iterations: 154170 total iterations: 10000000
KP      0       10:27:46.897    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.176 ms; avr bad time: 0.362 ms; bad iterations: 154258 total iterations: 10000000
PE      0       10:27:47.560    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.090 ms; avr bad time: 0.362 ms; bad iterations: 156325 total iterations: 10000000
LF      0       10:27:47.946    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.794 ms; avr bad time: 0.367 ms; bad iterations: 160557 total iterations: 10000000
IH      0       10:27:47.970    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.241 ms; avr bad time: 0.366 ms; bad iterations: 160307 total iterations: 10000000
KN      0       10:27:51.026    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.961 ms; avr bad time: 0.333 ms; bad iterations: 687 total iterations: 10000000
FP      0       10:27:51.517    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.844 ms; avr bad time: 0.372 ms; bad iterations: 165266 total iterations: 10000000
LE      0       10:27:51.574    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.435 ms; avr bad time: 0.371 ms; bad iterations: 165785 total iterations: 10000000
QE      0       10:27:51.686    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 13.601 ms; avr bad time: 0.371 ms; bad iterations: 166278 total iterations: 10000000
CK      0       10:27:52.204    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.480 ms; avr bad time: 0.374 ms; bad iterations: 161441 total iterations: 10000000
FL      0       10:27:52.262    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.503 ms; avr bad time: 0.374 ms; bad iterations: 161363 total iterations: 10000000
FQ      0       10:27:52.504    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.440 ms; avr bad time: 0.375 ms; bad iterations: 161927 total iterations: 10000000
KQ      0       10:27:52.507    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 20.155 ms; avr bad time: 0.375 ms; bad iterations: 161670 total iterations: 10000000
EG      0       10:27:52.558    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.634 ms; avr bad time: 0.371 ms; bad iterations: 167511 total iterations: 10000000
OK      0       10:27:52.751    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.698 ms; avr bad time: 0.368 ms; bad iterations: 168482 total iterations: 10000000
LL      0       10:27:53.941    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.659 ms; avr bad time: 0.364 ms; bad iterations: 171194 total iterations: 10000000
JP      0       10:27:58.244    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 12.019 ms; avr bad time: 0.308 ms; bad iterations: 970 total iterations: 10000000
OD      0       10:27:58.879    SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.972 ms; avr bad time: 0.299 ms; bad iterations: 1094 total iterations: 10000000
CE      0       10:28:06.402    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.140 ms; avr bad time: 0.342 ms; bad iterations: 56289 total iterations: 10000000
EK      0       10:28:06.860    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 14.013 ms; avr bad time: 0.344 ms; bad iterations: 56008 total iterations: 10000000
QL      0       10:28:06.922    SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.626 ms; avr bad time: 0.343 ms; bad iterations: 56676 total iterations: 10000000
ER      0       10:28:07.010    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.021 ms; avr bad time: 0.340 ms; bad iterations: 51610 total iterations: 10000000
ER      0       10:28:08.708    SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.970 ms; avr bad time: 0.317 ms; bad iterations: 24083 total iterations: 10000000

あなたのこの発言は100%嘘です。

Просматривая логи своей торговли, замечаю исполнение SymbolInfoTick в течение нескольких миллисекунд. При этом на 100% знаю, что в этот момент был полный Idle CPU.

ちょうど、あなたのこの前の発言のように。

Уверен, что могу доказать, что получение текущих цен у Вас реализовано очень медленно. И CPU-нагрузка создает такие тормоза только из-за неправильной реализации Вами самой главной функции в MQL5.

SymbolInfoTick による価格へのアクセスは非常に高速になり、ティック ストリーム処理から完全に切り離されました。あなたは、非常にまばらに、かつ迅速に更新される既製の価格キャッシュを使用しているのです。

0.01%のティックレートの遅さ」はすべてストレステスト条件下でしか現れず、素晴らしい結果となっています。通常の環境下では、非常に高速なアクセスが保証されています。

もしあなたが、SymbolInfoTickを「高速化するために多くの作業が行われた」と認めるなら、PositionSelectByTicketを介して価格を取得するという「松葉杖」が、より良い解決策になり得ないことを信じてください。

理由は簡単で、PositionSelectByTicketの実装は、SymbolInfoTickのオリジナルの「遅い」実装と完全に同じだからです。

上に書いたように、この実装は文字通りの意味で遅いわけではないのですが、CPU負荷が高い状態では、ランタイムアウトライアの発生確率が高くなります(これは前回のテストではっきりわかりました)。

このタイミングは、負荷のかかった状態で動作するシステムのタスクスケジューラに大きく依存するため、OSごとに、さらにはバージョンごとに違いがある可能性があります。

そして、負荷が重くなればなるほど、端末ではなくタスクスケジューラの性能をテストすることになります。

以上でSymbolInfoTickの性能に関する話題は終わりです。

もし、あなたの専門家が合成ストレステストのレベルの負荷を作成する場合、一つの解決策があります:「鉄はタスクに一致しなければならない」。

 

SymbolInfoTickで与えられるティックの関連性について疑問があります。

シチュエーション

1.TimeCurretn()を実行すると、時刻は 18:00:00となる。

2.ラベルのないシンボルに対してSymbolInfoTickを実行する。17:58:00という時刻のテロップが表示されます。

3.スリープ(1)

4.左以外のシンボルのSymbolInfoTickを追加します。17:59:00という 時刻のテロップが表示されます。


すなわち、4番目の項目で、TimeCurretn() と1分違いの新しいティックを表示しているのです。

この状況に問題はないのでしょうか?

どうすればこのような状況に陥ることが少なくなるのでしょうか?

 
pivomoe:

SymbolInfoTickで与えられるティックの関連性について疑問があります。

シチュエーション

1.TimeCurretn()を実行すると、時刻は18:00:00となる。

2.ラベルのないシンボルに対してSymbolInfoTickを実行する。17:58:00という時刻のテロップが表示されます。

3.スリープ(1)

4.左以外のシンボルのSymbolInfoTickを追加します。17:59:00という 時刻のテロップが表示されます。


すなわち、4番目の項目で、TimeCurretn() と1分違いの新しいティックを表示しているのです。

この状況に問題はないのでしょうか?

どうすればこのような状況に陥ることが少なくなるのでしょうか?

SymbolInfoTick は、ブローカーサーバーから受信したデータを送信する。サーバーが送信したものが、あなたが受け取るものです。

ブローカーが放送しているティックストリームに疑問がある場合は、ブローカーに問い合わせる必要があります。