Я пытаюсь создать Текущий Опции Цепочка (варианты за удар, за истечение) для тикера.Параллельный запрос исторические параметры цены на цепочку/Последняя известная цена в IBrokers (R)
library(IBrokers)
tws <- twsConnect()
# Lets say only Call prices
AA <- reqContractDetails(tws, twsOption(local="", right="C", symbol="AAPL"))
Native реализация с snapshot
слишком медленно:
reqMktData(tws, AA[1:2], snapshot = TRUE)
Он ждет около 11 sec
по контракту (Текущее количество договоров 626)
Другая реализация:
snapShot <- function (twsCon, eWrapper, timestamp, file, playback = 1, ...)
{
if (missing(eWrapper))
eWrapper <- eWrapper()
names(eWrapper$.Data$data) <- eWrapper$.Data$symbols
con <- twsCon[[1]]
if (inherits(twsCon, "twsPlayback")) {
sys.time <- NULL
while (TRUE) {
if (!is.null(timestamp)) {
last.time <- sys.time
sys.time <- as.POSIXct(strptime(paste(readBin(con,
character(), 2), collapse = " "), timestamp))
if (!is.null(last.time)) {
Sys.sleep((sys.time - last.time) * playback)
}
curMsg <- .Internal(readBin(con, "character",
1L, NA_integer_, TRUE, FALSE))
if (length(curMsg) < 1)
next
processMsg(curMsg, con, eWrapper, format(sys.time,
timestamp), file, ...)
}
else {
curMsg <- readBin(con, character(), 1)
if (length(curMsg) < 1)
next
processMsg(curMsg, con, eWrapper, timestamp,
file, ...)
if (curMsg == .twsIncomingMSG$REAL_TIME_BARS)
Sys.sleep(5 * playback)
}
}
}
else {
evalWithTimeout(
while (TRUE) {
socketSelect(list(con), FALSE, NULL)
curMsg <- .Internal(readBin(con, "character", 1L,
NA_integer_, TRUE, FALSE))
if (!is.null(timestamp)) {
processMsg(curMsg, con, eWrapper, format(Sys.time(),
timestamp), file, ...)
}
else {
processMsg(curMsg, con, eWrapper, timestamp,
file, ...)
}
if (!any(sapply(eWrapper$.Data$data, is.na)))
return(do.call(rbind, lapply(eWrapper$.Data$data,
as.data.frame)))
}, timeout=5, onTimeout="warning")
}
}
reqMktData(tws, AA[1:20], eventWrapper=eWrapper.data(20),CALLBACK=snapShot)
Это позволяет избежать ожидания (11 секунд).
Но это не сработает, если нет данных в реальном времени или рынки закрыты.
Итак, я хочу получить только последнюю известную цену, даже если рынки закрыты.
Это мое псевдо-решение:
reqHistoricalData(tws, AA[[1]]$contract, whatToShow='BID', barSize = "1 min", duration = "60 S")
Есть ли способ, чтобы распараллелить это решение, так что будет называть историческую цену несколько контракта?
В настоящее время он проводит около 2.3 seconds
за контракт, в то время как предыдущее решение может получить 20-30 контрактов с тем же затраченным временем.
Unfortunelty ** reqRealTimeBars ** похоже, испытывает ту же проблему, что и ** reqMktData() ** Насколько я могу видеть ответ, если он предоставляется при закрытии рынков. Хотя, я бы хотел, чтобы он сообщал последнюю известную цену, если рынки не открыты. – Jav
Вы пробовали использовать useRTH? reqHistoricalData (tws, AA [[1]] $ contract, whatToShow = 'BID', barSize = "1 min", duration = "60 S", useRTH = 0) –