2014-10-01 86 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