- 显示:
- 20
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
CDebugLogger 类 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"); // 使用通用日志函数进行初始化 logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true); // 使用通用日志函数记录警告 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."); //--- 添加一个关键字,使包含 "密码 "的日志保持沉默 logging.AddSilentKeyword("password"); //--- 尝试记录包含消音关键字的信息 Log(INFO, "User entered password: 12348"); // 此信息将被静音 //--- 删除沉默关键字 logging.RemoveSilentKeyword("password"); //--- 再次记录信息,现在它将被记录下来 Log(INFO, "User entered password: 1234"); //--- 使用通用日志函数记录信息 Log(INFO, "This message is logged using the generic Log function."); //--- 使用打印宏记录 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."); //--- 添加关键字以过滤包含 "重要 "的日志 logging.AddFilterKeyword("important"); //-- 记录一些信息以演示过滤器 Log(INFO, "This is an important message."); // 将显示该信息 Log(INFO, "This is a regular message."); // 此信息将不可见 //--- 删除过滤关键字以显示所有日志 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

根据手数和止损动态计算风险(百分比和金额)的指标

这段代码展示了如何创建一个仪表盘,在图表上显示所有相关信息