MT5 et la vitesse en action - page 11

 
Il était une fois, j'ai écrit un indicateur de décalage primitif. Il fait un excellent travail en montrant une pompe à torrent massive, par exemple.
Ping
Ping
  • www.mql5.com
Для торговли важным параметром является актуальность текущей цены. На него влияет множество факторов, самый популярный из которых - сетевой пинг между терминалом и торговым сервером. Но часто из виду упускается другой параметр: так называемый "внутренний пинг терминала" - дополнительный лаг котировок внутри самого терминала (платформы) . Даже...
 
fxsaber:

Incompris. Nous devons comprendre si MT se bloque ou non. Nous analysions les journaux du serveur, lorsque les pauses se modifiaient pendant des dizaines de secondes. Tout est parfait sur le serveur.

Le problème est donc ailleurs.

J'ai constaté que je touche très souvent les prix antérieurs. C'est-à-dire un retard important dans le terminal. La question se pose de savoir comment l'identifier.

Ici, j'ai acheté un VPS. Comment puis-je savoir qu'il est parfaitement adapté ? Je veux dire, il doit y avoir une sorte d'indicateur numérique. Il s'avère que les retransmissions ne sont pas fiables. À minuit - des dizaines de pour cent.


Je peux peut-être déployer une machine virtuelle sur la même machine physique que le serveur de trading. Et je serais capable de faire fonctionner le terminal à partir de là. Je suppose que cela réduirait le nombre de blocages.

Il me semble que le traçage, le ping depuis la console ou un logiciel spécial ne résoudront pas le problème.
Il est nécessaire d'enregistrer la participation de MT d'une manière ou d'une autre. Il me semble que nous devrions prendre position et demander aux développeurs de faire leur propre compteur pourTERMINAL_RETRANSMISSION

 
fxsaber:

Incompris. Nous devons comprendre si MT se bloque ou non. Nous analysions les journaux du serveur, lorsque les pauses se modifiaient pendant des dizaines de secondes. Tout est parfait sur le serveur.
Le problème est donc ailleurs.
J'ai constaté que j'atteignais très souvent les prix antérieurs. C'est-à-dire un retard important dans le terminal. La question s'est posée de savoir comment l'identifier.

Ce n'est pas très clair ce que signifie exactement "tout est parfait sur le serveur" :
1) Aucune demande de modification n'est arrivée au serveur, ou toutes les demandes dans les 10 secondes avaient un prix périmé ?
2) Et combien de secondes représente la différence entre le prix "actuel" et "obsolète" ?
3) Qui détermine que le prix est périmé : le serveur MT ou une tierce partie, peut-être une bourse ?


Si le problème est fréquent, vous pouvez analyser le trafic de modification des commandes à l'aide de Wireshark associé à Process Monitor (Network Activity) de Sysinternals.

 
Sergey Dzyublik:

Il n'est pas très clair ce que signifie exactement "tout est parfait sur le serveur" :
1) Aucune demande de modification n'est arrivée au serveur, ou toutes les demandes dans les 10 secondes avaient un prix périmé ?
2) Et combien de secondes représente la différence entre le prix "actuel" et "obsolète" ?
3) Qui détermine que le prix est périmé : le serveur MT ou une tierce partie, peut-être une bourse ?

Sur le serveur, toutes les demandes ont été traitées en unités de millisecondes. En ce qui concerne les prix périmés, vous devez vérifier auprès de l'administrateur.

Si le problème est récurrent, vous pouvez analyser le trafic de modification d'ordre en utilisant Wireshark couplé à Process Monitor (Network Activity) de Sysinternals.

Je suis complètement novice en la matière.

 

Il a été possible de reproduire les freins des fonctions HistorySelect.

  1. Allez sur un compte MetaQuotes-Demo avec un historique de transactions relativement long.
    1. Si le compte de démonstration a peu d'historique de transactions, activez l'auto-trading et exécutez le script OrderSend-Test2.ex5 en parallèle (voir le code source en pièce jointe).
  2. Ouvrez deux graphiques EURUSD et exécutez l'Expert Advisor ci-dessous sur chacun d'eux(le jaune dans le code source indique les modifications supplémentaires).

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

    MT5 et la vitesse en action

    fxsaber, 2020.06.04 14:38

    J'ai dessiné un tel EA.

    // Мониторинг длительных пиков выполнения важных функций для торговли.
    #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));
    
        HistorySelect(MathRand(), INT_MAX);
        _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);      
    }

MT5 b2572 envoie de tels messages.

2020.08.13 05:28:00.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.13 05:28:00.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.13 05:28:00.153 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.162 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.167 Alert: Time[Test6.mq5 34: HistoryOrderSelect(0)] = 2 ms.
2020.08.13 05:28:00.174 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.180 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.186 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.194 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.


Merci de nous faire part de vos résultats et de nous dire qui va l'essayer. Des résultats avec les ralentissements ?


ZS Long a essayé de comprendre pourquoi il y a des freins sur les comptes vivants. Je pense avoir trouvé la zone problématique.

Dossiers :
 
fxsaber:

ZS Long a essayé de comprendre pourquoi les comptes de bataille étaient lents. Il semble avoir trouvé la zone à problème.

Voilà à quel point la situation au combat est déprimante.

2020.08.13 10:20:09.074 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
...
2020.08.13 11:31:58.559 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 34 ms.
2020.08.13 11:31:58.559 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 35 ms.
2020.08.13 11:31:58.624 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 99 ms.
2020.08.13 11:32:12.483 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 7 ms.
2020.08.13 11:33:44.877 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:44.877 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 21 ms.
2020.08.13 11:33:44.879 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:47.911 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.911 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.912 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 29 ms.

2020.08.13 11:33:49.312 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.
2020.08.13 11:33:49.312 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.

2020.08.13 11:34:02.612 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.
2020.08.13 11:34:02.613 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.

2020.08.13 11:34:02.616 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 56 ms.
2020.08.13 11:34:12.057 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.

2020.08.13 11:34:30.643 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.
2020.08.13 11:34:30.643 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.

2020.08.13 11:34:30.643 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.08.13 11:37:17.059 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 24 ms.
2020.08.13 11:38:30.360 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 13 ms.

Si vous regardez de près, vous pouvez voir que les EA indépendantes les unes des autres ralentissent de la même manière (temps de latence et durée). C'est-à-dire que lorsque plusieurs conseillers experts font l'appel HistorySelect, MT5 arrête l'exécution de tous les conseillers experts pendant un certain temps, puis renvoie ses résultats aux conseillers experts.


Quelle est la raison d'une API aussi étrange (par rapport à l'imminente) pour travailler avec l'histoire ? Où sont les pièges de cette approche ?

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

MT5 et la vitesse en action

fxsaber, 2020.05.28 15:27

HistorySelect.

C'est une fonction incroyablement coûteuse. Et malheureusement, aucune quantité de cache ne peut rendre sa vitesse acceptable maintenant.


Veuillez envisager d'introduire de telles fonctionnalités d'histoire.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

Ils fermeraient complètement les freins de l'HistorySelect. Parce que cela résoudrait le problème d'obtenir les dernières offres à très bas prix. Pour l'instant, c'est un tourment dans l'exécution du combat.


Il n'est pas toujours possible de contrôler les dernières transactions via OnTradeTransaction. C'est pourquoi un rapide HistorySelect est pertinent.


Il n'est probablement pas normal que les performances de MT4 soient supérieures à celles de MT5 lorsqu'il s'agit de l'historique des transactions.

Veuillez retirer les freins du terminal de négociation !

 
1 000 transactions dans l'histoire, est-ce suffisant ?
 
Rorschach:
Les 1000 métiers de l'histoire sont-ils suffisants ?

Testé avec ces lectures.

        : HistoryDealsTotal() = 11045
        : HistoryOrdersTotal() = 11518
 

Commandes 20990

Contrats 10277

Connectez-vous dans 20 minutes

Dossiers :
20200813.log  4817 kb
 
Rorschach:

Commandes 20990

Contrats 10277

Connectez-vous dans 20 minutes.

Super, merci ! Enfin, une confirmation complète des tristes décalages de MT5. Et ce, sans aucune fonction commerciale. Des problèmes presque partout.

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...

C'est déprimant. Il serait intéressant de voir le résultat sous Linux. Sous Win, il n'y a pas de temps réel pour en parler.