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
相关产品推荐
相关产品推荐

