| name | ibkr-trader |
| description | 此技能用于通过 Interactive Brokers(IBKR)API 进行自动化交易操作,包括连接 TWS/IB Gateway、合约查询与校验、行情数据获取(实时/历史)、下单交易(股票/期权/期货/外汇)、账户和持仓查询。优先使用 ib_async(ib_insync 的维护分支)封装库,并优先从环境变量解析 IB Gateway/TWS 的地址、端口和 clientId。适用于用户提到 IBKR API、Interactive Brokers、TWS API、ib_insync、ib_async、IB Gateway、ibapi、placeOrder、reqHistoricalData、qualifyContracts、期货下单、全球多市场自动化交易的场景。 |
IBKR Trader API 调用(TWS API)
此技能专注于 TWS API(TCP socket),通过 ib_async 或官方 ibapi 连接本地 TWS / IB Gateway 进程。
| 调用方式 | 优点 | 适用场景 |
|---|
ib_async(推荐) | 同步写法,自动保持连接同步,asyncio 友好 | Python 项目首选(ib_insync 的维护分支) |
官方 ibapi | 官方支持,原生回调架构 | 需要最新特性、非 Python 环境 |
不适用于:Web API / Client Portal API(REST + WebSocket,需要 CP Gateway 进程,功能子集,不支持 tick 数据和算法订单);无法在本地运行 TWS 或 IB Gateway 进程的纯云无头环境;加密货币高频交易;thinkorswim 专有功能。
安装
pip install ib_async
pip install ib_insync
官方 ibapi 不需要单独安装(ib_async 内部实现了完整协议)。
前置条件
- 下载并安装 IB Gateway 或 Trader Workstation(TWS)
- 登录后启用 API:
Configure → API → Settings → Enable ActiveX and Socket Clients
- 确认端口:TWS 实盘
7496,Paper 7497;Gateway 实盘 4001,Paper 4002
- 关闭 Read-Only 模式(需要下单时)
- 设置 Memory Allocation ≥ 4096 MB(批量数据防崩溃)
详见 references/setup-and-auth.md。
工作流
复制此 checklist 追踪进度:
IBKR API 进度:
- [ ] 步骤 1: 连接 TWS/Gateway
- [ ] 步骤 2: 校验合约(qualifyContracts)
- [ ] 步骤 3: 选择任务类型(行情 / 历史数据 / 下单 / 账户)
- [ ] 步骤 4: 调用 API,等待响应
- [ ] 步骤 5: 处理数据
- [ ] 步骤 6: 断开连接 / 质量检查
步骤 1: 连接 TWS/Gateway
解析连接端点时按顺序执行:
- 优先读取环境变量:
IBKR_HOST / TWS_HOST、IBKR_PORT / TWS_PORT、IBKR_CLIENT_ID / TWS_CLIENT_ID
- 没有环境变量时使用默认候选:
127.0.0.1:7497(Paper TWS)、127.0.0.1:4002(Paper Gateway)、127.0.0.1:7496(实盘 TWS)、127.0.0.1:4001(实盘 Gateway)
- 默认地址和端口不通时,继续探索本机监听端口,优先查找
tws、ibgateway、jts、java 相关进程并测试其监听地址与端口
import os
import socket
from ib_async import IB, util
DEFAULT_ENDPOINTS = (
('127.0.0.1', 7497),
('127.0.0.1', 4002),
('127.0.0.1', 7496),
('127.0.0.1', 4001),
)
CONNECT_PROBE_TIMEOUT = 2.0
DEFAULT_CLIENT_ID = 1
def can_open(host, port, timeout=CONNECT_PROBE_TIMEOUT):
try:
with socket.create_connection((host, int(port)), timeout=timeout):
return True
except OSError:
return False
def resolve_ibkr_endpoint():
env_host = os.getenv('IBKR_HOST') or os.getenv('TWS_HOST')
env_port = os.getenv('IBKR_PORT') or os.getenv('TWS_PORT')
host = env_host or '127.0.0.1'
client_id = int(os.getenv('IBKR_CLIENT_ID') or os.getenv('TWS_CLIENT_ID') or DEFAULT_CLIENT_ID)
candidates = []
if env_port:
candidates.append((host, int(env_port)))
elif env_host:
candidates.extend((host, default_port) for _, default_port in DEFAULT_ENDPOINTS)
candidates.extend(DEFAULT_ENDPOINTS)
seen = set()
for candidate_host, candidate_port in candidates:
if (candidate_host, candidate_port) in seen:
continue
seen.add((candidate_host, candidate_port))
if can_open(candidate_host, candidate_port):
return candidate_host, candidate_port, client_id
raise RuntimeError(
"No IBKR TWS/Gateway socket found. Inspect local listeners for "
"tws/ibgateway/jts/java processes, then set IBKR_HOST and IBKR_PORT."
)
host, port, client_id = resolve_ibkr_endpoint()
ib = IB()
ib.connect(host, port, clientId=client_id)
print(ib.isConnected())
每个连接必须使用唯一的 clientId,同一 TWS 实例可同时连接多个客户端。端点自动解析失败时读取 references/setup-and-auth.md 的“连接发现顺序”排查监听进程。
步骤 2: 校验合约
合约必须先 qualify 才能请求数据或下单。ib_async 会自动填入 conId 等必要字段:
from ib_async import Stock, Forex, Future, Option, Index
stock = Stock('AAPL', 'SMART', 'USD')
ib.qualifyContracts(stock)
es = Future('ES', '20251219', 'CME')
ib.qualifyContracts(es)
eurusd = Forex('EURUSD')
opt = Option('AAPL', '20251219', 230, 'C', 'SMART')
ib.qualifyContracts(opt)
完整合约类型见 references/api-reference.md。
步骤 3: 选择任务类型
| 需求 | 方法 |
|---|
| 实时行情(Level 1) | ib.reqMktData(contract) |
| 历史 K 线 | ib.reqHistoricalData(contract, ...) |
| 期权链 | ib.reqSecDefOptParams(...) + ib.reqHistoricalData |
| 市场深度(Level 2) | ib.reqMktDepth(contract) |
| 下单 | ib.placeOrder(contract, order) |
| 持仓/账户 | ib.positions() / ib.accountSummary() |
步骤 4a: 历史行情数据
import pandas as pd
from ib_async import util
bars = ib.reqHistoricalData(
stock,
endDateTime='',
durationStr='30 D',
barSizeSetting='1 day',
whatToShow='TRADES',
useRTH=True,
)
df = util.df(bars)
print(df[['date', 'open', 'high', 'low', 'close', 'volume']].tail())
历史数据节流限制:10 分钟内不超过 60 次请求,批量下载需要加延迟。完整 duration/barSize 对照表见 references/api-reference.md。
步骤 4b: 实时行情
ib.reqMarketDataType(3)
ticker = ib.reqMktData(stock, '', False, False)
ib.sleep(2)
print(f"{ticker.last} bid={ticker.bid} ask={ticker.ask} vol={ticker.volume}")
ib.cancelMktData(stock)
步骤 4c: 下单交易
from ib_async import MarketOrder, LimitOrder, StopOrder
order = MarketOrder('BUY', 100)
trade = ib.placeOrder(stock, order)
ib.sleep(1)
print(trade.orderStatus.status)
limit_order = LimitOrder('BUY', 100, 180.0)
trade = ib.placeOrder(stock, limit_order)
bracket = ib.bracketOrder(
action='BUY',
quantity=100,
limitPrice=180.0,
takeProfitPrice=200.0,
stopLossPrice=170.0,
)
for leg in bracket:
ib.placeOrder(stock, leg)
ib.cancelOrder(trade.order)
完整订单类型和期权策略见 references/common-recipes.md。
步骤 5: 账户与持仓
positions = ib.positions()
for pos in positions:
print(f"{pos.contract.symbol}: {pos.position} @ avg {pos.avgCost:.2f}")
account = ib.managedAccounts()[0]
summary = ib.accountSummary(account)
for item in summary:
if item.tag in ('NetLiquidation', 'TotalCashValue', 'UnrealizedPnL'):
print(f"{item.tag}: {item.value} {item.currency}")
pnl = ib.reqPnL(account)
ib.sleep(1)
print(f"Daily P&L: {pnl.dailyPnL:.2f}")
步骤 6: 断开连接
ib.sleep(1)
ib.disconnect()
关键限制与陷阱
- pacing violation:历史数据 10 分钟内 ≤ 60 次请求;相同合约 2 秒内 < 6 次;批量请求加
time.sleep(2)
- clientId 冲突:同一 TWS 会话中每个连接需唯一 clientId;错误 507 表示 clientId 已被使用
- 端点发现失败:优先设置
IBKR_HOST、IBKR_PORT、IBKR_CLIENT_ID;默认端口不通时检查本机 tws / ibgateway / jts / java 监听端口
- Read-Only 模式:TWS 默认启用,需在 API Settings 中关闭才能下单
- 市场数据订阅:免费层仅有 Cboe One + IEX(部分股票),Period 期权/期货实时数据需额外付费订阅
- 100 市场数据线上限:默认账户 100 条并发行情线;
Ctrl+Alt+= 可查看当前使用量
- 期权链大请求:
reqContractDetails 不指定 expiry 会拉取全部合约,容易触发 Gateway 内存崩溃,必须指定到期日范围
- TWS 每日重启:TWS/Gateway 每日约 UTC 23:45–0:00 服务器重置,需要自动重连逻辑
- 短连接需要延迟:断开前
ib.sleep(1) 让数据 flush;否则最后的请求可能未发出
质量检查
参考资料(按需加载)
references/setup-and-auth.md - TWS/Gateway 安装配置、IBC 自动登录、ibeam Docker、连接重试
references/api-reference.md - 合约类型、订单类型、关键方法签名、错误代码、速率限制、历史数据参数对照
references/common-recipes.md - 完整可运行代码:批量历史下载、期权链、多腿策略下单、持仓监控、异步模式