MT5 et la vitesse en action - page 65

 
fxsaber:
J'étais devant l'ordinateur, je n'ai pas fait de calculs. Je n'ai pas chargé le processeur avec quoi que ce soit.

19 ms et 48 ms pour l'exécution de SymbolInfoTick. Il y avait plusieurs dizaines de cas où la durée était de plusieurs centaines de microsecondes. Mais je ne les ai pas cités.


Apparemment, pour le reproduire, il faut faire tourner des conseillers de combat pendant 24 heures, et ensuite seulement regarder. À mon avis, il est irréaliste de chercher à savoir ce qui est à l'origine de ces décalages.

Il arrive que l'ordinateur télécharge des mises à jour ou exécute certaines tâches de service. Les fluctuations de la tension du réseau peuvent également l'affecter. De cette façon, on peut arriver à des cartes réseau programmables, où toute la logique du robot est écrite au niveau du matériel :) mais même là, il y aura des retards dus aux fluctuations du champ quantique.
 
Maxim Dmitrievsky:
Parfois, l'ordinateur peut être en train de pomper des mises à jour ou d'effectuer certaines tâches de service. De même, une variation de la tension du réseau peut avoir un effet. De cette façon, on peut arriver à des cartes réseau programmables, où toute la logique du robot est câblée :) mais même là, il y aura des retards dus aux fluctuations des champs quantiques.

Les développeurs ont fait du mieux qu'ils pouvaient. Et sans cela, la branche a fourni un code qui montre comment le tick est en retard sur le Market Watch et vice versa. Comment la séquence d'arrivée des tics est cassée et probablement autre chose. Dans l'ensemble, un mauvais code valide est affiché pour reproduire d'autres situations.

 
Anton:

SymbolInfoTick envoie les données reçues du serveur du courtier. Ce que le serveur envoie est ce que vous recevez.

SymbolInfoTick() est-il exécuté en mode bloquant ou non bloquant ?

Par exemple, il se trouve dans le corps de la boucle while et il n'y a pas de connexion ou le marché est fermé pour le week-end,
alors il sera bloqué en arrêtant la boucle ou il sera exécuté de manière asynchrone ?

 
fxsaber:

comment la surveillance du marché est en retard sur la surveillance du marché et vice versa.

Par exemple, SymbolInfoTick attrape un nouveau tick et nous obtenons un Ask et un Bid différents en interrogeant le Market Watch (sans attendre un événement de changement de Market Watch) ? Il n'était pas possible de le faire il y a un an environ. SymbolInfoTick et CopyTick et vintage conduisent toujours au même tick. Si vous obtenez des tics par le biais de diverses fonctions OnXXX, bien sûr, vous obtiendrez quelque chose par le biais d'une fonction, et quelque chose par le biais d'une autre...

 
pivomoe:

Par exemple, SymbolInfoTick attrape un nouveau tick et nous obtenons un Ask et un Bid différents en interrogeant la coupe (sans attendre l'événement de changement de coupe) ?

Ici.

 
fxsaber:

Ici.

Comme je le pensais, vous testez OnBookEvent et OnTick, et non MarketBookGet et SymbolInfoTick. Si vous faisiez des tests avec ce schéma, vous auriez tout fait correspondre :

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s Lire vos messages ci-dessous. Vous le comprenez aussi. Pourquoi avez-vous besoin de OnBookEvent et OnTick ? Dans mon exemple, Sleep(1) prend 1 à 2 millisecondes, la demande et le tick avec SymbloInfoTick prend moins d'une MICROseconde. Le processeur est déjà au repos 99,9% du temps s'il n'y a pas de tics. Quel est l'avantage d'utiliser OnBookEvent et OnTick ?

 
pivomoe:

Comme je le pensais, vous testez OnBookEvent et OnTick, et non MarketBookGet et SymbolInfoTick. Si vous testiez selon ce schéma, tout correspondrait :

p.s Lire vos messages ci-dessous. Vous le comprenez aussi. Pourquoi avez-vous besoin de OnBookEvent et OnTick ? Dans mon exemple, Sleep(1) prend 1 à 2 millisecondes, la demande et le tick avec SymbloInfoTick prend moins d'une MICROseconde. Le processeur est déjà au repos 99,9% du temps s'il n'y a pas de tics. Quel est l'avantage d'utiliser OnBookEvent et OnTick ?

Sans un soupçon de diplomatie, vous dites n'importe quoi. Sleep(1) est un dixième de milliseconde. Je ne vois qu'un seul théoricien.

Les utilisateurs de OnTick veulent voir un tick frais et non celui qui est arrivé au terminal il y a quelque temps. Vous pouvez mettre SymbolInfoTick juste après MarketBookGet dans le code source.


Les développeurs ont pleinement reconnu deux problèmes liés à leur silence.

 
fxsaber:

Sans un soupçon de diplomatie, vous dites n'importe quoi. Sleep(1) est une douzaine de millisecondes. Je ne vois qu'un seul théoricien.

Les utilisateurs veulent voir un tick frais dans OnTick et non un tick arrivé au terminal il y a quelque temps. Vous pouvez mettre SymbolInfoTick juste après MarketBookGet dans le code source.


Les développeurs, par leur silence, ont pleinement reconnu deux problèmes.

Pas toujours et pas tous les dixièmes de milliseconde. Vérifié avec un script simple

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

Voici mon journal

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

Les utilisateurs de OnTick voient toujours le tick le plus récent.

Les utilisateurs de OnBookEvent voient toujours le tick le plus récent.

Mais si vous voulez comparer les ticks reçus avec OnTick et ceux reçus avec OnBookEvent, vous risquez d'être déçu car les événements sont traités séquentiellement et non en parallèle. C'est ce que l'utilisateur pivomoe a essayé de vous dire.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

Pas toujours et pas partout un dixième de milliseconde. Vérifié avec un simple script

Voici mon journal.

Et voici mon journal.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

Résultat.

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

Les utilisateurs de OnTick voient toujours le tick le plus récent.

Les utilisateurs de OnBookEvent voient toujours le tick le plus récent.

Le résultat de l'exécution de l'EA sur un seul graphique à partir d'une machine qui n'est pas occupée de quelque façon que ce soit.

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

Marque les ticks identiques, qui sont reçus dans différentes On-fonctions par des méthodes correspondantes. Le décalage peut atteindre des dizaines de millisecondes si l'on utilise six graphiques au lieu d'un.

Mais si vous voulez comparer les ticks reçus dans OnTick et ceux reçus dans OnBookEvent, vous serez déçu car les événements sont traités séquentiellement et non en parallèle. Ce que l'utilisateur pivomoe a essayé de vous dire

Si un OnBookEvent/OnTick presque vide est déclenché 20 millisecondes plus tard que le OnTick/OnBookEvent presque vide correspondant, est-ce correct ?


ZS Pendant que vous prêtez attention au fil, il y a un autre code de reproduction ici. Là, dans Market Watch, les ticks arrivent avec une heure antérieure à l'heure de Market Watch précédente.

 
fxsaber:

Si un OnBookEvent/OnTick presque vide est déclenché 20 millisecondes plus tard que le OnTick/OnBookEvent presque vide correspondant, est-ce correct ?


La file d'attente de l'EA est une ressource verrouillable. Lorsqu'un événement est écrit dans la file d'attente, le conseiller expert attend (sauf si le conseiller expert est en train de traiter un événement).

Les événements pour le conseiller expert proviennent de la file d'attente des événements du graphique correspondant, qui provient à son tour du cycle de traitement du symbole correspondant. Et cette boucle de traitement ne se contente pas de distribuer les événements sur ses propres graphiques, mais fait aussi beaucoup d'autres choses.

Je vous ai déjà dit que Windows n'est pas un système d'exploitation en temps réel.