You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IB API开发问题:Python如何查询指定Contract的未成交订单或持仓

Interactive Brokers Python API 合约订单与持仓查询方案

前置依赖

以下示例基于ib_insync封装库实现,逻辑也可复用于原生IB TWS API:

  • 提前完成TWS/IB Gateway连接配置,确认API访问权限已开启,未勾选只读模式
  • 导入依赖并初始化连接:
from ib_insync import IB, Stock, Contract

# 请替换为你自己的端口、clientId参数
ib = IB()
ib.connect(host='127.0.0.1', port=7497, clientId=1)

1. 查询指定合约的未完成公开订单

优先使用合约唯一标识conId匹配,避免同代码不同类型合约匹配错误:

# 定义目标合约,可按你的需求修改为期货、期权等对应类型
target_contract = Stock('AAPL', 'SMART', 'USD')
# 若已知conId可直接指定,匹配精度更高
# target_contract = Contract(conId=265598)

# 补全合约信息,避免未同步导致的属性缺失
ib.qualifyContracts(target_contract)

# 拉取所有未完成活动订单
open_orders = ib.openOrders()

# 匹配对应合约的未完成订单
has_open_order = any(order.contract.conId == target_contract.conId for order in open_orders)

if has_open_order:
    print(f"目标合约存在未完成公开订单")
else:
    print(f"目标合约无未完成公开订单")

如果使用原生TWS API,调用reqOpenOrders()接口,在openOrder回调中存储订单信息后按上述逻辑匹配即可。

2. 查询指定合约的当前持仓

# 拉取当前账户全量持仓
positions = ib.positions()

# 匹配目标合约持仓
target_position = next((pos for pos in positions if pos.contract.conId == target_contract.conId), None)
has_position = target_position is not None and target_position.position != 0

if has_position:
    print(f"目标合约当前持仓数量:{target_position.position}")
else:
    print(f"目标合约无持仓")

如果使用原生TWS API,调用reqPositions()接口,在position回调中存储持仓数据后按上述逻辑匹配即可。

注意事项

  • 所有合约匹配操作优先使用conId作为唯一标识,不要仅用symbol匹配,避免出现同代码不同到期日、不同交易所的合约匹配错误
  • 若查询返回结果为空,可先检查TWS/IB Gateway的API设置,确认clientId未被占用、IP地址已加入信任列表

内容的提问来源于stack exchange,提问作者Maxime Tardif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:36:03