Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Facebook !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Bibliothèque

Logging V2 for both MQL4 and MQL5 - bibliothèque pour MetaTrader 5

Vues:
12
Note:
(4)
Publié:
\MQL5\Include\
Logging.mqh (52.65 KB) afficher
\MQL5\Experts\ \MQL5\Scripts\
Logging.mq5 (9.08 KB) afficher
MQL5 Freelance 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

Position Risk Calculation Tool Position Risk Calculation Tool

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

Cycle stochastique du cyberespace Cycle stochastique du cyberespace

Un oscillateur stochastique adaptatif.

Value Charts Value Charts

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

SuperTrend SuperTrend

SuperTrend indicator.