0

Я пытаюсь создать Текущий Опции Цепочка (варианты за удар, за истечение) для тикера.Параллельный запрос исторические параметры цены на цепочку/Последняя известная цена в 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 контрактов с тем же затраченным временем.

ответ

0

Вместо использования reqMktData(), рассмотреть возможность использования reqRealTimeBars() с переменной, содержащей список контрактов, чтобы делать то, что вы хотите без ограничений reqHistoricalData().

Бары реального времени - это запрос для потоковой передачи исторических данных, данные передаются обратно с тех же серверов, которые предоставляют исторические данные.

+0

Unfortunelty ** reqRealTimeBars ** похоже, испытывает ту же проблему, что и ** reqMktData() ** Насколько я могу видеть ответ, если он предоставляется при закрытии рынков. Хотя, я бы хотел, чтобы он сообщал последнюю известную цену, если рынки не открыты. – Jav

+0

Вы пробовали использовать useRTH? reqHistoricalData (tws, AA [[1]] $ contract, whatToShow = 'BID', barSize = "1 min", duration = "60 S", useRTH = 0) –