8.15 为EA 除错
不像大部分的程序IDEs , MetaEditor 不支持毁损点或任何其他除错技术,因此需要使用Print()语法和记录为EA 除错。
之前我们已经说明了Print()函数。总之, 任何传送到函数的字符串自变量将被打印到记录中。透过打印变量和函数的内容到记录中,可以检验你的程序代码输出并修正任何错误。
我们可以用Strategy Tester 来执行一个交易仿真并检验记录输出。StrategyTester 记录显示在Strategy Tester 窗口内的Journal 表下面。由于列在Journal 表内的信息数量有限制,所以可能会看到实际的记录。
Strategy Tester 记录储存于\ tester\ logs 文件夹中。在Joumal 窗口中的任意位置点击鼠标右键,然后在跳出选项中选择Open 。浏览器窗口将开启,展现记录文件夹的内容。文件名是yyyymmdd. log 格式, yyyy 代表公元年, mm 代表两位数的月份, dd 代表两位数的日数。你可以在记事本或任何文本编辑器中阅读记录。
我们来举例说明如何使用记录来解决程序问题。
下列程序代码内含错误,且其执行结果与我们的预期有出入。为能诊断出问题,我们需检查函数的输入或输出。创建一个Print ( )语法,并打印所有相关变量的内容到记录中。
我们将在Strategy Tester 中执行EA ,并用Open prices only 作为我们的测试模型。要测试EA 需要有足够的交易单供我们分析。若需检查图中的价格,按OpenChart 按钮,可以开启一个图表显示仿真交易。
接着,我们到Joumal 表中检查我们所需的数据。若需要看完整的记录,或有些交易没有显示在Joumal 表中时,可以点击鼠标右键,从跳出的选项中选择Open ,并直接开启记录文件。
这段程序代码在每次下单时会显示错误代码130 : "invaild stops" 。我们知道,错误代码130 表示停损或获利不正确。你能够辨别出错误吗?

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

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

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

若你在尝试开仓、平仓或修改订单时收到错误讯息,你应把注意力放在错误讯息所提示的事项上。以下是一些最常见的编辑程序错误所导致的错误讯息:
• Errorl29: Invalid Price一一开仓价格无效。对于市场订单,要确认目前出价和要价并根据订单类型可过关。对于未决定的订单,确认价格则依据对订单类型的要求,及是高于或低于目前价格。也要确保未决定的订单不要太靠近目前价格(也就是要在停止水平内) 。
• Error130: Invalid Stops一一停损价或获利价不正确。根据订单类型即买或卖,检查停损价或获利价是否高于或低于目前价格。也要确保停损价或获利价不要太靠近目前价格(也就是在停止水平) 。
• Error 131 : Invalid Trade Volume一一手数不正确。确认手数没有超过最小或最大经纪量,且于数大小正常,合于正确等值(大多数经纪商为0.1 或0.01) 。
你可在MQL 中的Standard Constants一一Error Codes 源代码的底下找到所有错误讯息的说明。若你在接收到错误讯息时需要额外的帮助,可上MQIA. com 论坛一探究竟。
8.15.1 周期性的交易错误
有些严重的错误可简单地透过回头测试来发现,有些则只有在真正交易时才会发生。逻辑性的错误会导致交易无法被正确开启,而这些错误可透过一些努力找到。若有些交易在测试或真实交易时能不正确地开启,我们就需要以尽可能多的讯息来解决问题。
我们要加入一个可选择的特性以记录实际交易情况和状态数据,以便我们在纠正交易错误时有记录可循。如我们之前使用的Print( )语法,可记录指标值、价格……任何对我们除错有帮助的数据。同时也要加入一个外部变量,用于打开或关掉。例如:

上面的程序代码将记录价格和指标数据,以及BuyTicket 和SellTicket 变量的内容。若有任何关于如何成交或为何没有成交等问题,这些记录将显示相关交易条件的状态。可以透过Debug 外部变量以打开或关掉记录。
除错Print( )语法应置于靠近start ( )函数的末端,即在所有的交易函数之后。若在可见柱开启定时器和/或执行器,并把除错Print( )语法放于定时器区块内,那么它将仅会在需要时执行。否则,除错线将每秒打印一次到记录中,这会导致记录档案很大。
8.15.2 修正编译错误
当你编译完EA 后,要通过编译程序将检查语法正确与否,并确认所有自定义函数和变量都能正常运转。若有错误,编译程序将会停止,所有的编译错误将出现于Toolbox 窗口中的Error 表内。
当遭遇一大串的编译错误时,记得总要从第一行开始。点击两次列举出的错误,编辑器将直接跳到错误行,修正错误并重新编译。有时候一个简单的语法错误会导致许多元关的错误,即便只有第一个错误是有用的。
以下是一系列常见的编译错误和解决方法:
• Variable not de6ned一一你忘记给予执行的变量一个数据类别。若是总体或外部变量,则应该出现在档案的第一行作执行。若是本体变量,找到第一次出现之处,然后将数据类型执行置于其前,否则就检查拼法或变量名称的大小写是否正确。
• Variable already defined一一相同的变量执行了两次。从数据中移除重复变量。
• Function is not defined一一若问题中的函数是在数据库档案中,确认#include或#import 指令正确地放置于档案的第一行。否则,检查函数名称的拼法或大小写,并确定其存在于目前的档案或在相关的数据库档案中。
• Illegal assignment used一一常指一个等于符号( = )。记住:一个等于符号是给变量指定使用,两个等于符号( ==)是一个比较操作数。把指派操作数修正成适当的比较操作数。
• Assignment expected一一这常指向"等于"比较操作数( == ) 。你用了两个等于符号,而非一个。把操作数修正成一个等于符号。
• Unbalanced right parenthesis-一这通常发生在使用巢状圆括弧的if 语法。到第一个错误所指示的那行,在适当位置插入一个左方圆括弧。
• Unbalanced left parenthesis一一这是难处理的一个错误。错误通常指向程序最后一行。基本上你忘了某处的一个右方圆括弧。仔细检查最近编辑的程序代码并找寻看看所遗漏的右方圆括弧。你需要按行找出问题所在。
• Wrong parameters count-一在函数中有太少或太多自变量。从MQL 参照中检查函数语法,以修正自变量。
• Semicolon expected一一你可能忘了在行尾置入分号( ;) 。把分号放于前一行的尾端。注意:一个遗漏的分号会导致上面各项错误,所以要确保放置这些分号!