MT5 et la vitesse en action - page 63

 
fxsaber:

Chers développeurs, pourriez-vous me dire comment est calculé MQL_MEMORY_USED ?

J'ai fait un calcul de la mémoire qu'occupent toutes les variables EA.

Il est inférieur à 10%. Si je comprends bien, MQL_MEMORY_USED inclut le cache de l'historique et le cache des CopyTicks. Mais c'est toujours beaucoup moins.

Dans le même temps, le conseiller expert parallèle consomme plusieurs fois moins. Mais le principe est le même.

En général, qu'est-ce qui est inclus dans cette valeur ?


J'ai enregistré un modèle avec Expert Advisor et je l'ai appliqué au même graphique en provoquant un rechargement. Je l'ai vu comme ça.

L'utilisation de la mémoire a changé de près d'un ordre de grandeur. Jusqu'à présent, il est difficile d'expliquer ce que cela signifie.

De nombreux programmes ont un effet cumulatif sur l'utilisation de la mémoire. C'est un péché des navigateurs et parfois même de Word. Le terminal peut également s'en rendre coupable. De plus, tous les journaux sont écrits par défaut et il est facile de passer une semaine si vous avez trop d'actions dans un giga. C'est un mal qu'il faut gérer. Mais il n'est pas clair comment.

 
Vladimir Pastushak:

Peut-être savez-vous comment sélectionner par programme un instrument financier et ne pas rester bloqué pendant des heures ?

Par le biais d'un indicateur

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

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

MT5 et la vitesse en action

Renat Fatkhullin, 2020.10.14 04:15

Pour le tic-tac de masse, mettez plus de mémoire.

4gb (prix 20€) n'est pas bon en 2020 quand il s'agit d'analyse et de recherche.

Pour les produits du marché, cette approche n'est bonne nulle part. Nous devons contourner la rétention de 10 secondes de données inutiles grâce à une telle béquille.

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

La création d'un produit de marché trivial sous la forme d'un Market Screener n'est en fait pas une tâche réalisable pour MT5 en raison de la consommation excessive de mémoire.

 
fxsaber:

La création d'un produit de marché trivial sous la forme d'un Market Screener n'est en fait pas une tâche réalisable pour le MT5 en raison de la consommation excessive de mémoire.

Le terminal consomme beaucoup de mémoire après le lancement.

Après l'exécution du screener il a commencé à manger 2 gigs (TERMINAL_MEMORY_USED et n'a pas diminué avec le temps). Ceci avec un seul graphique ouvert pour 5000 barres M1.


Je n'ai pas enregistré de capture d'écran. Mais j'ai décidé de donner un exemple, qui montre que le terminal de consommation de mémoire n'est pas en soi, où c'est juste stupide.

// Создание копий оригинальных символов из Обзора рынка в виде пользовательских.
#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);
        }
       }
    }
  }
}


Le script fait simplement des copies des symboles originaux du Market Watch. J'étais censé ajouter tous les symboles sur MQ-Demo et exécuter ce script une première fois à froid, puis une seconde fois à chaud.

Et après l'exécution à chaud (lorsque les tics sont déjà sur le SSD sous la forme de fichiers tkc), j'observerai un énorme épuisement de la mémoire là où il n'est pas nécessaire dans une mise en œuvre correcte.


Cependant, en exécutant le script, j'ai constaté qu'il se bloque sur MQ-Demo. Il ne peut être déchargé que par une terminaison anormale, après quoi le terminal ne libère pas plus de 1 Go de mémoire.


Il est facile de comparer cette capture d'écran avec celle du début.

 

Désolé, je ne sais pas si c'est un bug ou une fonctionnalité. Je n'ai pas trouvé de réponse par moi-même. Mais la question est liée aux performances et je suppose qu'il est préférable de la poser ici.

Si nous ajoutons, par exemple, 22 tampons de type DRAW_SECTION à un indicateur vide, alors au démarrage d'un tel indicateur pour un graphique contenant 1000000 barres ou plus, le terminal accuse un retard significatif (il provoque une charge CPU importante) et consomme des quantités importantes de mémoire, même si l'indicateur ne calcule rien.

Mon intérêt a été éveillé par le fait que si vous utilisez des tampons avec d'autres types, tout fonctionne sans problème et un tel ralentissement n'est pas observé.

Par exemple, j'ai exécuté le code suivant sur un seul graphique avec 1000000 barres et il a consommé environ 500 MBytes et traîne, surtout le graphique lui-même.

#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;
}

Mais si je change le type de tampon pour, disons, DRAW_LINE, la charge sur le processeur est réduite de façon spectaculaire, les décalages ne sont pas observés, et la mémoire consomme 5 fois moins (environ 100 MBytes consommés).

#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;
}   

Des tests similaires ont été effectués sur différentes builds, jusqu'aux builds 2019 et la situation est la même.

Je serais reconnaissant de savoir de quoi il s'agit et si c'est normal, en principe ?
 
fxsaber:

Un citoyen a sorti de son pantalon largeun double d'une précieuse charge de code MQL, qui montrait que, dans les mêmes conditions, la béquille fonctionnait plus vite que la fonction régulière.

Un test très simple :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }

20 Expert Advisors sur EURUSD, c'est-à-dire tous les processus OnTick simultanément. La construction du terminal est de 2664. Le test est exécuté sans optimisation, compilation et autres charges supplémentaires à 100 % du processeur - vous n'allez pas exécuter une véritable transaction "hft" sur ce fond, n'est-ce pas ?

Journal d'essai typique :

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:

Un test très simple :

20 EAs sur EURUSD, c'est-à-dire tous les processus OnTick en même temps. Terminal build 2664. Le test est exécuté sans optimisation, compilation et autre charge de travail supplémentaire sur un CPU à 100% - vous n'allez pas exécuter un véritable trading "hft" sur ce fond, n'est-ce pas ?

Journal d'essai typique :

Vous créez des conditions de serre en effectuant 100 000 itérations pendant 1,5 seconde sur le même tick. D'autre part, j'ai volontairement attendu des ticks qui ne généraient pas de OnTick.

En examinant mes journaux de transactions, je remarque que l'exécution de SymbolInfoTick se fait en quelques millisecondes. Et je sais à 100% que le processeur était en veille à ce moment-là.


C'est très simple. Il y a conditionnellement 1 million de tiques par jour. Même un ralentissement de 0,01% des ticks représente 100 ticks par jour avec des décalages. Vous direz que c'est absurde. Je dirai que c'est mauvais. Si je rencontre un retard lorsque je dois passer une commande, c'est une perte monétaire potentielle.


Très reconnaissant que cette branche ne passe pas inaperçue, et sur cette fonctionnalité en particulier, beaucoup de travail a été fait pour accélérer les choses. Cependant, j'ai été un peu surpris de constater que l'horrible béquille pouvait surpasser la fonction régulière dans certaines situations. Et peut-être qu'en faisant le tri et en éliminant ce décalage, les 100 décalages potentiels par jour se transformeraient en 10.


Je dis que c'est bien mieux qu'au début du fil. Mais le fait est qu'il y a des moments où ce n'est pas bon. Et je vois que tu ne veux pas y réfléchir. Je respecte votre choix.


Nous avons cité plus haut l'option de l'instantané pour obtenir les prix actuels. Cela me conviendrait parfaitement s'il n'y avait pas de décalage de quelques millisecondes sur la machine à processeur inactif.

Je m'inquiète également non seulement de la vitesse de SymbolInfoTick, mais aussi de la pertinence des prix qu'il renvoie. Je vois que vous ne soulevez pas cette question. Apparemment, vous avez décidé de le regarder plus tard.

 
fxsaber:

Vous créez des conditions de serre en effectuant 100 000 itérations en 1,5 seconde sur le même tick. D'un autre côté, j'ai spécifiquement attendu les ticks qui ne génèrent pas de OnTick.

En examinant mes journaux de transactions, je remarque que SymbolInfoTick fonctionne pendant quelques millisecondes. Je sais à 100% que le processeur était complètement inactif à ce moment-là.

C'est très simple. En une journée, il y a conditionnellement 1 million de tiques. Même un décalage de 0,01 % représente 100 ticks par jour avec des décalages. Vous direz que c'est absurde. Je dirai que c'est mauvais. Si je rencontre un retard lorsque je dois passer une commande, c'est une perte monétaire potentielle.

Très reconnaissant que cette branche ne passe pas inaperçue, et sur cette fonctionnalité en particulier, beaucoup de travail a été fait pour accélérer les choses. Cependant, j'ai été un peu surpris de constater que l'horrible béquille pouvait surpasser la fonction régulière dans certaines situations. Et peut-être qu'en faisant le tri et en éliminant ce décalage, les 100 décalages potentiels par jour se transformeraient en 10.

Je dis que c'est bien mieux qu'au début du fil. Mais le fait est qu'il y a des moments où ce n'est pas bon. Et je vois que tu ne veux pas y réfléchir. Je respecte votre choix.

Nous avons cité plus haut l'option de l'instantané pour obtenir les prix actuels. Cela me conviendrait parfaitement s'il n'y avait pas de décalage de quelques millisecondes sur la machine à processeur inactif.

Je m'inquiète également non seulement de la vitesse de SymbolInfoTick, mais aussi de la pertinence des prix qu'il renvoie. Je vois que vous ne soulevez pas cette question. Apparemment, vous avez décidé de le regarder plus tard.

Ce ne sont pas du tout des conditions chaudes. Une boucle pour 100000 demandes de prix sans Sleep() et autres et dans 20 threads simultanément est un test de stress évident. Rien de tout cela ne devrait être proche en conditions réelles.

Si vous pensez qu'il n'y a pas d'autres tics à venir dans 1,5 seconde - ok, faites 10 millions de requêtes, cela ne changera rien, votre "béquille" fonctionne moins bien :
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

Cette affirmation est fausse à 100% :

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

Tout comme votre précédente déclaration :

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

L'accès aux prix via SymbolInfoTick est maintenant très rapide et complètement découplé du traitement des flux de tick. Vous travaillez avec un cache prix prêt à l'emploi, qui est mis à jour très parcimonieusement et rapidement.

Tous les "ralentissements du taux de tic-tac de 0,01 %" ne se manifestent que dans des conditions de test de stress, et c'est un excellent résultat. Dans des conditions normales, l'accès est garanti très rapide.

Si vous admettez que "beaucoup de travail a été fait pour accélérer" SymbolInfoTick, alors vous devriez me croire que la "béquille" consistant à obtenir les prix via PositionSelectByTicket ne peut pas être une meilleure solution.

Pour une raison simple : l'implémentation de PositionSelectByTicket est complètement identique à l'implémentation "lente" originale de SymbolInfoTick.

Comme je l'ai écrit plus haut, cette implémentation n'est pas lente au sens littéral du terme, mais sous une forte charge CPU, elle a une probabilité plus élevée d'apparition d'aberrations d'exécution (ce qui est clairement visible dans mon dernier test).

Les délais dépendent fortement du planificateur de tâches du système fonctionnant sous charge, c'est-à-dire qu'il peut y avoir des différences d'un système d'exploitation à l'autre et même d'une version à l'autre.

Et plus la charge est lourde, plus vous testez les performances du planificateur de tâches, et non du terminal.

C'est la fin du sujet sur la performance de SymbolInfoTick.

Si vos experts créent une charge du niveau des tests de stress synthétiques, il existe une solution : "le fer doit correspondre aux tâches".

 

J'ai une question sur la pertinence des ticks donnés par SymbolInfoTick.

Situation :

1. Nous faisons TimeCurretn() ; nous obtenons le temps 18:00:00

2. Effectuer SymbolInfoTick sur un symbole invalide. Nous obtenons un tic-tac avec l'heure 17:58:00.

3. Sommeil(1)

4. Ajoute un SymbolInfoTick pour le symbole non gauche. Nous obtenons un tick avec l'heure 17:59:00.


C'est-à-dire que dans le quatrième élément, nous avons un nouveau tick, qui est différent d'une minute de TimeCurretn().

Voyez-vous un problème dans cette situation ?

Comment se retrouver moins souvent dans cette situation ?

 
pivomoe:

J'ai une question sur la pertinence des ticks donnés par SymbolInfoTick.

Situation :

1. Nous faisons TimeCurretn() ; nous obtenons le temps 18:00:00

2. Effectue SymbolInfoTick sur un symbole non étiqueté. Nous obtenons un tic-tac avec l'heure 17:58:00.

3. Sommeil(1)

4. Ajoute un SymbolInfoTick pour le symbole non gauche. Nous obtenons un tick avec l'heure 17:59:00.


C'est-à-dire que dans le quatrième élément, nous avons un nouveau tick, qui est différent d'une minute de TimeCurretn().

Voyez-vous un problème dans cette situation ?

Comment se retrouver moins souvent dans cette situation ?

SymbolInfoTick envoie les données reçues du serveur du courtier. Ce que le serveur a envoyé est ce que vous recevez.

Si vous avez des questions sur le flux de tic-tac diffusé par votre courtier, vous devez contacter votre courtier.

Raison: