总览
TWS API 能覆盖账户、合约、行情和订单,但它不是没有边界的“万能交易接口”。开发前先理解这些限制,可以少走很多弯路。
限制不是坏事。它的意义是告诉你:哪些问题应该改代码,哪些问题应该改设置、补权限、换账户环境,或者让用户人工确认。
限制来自哪里
Section titled “限制来自哪里”TWS API 的限制通常来自五类来源:
| 来源 | 影响 |
|---|---|
| TWS / IB Gateway 本身 | 登录、2FA、重新认证、端口、API 设置。 |
| 账户类型 | Paper Account 和 Live Account 行为不同。 |
| 账户地区与监管规则 | 某些地区或产品不允许程序化交易。 |
| 行情与交易权限 | 没有订阅或权限时,请求会返回错误或延迟数据。 |
| API 协议模型 | 请求/回调、限频、断线重连、订单 ID 序列都需要程序正确处理。 |
所以排查问题时,不要只看代码。很多错误并不是 Python 写错了,而是账户权限、TWS 设置、市场数据订阅或监管限制导致。
本目录覆盖哪些限制
Section titled “本目录覆盖哪些限制”| 页面 | 重点 |
|---|---|
| MacOS 上的 C# 限制 | C# 在 macOS 上的官方支持边界。 |
| C++ DLL 与静态链接 | C++ 动态库、静态链接和发布时的注意事项。 |
| 加拿大居民程序化交易加拿大产品限制 | 账户地区和监管规则对程序化交易的影响。 |
| 模拟账户限制 | 模拟账户和真实账户的差异。 |
这些页面不适合放可复制代码。它们更像开发前的风险说明和排查索引。
和普通错误的区别
Section titled “和普通错误的区别”限制不是普通 bug。
普通 bug 可能通过改代码修复,例如:
- 字段拼错。
clientId冲突。- 忘记启动
EReader。 - 合约字段不完整。
限制通常需要改环境或改业务流程,例如:
- 账户没有行情订阅。
- 账户没有交易权限。
- TWS 没有允许 API 连接。
- Paper Account 和 Live Account 返回不同。
- 需要人工重新认证。
错误处理 页面会解释具体错误码;本页先帮助你建立“限制意识”。
常见现象和第一判断
Section titled “常见现象和第一判断”| 现象 | 第一判断 | 下一步 |
|---|---|---|
connect() 失败 | TWS / Gateway 未启动、端口不对、API 未启用、防火墙拦截 | 先回到 TWS 设置和连接机制页面。 |
收不到 nextValidId | Socket 握手没完成或消息循环没跑 | 检查 app.run()、线程、端口和 API 弹窗。 |
reqMktData() 没价格 | 行情订阅、延迟行情设置、交易所权限或合约不唯一 | 先确认合约,再试 reqMarketDataType(3) 延迟行情。 |
reqHistoricalData() 返回错误 | 参数组合、权限、数据可用范围或限频 | 检查 durationStr、barSizeSetting、whatToShow 和 pacing。 |
错误码 10089 | 请求的数据需要额外市场数据订阅 | 不是代码语法错误,通常要补权限或接受无权限结果。 |
| 下单被拒 | 账户交易权限、订单风控、价格、数量、产品状态 | 看 error()、openOrder()、orderStatus() 和 TWS 订单窗口。 |
| 服务器运行一段时间后断开 | 网络、每日重启、重新认证、IB Gateway 状态 | 加监控和人工认证流程,不要无限重试下单。 |
| 模拟账户能跑,真实账户不行 | Paper 和 Live 的权限、风控、保证金或成交环境不同 | 真实账户前重新验证每个接口和风控边界。 |
开发时的默认策略
Section titled “开发时的默认策略”为了让示例和开发测试更稳,建议采用这些策略:
| 场景 | 默认策略 |
|---|---|
| 新手学习 | 使用 Paper Account。 |
| 查询账户 / 行情 | 先用只读模式或非交易请求。 |
| 订单相关 | 先用 whatIf=True,再考虑模拟账户真实提交。 |
| 行情相关 | 先接受延迟行情和权限错误,再逐步补实时订阅。 |
| 服务器运行 | 优先 IB Gateway,但仍保留人工认证流程。 |
| 自动生成代码 | 必须先解释限制,再生成请求参数和代码。 |
文档里的示例不会默认假设用户拥有全部行情权限。遇到需要订阅、需要特定账户权限或可能受地区限制的接口,会在正文里说明。
需要特别注意的限制
Section titled “需要特别注意的限制”登录和重新认证
Section titled “登录和重新认证”TWS / IB Gateway 不是永久免登录服务。即使程序稳定运行,也要考虑每日或每周重新认证。服务器部署时,这一点尤其重要。
行情相关问题最常见。连接成功只能说明 Socket 通了,不代表能拿到对应市场的实时数据。
模拟账户差异
Section titled “模拟账户差异”Paper Account 很适合开发,但不能证明真实交易的成交速度、滑点、流动性和风控结果。
订单风险提示
Section titled “订单风险提示”TWS 有订单风险提示和风控保护。某些订单在程序侧看起来字段正确,但可能被 TWS 拦截或要求用户确认。
TWS API 不是无限并发接口。历史行情、Scanner、逐笔数据、市场深度等请求都可能触发 pacing 或软限制。正式系统应缓存结果、合并请求、限制重试频率,并把错误码写进日志。
产品和地区限制
Section titled “产品和地区限制”某些限制来自产品、交易所、账户地区或监管规则。程序无法绕过这些限制。正确做法是让系统在下单前做权限检查和产品白名单,而不是在被拒单后反复重试。
面向 Agent 开发时的规则
Section titled “面向 Agent 开发时的规则”如果你把本站 MCP 接入给 Agent,让 Agent 帮你写 TWS API 代码,需要明确告诉它:
- 先查限制和错误处理,再生成交易代码。
- 没有行情权限时,不要编造成功返回。
- 下单示例必须默认模拟账户、小数量、限价单和日志输出。
- 如果文档没有覆盖某个产品或权限规则,要提示人工确认。