8.15 为EA除错

8.15 为EA除错

不像大部分的程序IDEs, MetaEditor不支持毁损点或任何其他除错技术,因此需要使用Print( )语法和记录为EA除错。

之前我们已经说明了Print( )函数。总之,任何传送到函数的字符串自变量将被打印到记录中。透过打印变量和函数的内容到记录中,可以检验你的程序代码输出并修正任何错误。

我们可以用Strategy Tester来执行一个交易仿真并检验记录输出。Strategy Tester记录显示在Strategy Tester窗口内的Journal表下面。由于列在Journal表内的信息数量有限制,所以可能会看到实际的记录。

Strategy Tester记录储存于\tester\logs文件夹中。在Journal窗口中的任意位置点击鼠标右键,然后在跳出选项中选择Open。浏览器窗口将开启,展现记录文件夹的内容。文件名是yyyymmdd.log格式,yyyy代表公元年,mm代表两位数的月份,dd代表两位数的日数。你可以在记事本或任何文本编辑器中阅读记录。

我们来举例说明如何使用记录来解决程序问题。

下列程序代码内含错误,且其执行结果与我们的预期有出入。为能诊断出问题,我们需检查函数的输入或输出。创建一个Print( )语法,并打印所有相关变量的内容到记录中。

我们将在Strategy Tester中执行EA,并用Open prices only作为我们的测试模型。要测试EA需要有足够的交易单供我们分析。若需检查图中的价格,按Open Chart按钮,可以开启一个图表显示仿真交易。

接着,我们到Journal表中检查我们所需的数据。若需要看完整的记录,或有些交易没有显示在Journal表中时,可以点击鼠标右键,从跳出的选项中选择Open,并直接开启记录文件。

这段程序代码在每次下单时会显示错误代码130:"invaild stops"。我们知道,错误代码130表示停损或获利不正确。你能够辨别出错误吗?


我们用Print()函数来验证传送到OrderSend( )函数的参数是否已经传送。我们着重于开仓价、停损价或获利价。


以下是我们在strategy tester中执行EA的输出结果(假设停损和获利都是50点):


我们知道停损需比多单的开仓价格低,而在这里它比开仓的价格高。事实上,它与获利是同样的价格。快速看看我们的程序代码就会知道,在购买停损方程式中我们误植了一个加号。下面是正确的程序代码:


若你在尝试开仓、平仓或修改订单时收到错误讯息,你应把注意力放在错误讯息所提示的事项上。以下是一些最常见的编辑程序错误所导致的错误讯息:

Error129:Invalid Price——开仓价格无效。对于市场订单,要确认目前出价和要价并根据订单类型可过关。对于未决定的订单,确认价格则依据对订单类型的要求,及是高于或低于目前价格。也要确保未决定的订单不要太靠近目前价格(也就是要在停止水平内)。

Error130:Invalid Stops——停损价或获利价不正确。根据订单类型即买或卖,检查停损价或获利价是否高于或低于目前价格。也要确保停损价或获利价不要太靠近目前价格(也就是在停止水平)。

Error131:Invalid Trade Volume——手数不正确。确认手数没有超过最小或最大经纪量,且手数大小正常,合于正确等值(大多数经纪商为0.1或0.01)。

你可在MQL中的Standard Constants——Error Codes源代码的底下找到所有错误讯息的说明。若你在接收到错误讯息时需要额外的帮助,可上MQL4.com论坛一探究竟。