2014-10-01 54 views
2

我试图从IB(纳斯达克100电子迷你期货期权数据)中获取一些数据。我正在使用snapShot回调(下面包含)。有人能告诉我我的代码有什么问题吗?IBrokers twsF 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上发现了很少的文档,除了指向twsFuture的CRAN文档。快照电话如下:

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 2014-10-01 23:46:40

+0

看起来很对我。我[实现了完全相同的功能](https://r-forge.r-project.org/scm/viewvc.php/pkg/twsInstrument/R/get_quote.R?view=markup&root=twsinstrument),我知道它的作品期货,期权,股票和外汇(我还没有试过FOP)。当我运行你的代码时,我可以连接到市场数据场。在市场出现价格变化之前,您不会获得任何数据。 – GSee 2014-10-02 00:09:40

回答

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 

你的FOP工具似乎是有效的,因为你可以打电话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。如果您需要出价,询问和交易的数据,那么您必须提出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"获得买入价和卖出数据得到的最后一笔交易。

+0

谢谢大家的帮助。在不等待新的价格更新的情况下,是否有可能获得最后的价格或更好的当前出价或要价? – jd8585 2014-10-02 01:24:43

+0

@ jd8585不是。你可以'reqHistoricalData'。我会更新答案。 – GSee 2014-10-02 01:33:53