rgdax(coinbase)数据未按预期收集数据

时间:2019-01-23 21:39:17

标签: r

我正在尝试使用R的rgdax包下载一些历史价格。

我设置了API密钥等,并尝试在过去24小时内加载:

start <- strftime(Sys.time(), "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")
end <- strftime(Sys.time(), "%Y-%m-%dT%H:%M:%SZ", tz = "UTC") 

df <- public_candles(product_id = "ETH-EUR", granularity = 300, start = start, end = end)

但是这会加载“太多”的数据。

我想要最后24小时的数据,但它的负载量要比这多一点。

Head()
                   time    low   high   open  close volume
329 2019-01-22 16:25:00 104.09 104.12 104.09 104.09  16.03
328 2019-01-22 16:30:00 104.11 104.14 104.12 104.13  21.61
327 2019-01-22 16:35:00 103.88 104.12 104.10 103.97 161.35
326 2019-01-22 16:40:00 103.96 103.97 103.96 103.97  26.59
325 2019-01-22 16:45:00 103.97 104.20 103.97 104.19  48.57
324 2019-01-22 16:50:00 104.19 104.36 104.20 104.36  45.40

Tail()

                 time    low   high   open  close volume
6 2019-01-23 21:05:00 101.34 101.64 101.64 101.41  42.93
5 2019-01-23 21:10:00 101.42 101.58 101.42 101.54  24.03
4 2019-01-23 21:15:00 101.54 101.64 101.54 101.64  37.73
3 2019-01-23 21:20:00 101.60 101.68 101.60 101.61  35.97
2 2019-01-23 21:25:00 101.59 101.66 101.66 101.59  30.99
1 2019-01-23 21:30:00 101.59 101.62 101.60 101.59  12.91

我希望数据比Sys.time()早24小时开始-即2019-01-22 21:30:00而不是2019-01-22 16:50:00,或者比tail()中的最后一次观察早24小时

当我尝试以下操作(从86400秒(24小时之前)开始)时。

start <- strftime(Sys.time() - 86400, "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")
end <- strftime(Sys.time(), "%Y-%m-%dT%H:%M:%SZ", tz = "UTC") 

什么都没有改变。

文档指出(第11页)所需要的时间:

start Optional parameter. Start time in ISO 8601
end Optional parameter. End time in ISO 8601

我以这种格式输入(如果我输入错了,请纠正我)

文档: https://cran.r-project.org/web/packages/rgdax/rgdax.pdf

编辑:

以下内容似乎可以过滤数据,这样我才有24小时可用的od数据

x <- df %>%
  tbl_time(index = time) %>%
  filter(time > Sys.time() - 86400 - 288 * 3)

head(x , 1)
tail(x, 1)

但是我现在只有265个5分钟的时间。 24小时内有288个5分钟的时段。 直接从平台直接下载24小时的数据仍然很不错。

1 个答案:

答案 0 :(得分:2)

我相信问题出在rgdax::public_candles的请求中(如果我没有记错的话,它会使用curl)。

前奏

设置

以下是一些变量,将在以下内容中使用

# your variables
start <- strftime(Sys.time() - 86400, "%Y-%m-%dT%H:%M:%SZ", tz = "UTC")
end <- strftime(Sys.time(), "%Y-%m-%dT%H:%M:%SZ", tz = "UTC") 
product_id = "ETH-EUR"
granularity = 300
# request url
req.url <- paste0("https://api.pro.coinbase.com/products/", product_id, "/candles")

问题

现在,问题表明我可以使用rgdax::public_candles进行复制,也可以仅使用jsonlite并直接通过url访问数据

# fetching the data ourselves
res <- jsonlite::fromJSON(req.url)
res <- as.data.frame(res)
# checking the dates
res[['V1']] <- as.POSIXct(.subset2(res,1L), origin="1970-01-01")
c(min(res$V1),max(res$V1))
# [1] "2019-01-23 18:54:00 CET" "2019-01-24 00:42:00 CET"           # Problem still here

解决方案

这是一种解决方案,我们基本上可以自己制定GET请求,并确保指定查询参数

# fetching the data ourselves - the return
res <- httr::GET(url = req.url, 
                 query = list(start = start, end = end, 
                              granularity = granularity))
res <- as.data.frame(t(matrix(unlist(httr::content(res)), nrow = 6)))
res[['V1']] <- as.POSIXct(.subset2(res,1L), origin="1970-01-01")
c(min(res$V1),max(res$V1)) 
# [1] "2019-01-23 00:40:00 CET" "2019-01-24 00:40:00 CET"           # Problem solved

评论

只需在控制台中执行rgdax::public_candles,我们就可以洞悉问题可能出在哪里。我的看法是,问题应该在那一行

content <- parse_response(path = req.url, query = list(start = start, 
                          end = end, granularity = granularity))

我不知道函数parse_response,并且没有进一步研究,但是它似乎无法提供查询参数。

更新1:

我签入了curlopenssl(在rgdax中导入的两个包),并且parse_response不是名称空间,也不是{ {1}}。我怀疑这是未导出的rgdax方法。

更新2:

怀疑,rgdaxnon-exported method of parse_response。在方法内部,线

rgdax

应该处理我猜想的查询参数。但是,找不到方法url <- modify_url(api.url, path = path, query = query) 。可能会产生标准的查询参数。