8.7 错误重试

8.7 错误重试

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

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


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



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

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


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

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

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


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