8.7 错误重试

8.7 错误重试


在这本书中,我们已试着在尝试开启订单前确认订单参数,但错误仍会因重复引号、交易过忙或服务器等因素而发生。错误永难避免,但我们可以在其发生时重新开启订单。

当有错误时须重试订单,我们将把OrderSend ( )函数置于While 循环中,若OrderSend ( )函数没有回传一个单号,我们将再试一次。源代码如下:

我们首先为单号执行一个变量Ticket 。只要Ticket 不大于哈" , OrderSend ( )和While 循环将不停地执行。但这循环有个问题:即遇到程序代码错误或其他未更正的交易错误时,循环将无休止地运作,而EA 会挂掉。我们可以加上一个最大重试数次来预防这种情况的发生。源代码如下:

我们执行一个变量用以作为重试计数器(Retries),并设定最大重试次数(MaxRetries)。只要没超过MaxRetries , Retries 变量就会递增,而循环也会再次重复。而一旦到达MaxRetries 次数, break 操作数会终止循环,之后你可视需要警示使用者错误条件。

如果你想重试回读某特定错误程序验证,我们可以检查错误码和一系列名目,若符合就会回传一值为真。下列函数包含一些常见的错误码,可推论出在哪里交易可以成功的重试条件:

本函数使用switch 操作数,我们在找寻case 标签,其值和switch 操作数所被指派的表现方式相符合(在这个例子中是ErrorCode) 。若相符合的case 已找到,则在case 后面的程序代码会被执行;若无c臼e 标签被找到,则在default 标签后面的程序代码会被执行。

当case 被发现符合时, switch 区块必须以break 或return 操作数跳离。在这个例子中我们使用return 操作数以回传真/假值到呼叫函数。switch 运算在评估整数常数的符合有其效用,但其功能相对有限。

以下是如何使用EπorCode( )重试一订单配置的范例:

若Ticket 回传" -1" ,表示有错误发生,则用GetLastError( )获取出错误码。我们把错误码传到上述的ErrorCheck ( )函数,若错误码与错误检查函数中的任何错误相符合,则ErrorCheck ( )会回传"真",而OrderSend ( )函数将最多重试5 次。