微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用IBrokers和R,检索多只股票的实时交易数据的合适方法是什么?

如何解决使用IBrokers和R,检索多只股票的实时交易数据的合适方法是什么?

很明显,交易者可以在实时交易时段轻松监视100股股票。

这里的代码可以检索30多个股票代码的实时数据:

tws <- twsConnect()
sym <- c("AAPL","MSFT","GOOGL","TWTR","BABA","JD","WLTW","DIA","QQQ","VOO","MOMO","IBB","VOOG","VYM","VNQ","BIDU","BA","AYX","ROKU","UBER","ACB","CRON","TTD","BAM","AZO","JPM","WMT","GRUB","TSN")
contracts <- lapply(sym,function(x) twsEquity(x,'SMART','ISLAND'))

system.time(
last_prices <-   lapply(contracts,function(x) reqmktData(tws,Contract = x,snapshot = TRUE))

这是性能指标:

2 -1 2104 Market data farm connection is OK:usfarm 
2 -1 2106 Hmds data farm connection is OK:ushmds 
2 -1 2158 Sec-def data farm connection is OK:secdefil 
   user  system elapsed 
  0.408   0.367  46.727 
Warning message:
In .Internal(gc(verbose,reset,full)) :
  closing unused connection 6 (->localhost:7496)

这显然是不可接受的。检索30余只股票的实时数据应该不需要40秒钟以上的时间。

使用quantmod :: getSymbols,此操作本质上是即时的。

我在做什么错了?

我有一个8核XEON处理器。也是最新型号之一。不可能是我的硬件。

解决方法

Ibrokers仅是单线程的。这就是为什么某些ibrokers函数会一直运行直到您中断R会话。这基本上是一个R问题,因为R(目前)是单线程的。您可以通过创建新线程来模拟这一点,因为ib可以处理这个问题,但是需要一个aslan languange,而不是R。例如,socketConnection无法处理并行(asych)请求,则需要设置一个完整的线程。每个线程的新连接。可能,但是要正确跟踪从ib返回的消息会变得更加困难。

reqMktData函数仅接受1个代码(独立于语言),并且您需要遍历代码。在其他语言中,这种速度也往往是一个问题,开销,ib服务器的速度,等待时间等等等。但是将其与您使用quantmod进行的yahoo检索相比并不完全相同。 ib方面有很多检查,就像是一条正确的消息一样,发送回的消息在显示数据之前需要进行解码。所有这些都会增加开销。

通常,您将同时请求带有reqMktData(snapshot = FALSE)的市场数据流(最多100个报价),并实时检查数据流的最新价格,但是随后您需要使用python,c#或c ++(或Java) )。另外,您还需要区分行情自动收录器,这意味着要使用requestid或其他标识信息。对于python,请参见ib_insync库。信息here

有关ib api问题的更多信息,请查看twsapi group中有关该api的最新错误/问题。 R在那里的代表不多,因为它仍在api的非常旧的版本中。还要检查stackoverflow上的interactive-brokers标签。这也可能会给您一些想法/帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。