![](/img/trans.png)
[英]Using IBrokers and R, what is the appropriate way to retrieve last traded price during live trading session?
[英]Using IBrokers and R, what is the appropriate way to retrieve live trading data for multiple stocks?
顯然,交易者可以在實時交易 session 中輕松監控 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 處理器。 也是最新型號之一。 不可能是我的硬件。
Ibrokers 只是單線程的。 這就是為什么一些 ibrokers 函數會一直運行,直到您中斷 R session。這基本上是一個 R 問題,因為 R(目前)是單線程的。 你可以通過創建新線程來模擬這個,因為 ib 可以處理這個,但這需要一個異步語言,而不是 R。例如,socketConnection 不能處理並行(asych)請求,你需要設置一個完整的每個線程的新連接。 可能,但隨后正確跟蹤從 ib 返回的消息變得更加困難。
reqMktData function 僅接受 1 個自動收報機(與語言無關),您需要遍歷自動收報機。 這種速度在其他語言中也往往是一個問題,開銷、ib 服務器的速度、延遲等等等等。但是將它與您使用 quantmod 進行的雅虎檢索進行比較並不完全相同。 在 ib 端進行了很多檢查,比如它是否是一條正確的消息,發送回的消息需要在顯示數據之前進行解碼。 所有這些都會增加開銷。
通常情況下,您會使用 reqMktData (snapshot = FALSE) 同時請求最多 100 個代碼的市場數據流,並實時查看 stream 的最新價格,但隨后您需要使用 python、c# 或 c++(或 java)。 此外,您還需要區分代碼,這意味着使用 requestids 或其他識別信息。 對於 python,請參閱 ib_insync 庫。 信息在這里。
有關 ib api 問題的更多信息,請查看twsapi 組以了解有關 api 的最新錯誤/問題。R 在那里沒有太多代表,因為它仍然是 api 的一個非常舊的版本。還要檢查 stackoverflow 上的interactive-brokers標簽。 這也可能會給您一些想法/幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.