Back to Ccxt

Validate Paginated Data

wiki/examples/js/validate-paginated-data.md

4.5.602.1 KB
Original Source
javascript
// @NO_AUTO_TRANSPILE
import ccxt from '../../js/ccxt.js';
import ololog from 'ololog';
import ansicolor from 'ansicolor';
const log = ololog.configure({ locate: false });
ansicolor.nice;
//-----------------------------------------------------------------------------
/*
* Warning: Sometimes the exchanges have gaps in their OHLCV data, so it does not mean
* that CCXT is broken if you see gaps in the chart.
*/
async function fetchData(exchange, symbol, timeframe) {
    await exchange.loadMarkets();
    // exchange.verbose = true;
    const duration = exchange.parseTimeframe(timeframe) * 1000; // in milliseconds
    const ohlcv = await exchange.fetchOHLCV(symbol, timeframe, undefined, undefined, { 'paginate': true, 'paginationCalls': 5 });
    validateTimeframes(ohlcv, duration, exchange, symbol);
}
function validateTimeframes(ohlcv, duration, exchange, symbol) {
    for (let j = 0; j < ohlcv.length; j++) {
        const [timestamp, open, high, low, close, volume] = ohlcv[j];
        if (j > 0) {
            const [prevTimestamp, prevOpen, prevHigh, prevLow, prevClose, prevVolume] = ohlcv[j - 1];
            if (timestamp - prevTimestamp !== duration) {
                log.red('[' + j + ']', exchange.id, symbol, 'OHLCV data is not continuous, at', exchange.iso8601(timestamp), 'diff:', ((timestamp - prevTimestamp) / 1000), 's expected:', duration / 1000, 's');
            }
        }
    }
    log.green(exchange.id, symbol, `All the ${ohlcv.length} candles returned are continuous`);
}
async function main() {
    const exchanges = {
        'binance': 'BTC/USDT',
        'bitget': 'BTC/USDT',
        'kucoin': 'BTC/USDT',
        'kucoinfutures': 'BTC/USDT:USDT',
        'okx': 'BTC/USDT',
        'bybit': 'BTC/USDT'
    };
    const timeframe = '1m';
    const keys = Object.keys(exchanges);
    const promises = [];
    for (let i = 0; i < keys.length; i++) {
        const name = keys[i];
        const symbol = exchanges[name];
        const exchange = new ccxt[name]({ enableRateLimit: true });
        promises.push(fetchData(exchange, symbol, timeframe));
    }
    await Promise.all(promises);
}
main();