跳转到内容

验证 API 连接

验证 API 连接,不只是看 connect() 有没有返回。真正可靠的验证要分三层:

  1. Python 能导入 ibapi。
  2. 程序能连上 TWS / IB Gateway 的 Socket 端口。
  3. TWS / IB Gateway 能返回 nextValidId() 和至少一个简单请求结果。
顺序验证内容通过信号
1TWS / IB Gateway 已登录客户端处于可使用状态。
2API Socket 已启用API Settings 中勾选 Enable ActiveX and Socket Clients。
3端口一致程序端口和 Socket Port 一致。
4ibapi 可导入Python 不报 ModuleNotFoundError。
5收到 nextValidId()初始握手完成。
6reqCurrentTime() 返回请求、响应、回调全部通了。

先确认命令行里使用的 Python 能导入 ibapi:

Terminal window
python -c "import sys, ibapi; print(sys.executable); print(ibapi.__file__)"

如果看到:

ModuleNotFoundError: No module named 'ibapi'

说明这个 Python 环境没有安装 TWS API Python 包。此时不要先改 TWS 设置,应该回到安装章节,确认 python 和 pip 使用的是同一个环境。

同一台电脑运行 TWS 模拟账户和 Python 脚本时,常见配置是:

host = 127.0.0.1
port = 7497

常见端口如下:

场景常见端口
TWS 模拟账户7497
TWS 真实账户7496
IB Gateway 模拟账户4002
IB Gateway 真实账户4001

端口不是固定规则,最终以 TWS / IB Gateway 的 API 设置页面为准。

最小验证不要一上来请求行情、账户或下单。先用 reqCurrentTime() 验证连接链路,因为它不依赖行情订阅,也不会触发订单风险。

可以把上一页的最小连接示例保存为 Python 文件,然后按自己的环境传入 host、port 和 clientId。重点不是脚本文件名,而是确认 nextValidId() 和 currentTime() 都能返回。

参数含义:

参数示例含义
--host127.0.0.1TWS / IB Gateway 所在机器。同一台电脑运行时通常使用回环地址。
--port7497TWS API Socket 端口。模拟账户常见为 7497。
--client-id901本次 API 客户端编号,建议每个脚本用不同编号。
--timeout12等待连接和回调的最长秒数。

通过时会看到类似输出:

TWS API OK: server_time=1781368619, host=127.0.0.1, port=7497

这说明:

  • Python 可以导入 ibapi。
  • 程序可以连接 TWS 的 Socket 端口。
  • TWS 已接受这个 API 客户端。
  • nextValidId() 已返回。
  • reqCurrentTime() 请求和 currentTime() 回调都正常。

核心回调只需要三个:

def nextValidId(self, orderId: int):
self.reqCurrentTime()
def currentTime(self, time_: int):
print(f"SERVER_TIME={time_}")
self.disconnect()
def error(self, reqId, errorCode, errorString, advancedOrderRejectJson=""):
print(f"API message: reqId={reqId}, code={errorCode}, message={errorString}")

这里故意不用行情、合约详情、账户数据或订单接口。reqCurrentTime() 不依赖行情权限,也不会触发交易风险,是验证连接最干净的请求之一。

第一次连接时,TWS 可能弹出 API 连接确认窗口。确认后,TWS 才会真正接受这个 API 客户端。

如果没有弹窗,也不一定是异常:同一台电脑、同一套 TWS 设置之前已经允许过连接时,TWS 可能直接接受连接。

因此连接验证不要依赖“有没有看到弹窗”,而应该依赖两个回调信号:

信号含义
nextValidId(orderId)初始握手完成,可以开始发送请求。
currentTime(time_)一个简单请求已经成功返回。
现象常见原因处理方式
Python 导入失败这个解释器没装 ibapi确认 python 和 pip 属于同一环境。
connect() 报 502TWS 未启动、端口错、API 未启用、防火墙拦截检查 TWS API Settings 和端口。
收不到 nextValidId()TWS 弹出 API 连接确认未接受,或握手未完成看 TWS 界面是否有确认窗口;已经信任过同一台电脑的连接时可能不会再弹。
收到 nextValidId() 但无 currentTime()没有运行消息循环,或脚本提前退出确认 app.run() 在线程中运行。
连接一会儿断开TWS 重启、锁定、网络变化或 clientId 冲突看日志并换一个独立 clientId。

连接验证通过后,再按目标选择下一步接口:

目标下一步接口
查合约是否写对reqContractDetails()
拉历史 K 线reqHistoricalData()
看实时行情reqMktData()
看账户和持仓reqAccountSummary()、reqPositions()
测试订单结构placeOrder() + whatIf=True

IBKR Campus: TWS API Documentation