MT5 et la vitesse en action - page 89

 
Peut-être qu'il suffit de faire quelques tests pour que les questions disparaissent ?
 
traveller00:
Peut-être qu'il suffit de faire quelques tests pour que les questions disparaissent ?

Peut-être. J'aimerais avoir plus de temps pour faire les tests moi-même :(

 
traveller00:
Peut-être qu'il suffit de faire quelques tests pour que les questions disparaissent ?

Les tests ne montrent une différence que la première fois que vous commencez.

 
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 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 un paramètre normal de chaîne de caractères est spécifié au lieu de Symbol(), _Symbol ou NULL, alors les vérifications pour le programme complet et les appels de propriétés supplémentaires

Question :

   string symbol=_Symbol;
   SymbolInfoInteger(symbol,...)
   SymbolInfoInteger(NULL,...)

- Le comportement des appels SymbolInfoXXX dans ces deux cas diffère-t-il de plus d'une vérification ?

symbol==_Symbol

?

 
traveller00:

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

Il s'agissait de 3 EAs planant 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, une demande de nouveaux ticks provenant du dernier tick a été exécutée 700 ms.

Je surveille depuis environ 12 heures, mais je vois déjà les décalages franchir toutes les limites.

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

3 EAs, chacun sur son propre graphique, tous sur 1 symbole, demandent les anciens ticks du tick précédent via CopyTicksRange. Et le décalage est de presque 9 secondes. Et il semble que ce ne soit pas la limite. Il est fort probable que le magasin de tics soit une ressource partagée dont l'accès est synchronisé, mais même avec une très mauvaise synchronisation, de tels délais ne devraient pas exister.

Certains diront que c'est un problème ponctuel. Pendant ces 12 heures de surveillance, il y a malheureusement eu plus d'une centaine de sorties d'une seconde. Et cela ne ressemble plus à des explosions ponctuelles. Il semble qu'il y avait souvent plusieurs ticks entrant en même temps, ce qui est la cause de ces pics.

Même si nous fermons les yeux sur le fait que 3 EA se sont battues pour une ressource commune, regardons l'autre contrôle :

ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 1401285 mcs.

Il n'y avait qu'un seul conseiller expert sur le symbole. Et encore une seconde et demie. Ce n'était pas le seul, il y avait d'autres EA sur d'autres symboles, mais n'est-il pas multithread ? Ou bien des tics pour des symboles différents peuvent encore se ralentir mutuellement ?

Il s'agit d'une fonctionnalité de base pour les EA de base. La plateforme se positionne comme une plateforme de trading algorithmique. Cela dit, la fonctionnalité de base soulève de fortes questions. Je vous demande de le réexaminer. Je suis presque sûr qu'il est possible de l'améliorer quelque part. Ou je serais très reconnaissant de pouvoir obtenir les derniers ticks depuis que la fonction a été appelée, comme suggéré ici.

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

MT5 et la vitesse en action

fxsaber, 2021.03.01 07:28

Veuillez réfléchir à une telle fonctionnalité.

int SymbolInfoTicks( const string Symb, MqlTick &Ticks[] ); // Возвращает свежие тики (не более сотни), пришедшие с предыдущего вызова этой функции.


Le problème de l'obtention de NOUVEAUX ticks sans sauts est maintenant résolu uniquement par CopyTicks*. C'est un mécanisme très lourd pour cette tâche très répandue. C'est comme tirer des oiseaux avec un canon.

D'où les freins, la conservation d'énormes caches, etc.

 

Minimisation du nombre d'appels à SymbolInfoTick et CopyTicksRange :

  • Instantané SymbolInfoTick - pas appelé plus souvent qu'une fois tous les 100µs.
  • La CopyTicksRange pour les ticks frais n'est appelée que si, effectivement, un nouveau tick est arrivé dans la Market Watch.


Le terminal et la machine (fichier swap désactivé) avec cette charge.


En conséquence, il a été possible de réduire considérablement le nombre de messages de retard (moins d'appels ont été effectués) des fonctions régulières.


Journal de bord pendant 50 minutes :

2021.03.05 19:31:45.429 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 154 mcs.
2021.03.05 19:32:58.939 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 161 mcs.
2021.03.05 19:33:01.583 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 19:36:01.682 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 143 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 234 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 913 mcs.
2021.03.05 19:39:08.716 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 139 mcs.
2021.03.05 19:39:30.994 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 315 mcs.
2021.03.05 19:39:32.858 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 114 mcs.
2021.03.05 19:40:41.437 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 19:42:26.104 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 116 mcs.
2021.03.05 19:42:28.849 ::SymbolInfoTick(_Symbol,Tick)] = 109 mcs.
2021.03.05 19:43:10.977 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 481 mcs.
2021.03.05 19:43:53.945 ::SymbolInfoTick(_Symbol,Tick)] = 130 mcs.
2021.03.05 19:49:20.352 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 19:51:31.242 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 19:51:44.986 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 107 mcs.
2021.03.05 19:52:05.590 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 219 mcs.
2021.03.05 19:53:56.013 ::SymbolInfoTick(_Symbol,Tick)] = 236 mcs.
2021.03.05 19:55:41.453 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 105 mcs.
2021.03.05 19:55:47.109 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 148 mcs.
2021.03.05 19:55:47.110 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 265 mcs.
2021.03.05 19:59:26.011 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 186 mcs.
2021.03.05 20:00:01.569 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 117 mcs.
2021.03.05 20:01:19.704 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 109 mcs.
2021.03.05 20:02:07.285 ::SymbolInfoTick(_Symbol,Tick)] = 177 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 198 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 202 mcs.
2021.03.05 20:04:40.170 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 364 mcs.
2021.03.05 20:04:45.905 ::SymbolInfoTick(_Symbol,Tick)] = 143 mcs.
2021.03.05 20:04:45.906 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 20:04:45.907 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 504 mcs.
2021.03.05 20:04:48.259 ::SymbolInfoTick(_Symbol,Tick)] = 104 mcs.
2021.03.05 20:04:54.727 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 104 mcs.
2021.03.05 20:05:39.642 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 20:07:40.189 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 20:09:21.844 ::SymbolInfoTick(_Symbol,Tick)] = 115 mcs.
2021.03.05 20:09:32.422 ::SymbolInfoTick(_Symbol,Tick)] = 107 mcs.
2021.03.05 20:10:02.423 ::SymbolInfoTick(_Symbol,Tick)] = 128 mcs.
2021.03.05 20:15:48.838 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 149 mcs.
2021.03.05 20:16:36.001 ::SymbolInfoTick(_Symbol,Tick)] = 105 mcs.
2021.03.05 20:17:51.499 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 480 mcs.
2021.03.05 20:17:51.638 ::SymbolInfoTick(_Symbol,Tick)] = 342 mcs.
2021.03.05 20:17:52.802 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 429 mcs.
2021.03.05 20:17:53.340 ::SymbolInfoTick(_Symbol,Tick)] = 142 mcs.
2021.03.05 20:19:21.512 ::SymbolInfoTick(_Symbol,Tick)] = 122 mcs.
2021.03.05 20:20:35.836 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 116 mcs.


Ça n'a pas l'air trop mal. Il n'y a pas eu de transactions commerciales. Et eux, je vais voir.


CEPENDANT, le fragment mis en évidence montre que trois EAs (différents personnages) ont été décalés presque simultanément. C'est-à-dire que le décalage est universel pour le terminal.

 
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 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.

En d'autres termes, si vous spécifiez un simple paramètre de type chaîne de caractères au lieu de Symbol(), _Symbol ou NULL, des vérifications sont effectuées pour le programme complet et d'autres propriétés de la requête.

Veuillez expliquer à nouveau, car les utilisateurs du forum interprètent différemment vos propos.

 

Dans le terminal avec un EA/chart/symbole.


2021.03.05 23:02:02.860 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 189 mcs.
2021.03.05 23:02:24.152 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 339 mcs.
2021.03.05 23:02:53.540 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 915 mcs.
2021.03.05 23:05:35.325 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 223 mcs.
2021.03.05 23:05:41.398 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 245 mcs.
2021.03.05 23:05:44.585 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 376 mcs.
2021.03.05 23:06:35.210 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 173 mcs.
2021.03.05 23:07:38.298 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 290 mcs.
2021.03.05 23:08:50.342 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 23:14:58.216 ::SymbolInfoTick(_Symbol,Tick)] = 447 mcs.

Un tel journal en 15 minutes. Il semble que ce soit une question de lenteur de Windows après tout. Dans ce cas, c'est le cas.

2021.03.05 23:49:20.792 Terminal        MetaTrader 5 x64 build 2815 started for MetaQuotes Software Corp.
2021.03.05 23:49:20.792 Terminal        Windows Server 2019 build 17763, Intel Core i7-7700 K  @ 4.20 GHz, 17 / 31 Gb memory, 3698 / 3725 Gb disk, IE 11, RDP, UAC, GMT+2
 

Un exemple clair des freins que provoque Market Watch.

Regardez les valeurs de la colonne Processeur (deuxième à partir de la droite).

 
Au décalage du serveur s'ajoute le décalage du terminal.

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

Indicateurs : Ping

fxsaber, 2021.03.12 10:56

Je viens de me souvenir de cet excellent indicateur.

C'est une photo de la machine avec un ping nul. Il s'avère que le décalage interne du terminal est en moyenne de ~2ms. Il oscille entre 0 et 9 ms.


Par exemple, le serveur a reçu deux ticks : le premier, puis le second après 10 ms. Ainsi, en terminal, le deuxième tic-tac peut être reçu non pas 10 ms après le premier, mais 10-19 ms après. En moyenne, il est 12 ms plus tard.

Si vous négociez à partir du marché (marges de marché ou ordres en attente au prix actuel), il sera particulièrement difficile à gérer. Il est difficile de dire si les développeurs seront en mesure d'améliorer quoi que ce soit ici.

Si l'on regarde la bourse de Moscou, la situation y est similaire. En fait, en négociant par l'intermédiaire de l'algo MT5, vous êtes presque assuré d'être à la fin de la file d'attente d'exécution, n'ayant pas le temps d'aller chercher les bonnes choses, malheureusement.

Акцептирование SL/TP-ордеров
Акцептирование SL/TP-ордеров
  • 2020.11.24
  • www.mql5.com
В этой ветке пойдет речь об ордерах, которые создаются в результате срабатывания SL/TP-уровней открытых позиций...