显然,交易员可以很容易地在一个实时交易时段监控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处理器。也是最新的型号之一。不可能是我的硬件。
发布于 2020-09-01 18:17:04
Ibrokers仅是单线程的。这就是为什么有些ibrokers函数会一直运行,直到您中断R会话。这基本上是一个R问题,因为R(目前)是单线程的。您可以通过创建新线程来模拟这一点,因为ib可以处理此问题,但这需要异步语言,而不是R。例如,socketConnection不能处理并行(asych)请求,您需要为每个线程设置一个完整的新连接。这是可能的,但是随后正确地跟踪从ib返回的消息变得更加困难。
reqMktData函数只接受1个滚动条(独立于语言),您需要循环遍历这些滚动条。在其他语言中,这往往也是一个问题,开销,ib服务器的速度,延迟等等,但将其与您使用quantmod进行的yahoo检索进行比较并不完全相同。在ib端有很多检查,比如它是否是一条正确的消息,在显示数据之前,发回的消息需要解码。所有这些都增加了开销。
通常情况下,你会同时请求多达100个报价器的快照( reqMktData = FALSE)的市场数据流,并实时检查数据流的最新价格,但随后你需要使用python、c#或c++ (或java)。此外,您还需要区分不同的报价器,这意味着使用请求或其他识别信息。有关python,请参阅ib_insync库。Info here。
有关ib问题的更多信息,请查看twsapi group,了解有关该api的最新错误/问题。R没有太多表示,因为这仍然是在一个非常旧的api版本上。还要检查stackoverflow上的interactive-brokers标签。这也可能会给你一些想法/帮助。
https://stackoverflow.com/questions/63680283
复制相似问题