常见错误解决
排查 TWS API 错误时,不要一上来改大段代码。先把错误按来源分组:连接、合约、行情、订单或取消请求。
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
只有 2104、2106、2158 | 系统状态信息 | 记录日志,程序继续运行。 |
200 未找到证券定义 | Contract 字段不完整或合约不可用 | 先请求合约详情,补全 conId、localSymbol、交易所和到期字段。 |
10089 行情需要订阅 | 账户没有对应 API 行情权限 | 检查行情订阅、延迟行情设置或更换可用标的。 |
10168 行情未订阅且延迟未启用 | 当前请求没有实时行情权限,也没有启用可用延迟行情 | 尝试 reqMarketDataType(3) 延迟行情,或检查行情订阅。 |
10167 显示延迟市场数据 | 实时行情不可用,但 TWS 返回延迟行情 | 程序要明确标记这是延迟数据。 |
300 找不到 tickerId | 取消的行情订阅没有成功建立 | 只取消已成功建立的 reqId。 |
504 未连接 | 连接未完成或已断开 | 等待 nextValidId() 后再发请求。 |
推荐排查顺序
Section titled “推荐排查顺序”1. 连接是否收到 nextValidId()2. 系统信息码是否只是正常状态通知3. 错误 reqId 对应哪个请求4. 该请求使用的 Contract 或参数是什么5. TWS 界面中同一产品是否可见6. 账户权限和行情订阅是否满足要求这个顺序可以避免把权限问题误判成代码问题,也能避免把合约字段问题误判成 TWS 连接问题。
保留原始错误
Section titled “保留原始错误”def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""): print(f"reqId={reqId}; code={errorCode}; message={errorString}")写调试工具或日志系统时,应同时保存:
| 字段 | 说明 |
|---|---|
reqId | 对应哪一次请求。 |
errorCode | 稳定判断依据。 |
errorString | 人类可读说明。 |
| 请求参数 | 例如 Contract、durationStr、barSizeSetting。 |
| TWS 状态 | 连接账户、端口、是否模拟账户、行情类型。 |
只保存“失败”两个字,后面几乎无法排查。
两个常见页面
Section titled “两个常见页面”本目录下单独解释两个高频消息:
| 页面 | 适合阅读场景 |
|---|---|
| 行情服务器连接正常 | 看到 2104、2106、2158 时判断是否正常。 |
| 行情需要额外订阅 | 看到 10089 或类似行情权限消息时排查。 |