MT5 et la vitesse en action - page 16

 
fxsaber:

Il serait intéressant de comparer le même script avec d'autres plateformes de trading.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Seulement trois glissades, et elles n'apparaissaient que très rarement. Il est probablement difficile de créer un frein car il n'y a pas de HistorySelect et de CopyTicks.

 
Fast235:

Ils sont donc tous les deux Haswell, le xeon a une fréquence de fonctionnement beaucoup plus basse, il y aura une dégradation des performances dans les tests de performance et les tests simples, seulement dans l'optimisation multi-fil sera un avantage. Le i3 des derniers modèles devrait être beaucoup plus rapide à faire fonctionner

Demandez aux développeurs l'effet du niveau de cache sur la vitesse et, en général, la vitesse du Zen2 et des derniers intel.


ajouter

Ryzen 3700x que j'ai, vous pouvez faire des tests avec Intel

par exemple avec ce script MQL5\Scripts\UnitTests\Stat\TestStatBenchmark.mq5

le faire tourner en boucle plusieurs fois avec une minuterie

Nous ne parlons pas ici de tests, mais de retards dans l'exécution des commandes. Ce délai est là et il est flottant. Et cela dérange beaucoup le TS et moi.

 
fxsaber:

Seules trois choses sont apparues et elles sont apparues très rarement. Il doit être difficile de créer un frein car il n'y a pas de HistorySelect et de CopyTicks.

J'ai également attendu sur MT4.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

TempsLocal en 36 millisecondes. Choisissez un symbole avec un plus grand volume de ticks.

 

Pour les personnes intéressées, voici les instructions de lecture.

Qui pense que ça ne sera pas touché.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

J'ai choisi un symbole avec un plus grand volume.

Je ne vais même pas vérifier. Imaginez le symbole FORTS le plus populaire avec un abonnement en tic-tac. Au lieu de la logique OnTick dans OnBookEvent. Les décalages doivent être terribles.

J'ai besoin de conseils officiels sur ce qu'il faut faire pour minimiser les décalages.

 
fxsaber:

Pour reproduire les freins, vous devez exécuter le script sur plusieurs graphiques à UN caractère - faire en sorte que OnTick soit appelé en même temps. Ensuite, les alertes seront envoyées à chaque tick.

Le graphique de la charge CPU montre que terminal64.exe charge jusqu'à 30 % des huit cœurs logiques. Il s'agit seulement de quatre graphiques EURUSD avec le script en cours d'exécution. Vous pouvez clairement voir combien chaque graphique est chargé à la fois.

Où vont toutes ces ressources ?

Il est facile de répondre à cette question.

Ici, vous copiez beaucoup de données :

    HistorySelect(MathRand(), INT_MAX);

Vous donnez en fait une commande pour prendre tout l'historique de trading disponible de la base de données du terminal dans l'environnement EA, pour une utilisation ultérieure. Vous essayez délibérément de faire échouer un éventuel algorithme de mise en cache de requêtes identiques.

Mais vous n'utilisez pas toutes ces données, vous les réinitialisez immédiatement dans la ligne suivante :

    _B2(HistorySelect(Tick.time, INT_MAX));

Il est évident que la base terminale est ici une ressource partagée avec un accès synchronisé. Et vous y avez délibérément créé des milliers de commandes et d'affaires.

Toutes ces actions sans signification sont répétées 10 fois à chaque tic-tac de plusieurs fils à la fois. Et vous faites délibérément en sorte que ces actions se produisent simultanément à partir de plusieurs fils.

Vous savez donc très bien ce que vous faites et pourquoi, où les ressources sont dépensées, et en même temps vous prétendez que "le retard est causé par une charge excessive du CPU de la part de MT5".

Cela dit, il est clair que vous avez un problème avec votre ordinateur. C'est-à-dire que, oui, vous déplacez activement des quantités importantes de mémoire, mais cela ne devrait pas affecter le temps d'exécution des fonctions, en particulier celles qui ne sont pas liées à HistorySelect() de quelque manière que ce soit.

Dans nos tests b2582, même avec 1000 fois par tick et 5 EA sur des graphiques à un caractère, c'est-à-dire des ordres de grandeur supérieurs à vos conditions par défaut, pas une seule alerte n'a été observée.

Notre système de test : Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

Il est facile de répondre à cette question.

C'est ici que vous copiez un grand nombre de données :

Vous donnez en fait une commande pour prendre tout l'historique de trading disponible de la base de données du terminal dans l'environnement EA, pour une utilisation ultérieure. Essayer volontairement de perturber de manière aléatoire l'éventuel algorithme de mise en cache de demandes identiques.

Mais vous n'utilisez pas toutes ces données, vous les réinitialisez immédiatement dans la ligne suivante :

Il est évident que la base terminale est ici une ressource partagée avec un accès synchronisé. Et vous y avez délibérément créé des milliers de commandes et d'affaires.

Toutes ces actions sans signification sont répétées 10 fois à chaque tic-tac de plusieurs fils à la fois. Et vous faites délibérément en sorte que ces actions se produisent simultanément à partir de plusieurs fils.

Vous savez donc très bien ce que vous faites et pourquoi, où les ressources sont dépensées, et en même temps vous prétendez que "le retard est causé par une charge excessive du CPU de la part de MT5".

Cela dit, il est clair que vous avez un problème avec votre ordinateur. C'est-à-dire que, oui, vous déplacez activement des quantités importantes de mémoire, mais cela ne devrait pas affecter le temps d'exécution des fonctions, en particulier celles qui ne sont pas liées à HistorySelect() de quelque manière que ce soit.

Dans nos tests b2582, même avec 1000 fois par tick et 5 EA sur des graphiques à un caractère, c'est-à-dire des ordres de grandeur supérieurs à vos conditions par défaut, pas une seule alerte n'a été observée.

Notre système de test : Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Collègues,

il est temps pour vous de sortir du cercle de modélisation des avions.

Voici les conditions de la bataille : 4 terminaux, environ 300 Expert Advisors, environ 30 instruments. Un tiers d'entre eux sont abonnés aux gobelets. Tout ça sur les FORTS. Simulez dans ces conditions.

 
Dmi3:


Collègues,

il est temps pour vous de sortir du cercle de modélisation des avions.

Voici les conditions de combat : 4 terminaux, environ 300 EAs, environ 30 instruments. Un tiers des EA sont abonnés à des tumblers. Tout cela sur les FORTS. Simulez dans ces conditions.

"Here you go" est accepté sous la forme d'un fichier zip, accompagné d'une description détaillée du problème. Sinon, c'est une conversation vide.

Ce qui est discuté ici est le code de l'EA soumis et l'efficacité de son exécution. Sur la base des problèmes identifiés, des travaux ont été effectués pour optimiser le code du terminal.

 
Anton:

"Here you go" est accepté sous la forme d'un fichier zip, accompagné d'une description détaillée du problème. Sinon, c'est une conversation vide.

Dans ce cas, la discussion porte sur le code soumis par le conseiller expert et l'efficacité de son exécution. Le code du terminal a été optimisé pour les problèmes identifiés.

Je n'ai aucun problème, il n'y a rien à envoyer.

fxsaber a des problèmes. Il a déjà écrit 16 pages ici.

Et Mikhaïl a les mêmes problèmes depuis 2014, il a déjà écrit 149 pages : https://www.mql5.com/ru/forum/38456/page149.

Ils sont tous deux suffisamment qualifiés pour vous donner toutes les informations dont vous avez besoin.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

Il est facile de répondre à cette question.

C'est ici que vous copiez un grand nombre de données :

Vous donnez en fait une commande pour prendre tout l'historique de trading disponible de la base de données du terminal dans l'environnement EA, pour une utilisation ultérieure. Une randomisation volontaire pour tenter de perturber l'algorithme de mise en cache de demandes identiques.

Vous n'avez pas suivi la chronologie du développement de ce fil, donc vous vous permettez des notes accusatrices dans vos déclarations.

J'ai enlevé la ligne MathRand. Voici un bref compte rendu.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Mais on n'utilise pas toutes ces données, on les jette à la ligne suivante :

Il est évident que la base terminale est ici une ressource partagée avec un accès synchronisé. Et vous y avez délibérément créé des milliers de commandes et d'affaires.

Je le teste sur des comptes réels où les commandes de plus de 10K sont la norme. Il ne s'agit pas de faux ordres car >70% d'entre eux ont été exécutés.

Sur la capture d'écran, d'ailleurs, 9331+576 != 12529.

Toutes ces actions absurdes sont répétées 10 fois à chaque tic-tac à partir de plusieurs fils à la fois. Et vous faites délibérément en sorte que ces actions de plusieurs fils se produisent simultanément.

J'ai des problèmes sur différents personnages. Un seul symbole est proposé pour reproduire le problème plus rapidement.

Répéter 10 fois chaque tic est une nécessité vitale. Puisqu'il est normal qu'un EA contienne une douzaine de CTs avec des majors différentes.

Vous savez donc très bien ce que vous faites et pourquoi, et où vont les ressources, et pourtant vous prétendez que "la latence est due à une charge excessive du CPU de la part de MT5".

Cela dit, il est clair que vous avez un problème avec votre ordinateur. Je veux dire, oui, vous déplacez activement des quantités importantes de mémoire, mais cela ne devrait pas affecter le temps d'exécution des fonctions, en particulier celles qui ne sont pas liées à HistorySelect() de quelque manière que ce soit.

Je ne peux pas vous accuser d'incompétence, mais ce que vous avez écrit, pour ne pas dire plus, suscite la perplexité. HistorySelect est la recherche de quatre index (début/fin pour le tableau des ordres et début/fin pour le tableau des transactions). Les tables sont triées par temps, donc il y a (devrait y avoir) une recherche binaire au pire. Pour 10K ordres, c'est instantané (calculez le logarithme binaire). Quel mouvement de volume de mémoire ! Personne ne parle ici du redoutable HistorySelectByPosition. L'élémentaire HistorySelect est affecté.

Sur nos tests b2582, même avec 1000 fois par tick et 5 EA sur des graphiques à un caractère, c'est-à-dire des ordres de grandeur supérieurs à vos conditions par défaut, pas une seule alerte n'est observée.

Notre système de test : Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

Veuillez fournir ici les détails de connexion du compte de trading sur lequel les tests ont été effectués.

Raison: