跳转到内容

要求

开始写 TWS API 程序前,先确认运行环境已经准备好。TWS API 不是单独连到 IBKR 云端的接口,它依赖开发机或服务器上已经登录的 Trader Workstation(TWS)IB Gateway

官方入口:TWS API Documentation

如果只是做桌面开发和模拟账户测试,最小环境是:

项目推荐值说明
账户Paper Account新手先用模拟账户,避免误下真实订单。
客户端TWSWindows 桌面开发更直观,方便看界面和订单状态。
API 端口7497TWS 模拟账户常用端口;真实账户常见为 7496,以 TWS 设置为准。
连接地址127.0.0.1程序和 TWS 在同一台电脑上运行时使用。
API 设置启用 Socket clients需要在 TWS 设置中开启 API 连接。
Python 包ibapiPython 示例使用官方 TWS API Python 包。

这套环境能完成连接测试、服务器时间、合约查询、账户摘要、历史行情和模拟订单预览等基础验证。

最小环境只代表“可以开始开发”,不代表所有行情、逐笔数据、新闻、期权 Greeks、市场深度或订单类型都可用。后面每个接口页都会把“连接要求”和“权限要求”分开说明。

至少安装并运行一个:

  • TWS:适合桌面开发、人工确认订单状态。
  • IB Gateway:适合服务器长期运行,界面更简化,但仍需要登录和定期认证。

新手建议先用 TWS。TWS 有完整界面,能直接看到订单窗口、风险提示、连接状态、行情权限提示和 API 设置。等脚本、日志和错误处理流程稳定后,再把服务器部署切到 IB Gateway。

场景推荐客户端原因
第一次跑 Python 示例TWS能看到界面和弹窗,排查更直观。
桌面开发TWS设置路径、订单状态、错误提示都容易确认。
服务器长期运行IB Gateway更轻量,适合常驻,但仍需要处理认证和重启。
真实账户自动化交易先 TWS 验证,再评估 Gateway真实账户必须先把日志、风控、撤单、异常恢复跑通。

Python 代码需要能导入这些模块:

from ibapi.client import EClient
from ibapi.wrapper import EWrapper

如果导入失败,说明还没有安装官方 TWS API Python 包,或运行脚本的 Python 环境不是你安装包时使用的那个环境。

验证方式:

Terminal window
python -c "from ibapi.client import EClient; from ibapi.wrapper import EWrapper; print('ibapi ok')"

如果电脑里有多个 Python,重点检查“运行脚本的 Python”和“安装 ibapi 的 Python”是不是同一个。Windows 上尤其容易出现命令行能导入、IDE 里不能导入,或反过来的情况。

Paper Account 可以用于多数开发测试,但它不是完整真实市场环境:

  • 行情权限仍然受账户订阅影响。
  • 某些产品、交易所或订单类型可能和真实账户表现不同。
  • 模拟成交不等于真实成交,不适合验证真实滑点和成交概率。
  • 模拟账户有时能返回延迟行情,有时会直接返回权限错误,取决于标的、交易所、账户订阅和请求类型。

模拟账户适合验证:

适合验证不适合证明
连接、回调、合约字段、订单对象结构真实成交速度、真实滑点、真实流动性
历史 K 线参数和返回格式所有交易所的实时行情权限
whatIf=True 订单影响预览真实账户保证金结果完全一致
模拟下单、撤单、订单状态流真实资金环境里的风控和拒单概率

能连接 TWS API 不代表一定能拿到实时行情。实时行情、延迟行情、历史行情都可能受到订阅、交易权限和交易所规则影响。

行情相关页面会单独解释:

  • reqMarketDataType
  • reqMktData
  • reqHistoricalData
  • 常见行情错误码
  • 延迟行情与实时行情的区别

开发时建议这样判断:

现象常见原因处理方式
能连接,但 reqMktData() 没有实时价格没有对应交易所实时行情订阅先尝试延迟行情,或检查 Client Portal 中的行情订阅。
逐笔数据返回权限错误逐笔数据权限比普通 L1 行情更严格在文档和程序里允许这种错误,不要把它当代码必然失败。
历史 K 线能返回,实时行情不能返回历史数据和实时数据权限并不完全等价分别测试 reqHistoricalData()reqMktData()
某些字段为 -1 或空值该数据源没有提供、账户无权限或暂时无行情在页面展示时标注“无数据”,不要直接当作 0。

提交订单前,账户必须有对应产品和地区的交易权限。程序侧也需要设置订单风险保护,尤其是:

  • 先用 whatIf=True 做订单影响预览。
  • 先在 Paper Account 中测试。
  • 确认合约唯一,避免把同一个代码下到错误交易所或币种。
  • 明确订单类型、价格、数量、有效期和是否允许盘前盘后。
  • 读取 openOrder()orderStatus()execDetails()error(),不要只看 placeOrder() 是否调用成功。

下单相关页面会默认使用小数量、限价单和模拟账户示例。真实账户自动化交易应该在业务系统里额外加白名单、价格保护、最大数量限制、撤单机制和日志审计。

默认情况下,本地开发只需要连接:

host = "127.0.0.1"
port = 7497

如果程序运行在另一台机器上,就属于远程连接,需要额外考虑:

项目说明
Trusted IPs只允许可信机器访问 TWS / IB Gateway。
防火墙只开放必要端口,不把 API 端口暴露到公网。
服务器认证IBKR 仍会要求登录、2FA 和周期性重新认证。
只读模式查询型程序优先启用 Read-Only API。

不要把 TWS API 端口直接暴露到公网。即使是模拟账户,也应该按真实账户的安全标准处理。

桌面开发常见配置:

配置项推荐值说明
host127.0.0.1只连接同一台电脑上的 TWS,最安全。
port7497以 TWS API 设置页面显示为准。
clientId自己指定一个不冲突的整数不同脚本用不同编号,方便排查。
Read-Only API查询脚本可开启,下单脚本必须关闭只读模式会阻止下单。
Trusted IPs同一台电脑测试通常不需要额外添加远程连接才需要谨慎配置。
检查项目标状态
TWS / IB Gateway 已启动已登录账户,界面可用。
账户类型确认使用的是 Paper Account 还是 Live Account。
API Socket 已启用TWS 设置中允许 API 客户端连接。
端口确认模拟账户常用 7497,真实账户常用 7496
Python 能导入 ibapifrom ibapi.client import EClient 不报错。
能收到 nextValidId表示 Socket 握手完成,可以继续请求。
能请求 currentTime表示最小 API 请求链路可用。
行情权限已预期没有权限时能看懂错误码,不把权限问题误判为代码错误。
下单保护已设置下单前有合约确认、数量限制、限价保护和日志。

连接机制章节会使用 Python 连接脚本验证 nextValidIdcurrentTime,这样可以先确认 Socket 握手成功,再继续排查行情或订单问题。

误区正确理解
能登录 TWS 就能用 API还需要启用 Socket API 并确认端口。
能连接 API 就能拿实时行情行情还受订阅和权限影响。
模拟账户一定和真实账户一样模拟账户适合开发验证,不等于真实成交环境。
服务器跑 IB Gateway 就不用人工处理登录、2FA 和重新认证仍然需要设计处理流程。
直接复制下单代码就能交易必须先确认合约、权限、订单参数和风控提示。
placeOrder() 没报错就表示成交下单只是发出请求,成交要看订单状态和执行回报。