Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5
- Visualizaciones:
- 15
- Ranking:
- Publicado:
-
¿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

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.

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

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

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