Rejoignez notre page de fans
- Vues:
- 12
- Note:
- Publié:
-
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance
Classe CDebugLogger V2 : Un utilitaire de journalisation complet pour MQL4/5
La classe CDebugLogger est un utilitaire de journalisation puissant et flexible, spécialement conçu pour les environnements MQL4/5. C'est un outil essentiel pour les développeurs qui ont besoin de surveiller, de déboguer et de suivre le comportement de leurs applications avec précision.
Dans cette nouvelle version de la classe CDebugLogger, j'ai introduit plusieurs améliorations afin de renforcer sa fonctionnalité et sa polyvalence. Ces améliorations comprennent un mécanisme d'amortissement pour empêcher l'enregistrement excessif dans les systèmes événementiels tels que OnTick, OnTimer et OnChartEvent, ainsi que de nouvelles options de filtrage et de mise en sourdine pour aider les développeurs à se concentrer sur les entrées d'enregistrement les plus pertinentes.
J'ai décidé de publier cette version mise à jour en tant que base de code séparée afin de donner aux utilisateurs la liberté de choisir l'implémentation qui correspond le mieux à leurs besoins. Que vous préfériez la version originale ou cette version améliorée, vous avez maintenant la possibilité de choisir l'outil de journalisation qui convient à votre flux de travail et aux exigences de votre projet.
Ci-dessous, nous explorons les principales fonctionnalités et capacités de cette classe améliorée.
Caractéristiques principales
- Plusieurs niveaux de journalisation : La classe CDebugLogger prend en charge la journalisation à différents niveaux d'importance, notamment INFO, WARNING, ERROR et DEBUG. Cela permet aux développeurs de filtrer et de se concentrer sur les messages ayant une importance particulière.
- Inclusion de l'horodatage : Les développeurs peuvent choisir d'inclure des horodatages dans leurs messages de journalisation, avec des formats personnalisables. Cette fonctionnalité est cruciale pour suivre l'heure exacte des événements et déboguer les problèmes sensibles au temps.
- Journalisation des fichiers : La classe fournit un support robuste pour l'enregistrement dans des fichiers. Les développeurs peuvent activer ou désactiver la journalisation des fichiers, spécifier le chemin du fichier de journalisation et choisir d'enregistrer les journaux dans un dossier commun. En outre, les journaux peuvent être enregistrés au format CSV, ce qui facilite leur analyse.
- Informations contextuelles : Pour améliorer la clarté des messages du journal, la classe CDebugLogger permet d'inclure des signatures de fonctions, des noms de fichiers et des numéros de lignes. Ces informations contextuelles permettent de localiser précisément les problèmes dans le code.
- Mots-clés silencieux : Une caractéristique unique de cette classe est la possibilité de rendre silencieux les journaux qui contiennent des mots-clés spécifiques. Cette fonction est particulièrement utile pour éviter que des informations sensibles, telles que des mots de passe ou des données confidentielles, ne soient enregistrées.
- Mots clés filtrés : Une autre caractéristique unique de cette classe est la possibilité de filtrer les journaux qui contiennent des mots-clés spécifiques. Cette fonction est particulièrement utile pour le débogage, car elle permet de se concentrer uniquement sur les journaux relatifs à des problèmes spécifiques. Les développeurs peuvent limiter la sortie des journaux aux messages contenant certains termes, ce qui facilite l'identification et la résolution des problèmes liés à ces termes sans être submergés par des entrées de journaux sans rapport avec le sujet.
- Débrancher la journalisation des événements: Afin d'éviter le spamming et la journalisation excessive dans les systèmes événementiels (tels que OnTick, OnTimer et OnChartEvent), la classe CDebugLogger comprend un mécanisme de débouclage. Cette fonction permet de supprimer temporairement les entrées répétées d'un même événement, de sorte que seules les modifications uniques ou significatives sont enregistrées. Cette fonction est particulièrement utile pour réduire le bruit dans les journaux et prévenir la dégradation des performances dans les environnements où les événements sont fréquents.
Exemple d'utilisation
Voici un exemple d'initialisation et d'utilisation de la classe CDebugLogger :
// Initialiser le logger avec le niveau INFO dans un fichier CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true); // Enregistrer un message simple logger.Log(INFO, "This is an info message"); // Faire taire un mot-clé logger.AddSilentKeyword("password"); // Enregistrer un message qui sera réduit au silence logger.Log(INFO, "User entered password: 1234"); // Activer la journalisation des fichiers logger.EnableFileLogging(true, "debug.log", false); // Supprimer un mot-clé silencieux logger.RemoveSilentKeyword("password"); // Enregistrer un message après avoir supprimé le mot-clé de la liste de silence logger.Log(INFO, "User entered password: 1234"); // Ajouter un mot-clé pour filtrer les journaux logger.AddFilterKeyword("success"); // Enregistrer un message qui sera filtré logger.Log(INFO, "Operation failed"); // Enregistrer un message qui passera le filtre logger.Log(INFO, "Operation successful"); // Supprimer un mot-clé du filtre logger.RemoveFilterKeyword("success"); // Initialisation à l'aide de la fonction générique Log logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true); // Enregistrer un avertissement à l'aide de la fonction générique Log Log(WARNING, "This is a warning message");
Exemple de script
Pour utiliser la classe CDebugLogger dans un script, il suffit d'inclure la bibliothèque nécessaire au début de votre fichier, comme indiqué ci-dessous :
//--- Il est important d'inclure ce fichier d'en-tête avant tous les autres #include <Logging.mqh> //+------------------------------------------------------------------+ //| Fonction de démarrage du programme de script| //+------------------------------------------------------------------+ void OnStart() { //--- Initialiser le logger avec le niveau INFO, en l'enregistrant dans un fichier //--- Inclure les horodatages et enregistrer au format CSV int log_options = 0; // NOM DE FICHIER | LIGNE | FUNCSIG ; logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true); //--- Enregistrer un simple message d'information Log(INFO, "Script started successfully."); //--- Enregistrer un message d'avertissement Log(WARNING, "This is a warning message."); //--- Enregistrer un message d'erreur Log(ERROR, "This is an error message."); //--- Enregistrer un message de débogage Log(DEBUG, "This is a debug message for debugging purposes."); //--- Ajouter un mot-clé pour faire taire les logs contenant 'password' logging.AddSilentKeyword("password"); //--- Tentative d'enregistrement d'un message contenant le mot-clé silence Log(INFO, "User entered password: 12348"); // Ce message sera rendu silencieux //--- Supprimer le mot clé silencieux logging.RemoveSilentKeyword("password"); //--- Enregistrer le message à nouveau, maintenant il sera enregistré Log(INFO, "User entered password: 1234"); //--- Utiliser la fonction générique Log pour enregistrer un message Log(INFO, "This message is logged using the generic Log function."); //--- Utiliser la macro Print pour enregistrer un message au niveau INFO Print("This message is logged using the Print macro."); //--- Démonstration de la journalisation avec différentes combinaisons d'options logging.Initialize(INFO, true, "log_with_options.txt", true, TIME_DATE | TIME_MINUTES, false, FILENAME | LINE, true); Log(INFO, "This log includes only the file name and line number."); logging.Initialize(INFO, true, "log_with_funcsig.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, FUNCSIG, true); Log(INFO, "This log includes only the function signature."); logging.Initialize(INFO, true, "log_custom_order.txt", true, TIME_MINUTES, false, LINE | FILENAME | FUNCSIG, true); Log(INFO, "This log includes line number, file name, and function signature in a custom order."); //--- Ajouter un mot-clé pour filtrer les journaux contenant 'important' logging.AddFilterKeyword("important"); //--- Enregistrer quelques messages pour démontrer l'efficacité du filtre Log(INFO, "This is an important message."); // Ce message sera visible Log(INFO, "This is a regular message."); // Ce message ne sera pas visible //--- Enlever le mot clé "filter" pour afficher tous les logs logging.RemoveFilterKeyword("important"); //--- Enregistrer un message final indiquant la fin du script Log(INFO, "Script execution completed."); }
Exemple de sortie CSV :
Timestamp,Level,Message "2024.09.01 18:31:44","INFO","Script started successfully." "2024.09.01 18:31:44","WARNING","This is a warning message." "2024.09.01 18:31:44","ERROR","This is an error message." "2024.09.01 18:31:44","DEBUG","This is a debug message for debugging purposes." "2024.09.01 18:31:44","INFO","User entered password: 1234" "2024.09.01 18:31:44","INFO","This message is logged using the generic Log function." "2024.09.01 18:31:44","INFO","This message is logged using the Print macro."
Timestamp,Level,Message,Filename,Line "2024.09.01 18:31","INFO","This log includes only the file name and line number.","Logging.mq5","135"
Timestamp,Level,Message,Funcsig "2024.09.01 18:31:44","INFO","This log includes only the function signature.","void OnStart()"
Timestamp,Level,Message,Filename,Line,Funcsig "18:31","INFO","This log includes line number, file name, and function signature in a custom order.","Logging.mq5","141","void OnStart()" "18:31","INFO","This is an important message.","Logging.mq5","147","void OnStart()" "18:31","INFO","Script execution completed.","Logging.mq5","154","void OnStart()"
Exemple Exper Advisor
#include <Logging.mqh> //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'expert| //+------------------------------------------------------------------+ int OnInit() { int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG ; ou 0 logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false); //--- créer un timer EventSetMillisecondTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Fonction de désinitialisation de l'expert| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- détruire la minuterie EventKillTimer(); } int counter = 0; datetime last_time = 0; //--- Enregistre la dernière fois que le compteur a été mis à jour //+------------------------------------------------------------------+ //| Fonction de temporisation| //+------------------------------------------------------------------+ void OnTimer() { logging.BeginEvent(); //--- Démarrer un nouvel événement Log(INFO, "Sample message"); Log(INFO, "Another message"); Log(INFO, "Sample message"); //--- Obtenir l'heure actuelle datetime current_time = TimeLocal(); //--- Vérifier si au moins 2 secondes se sont écoulées depuis la dernière mise à jour du compteur if (current_time - last_time >= 2) { //--- Mise à jour du compteur counter++; //--- Mise à jour de la dernière fois last_time = current_time; //--- Enregistrer le message avec la nouvelle valeur du compteur Log(INFO, "Counter value: " + IntegerToString(counter)); //--- Vous pouvez également enregistrer un autre message Log(INFO, "Updated after 2 seconds"); } else { //--- Enregistrer un message indiquant que la minuterie est active mais que le compteur n'a pas changé Log(INFO, "Timer active but counter unchanged"); } }
Exemple de sortie du terminal MT5 :
2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 43 Function: void OnTimer() [INFO] Sample message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 44 Function: void OnTimer() [INFO] Another message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 45 Function: void OnTimer() [INFO] Sample message 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 55 Function: void OnTimer() [INFO] Counter value: 1 2024.09.22 13:00:29.589 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:29.605 test_logging (EURUSD,H1) 2024.09.22 13:00:29 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged 2024.09.22 13:00:31.001 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 55 Function: void OnTimer() [INFO] Counter value: 2 2024.09.22 13:00:31.001 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:31.017 test_logging (EURUSD,H1) 2024.09.22 13:00:31 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged 2024.09.22 13:00:33.001 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 55 Function: void OnTimer() [INFO] Counter value: 3 2024.09.22 13:00:33.001 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds 2024.09.22 13:00:33.016 test_logging (EURUSD,H1) 2024.09.22 13:00:33 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
Conclusion
La classe CDebugLogger est un outil inestimable pour tout développeur MQL4/5. Grâce à son large éventail de fonctionnalités personnalisables, elle permet une journalisation et une surveillance précises des applications, ce qui facilite le débogage et améliore le suivi des performances de l'application. Que vous ayez besoin d'un simple enregistrement de message ou d'informations contextuelles détaillées, la classe CDebugLogger fournit une solution fiable et efficace adaptée à vos besoins de développement.
Pour plus d'informations sur la classe CDebugLogger ou pour découvrir d'autres outils et solutions avancés, visitez le site de StormWave Technologies.
Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/52298

Un indicateur qui calcule dynamiquement le risque (en pourcentage et en argent) en fonction de la taille du lot et du stop loss.

Un oscillateur stochastique adaptatif.

Value Charts is a detrended price indicator, it shows the overbought and oversold states using the detrended price extremes.

SuperTrend indicator.