跳转到主要内容

使用Interactive Brokers API (IBAPI)异步与asyncio或PyQt5

项目描述

注意

该项目已发展成为 IB-insync,所有开发都在那里进行。

代码移植

  • TWSClient 已迁移到 ib_insync.client.Client (许多改进);

  • TWSClientQt:新的 Client 可以与PyQt和quamash一起使用。

简介

tws_async 包允许使用 asyncio 标准库或 PyQt5 框架以异步和单线程方式使用Interactive Brokers (IBAPI) 的Python API。

这提供了一种比多线程更简单、更安全、更高效的并发方法。

安装

使用pip安装

pip3 install -U tws_async

注意,在某些系统上,pip3 命令只是 pip

需要Python版本3.5或更高版本以及 Interactive Brokers Python API

用法

此包提供了两个客户端,可以用作IBAPI提供的标准EClient的替代品

  • TWSClient,适用于asyncio事件循环;

  • TWSClientQt,适用于PyQt5事件循环。

这些客户端还继承自ibapi.wrapper.EWrapper,可以使用标准IBAPI版本的方式进行使用。异步客户端使用自己的事件驱动网络代码来替换标准EClient的网络代码,并且将EClient.run()的无穷循环替换为事件循环。

为了简化与合约的工作,此包提供了可以用于任何期望ibapi.contract.Contract的地方的ContractStockOptionFutureForexIndexCFDCommodity类。一些简单案例的示例是Stock('AMD')Forex('EURUSD')CFD('IBUS30')Future('ES', '201612', 'GLOBEX')。要指定更复杂的合约,任何属性都可以作为关键字给出。

要了解更多信息,请参阅官方IBAPI文档或查看这些示例用例

历史数据下载器

HistRequester下载历史数据并将其保存到CSV文件中;histrequester演示说明了如何使用它。

实时流交易

tick流订阅实时交易数据。

Jupyter笔记本

要在Jupyter笔记本中完全交互式地使用Interactive Brokers API,请查看示例笔记本

可以使用命令jupyter notebook启动Jupyter。

此笔记本使用客户端的Qt版本,其中Qt事件循环在笔记本顶部使用%gui qt5指令启动。不需要调用客户端的run()方法。

关于在笔记本中使用asycio的注意事项

目前似乎没有一种单线程方式可以直接在Jupyter中运行asyncio事件循环。可以做到的是使用Qt事件循环(它与Jupyter内核有良好的集成)和quamash适配器。使用quamash,Qt事件循环用于驱动asyncio事件循环。这可以通过在笔记本顶部放置以下代码来实现

%gui qt5
import asyncio, quamash
loop = quamash.QEventLoop()
asyncio.set_event_loop(loop)

quamash和Jupyter结合使用时不起作用的是loop.run_until_finished方法。它可以像这样修补

def run_until_complete(self, future):
    future = asyncio.ensure_future(future)
    qApp = qt.QApplication.instance()
    while not future.done():
        qApp.processEvents(qt.QEventLoop.WaitForMoreEvents)
    return future.result()

quamash.QEventLoop.run_until_complete = run_until_complete

客户端的asyncio版本依赖于loop.run_until_finished来同步连接。因此,为了在笔记本中运行asyncio客户端,请应用修补程序或直接以异步方式连接(即,在连接调用中给出asyncConnect=True)。

更改日志

版本0.5.7

  • 为endDateTime格式化修复HistRequester

版本0.5.6

  • 更新HistRequester到API的9.73.04版本

版本0.5.5

  • 进行了一些简化

版本0.5.4

  • 客户端的connect()调用现在将默认阻塞,直到客户端准备好服务请求。

  • 为两个客户端添加了getReqId()方法。

  • 为客户端添加了dataHandlingPre()和dataHandlingPost()事件挂钩。

  • 添加了日志记录。

  • 添加了util模块。

  • 文件 tws_async.py 重命名为 twsclient.py,tws_asyncqt.py 重命名为 twsclientqt.py。

版本 0.5.3

  • client.connect() 方法添加了可选的 asyncConnect 参数。默认现在为同步连接(阻塞直到连接成功)。

  • 修复了 HistRequester 在下载每日数据时的错误。

版本 0.5.0

  • 初始 pip 包发布。

祝好运,享受编程!

作者:

Ewald de Wit <ewald.de.wit@gmail.com>

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面