2014-10-01 2 views
2

Я пытаюсь получить следующее, чтобы вытащить некоторые данные из IB (данные опций фьючерсов Nasdaq 100 e-mini). Я использую обратный вызов snapShot (см. Ниже). Может ли кто-нибудь сказать мне, что не так с моим кодом?IBrokers twsFOP call in R

require(IBrokers) 
tws <- twsConnect() 
test3<- twsFOP("NQ","GLOBEX",expiry="20141121",strike="4000",right="C") 
test4 <- reqMktData(tws, test3, eventWrapper=eWrapper.data(length(1)),CALLBACK=snapShot) 

Спасибо, кучка. Я искал высоко и низко онлайн и нашел небольшую документацию по twsFOP, кроме документации CRAN, которая указывает на twsFuture. Заключительный звонок, указанный ниже:

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 { 
    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))) 
    } 
    } 
} 
+1

Что происходит, когда вы пытаетесь запустить? – DMT

+0

Похоже на меня. Я [реализовал эту ту же функцию] (https://r-forge.r-project.org/scm/viewvc.php/pkg/twsInstrument/R/get_quote.R?view=markup&root=twsinstrument), и я знаю, что он работает для фьючерсов, опционов, акций и FX (я не пробовал FOP). Когда я запускаю свой код, я могу подключиться к ферме рыночных данных. Вы не собираетесь получать данные до тех пор, пока на рынке не произойдет изменение цены. – GSee

ответ

2

Функция не вернется, пока не появится обновление цены.

Если я сменил инструмент на будущее, он будет работать нормально.

test3<- twsFUT("NQ","GLOBEX",expiry="20141219") 
test4 <- reqMktData(tws, test3, eventWrapper=eWrapper.data(length(1)),CALLBACK=snapShot) 
test4 
#  BidSize BidPrice AskPrice AskSize Last LastSize Volume 
#NQZ4  14  3984 3984.25  1 3984.25  11 1702 

Ваш ФОП инструмент оказывается справедливым, потому что вы можете позвонить reqContractDetails(tws, test3), и вы получите обратно все детали контракта.

И, наконец, использование рыночных данных с контрактом FOP выглядит так же корректно. Я могу подключиться к ферме рыночных данных, используя ваш код ...

test3<- twsFOP("NQ","GLOBEX",expiry="20141121",strike="4000",right="C") 
reqMktData(tws, test3, eventWrapper=eWrapper.data(length(1)),CALLBACK=snapShot) 
#2 -1 2104 Market data farm connection is OK:usfuture 
#2 -1 2106 HMDS data farm connection is OK:ushmds.us 
#2 -1 2107 HMDS data farm connection is inactive but should be available upon demand.cashhmds 
#2 -1 2106 HMDS data farm connection is OK:ushmds 

Теперь нам просто нужно подождать, пока не появится обновление цены.


Если вы хотите последнюю цену не дожидаясь обновления, вы можете вытащить его с помощью reqHistoricalData, с текущим временем, как endDateTime. Если вам нужны данные для Bid, Ask и Trades, вы должны сделать 3 отдельных запроса. Вот как получить последнюю сделку с исторической службы данных

dat <- reqHistoricalData(tws, test3, 
        endDateTime=paste(format(Sys.time(), "%Y%m%d %H:%M:%S")), 
        barSize="1 min", 
        duration="5 D", useRTH=0, whatToShow="TRADES") 
#waiting for TWS reply on NQ .... done. 
last(dat) 
#     NQX4 C4000.Open NQX4 C4000.High NQX4 C4000.Low NQX4 C4000.Close NQX4 C4000.Volume NQX4 C4000.WAP 
2014-10-01 16:14:00   101.75   101.75   101.75   101.75     0   101.75 
        NQX4 C4000.hasGaps NQX4 C4000.Count 
2014-10-01 16:14:00     0    0 

Вы должны были бы использовать whatToShow="BID" и whatToShow="ASK" получить Bid и Ask данные.

+0

Спасибо всем за помощь. Возможно ли получить последнюю цену или лучше, текущую цену или цену, не дожидаясь нового обновления цены? – jd8585

+0

@ jd8585 Не совсем. Вы можете 'reqHistoricalData'. Я обновлю ответ. – GSee