0

显然,交易者可以在实时交易时段轻松监控 100 支股票。

这是仅检索 30 多个股票代码的实时数据的代码:

tws <- twsConnect()
sym <- c("AAPL", "MSFT", "GOOGL", "TWTR", "MSFT", "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 处理器。也是最新款之一。不可能是我的硬件。

4

1 回答 1

0

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

reqMktData 函数只接受 1 个代码(独立于语言),您需要遍历代码。这个速度在其他语言中也往往是一个问题,开销、ib 服务器的速度、延迟等等等。但是将它与你正在使用 quantmod 进行的 yahoo 检索进行比较并不完全相同。在 ib 端进行了很多检查,比如它是否是一条正确的消息,并且在向您显示数据之前需要对被发送回的消息进行解码。所有这些都增加了开销。

通常,您会同时请求多达 100 个代码的 reqMktData (snapshot = FALSE) 市场数据流,并实时检查流以获取最新价格,但随后您需要使用 python、c# 或 c++(或 java)。此外,您还需要区分代码,这意味着使用 requestid 或其他识别信息。对于 python,请参见 ib_insync 库。信息在这里

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

于 2020-09-01T10:17:03.630 回答