MT5 et la vitesse en action - page 9

 
fxsaber:

Il s'avère que c'est un événement fréquent. Les fonctions commerciales n'ont pas été appelées.

SymbolInfoTick n'est pas un mauvais décalage parfois. Le HFT peut avoir une grande expérience de ces décalages inattendus.

Veuillez demander aux développeurs d'en trouver les raisons. En attendant, il est évident que dans les EA de combat, leur profileur est un must.

Que va montrer le test sur le terminal "vide" ?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

Ça devrait être quelque chose comme ça :

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

Si vous ne nous dites pas en détail ce que vous faites, comment exactement vous faites peser une charge sur le terminal, il nous sera difficile d'en trouver les raisons.

 
Anton:

Que montrera le test sur un terminal "vide" ?

Ça devrait être quelque chose comme ça :

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

À moins que vous ne nous disiez en détail ce que vous faites, comment exactement vous faites peser la charge sur le terminal, il nous sera difficile d'en trouver les raisons.

100K itérations n'est pas un indicateur. Puisque la fonction ne ralentit pas toujours, mais parfois.

En fait, je dois désactiver des morceaux de l'EA de combat jusqu'à ce que le freinage s'arrête. Ensuite, je peux fournir le code. Nous devons attendre.

 
fxsaber:

En fait, je dois désactiver des morceaux du conseiller de combat jusqu'à ce que les freins s'arrêtent. Ensuite, je peux fournir le code. Je dois attendre.

Exécutez cette EA sur quelques personnages pour obtenir un résultat rapide.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


Je l'ai eu en cinq minutes.

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


Il semble qu'il suffise de laisser uniquement ceci (sans CopyTicks) dans l'EA.

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

100K itérations n'est pas un indicateur. Comme la fonction ne ralentit pas toujours, mais parfois.

Je propose de modifier le concept de définition de la rapidité d'une fonction.

Une fonction est rapide s'il n'y a pas de pics dans son temps d'exécution.


Comme nous l'avons montré ci-dessus, même les fonctions simples présentent de tels pics. Parfois de très grandes. Je n'ai aucune idée de ce que ça a à voir. Mais il est évident que toutes les fonctions critiques pour le trading devraient être vérifiées pour la présence de pics en utilisant la méthode suggérée ci-dessus. C'est-à-dire que nous exécutons et surveillons les pics supérieurs à une milliseconde pendant quelques heures.


Il est nécessaire de parvenir à ce qu'il n'y ait pas de pics, du moins sur un Terminal vide. Les 100 000 itérations rapides ne sont rien.

 
fxsaber:

Je suggère de modifier le concept de définition de la rapidité d'une fonction.

Une fonction est rapide s'il n'y a pas de pics dans sa durée.


Comme nous l'avons montré ci-dessus, même les fonctions simples présentent de tels pics. Parfois très grandes. Je n'ai aucune idée de ce que ça a à voir avec ça. Mais il est évident que toutes les fonctions critiques pour le trading devraient être vérifiées pour la présence de pics en utilisant la méthode suggérée ci-dessus. C'est-à-dire que nous exécutons et surveillons les pics supérieurs à une milliseconde pendant quelques heures.


Il est nécessaire de parvenir à ce qu'il n'y ait pas de pics, du moins sur un Terminal vide. Les 100K itérations rapides s'avèrent n'être rien.

Il arrive parfois que le minuteur affiche un temps cumulé si une autre tâche est en cours d'exécution. Par exemple, cela peut se produire lors du travail avec le canevas - lorsque la fonction d'affichage définit la tâche d'affichage sans créer d'image et revient. Ensuite, toute autre fonction est exécutée de manière séquentielle, par exemple le même commentaire, mais le processus de mappage du canevas est lancé en langage CPU et ce n'est qu'ensuite que le canevas est affiché. En mesurant le temps, vous pouvez voir que le commentaire prend un temps très long pour être édité, mais la fonction d'affichage kanvas fonctionne en 0 ms.

 
fxsaber:

exécuter et surveiller les pics supérieurs à une milliseconde pendant quelques heures.

Nous devons nous assurer qu'il n'y a pas de pics, du moins sur un terminal vide. Les 100K itérations rapides se sont avérées sans valeur.

J'ai rédigé un tel conseiller expert pour le suivi.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#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)))
  {
    MqlTick Ticks[];
    
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));

    _B2(HistorySelect(Tick.time, INT_MAX));
    
    _B2(HistoryDealsTotal());
    _B2(HistoryDealGetTicket(0));
    _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
    _B2(HistoryDealGetDouble(0, DEAL_PRICE));
    _B2(HistoryDealSelect(0));

    _B2(HistoryOrdersTotal());
    _B2(HistoryOrderGetTicket(0));
    _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
    _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
    _B2(HistoryOrderSelect(0));
    
    _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(TimeTradeServer());
    
    _B2(OrdersTotal());
    _B2(OrderSelect(0));
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
    
    _B2(PositionsTotal());
    _B2(PositionSelect(Symb));
    _B2(PositionSelectByTicket(0));
    _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
    _B2(PositionGetInteger(POSITION_MAGIC));
    _B2(PositionGetString(POSITION_SYMBOL));
    
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
    _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
    
    MqlTradeRequest Request = {0};
    MqlTradeCheckResult CheckResult;

    _B2(OrderCheck(Request, CheckResult));
    
    _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);
}


J'ai obtenu le résultat en cinq minutes de surveillance.

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY Avec une telle valeur du paramètre d'entrée, il y a beaucoup moins d'alertes.

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


Mais le résultat est aussi plus significatif.

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

Enfin, avec moi, modifier une série de commandes prend parfois 3 à 10 secondes par commande. Après cela, il faut à nouveau un temps long de 0,1 seconde.

J'ai sorti les journaux du serveur - c'est instantané là.


C'est très désagréable sur un Expert Advisor de combat.

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


Quelques valeurs fantastiques.

 
fxsaber:

Enfin, avec moi, modifier une série de commandes prend parfois 3 à 10 secondes par commande. Après cela, il faut à nouveau un temps long de 0,1 seconde.

Journaux de serveur soulevés - là instantanément.

La situation s'est répétée sur un autre serveur commercial.

Le terminal modifié en position ouverte prend 2,5 secondes. Sur le serveur - 2 millisecondes.

Très probablement, c'est aussi la source des problèmes avec l'exécution de FORTS.

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

Retransmissions.

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

Plate-forme MetaTrader 5 build 1700 beta : Projets dans MetaEditor et outils synthétiques

Renat Fatkhullin, 2017.12.14 12:47

C'est un indicateur de la qualité de la communication. Le pourcentage de paquets réseau retransmis dans le protocole TCP/IP.

Il est calculé globalement au niveau de l'interface réseau pour toutes les applications sur l'ensemble du système d'exploitation. Lorsque vous soupçonnez des lenteurs et des problèmes, regardez cette métrique. Critique lorsque le serveur du courtier est très éloigné. Par exemple pour les traders asiatiques et un courtier en Europe.

Déjà à 3% de taux de retransmission, vous pouvez dire que vous ne pouvez pas échanger. Le niveau extrême de retransmissions est donné par un mauvais wifi.

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

Nouveau MetaTrader 5 build 2360 : Intégration étendue avec SQLite

Renat Fatkhullin, 2020.04.06 12:33

La norme devrait être inférieure à 1%. Et déjà 3% de perte de réseau tue les services à faible latence.

Par exemple, nos retransmissions sont de 0,68 - 0,75% avec évidemment plus d'utilisateurs (nous avons 17k en ligne sur MetaQuotes-Demo). Et nous servons le monde entier, pas Moscou/Russie.

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

Bugs, bugs, questions

Renat Fatkhullin, 2017.12.17 23:03

Il s'agit des statistiques de l'interface réseau de l'ordinateur entier, où Metatrader n'est qu'un des utilisateurs. Il n'est pas nécessairement lié au serveur de négociation.

Les statistiques générales peuvent facilement être corrompues par un navigateur web après un accès infructueux à un site distant et glitch. Il est également possible pour un wifi local d'attraper un conflit de réseau et d'obtenir des dizaines de pour cent de retransmissions à des moments aléatoires.

Dans le cas de 20% de retransmissions, il n'y aura pas de connexion au serveur commercial et les reconnexions seront constantes et sans fin. Le terminal a une connexion constante et même 3-5% de retransmissions lui seront fatales pour maintenir de longues connexions.

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

Bugs, bugs, questions

Renat Fatkhullin, 2017.12.18 11:36

N'oubliez pas qu'il s'agit d'une caractéristique technique de votre pile TCP/IP locale , signalée par le système d'exploitation, et non d'un indicateur de la qualité d'une connexion particulière aux serveurs de négociation. Il comprend toute l'activité du réseau, y compris l'activité du système/du téléphone.


La connexion d'un cluster de trading est connue pour être de haute qualité et nous enregistrons de nombreux paramètres (il s'agit d'une fonctionnalité standard de la plateforme), en recueillant des instantanés d'une minute et une analyse ultérieure.

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

Bugs, bugs, questions

Renat Fatkhullin, 2017.12.18 00:13

Vérifié.

Aucun des nœuds de notre cluster de démonstration, y compris Asia, n'a connu de redémarrage ou d'augmentation du niveau de retransmission pendant toute la journée (et les autres jours également). Tout est entre 0,5% et 1,5% normal.


Je semble en avoir beaucoup.

Il est minuit maintenant, les cotes sont rarement mises à jour. Les retransmissions augmentent sous mes yeux. Je veux mettre l'alerte sur le VPS à une valeur élevée > 1% pour le trading à faible latence. Mais avec des valeurs aussi énormes, cette idée devient inutile.


Que puis-je recommander ? Faites tracert au serveur de commerce ? Une sorte de programme de surveillance ? En général, comment s'assurer que MT5 est prêt pour une faible latence ?


ZS Dès que les cotations commencent à bouger plus rapidement, l'indice chute plusieurs fois.

 
fxsaber:

Retransmetteurs.


Je semble en avoir beaucoup.

5-6h du matin :

Maison (optique, ETH vers le routeur, câble vers l'ordinateur) - 8-19%, ping 60-70

VPS aux Pays-Bas (momentanément 1 MT5 avec 9 monnaies/11 graphiques) - 1.2-1.6%, ping 3.7