【问题标题】:Retrieving complete price history for a product (i.e. BTC-USD) [closed]检索产品的完整价格历史记录(即 BTC-USD)[关闭]
【发布时间】:2022-01-06 22:56:03
【问题描述】:

上下文

假设我想使用以下 C# nuget 包检索比特币的完整价格历史记录:

https://github.com/bchavez/Coinbase.Pro

这是我正在采取的方法:

using System.IO;
using System.Text.Json;
using Coinbase.Pro;
using Coinbase.Pro.Models;

var api_key = File.ReadAllText(
    Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), 
        "coinbase-pro-api-key"), 
    System.Text.Encoding.UTF8);

var api_secret = File.ReadAllText(
    Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), 
        "coinbase-pro-api-secret"), 
    System.Text.Encoding.UTF8);

var api_passphrase = File.ReadAllText(
    Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), 
        "coinbase-pro-api-passphrase"), 
    System.Text.Encoding.UTF8);

var client = new CoinbaseProClient(new Config() 
{
    ApiKey = api_key,
    Secret = api_secret,
    Passphrase = api_passphrase
});

List<Candle> GetData(string product_id)
{
    var path = String.Format("{0}.json", product_id);

    if (File.Exists(path))
    {
        Console.WriteLine("Loading from file {0}", path);
        
        return JsonSerializer.Deserialize<List<Candle>>(File.ReadAllText(path));
    }
    else
    {
        Console.WriteLine("Downloading");

        var b = DateTime.Today;
        var a = b - TimeSpan.FromDays(290);
        
        var ls = new List<Candle>();
        
        while (true)
        {
            Console.WriteLine("Retrieving from {0:yyyy-MM-dd} to {1:yyyy-MM-dd}", a, b);
        
            var result = client.MarketData.GetHistoricRatesAsync(product_id, a, b, 86400).Result;
        
            if (result.Count() > 0)
            {
                ls.AddRange(result);
        
                b = a;
                a = b - TimeSpan.FromDays(290);
            }
            else
            {
                break;
            }
        }

        var ls_ordered = ls.OrderBy(candle => candle.Time);
        
        var json = JsonSerializer.Serialize(ls_ordered);

        File.WriteAllTextAsync(path, json).Wait();

        return ls_ordered.ToList();
    }
}

鉴于该代码,我可以使用以下内容检索比特币的价格历史记录:

var data = GetData("BTC-USD");

.NET 交互中返回的数据如下所示:

说明

GetData 函数将获取给定产品 ID 的最近 290 天的价格数据。如果找到数据,它会询问前一组 290 天。它一直持续到 API 没有返回价格范围的数据。

然后它将数据序列化到一个文件中。以后对 GetData 的调用将返回文件中的数据,而不是进行 API 调用。

问题

是否有更好或更有效的方法来获取给定产品的整个价格历史记录?

注意事项

这是演示该方法的完整 C# 笔记本:

https://github.com/dharmatech/coinbase-pro-bchavez-price-history/blob/master/coinbase-pro-bchavez-price-history.ipynb

此处提供了演示笔记本的视频:

https://www.youtube.com/watch?v=Xl5vx9XFKyo

【问题讨论】:

  • 对我来说看起来不错,290 天看起来是一个合理的批量大小。我会将历史记录存储在 SQL 数据库中。
  • 是的,我认为存储在数据库中对于更大的应用程序来说是件好事。只是想要一个简单的工作示例来演示该方法以及在小型笔记本示例中运行良好的东西。
  • CB 建议为您要跟踪的产品订阅 websocket 并保存数据以获得完整的历史记录。

标签: c# coinbase-api


【解决方案1】:

是否有更好或更有效的方法来获取给定产品的整个价格历史记录?

看起来你有一个获取历史记录的解决方案。将其保存在本地将防止您每次需要时都必须获取它。既然您有历史记录并且需要维持当前价格...来自:getCandles docs

历史汇率数据可能不完整。对于没有刻度的区间,不会发布任何数据。不应经常轮询历史汇率。如果您需要实时信息,请使用交易和预订端点以及 websocket 提要。

【讨论】:

  • 嘿特拉维斯。所以我已经能够获得 Kraken 交易所的完整交易历史。我在这两篇文章中谈到了我的方法。 linklink
  • 也许有一天 Coinbase 会提供一个类似的 CSV,其中包含他们的交易历史。
猜你喜欢
  • 2015-10-08
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多