简体中文
返回

主动捕捉异常,让策略更健壮

如何主动捕捉异常

量化功能的接口在调用出现异常时,会抛出 APIException 异常,该异常的 err_code 属性,会携带具体的错误码信息。我们为各种错误场景定义了一系列错误码。

错误码枚举

错误码枚举对应场景

ExceedReqLimit

请求过于频繁,触发频率限制

ReqTimeout

接口请求超时

NoQuoteRight

行情权限不足

InvalidArgument

无效参数(参数校验失败)

ReqFailed

接口请求失败

NoDataAvailable

无数据(返回数据是 NA)

EmptySymbol

参数 symbol 为空

Unknow

未知错误

为了让策略更加健壮,您可以在策略的关键环节捕捉错误码,并执行自定义的处理逻辑。

举例:为了增加下单的可靠性,使用自编码事件卡片,在发现下单失败时,反复提交订单直至成功。

while True:
    try:
        place_limit(symbol=self.运行标的1, price=2, qty=100, side=OrderSide.BUY, time_in_force=TimeInForce.DAY)
        break  # 下单成功,跳出循环
    except APIException as ex:
        print('下单失败,2 秒后重试')
        time.sleep(2)
        continue  # 下单失败,重试

所提供的图片并非最新图片,任何证券或输入内容仅用于说明目的,并非推荐。

 

卡片中主动捕捉异常,与运行时的异常设置是什么关系

卡片中采用自编码的方式捕捉异常,优先级会高于全局设置的异常处理。我们通过2个例子来看一下它们的关系:

例 1:无主动捕捉异常

在下图例子中,我们使用普通卡片,不采用自编码的方式主动捕捉异常错误码。全局的异常设置为“跳过本轮运行”。

所提供的图片并非最新图片,任何证券或输入内容仅用于说明目的,并非推荐。

假设,当策略运行到“无重试的下单开仓”卡片时,下单失败。此时会按照全局的异常设置,跳过本轮运行。因此,后面的“完成标记”卡片就不会运行到。直至下一个信号触发策略时,会再次运行“无重试的下单开仓”卡片。

例 2:有主动捕捉异常

在下图例子中,我们使用自编码卡片,主动捕捉异常错误码后重试提交订单直至成功。全局的异常仍设置为“跳过本轮运行”。

所提供的图片并非最新图片,任何证券或输入内容仅用于说明目的,并非推荐。

假设,当策略运行到“有异常重试的下单开仓”卡片时,第一次下单失败。

按照图中代码逻辑,捕捉到异常后,重复提交订单直至下单成功。之后会运行下一张“完成标记”卡片。因此,在有捕捉异常的自编码卡片中,异常在发生后,会先被卡片捕捉到,不会再执行全局的异常设置了。

本内容仅用作提供信息及教育之目的,不构成对任何特定证券或投资策略的推荐或认可。本内容中的信息仅用于说明目的,可能不适用于所有投资者。本内容未考虑任何特定人士的投资目标、财务状况或需求,并不应被视作个人投资建议。建议您在做出任何投资于任何资本市场产品的决定之前,应考虑您的个人情况判断信息的适当性。过去的投资表现不能保证未来的结果。投资涉及风险和损失本金的可能性。本平台对上述内容的真实性、完整性、准确性或对任何特定目的的时效性不做任何陈述或保证。