Простым способом сбора средних значений (и другой статистики) было бы создание карты с ключом по символу.
Мы будем вести историю для каждого символа, а затем каждый раз вычислять среднее значение, скажем, для объема мы получаем новую точку данных.
Пример может выглядеть так (я обновил частоту вызова до одного раза в 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 };
}));
});