![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Veuillez donner un diagramme-code rudimentaire pour cette idée. À première vue, cela ressemble à un malentendu total.
Pendant l'exécution de la fonction OnMain , il n'y a aucun moyen de connaître l'état de la file d'attente réelle actuelle. Le seul moyen d'y parvenir est d'utiliser un logiciel espion, comme indiqué dans le lien.
Dans sa forme la plus simple :
Il suffit de modifier l'approche des calculs eux-mêmes (faire des retours intermédiaires aussi souvent que la tâche l'exige). Mais si c'est difficile, considérez à l'étape 1 que OnMain n'existe pas pour vous (vous déplacez le code principal non pas dans OnMain, mais dans On2XX), respectivement, dans OnMain vous n'avez pas besoin d'apprendre quelque chose
Les béquilles sont fabriquées dans la mauvaise direction :
Laissez les fonctions OnXXX uniquement copier les événements (paramètres) dans la file d'attente et appeler la fonction principale OnMain. Déplacer tout leur code pour dupliquer les fonctions de On2XX. Appelez ces fonctions On2XX dupliquées depuis le OnMain dans l'ordre où vous en avez besoin, en leur passant à leur tour les données des files d'attente comme paramètres.
Ensuite, effectuez des mesures et montrez le gain de vitesse, et vous pourrez alors suggérer de compléter le MQL avec une fonctionnalité appropriée. Mais pourquoi ajouter, si vous avez déjà tout fait vous-même ici et maintenant ?
Ce n'est pas ce que vous écrivez.
Le problème est que la fonctionnalité de remplissage des champs dans les variables d'entrée de la fonction "OntaredeTransaction" ne correspond pas à la description donnée dans l'Aide, pour le pire :
c'est-à-dire que de nombreux champs ne sont pas remplis dans les appels et même dans l'appel final de TRADE_TRANSACTION_HISTORY_ADD.
Par conséquent, tous les traders sont à l'agonie ici pour déterminer d'une manière ou d'une autre ces paramètres manquants au moment de l'arrivée.
Il y a eu de nombreuses discussions ici, il suffit de faire une recherche sur le forum - la mauvaise fonctionnalité "OntaredeTransaction" entraîne des dépenses supplémentaires à la fois en temps et en "charge" les commerçants avec du temps supplémentaire passé sur le développement d'un code qui fonctionne correctement (c'est-à-dire d'énormes pertes de temps et une inefficacité colossale au niveau de la communauté).
Les réponses actuelles des développeurs sont du type "Si vous avez un symbole d'exécution du marché, il aura une valeur de prix nulle ; cela devrait être comme ça" (Lien).(Lien) - une fois de plus, c'est INNORMAL -
l'absence de valeurs exhaustives dans le dernier appel de fonction entraîne beaucoup de travail supplémentaire.
HistoireSelect.
C'est une fonction incroyablement coûteuse. Et malheureusement, aucune quantité de cache ne peut rendre sa vitesse acceptable maintenant.
Par exemple, dans les évaluations environnementales de champs de bataille, il est important de travailler avec des données réelles. En particulier, que les ticks de Market Watch et CopyTicks ne soient pas périmés si possible.
Pour ce faire, il existe des mécanismes pas très bons, mais forcés, pour vérifier la pertinence des données de prix actuelles. Une partie de ce mécanisme consiste à détecter les situations où une transaction sur un symbole est passée après le dernier tick. Cela n'arrive pas rarement, il est donc important de savoir si la tique actuelle est toujours d'actualité ou non.
Pour cette détection, vous devez pouvoir accéder à l'historique des transactions récentes. Cela se fait en utilisant le HistorySelect de la manière schématique suivante.
Malheureusement, un tel appel de HistorySelect prend 5-30 millisecondes (je l'ai mesuré moi-même dans la Release-EX5). Lorsque le conseiller expert effectue plusieurs de ces mises à jour en OnTick (cela devrait être fait après toute pause, par exemple, après chaque OrderSend), alors tout devient follement coûteux/long. HistorySelect peut consommer collectivement plusieurs secondes dans un seul OnTick.
Chers développeurs, pourquoi est-ce si cher ? Cette fonction peut s'exécuter instantanément avec une mise en œuvre appropriée.
Avez-vous des preuves de ce que "un tel appel à HistorySelect dure 5-30 millisecondes" ?
Si j'ai bien compris votre idée, alors le code de test devrait ressembler à ceci :
C'est ainsi que les requêtes 100000 fonctionnent :
Avez-vous des preuves de ce que "un tel appel à HistorySelect dure 5-30 millisecondes" ?
Si j'ai bien compris votre point de vue, alors le code de test devrait ressembler à ceci :
C'est ainsi que fonctionnent les requêtes 100 000 :
Avez-vous des preuves de ce que "un tel appel à HistorySelect dure 5-30 millisecondes" ?
Si j'ai bien compris votre point de vue, alors le code de test devrait ressembler à ceci :
C'est ainsi que fonctionnent les requêtes 100 000 :
Exécution de votre script.
Lancez un autre script.
Nombre normal de combats. Pas HFT.
Au fait, votre script a montré que HistorySelect recalcule tout à chaque fois. Et les paramètres d'entrée n'ont pas changé, la table d'historique n'a pas été mise à jour, les autres fonctions HistorySelect n'ont pas été appelées.
Exécution de votre script.
Il faut alors des détails.
Mon test s'est déroulé sur un ordinateur qui n'est pas le plus rapide "Intel Xeon E5-2630 v4 @ 2.20GHz" avec beaucoup d'autres processus en arrière-plan.
L'historique de mon compte test montre 31315 ordres plus ou moins réguliers depuis 2009, dont 8 ordres pour aujourd'hui.
Il se peut qu'un script ou un conseiller expert ait été exécuté en même temps, ce qui a chargé de façon considérable les bases de données du terminal. Essayez-le sur un terminal "propre".
Test plus informatif :
Trois courses :
Il faut alors des détails.
Mon test a été exécuté sur un ordinateur qui n'est pas le plus rapide "Intel Xeon E5-2630 v4 @ 2.20GHz" avec beaucoup d'autres processus en arrière-plan.
Le compte test avait 31315 ordres dans son historique plus ou moins uniformément depuis 2009, dont 8 ordres pour aujourd'hui.
Il se peut qu'un script ou un conseiller expert ait été exécuté en même temps, ce qui a entraîné un chargement considérable des bases de données du terminal. Essayez-le sur un terminal "propre".
Videz le Terminal sur le même compte et la même machine.
Sur d'autres comptes et terminaux, la même image. Configuration.
Je demande aux lecteurs de donner leurs résultats de ce scénario.
Un test plus informatif :
Trois départs :
Terminal vide 2460.
ZS Exécuter sur un compte vide.
La vitesse semble être fortement influencée par le nombre de transactions, et non par les ordres.
Videz le Terminal sur le même compte et la même machine.
Sur d'autres comptes et terminaux, le même schéma. Configuration.
Je demande aux lecteurs de citer leurs résultats de ce scénario.
Cela ne prouve rien, mais le fait qu'à chaque nouvelle exécution (sur un symbole différent), le temps augmente - est alarmant...
Doit fonctionner sur un compte avec un long historique de transactions.