Caractéristiques du langage mql5, subtilités et techniques - page 95

 
Slava:

Êtes-vous sûr d'avoir lu toute la question ?

...entre deux appels à GetMicrosecondsCount...

C'est ce que je dis. Le premier appel a lieu avant la synchronisation et le second après. La différence sera la même : le nombre réel de microsecondes + la correction de synchronisation.

 
Alexey Navoykov:

C'est ce que je veux dire. Le premier appel est avant la synchronisation et le deuxième appel est après la synchronisation. La différence sera égale : le nombre réel de microsecondes + la correction de la synchronisation.

Maintenant, dites-moi la probabilité de correction du temps entre deux appels à GetMicrofsecondsCount ?

Si vous mesurez vraiment des microsecondes, la probabilité est proche de 0.

Et vous mesurez les microsecondes sur des intervalles de quelques secondes ou plus ? Pourquoi ? Spherocon dans le vide ?

 
Alexey Navoykov:

Vous avez tort, j'ai spécifiquement cité le code ici utilisant WinApi. Exécutez-le, changez l'horloge dans le processus, et regardez le résultat.

Il n'est pas très clair comment mener un dialogue avec vous, si vos arguments sont basés sur des conjectures. Et vous ne considérez même pas nécessaire de prendre connaissance du déroulement de la discussion sur le sujet.

C'est vous qui n'avez aucune idée du problème que vous avez soulevé.

Comme je l'ai dit, un changement d'heure inattendu vous tuera le code, lié à un contrôle précis de l'heure, quelles que soient les fonctions que vous utilisez.
 
Slava:

Maintenant, dites-moi la probabilité de correction du temps entre deux appels à GetMicrofsecondsCount ?

Si vous mesurez réellement des microsecondes, alors la probabilité est presque nulle.

Et vous mesurez les microsecondes en secondes ou plus ? Pourquoi ? Spherocon dans le vide ?

Je vous l'ai déjà dit, cette probabilité dépend de la période de synchronisation. Plus elle est courte, plus nous aurons de décalages, c'est-à-dire plus la probabilité est élevée. Et aussi de la distance entre les mesures voisines. Plus elle est longue, plus on touchera souvent le décalage. La probabilité est donc calculée en fonction de ces deux paramètres, et pas seulement avec un doigt dans le ciel.

Et pourquoi écrire en une seule fois des intervalles de secondes ? Et des intervalles de millisecondes ? Par exemple, tout ce qui est inférieur à 16 ms ne peut être mesuré qu'avec cette fonction. Et même 16-30 millisecondes doivent être mesurées avec cette fonction, sinon l'erreur sera trop grande.

S'il vous semble que ce sont des broutilles et que vous pouvez les ignorer, alors c'est votre opinion personnelle. Plus tôt, nous avons parlé ici de la fonction système standard QueryPerformanceCounter, qui fonctionne correctement, sans aucun décalage. Elle doit avoir été inventée pour une raison. Et d'ailleurs, Renat l'a déclarée ici pour une raison quelconque :

C'est comme ça qu'on compte les microsecondes.

Mais en fait, ce n'est pas le cas. Il s'agit du QueryPerformanceCounter.

 
Renat Fatkhullin:
C'est vous qui n'avez aucune idée du problème que vous avez soulevé.

Comme je l'ai dit, un changement d'heure inattendu tuera le code lié au contrôle précis de l'heure, quelles que soient les fonctions utilisées.

Il n'y a pas de changement de temps dans QueryPerformanceCounter. Que voulez-vous dire ? Avez-vous exécuté le code dont je vous ai donné le lien ?

 

Après avoir vérifié la machine d'exécution du code MQL5, il s'est avéré que nous avions un schéma de comptage hybride dans GetMicrosecondCount:

  • pour Windows 8 et les versions ultérieures, une fonction GetSystemTimePreciseAsFileTime légèrement plus rapide était utilisée, en fonction de l'heure système
  • pour les autres cas, QueryPerformanceFrequency + QueryPerformanceCounter
  • Dans les deux cas, GetMicrosecondCount a rempli sa fonction de récupération des microsecondes à partir du début du programme.

Ce code est apparu en raison d'une tentative de réduire la surcharge du système sur l'appel de mesure du temps. Un des développeurs a exagéré.

Nous, personnellement, et Slava étions sûrs qu'un pur QueryPerformanceCounter fonctionnait. Et il y avait un tel code. Mais nous nous sommes trompés en raison de la présence d'un modèle hybride.

Maintenant, une simple QueryPerformanceFrequency + QueryPerformanceCounter fonctionnera.

En résumé : oui, nous nous sommes trompés à la fois dans l'implémentation de la fonction GetMicrosecondCount et dans la protection de son comportement.

Slava et moi, on s'excuse pour ça !
 
Les commentaires non pertinents pour ce sujet ont été déplacés vers "Bugs, bugs, problèmes".
 
Renat Fatkhullin:

Un rappel sur l'utilisation des phrases "devrait", explicitement ou implicitement. L'utilisation de "méta-citations devraient" au lieu de "veuillez considérer" est désormais inacceptable.

Veuillez considérer l'hypothèse selon laquelle, le plus souvent, lire entre les lignes n'a rien à voir avec ce que l'interlocuteur écrit.

Les rapports de bogue réels avec l'aide du forum et le fait de se jeter sur les MQ sont des choses incompatibles. Il est difficile d'imaginer une personne qui se transforme constamment en personne détestable et vice-versa.

 
MT5 mesure lui-même les longs intervalles de temps viaGetMicrosecondCount.
IS      0       13:32:55.239    Trades  '11391209': accepted exchange buy 1.00 AFKS at market
DM      0       13:33:07.896    Trades  '11391209': deal #265475900 buy 1.00 AFKS at 9.095 done (based on order #284425784)
OD      0       13:33:07.898    Trades  '11391209': order #284425784 buy 1.00 / 1.00 AFKS at 9.095 done in 12757.608 ms
 

Mes amis, pouvez-vous me dire à qui demander conseil - je veux comprendre comment travailler sur les différences de prix pour le même produit sur différentes bourses - je suis nouveau dans ce domaine, je veux comprendre. Je serais reconnaissant pour tout conseil - peut-être devrais-je écrire dans un autre fil ?

J'ai accès à plusieurs bourses étrangères, mais je ne comprends pas comment tout cela fonctionne.