IBrokers twsFOP calls R

I am trying to get the following to pull some data from IB (Nasdaq 100 e-mini futures options data). I am using snapShot callback (see below). Can anyone tell me what is wrong with my code?

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)

      

Thanks a bunch. I searched high and low online and found little documentation on twsFOP apart from CRAN documentation which points to twsFuture. The snapshot call is given below:

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)))
    }
  }
}

      

+2


source to share


1 answer


The feature will not return until a price update is available.

If I change the tool for the future, it works fine.

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

      

Your FOP will be valid as you can recall reqContractDetails(tws, test3)

and return all contract details.

Finally, using a market data call with an FOP contract looks just as correct. I can connect to the market data farm using your code ...

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 

      



Now we just need to wait for the price update to appear.


If you want to get the latest price without waiting for an update, you can pull it out with reqHistoricalData

, with the current time like endDateTime

. If you need data for Bid, Ask and Trades, you must make 3 separate requests. Here's how to get the latest trade from the historical data service

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

      

You need to use whatToShow="BID"

and whatToShow="ASK"

to get Bid and Ask data.

+2


source







All Articles