量化功能的接口在调用出现异常时,会抛出 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个例子来看一下它们的关系:
在下图例子中,我们使用普通卡片,不采用自编码的方式主动捕捉异常错误码。全局的异常设置为“跳过本轮运行”。
所提供的图片并非最新图片,任何证券或输入内容仅用于说明目的,并非推荐。
假设,当策略运行到“无重试的下单开仓”卡片时,下单失败。此时会按照全局的异常设置,跳过本轮运行。因此,后面的“完成标记”卡片就不会运行到。直至下一个信号触发策略时,会再次运行“无重试的下单开仓”卡片。
在下图例子中,我们使用自编码卡片,主动捕捉异常错误码后重试提交订单直至成功。全局的异常仍设置为“跳过本轮运行”。
所提供的图片并非最新图片,任何证券或输入内容仅用于说明目的,并非推荐。
假设,当策略运行到“有异常重试的下单开仓”卡片时,第一次下单失败。
按照图中代码逻辑,捕捉到异常后,重复提交订单直至下单成功。之后会运行下一张“完成标记”卡片。因此,在有捕捉异常的自编码卡片中,异常在发生后,会先被卡片捕捉到,不会再执行全局的异常设置了。
本内容仅用作提供信息及教育之目的,不构成对任何特定证券或投资策略的推荐或认可。本内容中的信息仅用于说明目的,可能不适用于所有投资者。本内容未考虑任何特定人士的投资目标、财务状况或需求,并不应被视作个人投资建议。建议您在做出任何投资于任何资本市场产品的决定之前,应考虑您的个人情况判断信息的适当性。过去的投资表现不能保证未来的结果。投资涉及风险和损失本金的可能性。本平台对上述内容的真实性、完整性、准确性或对任何特定目的的时效性不做任何陈述或保证。