很抱歉,非彭博用户无法复制此示例。
对于其他人,我正在使用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.
当然,这是行不通的,因为我真的不知道如何在流数据上使用索引。 $
运算符似乎可以按名称检索数据点-就像我对BID
和ASK
所做的一样-但我无法找到一种方法来找出哪个值引用了{{ 1}}或securities[1]
。似乎我得到了一串彼此无法区分的数字值,因为我无法在证券之间检索该值的所有权。
在securities[2]
上使用索引会引发相同的错误。
答案 0 :(得分: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))
})
结果
答案 1 :(得分: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。可以使用subscription的FUN参数直接处理或存储数据。