Oh, oui, Pushkin, oui, fils de pute.
C'est un grand article. Un véritable endoscope.
Je l'utiliserai certainement pour les grands projets. Il me faut 24 heures pour trouver l'origine de l'erreur.
Le débogueur est bon, mais la trace donne une image complète du passage du signal.
De rien, j'ai fait de mon mieux pour vous. :)
J'ai l'intention de maintenir et d'essayer d'étendre les fonctionnalités de ce système. Si vous avez besoin de quelque chose, écrivez-moi.
-----
Pour plus de clarté, je pense qu'il est nécessaire d'aborder deux autres points purement techniques.
1. Dans le fichier Trace.mqh, une seule instance du traceur est créée (au bas du fichier).
extern CTraceCtrl* m_trace; // une seule instance du traceur
Grâce à la directive extern, l'instance sera unique. En d'autres termes, elle ne dépend pas du nombre de fichiers #include "Trace.mqh" inclus dans le fichier #include "Trace.mqh".
2. La classe CTraceView n'est utilisée dans CTraceCtrl que pour une seule raison : développer la fonction CTraceCtrl::Break.
Il s'agit d'avoir une réaction aux clics de l'utilisateur dans une boucle while (true)
Ajout du traitement de la macro __PATH__ (build 420), en relation avec laquelle toutes les classes sont mises à jour.
Le bouton permettant d'ouvrir un fichier de nœud a été ajouté à la fenêtre INFO.
L'ouverture est effectuée par la commande ShellExecute , de sorte que l'autorisation d'importation de DLL est requise pour que les classes fonctionnent.
ajout d'une fonctionnalité permettant d'ajouter une description de nœud.
Désormais, dans les macros _IN, il est possible d'ajouter une description supplémentaire, par exemple pour afficher les conditions d'entrée dans un nœud ou certaines informations pertinentes.
Cette description est mise à jour dynamiquement dans l'affichage de l'arbre.
Exemple de code :
void OnTick() { _IN(""); static datetime limit_time=0; // temps de traitement de la dernière transaction + délai d'attente //--- ne pas traiter en cas de dépassement de délai if(TimeCurrent()>=limit_time) { _IN2(TimeCurrent()+">="+limit_time); //--- vérification des données if(Bars(Symbol(),Period())>2*InpMATrendPeriod) { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod); //--- modifier la durée limite par le délai d'attente en secondes en cas de traitement if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut; } } //--- }
Exemple d'affichage de l'information
Bouton d'activation de l'affichage de la description - en haut à droite "i"
1. Ajout d'une classe CPropertyView distincte pour l'affichage des propriétés des nœuds.
2. Toutes les fonctions surchargées des classes sont rendues virtuelles, de sorte que toutes les classes sont mises à jour.
3. Ajout de deux nouvelles propriétés à la classe CNode.
m_edit - signe du champ modifiable dans CPropertyView
m_brkuse - nombre d'appels au nœud, à partir duquel la fonction CTraceCtrl::Break est arrêtée et appelée. 3.
3. Selon les notes d'Urain sur le forum, deux possibilités d'utilisation des arrêts de code ont été ajoutées.
- activer/désactiver les arrêts (bouton rouge D)
- arrêter par le nombre spécifié d'invocations de nœuds
а. La définition du nombre initial m_brkuse dans le noeud peut être effectuée à l'aide d'une macro (dans le fichier Trace)
#define _BRKUSES(u) if (!NIL(m_trace)) if (!NIL(m_trace.m_cur)) ........
b. Ou directement dans la fenêtre des propriétés du nœud dans le champ"DebugBreak after", qui spécifie le nombre requis d'appels avant de s'arrêter.
CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE
5. Changements cosmétiques mineurs dans le mappage des arbres
Est-il possible d'utiliser ce mécanisme dans les scripts ?
Je pense que oui. Mais en général, dans les scripts, le code n'est pas beaucoup ramifié (sauf bien sûr si le script est en boucle).
En outre, il y a un inconvénient - l'événement OnChartEvent n'est pas géré dans les scripts.
Je pense que oui. Mais en général, dans les scripts, le code n'est pas beaucoup ramifié (sauf bien sûr si le script est en boucle).
En outre, il y a un inconvénient - les scripts ne gèrent pas l'événement OnChartEvent.
Et si mon script utilise de nombreuses classes différentes, quelles sont les hiérarchies de classes ?
Je pense qu'il est nécessaire d'affiner l'outil pour les scripts également...
La classe CTraceView ne se préoccupe pas de savoir qui l'appelle, elle crée un arbre et l'affiche.
Mais les scripts ont un problème de rétroaction insoluble. Vous ne pourrez pas travailler activement avec l'arbre.

- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Un nouvel article Traçage, Débogage et Analyse Structurelle du Code Source a été publié :
L'ensemble complexe des problèmes de création d'une structure d'un code exécuté et de son traçage peut être réglé sans difficultés majeures. Cette possibilité est apparue dans MetaTrader 5 en raison de la nouvelle fonctionnalité du langage MQL5 - la création automatique de variables dont les données sont de type complexe (structures et classes) et leur élimination au moment de quitter le périmètre local. L'article comporte la description de la méthodologie et de l'outil prêt à l'emploi.
Lorsqu'elles rencontrent un tel point de rupture, les arbres de pile sont synchronisés pour afficher la fonction qui a appelé cette macro. Si un nœud est fermé, le nœud parent sera étendu pour l'afficher. Et si nécessaire, l'arbre défile vers le haut ou vers le bas pour amener le nœud dans la zone visible.
Pour quitterCTraceCtrl::Break ,cliquez sur le bouton rouge situé près du nom du nœud.
Auteur : ---