跳转到内容

登录多个应用

“登录多个应用”容易和“连接多个 API 客户端”混在一起。写 TWS API 程序时,需要先把这两个概念分开:

概念含义
多个交易应用登录同一个 IBKR 用户名同时登录 TWS、IB Gateway、IBKR Mobile、Client Portal 等
多个 API 客户端连接多个程序连接到同一个已经登录的 TWS / IB Gateway

前者受 IBKR 账户会话规则限制;后者由 TWS API 的 clientId 管理。很多“为什么另一个程序一启动,我这里就断了”的问题,其实是把这两层搞混了。

TWS / IB Gateway 是登录 IBKR 账户后的交易会话。一般不要假设同一个用户名可以在多个交易应用里无限并行使用。

常见情况如下:

场景建议理解
TWS 和 IB Gateway 同时用同一用户名登录可能互相挤掉或造成会话冲突
TWS 和 IBKR Mobile 同时登录可能触发重新认证、会话切换或权限变化
Client Portal 与 TWS 同时使用需要注意会话状态和重新认证
多个 API 程序连接同一个 TWS使用不同 clientId 管理,属于 API 客户端层面

实际能否同时登录,最终以 IBKR 账户、地区、认证方式和客户端提示为准。开发时的稳定做法是:一个自动化环境只保留一个主要交易会话,避免 TWS、IB Gateway 和移动端互相抢会话。

多个 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 test900999
行情采集100199
账户与持仓200299
订单测试300399
服务端任务500599

编号本身没有业务含义,关键是不要让两个正在运行的程序使用同一个 clientId

同一个 clientId 代表同一个 API 客户端身份。复用可能带来这些问题:

问题表现
连接冲突新程序连接时,旧程序断开或收不到回调
订单归属混乱订单状态里看到相同 clientId,难以判断哪个程序发起
排查困难日志中无法按客户端区分请求来源
回调错位程序重启后旧请求和新请求难以区分

新手调试时,最简单的规则是:每开一个脚本窗口,就换一个 clientId

TWS 界面手动下单和 API 程序下单不是完全一样的来源。TWS API 的订单回调里会出现 clientId,用于识别订单来自哪个客户端。

需要注意:

订单来源排查重点
这个 API 客户端提交的订单这个程序通常能直接跟踪
其他 API 客户端提交的订单需要考虑是否请求所有开放订单
TWS 手工提交的订单需要按订单管理章节处理绑定和可见性

订单可见性、绑定手工订单、请求所有开放订单这些内容会在订单管理章节详细写。这里先记住:多客户端环境下,订单状态排查必须同时看 orderIdpermIdclientId

为了减少会话冲突,建议按环境分开:

环境推荐方式
Windows 桌面开发只开 TWS 模拟账户,脚本连接 127.0.0.1:7497
Linux 服务器运行优先使用 IB Gateway 模拟账户,脚本连接 127.0.0.1:4002
自建网页系统后端或本地脚本统一管理 API 会话
人工交易和自动化同时进行分清手工订单、API 订单和 clientId

不要一边用真实账户人工交易,一边让多个没有充分测试过的脚本接入同一会话。即使是模拟账户,也应先把每个脚本的职责和 clientId 固定下来。

当你怀疑是多客户端问题时,按这个顺序排查:

  1. 关闭所有测试脚本,只保留 TWS / IB Gateway。
  2. 用一个最小 reqCurrentTime() 脚本连接,确认能收到 nextValidId()
  3. 换一个不同 clientId,再启动第二个脚本。
  4. 观察两个脚本是否都能稳定收到回调。
  5. 如果涉及订单,再检查订单状态里的 clientIdpermId

不要在多客户端问题没排清前直接测试批量行情或订单接口。否则限频、连接、订单归属和权限错误会叠在一起。

现象常见原因处理方式
第二个脚本启动后第一个断开两个脚本用了同一个 clientId给每个脚本分配独立编号
TWS 被其他应用挤掉登录同一用户名在多个交易应用中切换保留一个主要交易会话
订单状态看不出来源没记录 clientIdorderIdpermId日志里同时打印这三个字段
TWS 能连,IB Gateway 连不上两者是不同会话和端口分别检查端口和登录状态
手机登录后程序断线账户会话或认证状态变化等待重新认证后重新连接

IBKR Campus: TWS API Documentation