使用 ib_insync 获取交易合约 ID (conID) 的教程

聖光之護
发布: 2025-12-02 14:07:22
原创
427人浏览过

使用 ib_insync 获取交易合约 id (conid) 的教程

本教程详细介绍了如何在使用 `ib_insync` 库与盈透证券TWS API交互时,从交易对象中获取关联的合约ID (conID)。通过利用 `ib.openTrades()` 方法返回的 `Trade` 对象,用户可以方便地访问每个交易中包含的 `contract` 属性,进而提取出唯一的合约标识符 `conId`,从而有效地将订单或交易与具体的金融工具关联起来。

理解 ib_insync 中的订单与合约关联

在使用 ib_insync 库进行自动化交易时,经常需要将执行的订单或当前的交易头寸与其所代表的金融合约进行关联。盈透证券API中的合约ID (conID) 是一个唯一的整数标识符,用于精确识别一个特定的金融工具(如股票、期货、期权等)。虽然 ib.orders() 方法返回的 Order 对象本身可能不直接包含 conId 属性,但通过 ib.openTrades() 方法获取的 Trade 对象则提供了这种直接的关联。

Trade 对象在 ib_insync 中代表了一个活跃的订单或一个已建立的头寸。每个 Trade 对象都包含一个 contract 属性,这个属性是一个 Contract 对象实例,它详细描述了该交易涉及的金融工具。从这个 Contract 对象中,我们可以轻松地获取到 conId。

Otter.ai
Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

Otter.ai 91
查看详情 Otter.ai

获取合约 ID 的步骤与示例

以下是使用 ib_insync 连接到 TWS/Gateway 并从开放交易中提取合约 ID 的详细步骤和代码示例:

  1. 导入必要的模块:首先,需要从 ib_insync 库中导入 IB 和 util 模块。
  2. 启动事件循环:ib_insync 依赖于 asyncio 事件循环,因此在连接之前需要通过 util.startLoop() 启动它。
  3. 创建 IB 实例并连接:实例化 IB 类,并使用 ib.connect() 方法连接到本地运行的 TWS 或 IB Gateway。
  4. 获取开放交易:使用 ib.openTrades() 方法获取所有当前开放的交易。这个方法会返回一个 Trade 对象的列表。
  5. 遍历交易并提取合约 ID:迭代 openTrades 列表中的每个 Trade 对象。对于每个 trade,访问其 trade.contract 属性,这将返回一个 Contract 对象。最后,从 Contract 对象中提取 conId。
  6. 断开连接:完成操作后,使用 ib.disconnect() 断开与 TWS/Gateway 的连接。
from ib_insync import IB, util, Contract

# 1. 启动 asyncio 事件循环
util.startLoop()

# 2. 创建 IB 实例
ib = IB()

try:
    # 3. 连接到 TWS/Gateway
    # 确保 TWS 或 IB Gateway 正在运行,并且端口和 clientId 正确
    # 默认端口 TWS: 7496, Gateway: 7497 (实时), 4001 (模拟)
    ib.connect("127.0.0.1", 7496, clientId=4)
    print("成功连接到盈透证券 TWS/Gateway。")

    # 4. 获取所有开放交易
    # openTrades() 返回一个 Trade 对象的列表
    openTrades = ib.openTrades()
    print(f"检测到 {len(openTrades)} 个开放交易。")

    if not openTrades:
        print("当前没有开放的交易。")
    else:
        # 5. 遍历开放交易以访问合约 ID
        for trade in openTrades:
            # 每个 trade 对象都有一个关联的 contract 属性
            contract = trade.contract
            # 从 contract 对象中打印合约 ID (conId)
            print(f"--------------------------------------------------")
            print(f"交易 ID: {trade.order.orderId}") # 打印关联的订单ID
            print(f"合约符号: {contract.symbol}")
            print(f"合约类型: {contract.secType}")
            print(f"合约交易所: {contract.exchange}")
            print(f"合约 ID (conID): {contract.conId}")
            print(f"交易状态: {trade.orderStatus.status}") # 打印订单状态
            print(f"--------------------------------------------------")

except Exception as e:
    print(f"连接或操作过程中发生错误: {e}")
finally:
    # 6. 断开与 TWS/Gateway 的连接
    if ib.isConnected():
        ib.disconnect()
        print("已断开与盈透证券 TWS/Gateway 的连接。")
登录后复制

注意事项与进阶

  • Order 与 Trade 的区别:ib.orders() 返回的是 Order 对象,它代表了您提交的订单指令。而 ib.openTrades() 返回的是 Trade 对象,它代表了当前活跃的订单或已执行并持有头寸的交易。Trade 对象比 Order 对象包含了更多的实时状态信息,并且关键在于它直接关联了 Contract 对象。
  • 历史订单:如果需要获取历史订单的合约信息,ib_insync 提供了 ib.reqHistoricalOrders() 或通过 ib.fills() 获取成交记录,这些记录通常也包含关联的合约信息。对于已完成的订单,可能需要根据 orderId 或其他信息自行查询对应的合约。
  • Contract 对象的丰富信息:Contract 对象不仅包含 conId,还包含 symbol (股票代码), secType (证券类型,如STK, FUT, OPT), exchange (交易所), currency (货) 等详细信息。这些信息对于识别和管理交易至关重要。
  • 错误处理:在实际应用中,务必添加适当的错误处理机制,例如 try-except-finally 块,以确保连接的健壮性和资源的正确释放。
  • 客户端 ID (clientId):在 ib.connect() 中使用的 clientId 必须是唯一的,否则可能会导致连接冲突。

总结

通过 ib_insync 库的 ib.openTrades() 方法,我们可以高效地获取到所有活跃交易的 Trade 对象。每个 Trade 对象都包含一个 contract 属性,通过访问 trade.contract.conId,用户可以轻松地获取到与该交易关联的唯一合约 ID。这种方法是 ib_insync 中连接交易与具体金融工具的关键途径,对于构建复杂的交易策略和管理交易数据至关重要。

以上就是使用 ib_insync 获取交易合约 ID (conID) 的教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号