我正在尝试使用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小时的数据仍然很不错。
答案 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:
我签入了curl
和openssl
(在rgdax
中导入的两个包),并且parse_response
不是名称空间,也不是{ {1}}。我怀疑这是未导出的rgdax
方法。
更新2:
怀疑,rgdax
是non-exported method of parse_response
。在方法内部,线
rgdax
应该处理我猜想的查询参数。但是,找不到方法url <- modify_url(api.url, path = path, query = query)
。可能会产生标准的查询参数。