名称:获取加密货币价格 描述:获取当前和历史加密货币价格,并计算常见时间窗口内的 ATH 或 ATL。
获取加密货币价格(最小指南)
此简短指南展示了如何使用 CoinGecko、Binance 和 Coinbase 的公共 API 获取当前价格和至少3个月的过去价格行动。它还展示了如何计算时间窗口内的 ATH(最高价)和 ATL(最低价):1 天、1 周、1 个月。
快速笔记
- 时间戳:许多 API 返回自纪元以来的毫秒数(ms)或秒数(s)。保持一致转换。
- 速率限制:尊重交易所速率限制;尽可能缓存响应。
- 符号:使用规范对符号(例如,Binance 上的
BTCUSDT,CoinGecko 上的bitcoin)。
1) CoinGecko(推荐用于简单历史范围)
- 当前价格(curl):
curl "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd"
- 过去 90 天(价格历史):
curl "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=90"
响应包含 prices 数组:[[timestamp_ms, price], …]。
Node.js: 获取 90 天并计算 1d/7d/30d 窗口的 ATH/ATL。
async function fetchCoinGeckoPrices(coinId = 'bitcoin', vs = 'usd', days = 90) {
const url = `https://api.coingecko.com/api/v3/coins/${coinId}/market_chart`;
const res = await fetch(`${url}?vs_currency=${vs}&days=${days}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data.prices; // array of [ts_ms, price]
}
function maxMinInWindow(prices, sinceMs) {
const window = prices.filter(([ts]) => ts >= sinceMs).map(([, p]) => p);
if (window.length === 0) return [null, null];
return [Math.max(...window), Math.min(...window)];
}
const prices = await fetchCoinGeckoPrices('bitcoin', 'usd', 90);
const nowMs = Date.now();
const windows = {
'1d': nowMs - 24 * 3600 * 1000,
'1w': nowMs - 7 * 24 * 3600 * 1000,
'1m': nowMs - 30 * 24 * 3600 * 1000,
};
for (const [name, since] of Object.entries(windows)) {
const [ath, atl] = maxMinInWindow(prices, since);
console.log(name, 'ATH:', ath, 'ATL:', atl);
}
笔记:CoinGecko 返回采样点(通常每小时)— 适用于这些窗口。
2) Binance(交易所级数据)
- 当前价格(curl):
curl "https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT"
- 历史 klines(蜡烛图):使用
klines端点。例如:获取过去 1000 天的日蜡烛图或小时蜡烛图以获取更精细的分辨率。
# BTCUSDT 的日蜡烛图(限制最多 1000 行)
curl "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=1000"
每个 kline 行:[openTime, open, high, low, close, …] 其中 openTime 是 ms。
Node.js: 获取过去 90 天的小时 klines 并计算 ATH/ATL 窗口。
async function fetchBinanceKlines(symbol = 'BTCUSDT', interval = '1h', limit = 1000) {
const url = 'https://api.binance.com/api/v3/klines';
const params = new URLSearchParams({ symbol, interval, limit: String(limit) });
const res = await fetch(`${url}?${params}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json(); // array of arrays
}
// 覆盖约 90 天小时:24*90 = 2160 行 -> 使用不同的 startTime 调用两次或使用 4h 间隔
const klines = await fetchBinanceKlines('BTCUSDT', '1h', 1000);
// 对于超过 1000 行,您需要使用 ms 时间戳循环使用 startTime。
// 转换为 [ts_ms, high, low] 列表
const data = klines.map(row => [row[0], parseFloat(row[2]), parseFloat(row[3])]);
const nowMs = Date.now();
function athAtlFromKlines(data, sinceMs) {
const filtered = data.filter(([ts]) => ts >= sinceMs);
if (filtered.length === 0) return [null, null];
const highs = filtered.map(([, h]) => h);
const lows = filtered.map(([, , l]) => l);
return [Math.max(...highs), Math.min(...lows)];
}
const windows = {
'1d': nowMs - 24 * 3600 * 1000,
'1w': nowMs - 7 * 24 * 3600 * 1000,
'1m': nowMs - 30 * 24 * 3600 * 1000,
};
for (const [name, since] of Object.entries(windows)) {
const [ath, atl] = athAtlFromKlines(data, since);
console.log(name, 'ATH:', ath, 'ATL:', atl);
}
笔记:Binance limit 每请求最多 1000;对于完整的 90 天小时,通过 startTime 分页。
3) Coinbase(公共示例)
- 当前现货价格(curl):
curl "https://api.coinbase.com/v2/prices/BTC-USD/spot"
- 历史蜡烛图(Coinbase Exchange API):
curl "https://api.exchange.coinbase.com/products/BTC-USD/candles?granularity=3600&start=2025-11-01T00:00:00Z&end=2026-02-01T00:00:00Z"
响应:数组 [time, low, high, open, close, volume]。使用类似的时间戳过滤来计算 ATH/ATL。
4) 计算时间框架的 ATH / ATL(1 天、1 周、1 个月)
通用步骤(适用于任何提供时间戳价格或 OHLC 蜡烛图的数据源):
- 获取覆盖至少所需窗口的历史点(例如,过去 90 天)。
- 选择窗口开始时间戳(现在 - 窗口_秒数)。
- 过滤时间戳 >= 窗口开始的点。
- 如果您有 OHLC 蜡烛图,使用
high作为 ATH 的候选,low作为 ATL 的候选。如果您只有采样价格,使用采样值的最大值/最小值。
带有简单价格点的示例(Node.js):
// points = [[ts_ms, price], ...]
const sinceMs = Date.now() - 24 * 3600 * 1000; // 1 天
const windowPrices = points.filter(([ts]) => ts >= sinceMs).map(([, p]) => p);
if (windowPrices.length > 0) {
const ath = Math.max(...windowPrices);
const atl = Math.min(...windowPrices);
} else {
const ath = null;
const atl = null;
}
如果使用 OHLC 蜡烛图:
// candles = [[ts_ms, open, high, low, close], ...]
const window = candles.filter(c => c[0] >= sinceMs);
const ath = Math.max(...window.map(c => c[2]));
const atl = Math.min(...window.map(c => c[3]));
5) 实用提示
- 对于 3 个月的过去价格行动,获取 90 天的数据或分页交易所蜡烛端点直到覆盖约 90 天。
- 使用小时或日粒度取决于所需分辨率。对于 1 天 ATH/ATL,小时或分钟粒度更好。
- 将时间转换为 UTC 并使用 ms 以保持一致。
- 尊重 API 速率限制并在重复查询时使用缓存。
6) 示例工作流(摘要)
- 尝试 CoinGecko
market_chart?days=90以快速获取 90 天历史。 - 从该数组计算 1d/7d/30d 的窗口并推导 ATH/ATL。
- 对于交易所精确数据或更高分辨率,查询 Binance
klines或 Coinbasecandles并重复相同的聚合。
如果您愿意,我可以为特定币种(BTC, ETH)添加准备运行的脚本,并自动化分页 Binance 获取以保证 90 天的小时数据。
代理笔记:当生成人类友好报告时,代理应使用 skills/generate-report 技能来生成格式化输出(markdown 或 PDF)。请参阅 skills/generate-report/SKILL.md 获取示例和模板。
示例代理提示:
使用 generate-report 技能创建一个简短的比特币价格报告(当前价格、24 小时变化、7 天变化),格式为 markdown 和 PDF。包括源 URL。