Mira cómo descargar robots gratis
¡Búscanos en Facebook!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Logging V2 for both MQL4 and MQL5 - librería para MetaTrader 5

Visualizaciones:
15
Ranking:
(4)
Publicado:
\MQL5\Include\
Logging.mqh (52.65 KB) ver
\MQL5\Experts\
test_logging.mq5 (6.25 KB) ver
\MQL5\Scripts\
Logging.mq5 (9.08 KB) ver
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

CDebugLogger Clase V2: Una Utilidad de Registro Completa para MQL4/5

La clase CDebugLogger es una potente y flexible utilidad de registro diseñada específicamente para entornos MQL4/5. Es una herramienta esencial para los desarrolladores que necesitan monitorizar, depurar y seguir con precisión el comportamiento de sus aplicaciones.

En esta nueva versión de la clase CDebugLogger, he introducido varias mejoras para aumentar su funcionalidad y versatilidad. Estas mejoras incluyen un mecanismo de debounce para evitar el registro excesivo en sistemas basados en eventos como OnTick, OnTimer y OnChartEvent, así como nuevas opciones de filtrado y silenciado para ayudar a los desarrolladores a centrarse en las entradas de registro más relevantes.

He decidido publicar esta versión actualizada como una base de código independiente para dar a los usuarios la libertad de elegir la implementación que mejor se adapte a sus necesidades. Tanto si prefieres la versión original como esta mejorada, ahora tienes la opción de seleccionar la herramienta de registro que mejor se adapte a tu flujo de trabajo y a los requisitos de tu proyecto.

A continuación, exploramos las principales características y capacidades de esta clase mejorada.

Características principales

  • Múltiples niveles de registro: La clase CDebugLogger soporta el registro en diferentes niveles de importancia, incluyendo INFO, ADVERTENCIA, ERROR y DEBUG. Esto permite a los desarrolladores filtrar y centrarse en mensajes de especial importancia.
  • Inclusión de marcas de tiempo: Los desarrolladores pueden optar por incluir marcas de tiempo en sus mensajes de registro, con formatos personalizables. Esta característica es crucial para el seguimiento de la hora exacta de los eventos y la depuración de problemas sensibles al tiempo.
  • Registro de archivos: La clase proporciona un soporte robusto para el registro en archivos. Los desarrolladores pueden activar o desactivar el registro de archivos, especificar la ruta del archivo de registro y elegir si desean guardar los registros en una carpeta común. Además, los registros pueden guardarse en formato CSV, lo que facilita su análisis.
  • Información contextual: Para mejorar la claridad de los mensajes de registro, la clase CDebugLogger permite la inclusión de firmas de función, nombres de archivo y números de línea. Esta información contextual ayuda a localizar con exactitud los problemas dentro del código.
  • Palabras clave silenciosas: Una característica única de esta clase es la capacidad de silenciar los registros que contienen palabras clave específicas. Esto es especialmente útil para evitar que se registre información sensible, como contraseñas o datos confidenciales.
  • Filtrar palabras clave: Otra característica única de esta clase es la capacidad de filtrar los registros que contienen palabras clave específicas. Esto es particularmente útil para la depuración, centrándose sólo en los registros que son relevantes para problemas específicos. Los desarrolladores pueden reducir la salida de registro para incluir sólo los mensajes que contienen ciertos términos, por lo que es más fácil de identificar y abordar los problemas relacionados con los términos sin ser abrumado por las entradas de registro no relacionados.
  • Eliminación del registro de eventos: Para evitar el spam y el exceso de registros en sistemas basados en eventos (como OnTick, OnTimer y OnChartEvent), la clase CDebugLogger incluye un mecanismo de eliminación de rebotes. Esta característica asegura que las entradas de registro repetidas del mismo evento se supriman temporalmente, permitiendo que sólo se registren los cambios únicos o significativos. Esto es particularmente útil para reducir el ruido en los registros y prevenir la degradación del rendimiento en entornos de eventos de alta frecuencia.

Ejemplo de uso

A continuación se muestra un ejemplo de cómo inicializar y utilizar la clase CDebugLogger:

// Inicializar el logger con nivel INFO registrando en un fichero
CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true);

// Registrar un mensaje simple
logger.Log(INFO, "This is an info message");

// Silenciar una palabra clave
logger.AddSilentKeyword("password");

// Registrar un mensaje que será silenciado
logger.Log(INFO, "User entered password: 1234");

// Activar el registro de archivos
logger.EnableFileLogging(true, "debug.log", false);

// Eliminar una palabra clave silenciada
logger.RemoveSilentKeyword("password");

// Registrar un mensaje después de eliminar la palabra clave de la lista de silencio
logger.Log(INFO, "User entered password: 1234");

// Añadir una palabra clave para filtrar los registros
logger.AddFilterKeyword("success");

// Registrar un mensaje que será filtrado
logger.Log(INFO, "Operation failed");

// Registrar un mensaje que pase el filtro
logger.Log(INFO, "Operation successful");

// Eliminar una palabra clave del filtro
logger.RemoveFilterKeyword("success");

// Inicializar usando la función genérica Log
logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true);

// Registrar una advertencia utilizando la función genérica Log
Log(WARNING, "This is a warning message");

Ejemplo de Script

Para utilizar la clase CDebugLogger en un script, simplemente incluya la librería necesaria al principio de su archivo, como se muestra a continuación:

//--- Es importante incluir este fichero de cabecera antes que todos los demás
#include <Logging.mqh>  


//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
{
   //--- Inicializar el logger con nivel INFO, registrando en un fichero
   //--- Incluir marcas de tiempo y guardar en formato CSV
   int log_options = 0; // NOMBRE DE ARCHIVO | LÍNEA | FUNCSIG;
   logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true);

   //--- Registrar un simple mensaje informativo
   Log(INFO, "Script started successfully.");

   //--- Registrar un mensaje de advertencia
   Log(WARNING, "This is a warning message.");

   //--- Registrar un mensaje de error
   Log(ERROR, "This is an error message.");

   //--- Registrar un mensaje de depuración
   Log(DEBUG, "This is a debug message for debugging purposes.");

   //--- Añade una palabra clave para silenciar los registros que contengan 'password'
   logging.AddSilentKeyword("password");

   //--- Intento de registrar un mensaje que contiene la palabra clave silenciado
   Log(INFO, "User entered password: 12348"); // Este mensaje será silenciado

   //--- Eliminar la palabra clave silenciada
   logging.RemoveSilentKeyword("password");

   //--- Registrar el mensaje de nuevo, ahora se registrará
   Log(INFO, "User entered password: 1234");

   //--- Utiliza la función genérica Log para registrar un mensaje
   Log(INFO, "This message is logged using the generic Log function.");

   //--- Utilice la macro Imprimir para registrar un mensaje en el nivel INFO
   Print("This message is logged using the Print macro.");

   //--- Demostrar el registro con diferentes combinaciones de opciones
   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.");

   //--- Añadir una palabra clave para filtrar los registros que contengan 'importante
   logging.AddFilterKeyword("important");

   //--- Registrar algunos mensajes para demostrar el filtro
   Log(INFO, "This is an important message."); // Este mensaje será visible
   Log(INFO, "This is a regular message.");    // Este mensaje no será visible

   //--- Eliminar la palabra clave de filtro para mostrar todos los registros
   logging.RemoveFilterKeyword("important");

   //--- Registra un mensaje final indicando el fin del script
   Log(INFO, "Script execution completed.");
}

Ejemplo de salida 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()"


Ejemplo de Exper Advisor

#include <Logging.mqh>

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
{  int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; o 0
   logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false);
//--- crear temporizador
   EventSetMillisecondTimer(1);
//---
   return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destruir temporizador
   EventKillTimer(); }

int counter = 0;
datetime last_time = 0; //--- Almacena la última vez que se actualizó el contador
//+------------------------------------------------------------------+
//| Función temporizador|
//+------------------------------------------------------------------+
void OnTimer()
{  logging.BeginEvent(); //--- Iniciar un nuevo evento
   Log(INFO, "Sample message");
   Log(INFO, "Another message");
   Log(INFO, "Sample message"); 
//--- Obtener la hora actual
   datetime current_time = TimeLocal();
//--- Comprueba si han pasado al menos 2 segundos desde la última actualización del contador
   if (current_time - last_time >= 2)
   {  //--- Actualizar el contador
      counter++;
      //--- Actualizar la última vez
      last_time = current_time;
      //--- Registrar el mensaje con el nuevo valor del contador
      Log(INFO, "Counter value: " + IntegerToString(counter));
      //--- También puede registrar otro mensaje
      Log(INFO, "Updated after 2 seconds"); }
   else
   {  //--- Registra un mensaje indicando que el temporizador está activo pero el contador no ha cambiado
      Log(INFO, "Timer active but counter unchanged"); } }

Ejemplo de terminal MT5 de salida:

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


Conclusión

La clase CDebugLogger es una herramienta inestimable para cualquier desarrollador MQL4/5. Con su amplia gama de características personalizables, permite un registro y monitorización precisos de las aplicaciones, facilitando una depuración más sencilla y un mejor seguimiento del rendimiento de la aplicación. Tanto si necesita un simple registro de mensajes como información contextual detallada, la clase CDebugLogger proporciona una solución fiable y eficiente adaptada a sus necesidades de desarrollo.

Para más información sobre la clase CDebugLogger o para explorar otras herramientas y soluciones avanzadas, visite StormWave Technologies.

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/52298

Position Risk Calculation Tool Position Risk Calculation Tool

Un indicador que calcula dinámicamente el riesgo (en porcentajes y en dinero) en función del tamaño del lote y del stop loss.

Dashboard Panel for displaying information on the chart Dashboard Panel for displaying information on the chart

Este código muestra cómo se puede crear un cuadro de mando para mostrar toda la información relevante en el gráfico

Accumulation/Distribution Accumulation/Distribution

El indicador Accumulation/Distribution (Acumulación/Distribución) queda determinado por los cambios que se producen en el precio y en el volumen.

Accelerator Oscillator (AC) Accelerator Oscillator (AC)

El indicador Acceleration/Deceleration (AC, Aceleración/Desaceleración) mide la aceleración y la desaceleración de la fuerza impulsora del mercado.