Рассчитать среднее значение в NodeJS из API - PullRequest
1 голос
/ 14 июля 2020

У меня есть скрипт, который берет данные из Binance API каждые 30 минут и показывает их в терминале. Я хотел бы рассчитать среднее значение для каждого актива, который у меня есть в массиве.

Это Пакет Node-Schedule - 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 минут?

1 Ответ

1 голос
/ 14 июля 2020

Простым способом сбора средних значений (и другой статистики) было бы создание карты с ключом по символу.

Мы будем вести историю для каждого символа, а затем каждый раз вычислять среднее значение, скажем, для объема мы получаем новую точку данных.

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