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)))
}
}
}
source to share
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.
source to share