文章 "MQL5中的错误处理和日志记录"

 

新文章 MQL5中的错误处理和日志记录已发布:

本文着力介绍和软件错误处理相关的常见问题。另外,介绍了日志项及用MQL5工具包实现日志记录。

在大多数程序的执行过程中,错误总可能偶尔出现。对它们的恰当处理是高质量和稳定的软件重要的特征。本文将包含错误处理的主要方法,使用它们的一些建议以及通过MQL5工具包做日志记录。

错误处理是一个相对来说困难且有争议的话题。有许多错误处理的方法,每一种都有其特有的优点和缺点。很多方法可以合一起使用,但没有统一的标准 — 每一项特定的任务都需要一个合适的方法。


用MQL5工具包做日志记录

日志文件通常由程序创建以便于开发者查找失败/报错的原因,以及在某个特定的时刻评估系统条件等。除此之外,日志记录可用于软件分析。

日志等级

通常日志文件中接收到的信息类型各不相同,且需要不同的关注等级。日志等级用于将含有各种类型的信息区分开来,并且能够对显示信息的类别自定义。通常实现有几种日志等级:

  • Debug: 调试信息。这个等级的日志包含在开发、调试和试运行阶段。
  • Info: 信息性消息。它们携带各种系统活动的信息(例如,操作开始/结束,开/平仓等)。这个级别的消息通常不需要任何反馈,但能够明显有助于研究导致报错的事件链。
  • Warning: 告警信息。这个级别的信息可能包含导致报错的场景描述,无需用户介入。例如,如果计算后的交易量小于最低允许交易量,程序自动修正它,然后以《告警》级别在日志中记录下来。
  • Error: 需要干预的报错信息。这个日志记录级别通常用于与保存一个特定的文件,打开和修改订单等发生错误时。换句话说,此类错误程序无法自己修复,因此需要用户或开发者的干预。
  • 致命的: 严重的错误信息,程序无法继续运行。这个级别的报错信息需要立即处理,通过email,SMS等方式通知用户或者程序开发者。下面我们将向您展示在MQL5中如何使用PUSH通知。
2015.09.23 09:02:10, USDCAD (D1), INFO: 
2015.09.23 09:02:10, USDCAD (D1), INFO: ---------- OnInit() -----------
2015.09.23 09:02:10, USDCAD (D1), DEBUG: Example of debug message (LoggerTest.mq5; int OnInit(); Line: 36)
2015.09.23 09:02:10, USDCAD (D1), INFO: Example of info message (LoggerTest.mq5; int OnInit(); Line: 38)
2015.09.23 09:02:10, USDCAD (D1), WARNING: Example of warning message (LoggerTest.mq5; int OnInit(); Line: 40)
2015.09.23 09:02:10, USDCAD (D1), ERROR: Example of error message (LoggerTest.mq5; int OnInit(); Line: 42)
2015.09.23 09:02:10, USDCAD (D1), FATAL: Example of fatal message (LoggerTest.mq5; int OnInit(); Line: 44)

作者:Sergey Eremin

 

下午好!

您为什么不考虑 "处理贸易服务器返回代码"这个问题?

这比您文章中的所有内容都重要得多。

 
Михаил:

下午好!

您为什么不考虑 "处理贸易服务器返回代码"这个问题?

这比您文章中的所有内容都重要得多。

首先,请阅读整篇文章。如果不理解,那就反复阅读,直到完全理解为止。只有这样,您才会意识到您的信息与文章中涉及的主题毫无关系。
 
Karputov Vladimir:
首先,请阅读全文。如果不理解,那就反复阅读,直到完全理解为止。只有这样,您才会意识到您的留言与文章主题无关。

这篇文章的标题不应该是" MT5 中的错误处理 和日志记录"、

而是 "MT5 中对自身错误的处理和日志记录"!

 
Михаил:

下午好!

您为什么不考虑 "处理贸易服务器返回代码"这个问题?

这比您文章中的所有内容都重要得多。

米哈伊尔,你为什么不写这样一篇文章呢?这是一个现成的话题!:)

我并不认为这个主题比文章中的所有内容都重要。如果你这么想--那就去写啊,何必骂我不写呢?


事实上,我并没有详细考虑这一点,因为我想谈的是更普遍的问题。因此,我们可以详细考虑标准语言函数返回的错误代码。例如,作为文章的另一个主题--"处理在 MQL5 中使用图形对象时出现的错误"。

我的目标并不相同。是的,写完这篇文章一个月后,我发现结果 "一般般"。好吧,我以后会努力写得更好。

 
Sergey Eremin:

你为什么不写一篇这样的文章呢?这是一个现成的话题!:)

事实上,我并不想详细讨论这一点,因为我想讨论更普遍的问题。因此,我们可以详细讨论标准语言函数返回的错误代码。例如,作为文章的另一个主题--"处理在 MQL5 中使用图形对象时出现的错误"。

我的目标并不相同。是的,写完这篇文章一个月后,我发现结果 "一般般"。好吧,我以后会努力写得更好。

谢尔盖

没关系,但我想把这篇文章叫做

"在 MT5 中使用日志调试智能交易系统 的高级方法"。

因为在调试智能交易系统时,不会再出现错误、

但交易服务器的返回代码可能会有很多错误、

这些错误需要在 Expert Advisor 的正常模式下进行处理。

 
Михаил:

谢尔盖

一切都很好,但我想把这篇文章称为

"在 MT5 中使用日志调试智能交易系统 的高级方法"。

但错误处理不是调试:)

还是说,例如,处理 "资金不足 "错误(文章中作为示例提到)就是调试?

 
Sergey Eremin:

但错误处理不是调试:)

或者你想说,例如,处理 "资金不足 "错误(这是文章中提到的例子)就是调试?

"资金不足 "不是错误,而是向您发送的信息(向专家发送有关您账户状态的信息),并且

这是一种标准处理情况。正常的开发人员在进行交易或下订单之前必须

必须验证 资金是否 可用。

//+------------------------------------------------------------------+
//| 专家验钞功能|
//+------------------------------------------------------------------+ 
bool CheckMoney( const long volume )
{
  double a_go = SymbolInfoDouble( _Symbol, SYMBOL_MARGIN_INITIAL ) * double(volume);
  double free_margin = ( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 90;
//--- 
  if ( a_go <= free_margin )
  {
    return( true );
  }
  Print( "支票款项:资金不足!" );
  return( false );
}
 
Михаил:

"资金不足 "不是错误,而是向您发送的信息(向智能交易系统发送有关您账户状况的信息),并且

这是标准处理情况。

但这也不是调试时刻。随你怎么说,但它必须得到处理(在我看来,我们在这一点上达成了一致)。在我看来,相对于正常情况,这是一种错误的情况。毕竟,专家可能会认为手段已经足够。而如果不对其进行任何检查和处理,结果就会是一无所获。

举例来说,由于文件不存在而打开文件的错误--一方面,这是需要处理的标准情况,但另一方面,这是假设文件存在并且我们可以使用它的错误。


再说一遍:在本文中,我试图考虑的是程序运行过程中的错误处理问题,而不是软件调试问题。这完全是另一个话题,而且只在日志记录的框架内与本文相关(而且只是部分相关)。
而且我的目标也不是考虑具体的错误(无论是交易服务器返回代码,还是如上所述,例如在处理图形对象时可能出现的错误)。

如果我的信息仍然不清楚,请原谅。希望现在一切都已就绪。

 
Михаил:

这是一种标准处理方式。在进行交易或下订单之前,一个正常的开发人员必须

或下订单之前,必须核实资金是否到位。

唉,我得问一句:你是读了这篇文章,还是只看了一遍就下结论?我在文章中谈到了初步检查(我忏悔,我没有具体谈到资金检查,但我认为这很清楚)。即使我们之前进行了检查,在尝试开立交易后处理可能出现的错误 "资金不足 "也不失为一个好主意。从 "之前 "检查到立即尝试开仓之间的这段时间里,任何事情都可能发生。

 
Sergey Eremin:

唉,我得问一句:你是读了这篇文章,还是只看了一遍就下结论?我在文章中谈到了初步检查(我忏悔,我没有具体谈到资金检查,但我认为这很清楚)。即使我们之前做了检查,在尝试开仓交易后处理可能出现的 "资金不足 "错误也不是最糟糕的主意。从 "之前 "检查到立即尝试开仓之间的这段时间里,任何事情都有可能发生。

谢尔盖

交易服务器返回代码 就是针对这种情况的。

例如您检查了空闲资金的可用性,并得到了肯定的结果。

您发送了订单,但未被接受(如您所说:"可能发生什么")、

因此,交易服务器将在返回代码中给出错误 "Insufficient funds(资金不足)"。

事实证明,检查多少次错误都是一样的。

在您的支票(CheckMoney)和交易服务器的返回代码之间!