【发布时间】: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# 笔记本:
此处提供了演示笔记本的视频:
【问题讨论】:
-
对我来说看起来不错,290 天看起来是一个合理的批量大小。我会将历史记录存储在 SQL 数据库中。
-
是的,我认为存储在数据库中对于更大的应用程序来说是件好事。只是想要一个简单的工作示例来演示该方法以及在小型笔记本示例中运行良好的东西。
-
CB 建议为您要跟踪的产品订阅 websocket 并保存数据以获得完整的历史记录。
标签: c# coinbase-api