跳转到内容

常见错误解决

排查 TWS API 错误时,不要一上来改大段代码。先把错误按来源分组:连接、合约、行情、订单或取消请求。

现象常见原因处理方式
只有 210421062158系统状态信息记录日志,程序继续运行。
200 未找到证券定义Contract 字段不完整或合约不可用先请求合约详情,补全 conIdlocalSymbol、交易所和到期字段。
10089 行情需要订阅账户没有对应 API 行情权限检查行情订阅、延迟行情设置或更换可用标的。
10168 行情未订阅且延迟未启用当前请求没有实时行情权限,也没有启用可用延迟行情尝试 reqMarketDataType(3) 延迟行情,或检查行情订阅。
10167 显示延迟市场数据实时行情不可用,但 TWS 返回延迟行情程序要明确标记这是延迟数据。
300 找不到 tickerId取消的行情订阅没有成功建立只取消已成功建立的 reqId
504 未连接连接未完成或已断开等待 nextValidId() 后再发请求。
1. 连接是否收到 nextValidId()
2. 系统信息码是否只是正常状态通知
3. 错误 reqId 对应哪个请求
4. 该请求使用的 Contract 或参数是什么
5. TWS 界面中同一产品是否可见
6. 账户权限和行情订阅是否满足要求

这个顺序可以避免把权限问题误判成代码问题,也能避免把合约字段问题误判成 TWS 连接问题。

def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""):
print(f"reqId={reqId}; code={errorCode}; message={errorString}")

写调试工具或日志系统时,应同时保存:

字段说明
reqId对应哪一次请求。
errorCode稳定判断依据。
errorString人类可读说明。
请求参数例如 ContractdurationStrbarSizeSetting
TWS 状态连接账户、端口、是否模拟账户、行情类型。

只保存“失败”两个字,后面几乎无法排查。

本目录下单独解释两个高频消息:

页面适合阅读场景
行情服务器连接正常看到 210421062158 时判断是否正常。
行情需要额外订阅看到 10089 或类似行情权限消息时排查。