Erreurs, bugs, questions - page 2778
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Les programmes MQL5 travaillent (méthodes Get/Set) avec un graphique via une file d'attente de transactions.
Cela permet de libérer l'interface graphique et le terminal lui-même des blocages inévitables qui seraient un problème pour les programmes MQL5.
L'asynchronie transactionnelle permet une écriture ou une lecture rapide dans les modes séparés et active immédiatement le mode de synchronisation en mélangeant les méthodes Set et Get.
En d'autres termes, il est préférable d'effectuer un Set 1000 fois asynchrone, puis un Get 1000 fois, plutôt que d'effectuer alternativement un Get & Set, transformant ainsi la file d'attente en un processus synchrone. Parce que vous devez vous assurer que le Set asynchrone précédent était exactement superposé et que vous pouvez maintenant le lire.
Vous devez utiliser les fonctions du système avec précaution et les mettre en cache chaque fois que possible.
Vous devez utiliser les fonctions système avec précaution et les mettre en cache lorsque cela est possible.
Bonjour, le problème est un peu différent - le ChartGetInteger et les fonctions similaires sont TRÈS lents à s'exécuter.
Lors du passage de la version 2009 à la version 2485, le temps d'exécution de ChartGetInteger est passé de 5 ms à 200-250 ms. Ce problème est particulièrement visible avec plus de 50 graphiques ouverts.
Système : Terminal Windows 10 build 18363, Intel Core i7-7700HQ @ 2.80GHz, 19 / 31 GB de mémoire, 262 / 640 GB de disque, moniteur 4K, NVidia 1050Ti
Lecode de la description du problème a été utilisé: https://www.mql5.com/en/forum/342152.
Causes possibles du problème :
Bugs, bugs, problèmes
Sergey Dzyublik, 2020.06.13 19:20
J'ai comparé l'implémentation de la fonction ChartGetInteger pour deux versions de MT5 2009 et MT5 2485, le problème est peut-être le suivant :
1. En 2485, pour lire les champs "atomiques" d'un objet graphique, nous utilisons des opérations plutôt lentes :
mfence; lock mov eax,[rax+2C] ;
Alors que dans la version 2009, cela est fait en utilisant : lock xadd [rcx+2C],eax
Il semble également que la logique et le temps d'attente possible dans ntdll_RtlEnterCriticalSection aient considérablement changé.
Auparavant, en 2009, une section critique ne vérifiait qu'une paire de valeurs reçues, sans aucune opération atomique.
Et en 2485, les objets de la liste chaînée du tableau peuvent également être énumérés.
Vraisemblablement, le problème a pu se produire lorsque le crash a été corrigé lors du travail avec les fonctions graphiques dans le cadre de la migration vers le nouveau compilateur (il y a environ 2-3 mois).
Le code assembleur pour l'appel ChartGetInteger dans MT5 (build 2485) est joint.
Regardez ça.
Étapes de la lecture :
1. Prenez un terminal MT propre, ouvrez un graphique sur celui-ci, exécutez l'EA compilé ci-dessus sur ce graphique.
2. Après avoir ouvert les 95 nouveaux graphiques, élargissez la fenêtre graphique à la largeur totale de l'espace graphique dans MT, si cela n'a pas été fait auparavant.
3. Pour passer d'un onglet de graphique à un autre et enregistrer dans le journal les valeurs d'exécution de ChartGetInteger.
Pour fermer tous les graphiques ouverts, vous pouvez appuyer sur CTRL+W et le maintenir enfoncé.
Résultat de MT5 (build 2009) :
Résultat MT5 (buidl 2485) :
Comparaison des résultats et des conclusions :
1. Le nombre d'enregistrements qui sont affichés dans la version 2009 est beaucoup plus élevé que dans la version 2485.
Lafonction ChartGetInteger dans des "conditions normales" est devenue plus rapide après le passage à la version 2485.
2. Le temps d'exécution maximal pour la version 2009 - 15 ms, et pour la version 2485 - 310 ms.
La fonction ChartGetInteger dans des "conditions défavorables" devient jusqu'à 20 fois plus lente après le passage à la version 2485.
3. de la même manière que vous pouvez estimer à l'œil la vitesse d'ouverture de 95 cartes.
Pour les deux builds, on remarque la complexité "exponentielle" du nombre de graphiques ouverts précédemment, ainsi qu'une exécution nettement plus rapide dans la build 2009.
D'après les journaux, la décélération de l'un n'a pas coïncidé avec la décélération de l'autre, c'est-à-dire qu'elle n'a pas été simultanée. Le problème se situe donc dans le terminal lui-même.
Le journal n'est imprimé que toutes les minutes (la traduction a gâché l'horodatage ! !), je pourrais vérifier plus précisément, mais ça n'en vaut pas la peine.
Je l'ai essayé sur plusieurs terminaux et il montre clairement que les pics ne sont PAS simultanés. Il s'agit clairement d'un problème lié à MT5.
Les programmes MQL5 travaillent (méthodes Get/Set) avec un graphique via une file d'attente de transactions.
Cela permet de libérer l'interface graphique et le terminal lui-même des blocages inévitables qui seraient un problème pour les programmes MQL5.
L'asynchronie transactionnelle permet une écriture ou une lecture rapide dans les modes séparés et active immédiatement le mode de synchronisation en mélangeant les méthodes Set et Get.
En d'autres termes, il est préférable d'effectuer un Set 1000 fois asynchrone, puis un Get 1000 fois, plutôt que d'effectuer alternativement un Get & Set, transformant ainsi la file d'attente en un processus synchrone. Parce que vous devez vous assurer que le Set asynchrone précédent était exactement superposé et que vous pouvez maintenant le lire.
Vous devez utiliser les fonctions du système avec précaution et les mettre en cache chaque fois que possible.
Pour autant que je sache, l'appel à ChartRedraw ne provoque pas le redécoupage immédiat du graphique. Le redécoupage ne se produit que lorsqu'une méthode Get est appelée.
essayez d'intervertir ces deux lignes
alors il n'y aura rien d'asynchrone dans la mesure et voyez ce qui se passe. Ce sera encore plus rapide.
Je suis resté muet pendant longtemps, ne comprenant pas ce que le compilateur n'aime pas dans cette ligne.
J'ai oublié d'écrire si. J'ai pensé que ce serait une bonne idée de mâcher le message pour de tels abrutis.
Il m'a demandé de faire une description et un exemple pour toutes les erreurs et avertissements du compilateur il y a environ 5 ans, peut-être plus.
Vous pouvez peut-être faire mieux.
Les programmes MQL5 travaillent (méthodes Get/Set) avec un graphique via une file d'attente de transactions.
Cela permet de libérer l'interface graphique et le terminal lui-même des blocages inévitables qui seraient un problème pour les programmes MQL5.
L'asynchronie transactionnelle permet une écriture ou une lecture rapide dans les modes séparés et active immédiatement le mode de synchronisation en mélangeant les méthodes Set et Get.
En d'autres termes, il est préférable d'effectuer un Set 1000 fois asynchrone, puis un Get 1000 fois, plutôt que d'effectuer alternativement un Get & Set, transformant ainsi la file d'attente en un processus synchrone. Parce que vous devez vous assurer que le Set asynchrone précédent était exactement superposé et que vous pouvez maintenant le lire.
Vous devez utiliser les fonctions du système avec précaution et les mettre en cache chaque fois que possible.
J'ai bien compris que non seulement les méthodes Set sont asynchrones, mais aussi Get ?
Ilyas s'est trompé ici , n'est-ce pas ?
Et Slava avait raison quand il disait que la méthode ChartXYToTimePrice est asynchrone ? Après tout, la méthode ChartXYToTimePrice fait très probablement référence aux méthodes Get.
La documentation ne parle que de l'asynchronisme des méthodes Set.
Ai-je bien compris que non seulement les méthodes Set sont asynchrones, mais aussi Get ?
On vous a déjà répondu à cette question, mais d'après vos propos, vous n'avez pas besoin de "récits académiques"...
Tu vas te décider là-bas ou quoi ?