理解消息代码
TWS API 里的很多提示都会进入 error() 回调,但它们不一定都是错误。开发时要先区分三类消息:系统状态信息、请求级错误和客户端发送错误。
| 类型 | 常见代码 | 含义 | 是否一定要停止程序 |
|---|---|---|---|
| 系统信息 | 2104、2106、2158 | 行情服务器、历史数据服务器或安全定义服务器连接正常 | 否,通常只记录日志。 |
| 请求级错误 | 200、10089、10167、10168、300 | 某个 reqId 对应的请求失败、降级为延迟行情或无法完成 | 不一定,要看请求类型。 |
| 客户端发送错误 | 501、504、518 等 | 客户端状态、连接或发送请求本身有问题 | 通常需要修连接或请求流程。 |
新手最常见的误判,是看到 error() 就认为连接失败。实际上 TWS 把很多正常状态通知也通过这个回调发送。
reqId 的作用
Section titled “reqId 的作用”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 更稳定。