R中的IBrokers twsFOP呼叫 [英] IBrokers twsFOP call in R

查看:117
本文介绍了R中的IBrokers twsFOP呼叫的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试从IB获取以下数据(纳斯达克100 e-mini期货期权数据).我正在使用snapShot回调(包括在下面).有人可以告诉我我的代码有什么问题吗?

I'm trying to get the following to pull some data from IB (Nasdaq 100 e-mini futures options data). I am using the snapShot callback (included below). Could someone 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)

谢谢.我在网上搜索了很多内容,除了关于twsFuture的CRAN文档外,几乎没有关于twsFOP的文档.快照调用如下:

Thanks a bunch. I've searched high and low online and found little documentation on twsFOP, besides the CRAN documentation which points to twsFuture. Snapshot call included 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)))
    }
  }
}

推荐答案

在价格更新之前,该函数将不会返回.

The function is not going to return until there is a price update.

如果我将仪器更改为将来的仪器,它就可以正常工作.

If I change the instrument to a future, it works just 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

您的FOP工具似乎有效,因为您可以致电reqContractDetails(tws, test3),并取回所有合同详细信息.

Your FOP instrument appears to be valid because you can call reqContractDetails(tws, test3) and you get back all the contract details.

最后,将市场数据电话与FOP合约一起使用似乎也是正确的.我可以使用您的代码连接到市场数据场...

Finally, using the market data call with the FOP contract looks like it is correct as well. I'm able to 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 until there is a price update.

如果想要最新价格而不等待更新,则可以使用reqHistoricalData将其拉出,当前时间为endDateTime.如果您需要有关买入,卖出和交易的数据,那么您必须提出3个单独的请求.这是从历史数据服务中获取最后一笔交易的方法

If you want the last price without waiting for an update, you can pull it using reqHistoricalData, with the current time as the endDateTime. If you want data for the Bid, Ask, and Trades, then you have to make 3 separate requests. Here's how to get the last 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

您需要使用whatToShow="BID"whatToShow="ASK"来获取买价和卖价数据.

You'd need to use whatToShow="BID" and whatToShow="ASK" to get Bid and Ask data.

这篇关于R中的IBrokers twsFOP呼叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆