3.4.3 错误处理
修改或平仓交易单时,可能会由于无效的交易参数、必要条件或服务器问题而出现错误。我们已经竭尽所能来确保所用之交易参数为有效,并检查过,以防止可预防的常见错误发生。然而,出现错误时,我们需要提醒使用者注意该项错误,并记录任何相关信息,以利故障排除。
透过审视OrderSend()、OrderModify()和OrderClose()等功能输出来检查可能存在的错误。功能若未顺利完成,OrderSend()会返回“-1”,或是OrderModify()和 OrderClose()为假(false)。
在本节中,我们将为OrderSend()功能建立错误处理程序。若OrderSend()的返回值为“-1”,我们会执行错误处理程序来警示用户,并在日志上打印相关的交易参数和价格信息。
首先,我们必须先获取错误代码。使用GetLastError()功能来完成这项工作。我们需要把GetLastError()功能的返回值储存在一个变量中,因为GetLastError()功能一旦被调用,错误代码就会清除,而GetLastError()功能在下次调用时就会归“0”。我们将公开一个名为ErrorCode的全局变量,用它储存GetLastEiror()功能的值。
接着,我们需要取得关于错误的一些说明信息。包含档stdlib.mqh内含名为ErrorDescription()的功能。该功能会显示描述该项错误的字符串。虽非详细描述,不过有总比没有好。我们需要在档案Stdlib.mqh的前面增加#include语句。
然后,以内置的Altert()功能将警示打印至用户的屏幕。这项信息也会打印至日志中。该警示包括错误代码、错误描述,以及我们刚才试图进行操作的简短描述。这样你就清楚你的程序到底是哪里出现了错误。
最后,我们会用Print()功能把相关的价格信息打印至日志中,包括目前的买卖价、仓位大小及交易价格等交易参数。


在上述源代码中包括stdlib.mqh档。我们增加ErrorCode(错误代码)全局变量来储存错误代码。OrderSend()会下停损买单。功能若失败,错误处理代码就会执行。
首先,我们在ErrorCode(错误代码)中储存GetLastError()的值。然后调用ErrorDescription()功能,用ErrorCode作为自变量。接着,用StringConcatenate()功能建立警示讯息,讯息会储存在字符串变量ErrAlert中。
StringConcatenate()是MQL的功能,让你能用变量与常数建立复杂的字符串。每个要加入(或“串联”)的字符串元素由逗号分隔。试着把上面的例子输人到MetaEditor中,与凸显的语法一并检视。
你也可以连接字符串,用加号(+)使其合并。用StringConcatenate()会更加清楚有效。若仅是连接简短的字符串,就用加号来合并字符串常数与变量。源代码如下:

Alert()功能会在用户的桌面弹出显示,内含ErrAlert(错误警示)变量的内容。
以价格和交易参数建构另一个字符串,并将其储存在ErrLog(错误日志)变量中,同时把ErrLog传至Print()功能。Print()把功能自变量的内容打印至专家日志上。可透过Terminal窗口中的Experts卷标检视专家日志,如正在使用StrategyTester,可在Tester窗口中的日志卷标中检视。
你可同时为其他功能建立类似的错误处理程序,特别是OrderModify()功能和OrderClose()功能。你还可依错误代码提供自定错误讯息,建立更精密的错误处理程序,或是执行其他操作。
例如,如果收到错误代码130:“无效停损”,你可以显示类似“停损或获利价无效”的讯息。这里提供如何进行此操作的例子:
