javascript - 从 API 计算 NodeJS 中的平均值
问题描述
我有一个脚本,每隔 30 分钟从Binance API获取数据并在终端中显示。我想计算数组中每个资产的平均值。
这是节点计划包- const j = schedule.scheduleJob('* * * * *'
小例子:var array = ["ADABTC", "AEBTC", "AIONBTC"]
我想分别计算"ADABTC"
、"AEBTC"
和 的平均值"KAVABTC"
。
完整代码
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
const fetch = require('node-fetch');
const symbols = ["ADABTC", "AEBTC", "AIONBTC", "ALGOBTC", "ARDRBTC", "ARKBTC", "ATOMTC"]
const getBTCData = async symbol => {
let data = await fetch(`https://api.binance.com/api/v3/klines?symbol=${symbol}&interval=30m&limit=1`).then(res => res.json());
const btcusdtdata = data.map(d => {
return {
Volume: parseInt(d[5]),
Timespan: 30,
}
});
console.log(btcusdtdata);
};
const sleep = ms => new Promise(res => setTimeout(res, ms));
const j = schedule.scheduleJob('* * * * *', async() => {
for (let symbol of symbols) {
await getBTCData(symbol);
await sleep(4000);
}
});
目标:我如何计算这部分的平均交易量 -Volume: parseInt(d[5]),
如果我每 30 分钟收到一次资产,则为每项资产?
解决方案
收集平均值(和其他统计数据)的一种简单方法是创建一个以符号为键的地图。
我们将为每个交易品种保留历史记录,然后在每次获得新数据点时计算交易量的平均值。
一个示例可能看起来像这样(出于演示目的,我已将调用频率更新为每 10 秒一次!)
const schedule = require('node-schedule');
const fetch = require('node-fetch');
const symbols = ["ADABTC", "AEBTC", "AIONBTC", "ALGOBTC", "ARDRBTC", "ARKBTC", ]
const symbolSummary = {};
const getBTCData = async symbol => {
let data = await fetch(`https://api.binance.com/api/v3/klines?symbol=${symbol}&interval=30m&limit=1`).then(res => res.json());
const btcusdtdata = data.map(d => {
return {
Volume: parseInt(d[5]),
Timespan: 30,
symbol
}
});
console.log(btcusdtdata);
return btcusdtdata;
};
const appendBTCDataToSummary = (btcData, summary) => {
if (!summary[btcData.symbol]) {
summary[btcData.symbol] = { history: [], symbol: btcData.symbol };
}
let symbolHistory = summary[btcData.symbol].history;
symbolHistory.push(btcData);
summary[btcData.symbol].averageVolume = symbolHistory.reduce((average, row) => {
// Calculate the average volume by scaling each volume entry by 1 / length.
return average + (row.Volume) * (1 / symbolHistory.length);
}, 0)
summary[btcData.symbol].dataPoints = symbolHistory.length;
}
const sleep = ms => new Promise(res => setTimeout(res, ms));
const j = schedule.scheduleJob('* * * * *', async() => {
for (let symbol of symbols) {
let btcData = await getBTCData(symbol);
appendBTCDataToSummary(btcData[0], symbolSummary);
// We must back off between calls as per api terms of use.
await sleep(4000);
}
console.log("Symbol summaries:", Object.values(symbolSummary).map(summary => {
return { symbol: summary.symbol, AverageVolume: summary.averageVolume, DataPoints: summary.dataPoints };
}));
});
推荐阅读
- ios - 自定义表格视图单元格为字符串
- node.js - 如何从数据库中删除 Loopback 模型和引用
- javascript - Cheerio 选择器不选择某些元素
- java - JDK/11 中不再存在 java.xml.bind
- javascript - 将 forwardRef 与 React 一起使用 - 获取迭代器中元素的缺失键道具
- javascript - Javascript 按钮切换
- apache-spark - Spark 批处理中的顺序处理
- java - 温度打印到小数点后的格式
- javascript - 将函数动态导入到 ES5 JS 文件中?
- python - Python Beautiful Soup Table 数据抓取除特定数据之外的所有数据