跳转到内容

理解消息代码

TWS API 里的很多提示都会进入 error() 回调,但它们不一定都是错误。开发时要先区分三类消息:系统状态信息、请求级错误和客户端发送错误。

类型常见代码含义是否一定要停止程序
系统信息210421062158行情服务器、历史数据服务器或安全定义服务器连接正常否,通常只记录日志。
请求级错误200100891016710168300某个 reqId 对应的请求失败、降级为延迟行情或无法完成不一定,要看请求类型。
客户端发送错误501504518客户端状态、连接或发送请求本身有问题通常需要修连接或请求流程。

新手最常见的误判,是看到 error() 就认为连接失败。实际上 TWS 把很多正常状态通知也通过这个回调发送。

reqId 是排查错误时最重要的线索。

reqId = -1 常见于系统级信息或非某个请求触发的消息
reqId = 1001 表示和你发出的 1001 号请求有关

例如合约详情请求返回 200,要看这个 200 对应哪个 reqId。如果它对应合约详情请求,就说明那组 Contract 字段没有被 TWS 识别;如果它对应期权请求,就应回去检查期权到期日、行权价、方向和交易所。

连接 TWS 后,模拟账户可能收到这些信息码:

INFO_CODES=2104,2104,2104,2104,2106,2106,2158

这些表示行情、历史数据或安全定义服务连接正常,不是失败。

无效合约详情请求返回:

ERROR=reqId=99101;code=200;msg=未找到该请求的证券定义

这表示 reqId=99101 对应的合约详情请求没有找到证券定义。连接本身仍然正常。

AAPL 行情订阅返回过:

ERROR=reqId=99102;code=10089;msg=请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。:AAPL NASDAQ.NMS/TOP/ALL

这表示合约能识别,但账户的 API 行情权限不足。

另一次实时行情请求也可能返回:

ERROR=reqId=99102;code=10168;msg=请求的市场数据没有订阅。延迟市场数据未启用。

这表示当前请求没有可用实时行情,也没有在该请求链路上启用延迟行情。

先看代码值
-> 再看 reqId
-> 再看消息文字
-> 再回到对应请求和合约字段

不要只根据中文或英文错误文本做字符串匹配。不同 TWS 语言设置、API 版本和消息来源下,文字可能变化;代码和 reqId 更稳定。