
本教程详细介绍了如何在使用 `ib_insync` 库与盈透证券TWS/Gateway交互时,从交易对象中提取关联的合约ID (conID)。文章阐明了 `ib.orders()` 返回的 `Order` 对象与 `ib.openTrades()` 返回的 `Trade` 对象的区别,并提供了通过遍历 `Trade` 对象来访问其 `contract` 属性,进而获取唯一合约标识符 `conId` 的实用Python代码示例和专业指导。
在使用 ib_insync 库与盈透证券 (Interactive Brokers, IB) 的交易工作站 (TWS) 或 IB Gateway 进行交互时,开发者经常需要获取与特定订单或交易相关的合约信息。其中,合约ID (conID) 是一个关键标识符,它在全球范围内唯一地识别一个金融合约。
然而,ib_insync 库中不同方法返回的对象类型及其包含的信息有所区别。例如,通过 ib.orders() 方法获取的 Order 对象主要关注订单的详细信息,如订单类型、价格、数量等,但它通常不直接包含合约的 conID。这可能会让开发者在尝试从 Order 对象中直接提取 conID 时遇到困惑。
为了获取合约ID,我们需要利用 ib_insync 提供的 Trade 对象。Trade 对象代表一个已提交并正在执行或已执行的交易,它与一个特定的合约紧密关联。通过 ib.openTrades() 方法可以获取当前所有未完成或活跃的交易列表,每个 Trade 对象都包含一个 contract 属性,该属性是一个 Contract 对象,其中就包含了我们需要的 conID。
以下是使用 ib_insync 连接到 TWS/Gateway,并从 Trade 对象中提取合约ID的详细步骤和代码示例:
首先,确保导入 ib_insync 库中的 IB 和 util 模块。IB 类用于建立与 TWS/Gateway 的连接,而 util 模块则提供了启动 asyncio 事件循环等实用功能。
from ib_insync import IB, util
ib_insync 是基于 asyncio 构建的,因此在执行任何 ib_insync 操作之前,需要启动 asyncio 事件循环。util.startLoop() 是一个便捷的方法,可以完成此操作。
util.startLoop()
使用 IB() 实例连接到运行中的 TWS 或 IB Gateway。需要指定主机地址(通常是 127.0.0.1)、端口号(TWS 默认 7496,Gateway 默认 4001 或 4002,示例中使用 7491)和客户端ID。客户端ID用于区分不同的客户端连接。
ib = IB()
ib.connect("127.0.0.1", 7491, clientId=4)使用 ib.openTrades() 方法获取所有当前活跃的交易。这个方法返回一个 Trade 对象列表,每个 Trade 对象都代表一个开放的交易。
openTrades = ib.openTrades()
迭代 openTrades 列表中的每个 Trade 对象。每个 Trade 对象都有一个 contract 属性,它是一个 Contract 对象。从这个 Contract 对象中,可以访问 conId 属性来获取合约ID。
for trade in openTrades:
# 每个 trade 对象都有一个关联的 contract 属性
contract = trade.contract
# 打印合约ID
print(f"Contract ID (conID) for trade: {contract.conId} - Symbol: {contract.symbol}")为了更好地理解,这里也展示了如何获取 ib.orders() 返回的订单,并强调它不直接包含 conID。
orders = ib.orders()
print("\n--- Fetched Orders (no direct conID) ---")
for order in orders:
print(f"Order ID: {order.orderId}, Status: {order.status}")
# 注意:Order 对象本身没有 conId 属性完成操作后,务必调用 ib.disconnect() 方法断开与 TWS/Gateway 的连接,释放资源。
ib.disconnect()
from ib_insync import IB, util
# 启动 asyncio 事件循环
util.startLoop()
# 创建一个 IB 实例
ib = IB()
try:
# 连接到 TWS/Gateway
# 请根据您的实际配置修改 IP 地址和端口
ib.connect("127.0.0.1", 7491, clientId=4)
print("成功连接到 TWS/Gateway")
# 获取所有活跃交易
openTrades = ib.openTrades()
print(f"\n--- 发现 {len(openTrades)} 个活跃交易 ---")
if not openTrades:
print("当前没有活跃交易。")
else:
# 遍历活跃交易以访问合约ID
for trade in openTrades:
# 每个 trade 对象都包含一个关联的 contract 属性
contract = trade.contract
# 打印合约ID和其他相关信息
print(f"交易ID: {trade.order.orderId}, 合约ID (conID): {contract.conId}, "
f"代码: {contract.symbol}, 类型: {contract.secType}, 交易所: {contract.exchange}")
# 也可以获取所有订单,但请注意 Order 对象不直接包含 conID
# orders = ib.orders()
# print(f"\n--- 发现 {len(orders)} 个订单 ---")
# for order in orders:
# print(f"订单ID: {order.orderId}, 状态: {order.status}")
except Exception as e:
print(f"连接或操作过程中发生错误: {e}")
finally:
# 断开与 TWS/Gateway 的连接
if ib.isConnected():
ib.disconnect()
print("已断开与 TWS/Gateway 的连接")
通过 ib_insync 获取合约ID (conID) 的关键在于理解 Order 对象和 Trade 对象的区别。虽然 ib.orders() 返回的 Order 对象不直接提供 conID,但 ib.openTrades() 返回的 Trade 对象则通过其 contract 属性间接地暴露了 conID。掌握这一机制,可以帮助开发者更准确、高效地管理和查询与IB交易相关的合约信息。在进行程序化交易开发时,始终优先考虑通过 Trade 对象来获取合约的唯一标识符 conID,以确保数据的准确性和一致性。
以上就是使用 ib_insync 从交易对象中获取合约ID (conID)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号