2013-02-26 16 views
5

मैं आईबी से "अंतिम" कीमतें प्राप्त करने के लिए महान आईब्राकर पैकेज से एक संशोधित स्नैपशॉट फ़ंक्शन का उपयोग कर रहा हूं और यह तरल स्टॉक के लिए बहुत अच्छा काम कर रहा है। मैं जो कॉल करता हूं वह उदाहरण है।आईबीआरोकर्स reqMktData, कॉलबैक फ़ंक्शन में टाइमआउट कैसे जोड़ें?

reqMktData(tws, twsSTK("AAPL"), eventWrapper=eWrapper.data.Last(1),CALLBACK=snapShot) 

समस्या बहुत उभरती हुई स्टॉक या विकल्पों को पुनर्प्राप्त करने का प्रयास करते समय उत्पन्न होती है। इसलिए मुझे स्नैपशॉट फ़ंक्शन में टाइमआउट जोड़ने की आवश्यकता होगी। टाइमआउट कैसे और कहाँ जोड़ा जा सकता है?

स्नैपशॉट समारोह के साथ कोड:

library(IBrokers) 
tws <- twsConnect() 

eWrapper.data.Last <- function(n) { 
    eW <- eWrapper(NULL) # use basic template 
    eW$assign.Data("data", rep(list(structure(.xts(matrix(rep(NA_real_,2),nc=2),0), 
             .Dimnames=list(NULL,c("LastSize","Last")))),n)) 

    eW$tickPrice <- function(curMsg, msg, timestamp, file, ...) 
    { 
    tickType = msg[3] 
    msg <- as.numeric(msg) 
    id <- msg[2] #as.numeric(msg[2]) 
    data <- eW$get.Data("data") #[[1]] # list position of symbol (by id == msg[2]) 
    attr(data[[id]],"index") <- as.numeric(Sys.time()) 
    nr.data <- NROW(data[[id]]) 
    if(tickType == .twsTickType$LAST) { 
     data[[id]][nr.data,2] <- msg[4] 
    } 
    eW$assign.Data("data", data) 
    c(curMsg, msg) 
    } 
    eW$tickSize <- function(curMsg, msg, timestamp, file, ...) 
    { 
    data <- eW$get.Data("data") 
    tickType = msg[3] 
    msg <- as.numeric(msg) 
    id <- as.numeric(msg[2]) 
    attr(data[[id]],"index") <- as.numeric(Sys.time()) 
    nr.data <- NROW(data[[id]]) 
    if(tickType == .twsTickType$LAST_SIZE) { 
     data[[id]][nr.data,1] <- msg[4] 
    } 
    eW$assign.Data("data", data) 
    c(curMsg, msg) 
    } 
    return(eW) 
} 

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

है कि [इस पोस्ट] से स्नैपशॉट समारोह (http://www.mail-archive.com/[email protected]/msg00927.html)? – GSee

+0

हाँ! लेकिन कॉलम नाम – nikke

+0

सूरी को सही किया, वास्तव में यह वहां से भिन्नता थी जो केवल "अंतिम" प्राप्त करती है: http://marc.info/?l=r-sig-finance&m=131662968112461 लेकिन कॉलम नामों के साथ – nikke

उत्तर

4

आप R.utils से evalWithTimeout उपयोग कर सकते हैं। मैंने इसका परीक्षण नहीं किया, लेकिन मुझे यकीन है कि evalWithTimeout लपेटने के दौरान मुझे यकीन है कि लूप आपके द्वारा प्राप्त किए जाने वाले कार्यों को प्राप्त करेगा।

library(R.utils) 

evalWithTimeout(
    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))) 
    }, timeout=5, onTimeout="warning") 
+0

हाय बदल गया! धन्यवाद! उस सरल और सुरुचिपूर्ण समाधान के बारे में सोचा नहीं था। आपने शायद देखा है कि मैंने पोस्ट किए गए कोड का मूल भाग मेलिंग सूची से भी था, आपके द्वारा भी :) – nikke

+0

दरअसल, जिस पोस्ट से मैंने लिंक किया था वह जेफ द्वारा था .. – GSee

+0

यह वास्तव में वहां से भिन्नता थी जो केवल "अंतिम" प्राप्त करता है: marc.info/?l=r-sig-finance&m=131662968112461 लेकिन कॉलम नाम बदल गए – nikke

संबंधित मुद्दे