1

很抱歉,非彭博用户的人无法复制此示例。

对于其他人,我正在使用Rblpapi及其subscribe功能。我想创建一个数据框、矩阵或数组之类的东西,并用订阅流式传输的值填充它。

假设您的 BBComm 组件已启动并正在运行,我的示例说:

require(Rblpapi)
con <- blpConnect()
securities <- c('SX5E 07/20/18 C3400 Index',
            'SX5E 07/20/18 C3450 Index',
            'SX5E 07/20/18 C3500 Index')

我想用这些字段填充一个 3 x 2 矩阵:

fields <- c('BID', 'ASK')

我想我可以创建一个这样的矩阵,几乎没有性能开销:

mat <- matrix(data = NA,
          nrow = 3,
          ncol = 2)

现在我使用subscribe和它的参数fun来填充目的,所以像这样(虽然看起来很难看并且可能效率低下):

i <- 1
subscribe(securities = securities,
          fields = fields,
          fun = function(x){
            if (i > length(securities))
              i <<- 1
            tryCatch(
              expr = {
                mat[i, 1] <<- x$data$BID
                mat[i, 2] <<- x$data$ASK
                i <<- i + 1
              },
              error = function(e){
                message(e)
              },
              finally = {}
              )
          })

结果:

Error in subscribe_Impl(con, securities, fields, fun, options, identity) : 
  Evaluation error: number of items to replace is not a multiple of replacement length.

当然,这不起作用,因为我真的不知道如何对流数据使用索引。$运算符似乎可以按名称检索数据点 - 就像我对BIDand所做的那样ASK- 但我无法找到一种方法来确定哪些值指的是,比如说,securities[1]securities[2]. 似乎我得到了一个彼此无法区分的数值流,因为我无法检索证券中价值的所有权。

使用索引x$data$BID[1]会引发相同的错误。

4

2 回答 2

2

好的,您的代码看起来不错,唯一不起作用的是x$data$BID,更改为x$data["BID"]然后您可以存储它,我正在使用您的代码,这是我的结果。

     fields=c("TIME","LAST_PRICE", "BID", "ASK")
     blpConnect()
     blpConnect()
     i <- 1

    subscribe(securities = securities,
    fields = fields,"interval=60",
      fun = function(x){
        if (i > length(securities))
          i <<- 1
        tryCatch(
          expr = {
            tim <- x$data["TIME"]
            last <<- x$data["LAST_PRICE"]
            ask <<- x$data["ASK"]
            bid <<- x$data["BID"]
            i <<- i + 1
          },
          error = function(e){
            message(e)
          },
          finally = {}
        )
        print(cbind(tim$TIME,last$LAST_PRICE,ask$ASK, bid$BID))
      })

结果

于 2018-07-24T16:36:12.900 回答
1

从函数中查看结果对象的一个​​好方法subscribe是:

subscribe(securities=c("AAPL US Equity"),
          fields=c("LAST_PRICE"),
          fun=function(x) print(str(x)))

从那里你可以进入数据:

subscribe(securities=c("AAPL US Equity", "INTC US Equity"),
          fields=c("LAST_PRICE","BID","ASK"),
          fun=function(x) {
            if (!is.null(x$data$MKTDATA_EVENT_TYPE) && x$data$MKTDATA_EVENT_TYPE == "TRADE" && exists("LAST_PRICE", where = x$data)) {
              print(data.frame(Ticker = x$topic, DateTime = x$data$TRADE_UPDATE_STAMP_RT, Trade = x$data$LAST_PRICE))
            }
          })

我只在这里打印了data.frame。可以使用 subscribe 的 FUN 参数直接处理或存储数据。

于 2019-07-17T14:20:42.293 回答