MT5 et la vitesse en action - page 86

 
fxsaber:

@Anton, dans de nombreuses fonctions standard, vous pouvez spécifier NULL au lieu d'un caractère. Cela affecte-t-il la vitesse d'exécution ?

Ou cela ne fait-il aucune différence pour le Terminal/Tester ?

Les entrées Symbol(), _Symbol sont équivalentes à NULL (où NULL est autorisé à la place d'un nom de symbole).

Dans ce cas, il n'y a pas de vérification supplémentaire de l'existence du symbole courant, de la présence du symbole courant dans le Market Watch et de l'appel inutile des propriétés du symbole courant, car les propriétés du caractère courant sont mises en cache.

C'est-à-dire que si vous spécifiez un simple paramètre de type chaîne de caractères au lieu de Symbol(), _Symbol ou NULL, le programme complet sera vérifié et les propriétés seront toujours demandées.

 
Slava:

Symbol(), les entrées _Symbol sont équivalentes à NULL (où NULL est autorisé à la place du nom du symbole).

Dans ce cas, il n'y a pas de vérification inutile de l'existence du symbole courant, de la présence du symbole courant dans Market Watch et d'appel inutile des propriétés du symbole courant, puisque les propriétés du symbole courant sont mises en cache.

Slava, pouvez-vous commenter : pour les actions, le prix du tick dans la spécification du symbole est défini sur '0'. Et voici ce que dit le support :

"J'ai reçu la confirmation du service technique. Veuillez noter qu'il n'est pas possible d'indiquer le paramètre "tick price" pour l'action. La valeur par défaut est de 0.
Merci de nous avoir contactés !"


Est-ce vraiment le cas ? Dans les spécificités du symbole, il est indiqué que le prix du tick est égal à zéro uniquement pour les actions ?

 
Vladimir Karputov:

Slava, pouvez-vous commenter : sur l'action, le prix du tick dans la spécification du symbole est défini sur '0'. Et voici ce que dit le support :

"J'ai reçu la confirmation du service technique. Veuillez noter qu'il n'est pas possible de remplir le paramètre "Tick price" pour l'action. La valeur par défaut est de 0.
Merci de nous avoir contactés !"


Est-ce vraiment le cas ? Dans les spécificités du symbole, il est indiqué que le prix du tick est égal à zéro uniquement pour les actions ?

Oui. Il y a des nuances.

Lorsque le zéro est exposé, vous devez faire le calcul vous-même. Demandez la formule à votre courtier

 
fxsaber:

Le problème de l'obtention de ticks tardifs sans sauts est maintenant résolu uniquement par CopyTicks*. Il s'agit d'un mécanisme très lourd pour ce problème très répandu.

Au fait, d'après les journaux récents de la dernière version de MT5 :

Time[Main.mqh 162 in ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 704931 mcs.
Time[Main.mqh 162 in ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 704684 mcs.
Time[Main.mqh 162 in ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 704425 mcs.

Il accrochait 3 EAs sur un symbole, chacun sur son propre graphique. Et la demande continue à chaque tic. De tels pics sont bien sûr peu fréquents, mais en fait 1 demande de nouveaux ticks, provenant du dernier tick, était de 700 ms.

 
Renat Fatkhullin:

Ce n'est pas le cas.

Vous trouverez toujours des retards aléatoires dans n'importe quel programme. Commencez à garder une trace de tout et vous serez horrifié par les réalités de Windows. Je l'ai déjà expliqué en détail à plusieurs reprises.

À un moment donné, nous avons nous aussi été étonnés de voir des rafales aléatoires de 60-80 ms au lieu de 0 ms sur les fonctions WinAPI du système.


Nous sommes en train de migrer en masse la plupart de nos solutions Windows vers des versions Core de Windows Server 2019 spécialement écrémées, et les projets web.NET Core vers Linux. Cela permet de réaliser des économies considérables en termes de ressources système et de réduire considérablement la latence du système.

La première étape de l'écrémage des terminaux MataTrader 5 a consisté à mettre en place un gestionnaire de tâches pour suivre à la volée la consommation des ressources. Pour nous-mêmes, nous recueillons davantage d'informations.

Il est déjà clair que nous le sommes :

  • une rétention trop longue des flux inutiles
  • sur-échantillonnage
  • Dépassement des caches.
Dans la prochaine version, nous corrigerons certains problèmes de ressources étape par étape.

Ce ne serait pas bien d'avoir un terminal basé sur linux également ))))

 
Slava:

Oui. Il y a des nuances.

Si vous avez zéro, vous devez le calculer vous-même. Demandez la formule à votre courtier.

Tout est correct avec SymbolInfoXXXX. La question était de savoir pourquoi ils disent que "0" est défini pour les actions dans la spécification. Ils disent que c'est clair - une coche égale un centime. Mais ce n'est pas la raison pour laquelle il faut mettre "0" dans la spécification ?

 
fxsaber:

À l'intérieur de la fonction, vous devez encore sauter au caractère de coche correspondant. C'est le moment d'analyser la variable de la chaîne. Il n'est pas nécessaire de le faire avec NULL.

Je l'ai vérifié à ce moment-là et je n'ai pas constaté de différence de vitesse significative. Vous pouvez le vérifier vous-même

 
Slava:

Si un paramètre normal de chaîne de caractères est spécifié au lieu de Symbol(), _Symbol ou NULL, alors le programme complet est vérifié et les propriétés sont également interrogées.

Merci pour l'information ! Il s'avère que c'est mieux de le faire de cette façon :

// Быстрый SymbolInfoTick.
bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}
 
fxsaber:

Merci pour ces informations ! Il s'avère que c'est mieux de le faire de cette façon :

Même sans les détails techniques, je ne pouvais pas imaginer comment vous pourriez faire différemment dans vos fonctions...

En quoi cette construction devrait-elle être plus rapide que la méthode standard SymbolInfoTick()?

 
Artyom Trishkin:

Comment cette construction est-elle censée être plus rapide que la méthode standard SymbolInfoTick()?

Plus vite.

Raison: