要求
开始写 TWS API 程序前,先确认运行环境已经准备好。TWS API 不是单独连到 IBKR 云端的接口,它依赖开发机或服务器上已经登录的 Trader Workstation(TWS) 或 IB Gateway。
最小可用环境
Section titled “最小可用环境”如果只是做桌面开发和模拟账户测试,最小环境是:
| 项目 | 推荐值 | 说明 |
|---|---|---|
| 账户 | Paper Account | 新手先用模拟账户,避免误下真实订单。 |
| 客户端 | TWS | Windows 桌面开发更直观,方便看界面和订单状态。 |
| API 端口 | 7497 | TWS 模拟账户常用端口;真实账户常见为 7496,以 TWS 设置为准。 |
| 连接地址 | 127.0.0.1 | 程序和 TWS 在同一台电脑上运行时使用。 |
| API 设置 | 启用 Socket clients | 需要在 TWS 设置中开启 API 连接。 |
| Python 包 | ibapi | Python 示例使用官方 TWS API Python 包。 |
这套环境能完成连接测试、服务器时间、合约查询、账户摘要、历史行情和模拟订单预览等基础验证。
最小环境只代表“可以开始开发”,不代表所有行情、逐笔数据、新闻、期权 Greeks、市场深度或订单类型都可用。后面每个接口页都会把“连接要求”和“权限要求”分开说明。
TWS 或 IB Gateway
Section titled “TWS 或 IB Gateway”至少安装并运行一个:
- TWS:适合桌面开发、人工确认订单状态。
- IB Gateway:适合服务器长期运行,界面更简化,但仍需要登录和定期认证。
新手建议先用 TWS。TWS 有完整界面,能直接看到订单窗口、风险提示、连接状态、行情权限提示和 API 设置。等脚本、日志和错误处理流程稳定后,再把服务器部署切到 IB Gateway。
| 场景 | 推荐客户端 | 原因 |
|---|---|---|
| 第一次跑 Python 示例 | TWS | 能看到界面和弹窗,排查更直观。 |
| 桌面开发 | TWS | 设置路径、订单状态、错误提示都容易确认。 |
| 服务器长期运行 | IB Gateway | 更轻量,适合常驻,但仍需要处理认证和重启。 |
| 真实账户自动化交易 | 先 TWS 验证,再评估 Gateway | 真实账户必须先把日志、风控、撤单、异常恢复跑通。 |
TWS API 包
Section titled “TWS API 包”Python 代码需要能导入这些模块:
from ibapi.client import EClientfrom ibapi.wrapper import EWrapper如果导入失败,说明还没有安装官方 TWS API Python 包,或运行脚本的 Python 环境不是你安装包时使用的那个环境。
验证方式:
python -c "from ibapi.client import EClient; from ibapi.wrapper import EWrapper; print('ibapi ok')"如果电脑里有多个 Python,重点检查“运行脚本的 Python”和“安装 ibapi 的 Python”是不是同一个。Windows 上尤其容易出现命令行能导入、IDE 里不能导入,或反过来的情况。
账户与权限要求
Section titled “账户与权限要求”Paper Account 可以用于多数开发测试,但它不是完整真实市场环境:
- 行情权限仍然受账户订阅影响。
- 某些产品、交易所或订单类型可能和真实账户表现不同。
- 模拟成交不等于真实成交,不适合验证真实滑点和成交概率。
- 模拟账户有时能返回延迟行情,有时会直接返回权限错误,取决于标的、交易所、账户订阅和请求类型。
模拟账户适合验证:
| 适合验证 | 不适合证明 |
|---|---|
| 连接、回调、合约字段、订单对象结构 | 真实成交速度、真实滑点、真实流动性 |
| 历史 K 线参数和返回格式 | 所有交易所的实时行情权限 |
whatIf=True 订单影响预览 | 真实账户保证金结果完全一致 |
| 模拟下单、撤单、订单状态流 | 真实资金环境里的风控和拒单概率 |
能连接 TWS API 不代表一定能拿到实时行情。实时行情、延迟行情、历史行情都可能受到订阅、交易权限和交易所规则影响。
行情相关页面会单独解释:
reqMarketDataTypereqMktDatareqHistoricalData- 常见行情错误码
- 延迟行情与实时行情的区别
开发时建议这样判断:
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
能连接,但 reqMktData() 没有实时价格 | 没有对应交易所实时行情订阅 | 先尝试延迟行情,或检查 Client Portal 中的行情订阅。 |
| 逐笔数据返回权限错误 | 逐笔数据权限比普通 L1 行情更严格 | 在文档和程序里允许这种错误,不要把它当代码必然失败。 |
| 历史 K 线能返回,实时行情不能返回 | 历史数据和实时数据权限并不完全等价 | 分别测试 reqHistoricalData() 和 reqMktData()。 |
某些字段为 -1 或空值 | 该数据源没有提供、账户无权限或暂时无行情 | 在页面展示时标注“无数据”,不要直接当作 0。 |
提交订单前,账户必须有对应产品和地区的交易权限。程序侧也需要设置订单风险保护,尤其是:
- 先用
whatIf=True做订单影响预览。 - 先在 Paper Account 中测试。
- 确认合约唯一,避免把同一个代码下到错误交易所或币种。
- 明确订单类型、价格、数量、有效期和是否允许盘前盘后。
- 读取
openOrder()、orderStatus()、execDetails()和error(),不要只看placeOrder()是否调用成功。
下单相关页面会默认使用小数量、限价单和模拟账户示例。真实账户自动化交易应该在业务系统里额外加白名单、价格保护、最大数量限制、撤单机制和日志审计。
网络与安全要求
Section titled “网络与安全要求”默认情况下,本地开发只需要连接:
host = "127.0.0.1"port = 7497如果程序运行在另一台机器上,就属于远程连接,需要额外考虑:
| 项目 | 说明 |
|---|---|
| Trusted IPs | 只允许可信机器访问 TWS / IB Gateway。 |
| 防火墙 | 只开放必要端口,不把 API 端口暴露到公网。 |
| 服务器认证 | IBKR 仍会要求登录、2FA 和周期性重新认证。 |
| 只读模式 | 查询型程序优先启用 Read-Only API。 |
不要把 TWS API 端口直接暴露到公网。即使是模拟账户,也应该按真实账户的安全标准处理。
桌面开发常见配置:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
host | 127.0.0.1 | 只连接同一台电脑上的 TWS,最安全。 |
port | 7497 | 以 TWS API 设置页面显示为准。 |
clientId | 自己指定一个不冲突的整数 | 不同脚本用不同编号,方便排查。 |
| Read-Only API | 查询脚本可开启,下单脚本必须关闭 | 只读模式会阻止下单。 |
| Trusted IPs | 同一台电脑测试通常不需要额外添加 | 远程连接才需要谨慎配置。 |
开发前检查清单
Section titled “开发前检查清单”| 检查项 | 目标状态 |
|---|---|
| TWS / IB Gateway 已启动 | 已登录账户,界面可用。 |
| 账户类型确认 | 使用的是 Paper Account 还是 Live Account。 |
| API Socket 已启用 | TWS 设置中允许 API 客户端连接。 |
| 端口确认 | 模拟账户常用 7497,真实账户常用 7496。 |
Python 能导入 ibapi | from ibapi.client import EClient 不报错。 |
能收到 nextValidId | 表示 Socket 握手完成,可以继续请求。 |
能请求 currentTime | 表示最小 API 请求链路可用。 |
| 行情权限已预期 | 没有权限时能看懂错误码,不把权限问题误判为代码错误。 |
| 下单保护已设置 | 下单前有合约确认、数量限制、限价保护和日志。 |
连接机制章节会使用 Python 连接脚本验证 nextValidId 和 currentTime,这样可以先确认 Socket 握手成功,再继续排查行情或订单问题。
| 误区 | 正确理解 |
|---|---|
| 能登录 TWS 就能用 API | 还需要启用 Socket API 并确认端口。 |
| 能连接 API 就能拿实时行情 | 行情还受订阅和权限影响。 |
| 模拟账户一定和真实账户一样 | 模拟账户适合开发验证,不等于真实成交环境。 |
| 服务器跑 IB Gateway 就不用人工处理 | 登录、2FA 和重新认证仍然需要设计处理流程。 |
| 直接复制下单代码就能交易 | 必须先确认合约、权限、订单参数和风控提示。 |
placeOrder() 没报错就表示成交 | 下单只是发出请求,成交要看订单状态和执行回报。 |