3.4 其他注意事项

3.4 其他注意事项


3.4.1 交易背景

MetaTrader 为众多的expe此advisor 提供单一交易执行线程。也就是说,无论终端机上有多少位expert advisor 正在进行操作,同一时间仅一位expert advisor 可进行交易。进行任何交易之前,须检查目前交易执行线程是否在使用中。

如交易执行线程被占用, IsTradeContextBusy ( )功能会返回真( true) ,否则为假(false) 。我们会在调用包括OrderSend ( )、OrderClose ( )、OrderDelete ( )或OrderModify( )等任何交易功能之前调用此功能。

使用IsTradeContextBusy ( )检查交易执行程序源代码:

我们用while 回路来评估IsTradeContextBusy ( ) 。功能如返回真(true) ,即表示目前交易执行线程被占用, expert advisor 就会休眠10 毫秒。只要IsTradeContextBusy( )返回真, while 回路就会继续执行。一旦交易线程释出,交易即开始。

3.4.2 重载预定义变量

买卖价等预定义变量的值,是在expert advisor 开始执行时设定。执行expert advisor 代码所需的时间非常短,可以毫秒计。然而,把交易服务器响应延误以及价格实际上变化非常迅速都考虑进去,务必用最新价格非常重要。

RefreshRates ( )功能用服务器最新的价格更新预定义变量的内容。建议你在使用买卖价变量时,每次都调用此功能,特别是在之前交易执行过后。

请注意: 如以MarketInfo ( )功能获取价格,就没必要使用RefreshRates ( ) 。之前讨论了MarketInfo ( ) 。到建立功能那章时,我们会以MarketInfo ( )获取价格,而不用预定义变量。然而,你也许仍希望在start( )功能中使用买卖价来引用目前的图表价格。

3.4.3 错误处理

修改或平仓交易单时,可能会由于无效的交易参数、必要条件或服务器问题而出现错误。我们已经竭尽所能来确保所用的交易参数为有效,并检查过,以防止可预防的常见错误发生。然而,出现错误时,我们需要提醒使用者注意该项错误,并记录任何相关信息,以利故障排除。

透过审视OrderSend ( ) 、OrderModify ( )和OrderClose ( )等功能输出来检查可能存在的错误。功能若未顺利完成, OrderSend ( )会返回-1 ,或是OrderMod均()和OrderClose ( )为假(false) 。

在本节中,我们会为OrderSend ( )功能建立错误处理程序。若OrderSend ( )的返回值为" -1" ,我们会执行错误处理程序来警示用户,并在日志上打印相关的交易参数和价格信息、。

首先,我们必须获取错误代码。使用GetLastError ( )功能来完成这项工作。我们需要把GetLastError( )功能的返回值储存在一个变量中,因为GetLastError( )功能一旦被调用,错误代码就会被清除,而GetLastError( )功能在下次调用时就会归"0" 。我们将公开一个名为ErrorCode 的全局变量,用它储存GetLastError ( )功能的值。

接着,我们需要取得关于错误的一些说明信息。包含档stdlib. mqh 内含名为ErrorDescription ( )的功能。该功能会显示描述该项错误的字符串。虽非详细描述,不过有总比没有好。我们需要在档案stdlib. mqh 的前面增加#include 语句。

然后,内置的Altert( )功能将警示打印至用户的屏幕。这项信息也会打印至日志中。该警示包括错误代码、错误描述,以及我们刚才试图进行操作的简短描述。这样你就能清楚你的程序到底是哪里出现了错误。

最后,我们会用Print( )功能把相关的价格信息打印至日志中,包括目前的买卖价、仓位大小及交易价格等交易参数。

在上述源代码中包括stdlib. mqh 档。我们增加ErrorCode( 错误代码)全局变量来储存错误代码。OrderSend ( )会下停损买单。功能若失败,错误处理代码就会执行。

首先,我们在ErrorCode (错误代码)中储存GetLastError ( )的值。然后调用ErrorDescription ( )功能,用ErrorCode 作为自变量。接着,用StringConcatenate ( )功能建立警示讯息,讯息会储存在字符串变量ErrAlert 中。

StringConcatenate ( )是MQL 的功能,让你能用变量与常数建立复杂的字符串。每个要加入(或"串联")的字符串元素是由逗号分隔。试着把上面的例子输入到MetaEditor 中,与凸显的语法一并检视。

你也可以连接字符串,用加号( + )使其合并。用StringConcatenate ( )会更加清楚有效,若仅是连接简短的字符串,就用加号来合并字符串常数与变量:

Alert( )功能会在用户的桌面弹出显示,内含EηAlert( 错误警示)变量的内容。

以价格和交易参数建构另一个字符串,并将其储存在ErrLog( 错误日志)变量中,同时把ErrLog 传至Print( )功能。Print( )把功能自变量的内容打印至专家日志上。可透过Terminal 窗口中的Experts 卷标检视专家日志,如正在使用Strategy Tester ,可在Tester 窗口中的日志卷标中检视。

你可同时为其他功能建立类似的错误处理程序,特别是OrderMod均()功能和OrderClose ( )功能。你还可依错误代码提供自定错误讯息,建立更精密的错误处理程序,或是执行其他操作。

例如,如果收到错误代码130:" 无效停损",你可以显示类似"停损或获利价无效" 的讯息。这里提供如何进行此操作的例子: