登录多个应用
“登录多个应用”容易和“连接多个 API 客户端”混在一起。写 TWS API 程序时,需要先把这两个概念分开:
| 概念 | 含义 |
|---|---|
| 多个交易应用登录 | 同一个 IBKR 用户名同时登录 TWS、IB Gateway、IBKR Mobile、Client Portal 等 |
| 多个 API 客户端连接 | 多个程序连接到同一个已经登录的 TWS / IB Gateway |
前者受 IBKR 账户会话规则限制;后者由 TWS API 的 clientId 管理。很多“为什么另一个程序一启动,我这里就断了”的问题,其实是把这两层搞混了。
同一用户名的登录边界
Section titled “同一用户名的登录边界”TWS / IB Gateway 是登录 IBKR 账户后的交易会话。一般不要假设同一个用户名可以在多个交易应用里无限并行使用。
常见情况如下:
| 场景 | 建议理解 |
|---|---|
| TWS 和 IB Gateway 同时用同一用户名登录 | 可能互相挤掉或造成会话冲突 |
| TWS 和 IBKR Mobile 同时登录 | 可能触发重新认证、会话切换或权限变化 |
| Client Portal 与 TWS 同时使用 | 需要注意会话状态和重新认证 |
| 多个 API 程序连接同一个 TWS | 使用不同 clientId 管理,属于 API 客户端层面 |
实际能否同时登录,最终以 IBKR 账户、地区、认证方式和客户端提示为准。开发时的稳定做法是:一个自动化环境只保留一个主要交易会话,避免 TWS、IB Gateway 和移动端互相抢会话。
多个 API 客户端怎么区分
Section titled “多个 API 客户端怎么区分”多个 API 程序可以连接到同一个 TWS / IB Gateway,但每个程序应该使用不同的 clientId:
# 行情程序app.connect("127.0.0.1", 7497, clientId=101)
# 账户监控程序app.connect("127.0.0.1", 7497, clientId=102)
# 订单测试程序app.connect("127.0.0.1", 7497, clientId=103)clientId 是 TWS 用来区分 API 客户端的编号。它不是 IBKR 账户 ID,也不是订单 ID。
建议给不同用途预留固定范围:
| 用途 | clientId 示例 |
|---|---|
| 临时 smoke test | 900 到 999 |
| 行情采集 | 100 到 199 |
| 账户与持仓 | 200 到 299 |
| 订单测试 | 300 到 399 |
| 服务端任务 | 500 到 599 |
编号本身没有业务含义,关键是不要让两个正在运行的程序使用同一个 clientId。
为什么不要复用同一个 clientId
Section titled “为什么不要复用同一个 clientId”同一个 clientId 代表同一个 API 客户端身份。复用可能带来这些问题:
| 问题 | 表现 |
|---|---|
| 连接冲突 | 新程序连接时,旧程序断开或收不到回调 |
| 订单归属混乱 | 订单状态里看到相同 clientId,难以判断哪个程序发起 |
| 排查困难 | 日志中无法按客户端区分请求来源 |
| 回调错位 | 程序重启后旧请求和新请求难以区分 |
新手调试时,最简单的规则是:每开一个脚本窗口,就换一个 clientId。
TWS 手工订单和 API 订单
Section titled “TWS 手工订单和 API 订单”TWS 界面手动下单和 API 程序下单不是完全一样的来源。TWS API 的订单回调里会出现 clientId,用于识别订单来自哪个客户端。
需要注意:
| 订单来源 | 排查重点 |
|---|---|
| 这个 API 客户端提交的订单 | 这个程序通常能直接跟踪 |
| 其他 API 客户端提交的订单 | 需要考虑是否请求所有开放订单 |
| TWS 手工提交的订单 | 需要按订单管理章节处理绑定和可见性 |
订单可见性、绑定手工订单、请求所有开放订单这些内容会在订单管理章节详细写。这里先记住:多客户端环境下,订单状态排查必须同时看 orderId、permId 和 clientId。
开发环境建议
Section titled “开发环境建议”为了减少会话冲突,建议按环境分开:
| 环境 | 推荐方式 |
|---|---|
| Windows 桌面开发 | 只开 TWS 模拟账户,脚本连接 127.0.0.1:7497 |
| Linux 服务器运行 | 优先使用 IB Gateway 模拟账户,脚本连接 127.0.0.1:4002 |
| 自建网页系统 | 后端或本地脚本统一管理 API 会话 |
| 人工交易和自动化同时进行 | 分清手工订单、API 订单和 clientId |
不要一边用真实账户人工交易,一边让多个没有充分测试过的脚本接入同一会话。即使是模拟账户,也应先把每个脚本的职责和 clientId 固定下来。
多客户端最小检查
Section titled “多客户端最小检查”当你怀疑是多客户端问题时,按这个顺序排查:
- 关闭所有测试脚本,只保留 TWS / IB Gateway。
- 用一个最小
reqCurrentTime()脚本连接,确认能收到nextValidId()。 - 换一个不同
clientId,再启动第二个脚本。 - 观察两个脚本是否都能稳定收到回调。
- 如果涉及订单,再检查订单状态里的
clientId和permId。
不要在多客户端问题没排清前直接测试批量行情或订单接口。否则限频、连接、订单归属和权限错误会叠在一起。
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 第二个脚本启动后第一个断开 | 两个脚本用了同一个 clientId | 给每个脚本分配独立编号 |
| TWS 被其他应用挤掉登录 | 同一用户名在多个交易应用中切换 | 保留一个主要交易会话 |
| 订单状态看不出来源 | 没记录 clientId、orderId、permId | 日志里同时打印这三个字段 |
| TWS 能连,IB Gateway 连不上 | 两者是不同会话和端口 | 分别检查端口和登录状态 |
| 手机登录后程序断线 | 账户会话或认证状态变化 | 等待重新认证后重新连接 |