Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 32
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
CDebugLogger Class V2: Комплексная утилита протоколирования для MQL4/5
Класс CDebugLogger - это мощная и гибкая утилита протоколирования, специально разработанная для сред MQL4/5. Это незаменимый инструмент для разработчиков, которым необходимо точно контролировать, отлаживать и отслеживать поведение своих приложений.
В новой версии класса CDebugLogger я ввел несколько улучшений, чтобы расширить его функциональность и универсальность. Среди этих улучшений - механизм дебаггинга для предотвращения чрезмерной записи логов в системах, управляемых событиями, таких как OnTick, OnTimer и OnChartEvent, а также новые опции фильтрации и глушения, помогающие разработчикам сосредоточиться на наиболее важных записях логов.
Я решил выпустить эту обновленную версию в виде отдельной кодовой базы, чтобы дать пользователям свободу выбора реализации, которая лучше всего соответствует их потребностям. Независимо от того, предпочитаете ли вы оригинальную версию или эту улучшенную, теперь у вас есть возможность выбрать инструмент для ведения логов, который соответствует вашему рабочему процессу и требованиям проекта.
Ниже мы рассмотрим ключевые особенности и возможности этого усовершенствованного класса.
Ключевые особенности
- Несколько уровней ведения журнала: Класс CDebugLogger поддерживает ведение журнала на разных уровнях важности, включая INFO, WARNING, ERROR и DEBUG. Это позволяет разработчикам фильтровать и фокусироваться на сообщениях особой важности.
- Включение временных меток: Разработчики могут включать в сообщения журнала временные метки в настраиваемых форматах. Эта функция очень важна для отслеживания точного времени событий и отладки проблем, чувствительных к времени.
- Файловое протоколирование: Класс обеспечивает надежную поддержку записи логов в файлы. Разработчики могут включить или отключить ведение журнала в файлах, указать путь к файлу журнала и выбрать, сохранять ли журналы в общей папке. Кроме того, журналы могут быть сохранены в формате CSV, что упрощает их разбор и анализ.
- Контекстная информация: Для повышения наглядности сообщений журнала класс CDebugLogger позволяет включать сигнатуры функций, имена файлов и номера строк. Эта контекстная информация помогает точно определить местоположение проблем в коде.
- Тихие ключевые слова: Уникальной особенностью этого класса является возможность глушить журналы, содержащие определенные ключевые слова. Это особенно полезно для предотвращения записи конфиденциальной информации, такой как пароли или конфиденциальные данные.
- Фильтр ключевых слов: Еще одной уникальной особенностью этого класса является возможность фильтрации журналов, содержащих определенные ключевые слова. Это особенно полезно для отладки, поскольку позволяет сосредоточиться только на тех журналах, которые имеют отношение к конкретным проблемам. Разработчики могут сузить вывод журнала, включив в него только сообщения, содержащие определенные термины, что облегчает выявление и решение проблем, связанных с этими терминами, и не перегружает журнал не относящимися к делу записями.
- Отказ от ведения журнала событий: Для предотвращения спама в журналах и чрезмерной регистрации в системах, управляемых событиями (например, OnTick, OnTimer и OnChartEvent), класс CDebugLogger включает механизм дебаггинга. Эта функция обеспечивает временное подавление повторяющихся записей в журнале от одного и того же события, позволяя регистрировать только уникальные или значительные изменения. Это особенно полезно для уменьшения шума в журналах и предотвращения снижения производительности в средах с высокой частотой событий.
Пример использования
Ниже приведен пример инициализации и использования класса CDebugLogger:
// Инициализируем регистратор с записью в файл на уровне INFO CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true); // Записать простое сообщение logger.Log(INFO, "This is an info message"); // Заглушите ключевое слово logger.AddSilentKeyword("password"); // Записать сообщение, которое будет заглушено logger.Log(INFO, "User entered password: 1234"); // Включите регистрацию файлов logger.EnableFileLogging(true, "debug.log", false); // Удалите замолчавшее ключевое слово logger.RemoveSilentKeyword("password"); // Выведите сообщение после удаления ключевого слова из списка молчания logger.Log(INFO, "User entered password: 1234"); // Добавьте ключевое слово для фильтрации журналов logger.AddFilterKeyword("success"); // Занесите в журнал сообщение, которое будет отфильтровано logger.Log(INFO, "Operation failed"); // Запишите в журнал сообщение, которое пройдет фильтр logger.Log(INFO, "Operation successful"); // Удалите ключевое слово из фильтра logger.RemoveFilterKeyword("success"); // Инициализация с помощью общей функции Log logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true); // Занесите предупреждение в журнал, используя общую функцию Log Log(WARNING, "This is a warning message");
Пример сценария
Чтобы использовать класс CDebugLogger в сценарии, просто включите необходимую библиотеку в начало файла, как показано ниже:
//--- Важно включить этот заголовочный файл перед всеми остальными #include <Logging.mqh> //+------------------------------------------------------------------+ //| Функция запуска программы сценария| //+------------------------------------------------------------------+ void OnStart() { //--- Инициализируем регистратор с уровнем INFO, ведя запись в файл //--- Включение временных меток и сохранение в формате CSV int log_options = 0; // FILENAME | LINE | FUNCSIG; logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true); //--- Выведите в журнал простое информационное сообщение Log(INFO, "Script started successfully."); //--- Выведите предупреждающее сообщение Log(WARNING, "This is a warning message."); //--- Выведите сообщение об ошибке Log(ERROR, "This is an error message."); //--- Выведите в журнал отладочное сообщение Log(DEBUG, "This is a debug message for debugging purposes."); //--- Добавьте ключевое слово для блокировки журналов, содержащих 'password'. logging.AddSilentKeyword("password"); //--- Попытка зарегистрировать сообщение, содержащее ключевое слово silenced Log(INFO, "User entered password: 12348"); // Это сообщение будет заглушено //--- Удалите ключевое слово "молчание". logging.RemoveSilentKeyword("password"); //--- Запишите сообщение снова, теперь оно будет занесено в журнал Log(INFO, "User entered password: 1234"); //--- Используйте общую функцию Log для регистрации сообщения Log(INFO, "This message is logged using the generic Log function."); //--- Используйте макрос Print для регистрации сообщения на уровне INFO Print("This message is logged using the Print macro."); //--- Продемонстрируйте ведение журнала с различными комбинациями опций 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."); //--- Добавьте ключевое слово для фильтрации журналов, содержащих 'important' logging.AddFilterKeyword("important"); //--- Выведите несколько сообщений для демонстрации работы фильтра Log(INFO, "This is an important message."); // Это сообщение будет видно Log(INFO, "This is a regular message."); // Это сообщение не будет отображаться //--- Удалите ключевое слово filter, чтобы показать все журналы. logging.RemoveFilterKeyword("important"); //--- Выведите в журнал финальное сообщение о завершении работы скрипта Log(INFO, "Script execution completed."); }
Пример вывода 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()"
Пример советника
#include <Logging.mqh> //+------------------------------------------------------------------+ //| Функция инициализации эксперта| //+------------------------------------------------------------------+ int OnInit() { int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; или 0 logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false); //--- создайте таймер EventSetMillisecondTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Функция деинициализации эксперта| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- уничтожить таймер EventKillTimer(); } int counter = 0; datetime last_time = 0; //--- Сохраняет последний раз, когда счетчик был обновлен //+------------------------------------------------------------------+ //| Функция таймера| //+------------------------------------------------------------------+ void OnTimer() { logging.BeginEvent(); //--- Начните новое событие Log(INFO, "Sample message"); Log(INFO, "Another message"); Log(INFO, "Sample message"); //--- Получите текущее время datetime current_time = TimeLocal(); //--- Проверьте, прошло ли не менее 2 секунд с момента последнего обновления счетчика. if (current_time - last_time >= 2) { //--- Обновите счетчик counter++; //--- Обновление последнего времени last_time = current_time; //--- Занесите в журнал сообщение с новым значением счетчика Log(INFO, "Counter value: " + IntegerToString(counter)); //--- Вы также можете записать в журнал другое сообщение Log(INFO, "Updated after 2 seconds"); } else { //--- Выведите в журнал сообщение о том, что таймер активен, но счетчик не изменился Log(INFO, "Timer active but counter unchanged"); } }
Пример вывода данных из терминала 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
Заключение
Класс CDebugLogger - это бесценный инструмент для любого разработчика MQL4/5. Благодаря широкому набору настраиваемых функций он позволяет вести точный журнал и мониторинг приложений, облегчая отладку и повышая эффективность работы приложения. Нужна ли вам простая регистрация сообщений или подробная контекстная информация, класс CDebugLogger обеспечивает надежное и эффективное решение, соответствующее вашим потребностям в разработке.
Для получения дополнительной информации о классе CDebugLogger или для изучения других передовых инструментов и решений посетите сайт StormWave Technologies.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/52298

Индикатор, который динамически рассчитывает риск (в процентах и деньгах) на основе размера лота и стоп-лосса

Этот код показывает, как можно создать приборную панель для отображения всей необходимой информации на графике

Скрипт рисует уровни Рудолфа Акселя

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.