Back to Ccxt

Fetch All Tickers To Files

wiki/examples/js/fetch-all-tickers-to-files.md

4.5.602.4 KB
Original Source
javascript
// @NO_AUTO_TRANSPILE
import ccxt from '../../js/ccxt.js';
import ololog from 'ololog';
const { noLocate } = ololog;
const log = noLocate;
import fs from 'fs';
// the numWorkers constant defines the number of concurrent workers
// those aren't really threads in terms of the async environment
// set this to the number of cores in your CPU * 2
// or play with this number to find a setting that works best for you
const numWorkers = 8;
(async () => {
    // make an array of all exchanges
    const exchanges = ccxt.exchanges
        // filter coinmarketcap and theocean
        // coinmarketcap isn't really an exchange
        // theocean requires web3 dependencies to be installed
        .filter(id => !['coinmarketcap', 'theocean'].includes(id))
        // instantiate each exchange and save it to the exchanges list
        .map(id => new ccxt[id]());
    // the worker function for each "async thread"
    const worker = async function () {
        // while the array of all exchanges is not empty
        while (exchanges.length > 0) {
            // pop one exchange from the array
            const exchange = exchanges.pop();
            // check if it has the necessary method implemented
            if (exchange.has['fetchTickers']) {
                // try to do "the work" and handle errors if any
                try {
                    // fetch the response for all tickers from the exchange
                    const tickers = await exchange.fetchTickers();
                    // make a filename from exchange id
                    const filename = exchange.id + '.json';
                    // save the response to a file
                    fs.writeFileSync(filename, JSON.stringify({ tickers }));
                    // print out a message on success
                    log.green(exchange.id, 'tickers saved to', filename);
                }
                catch (e) {
                    // in case of error - print it out and ignore it further
                    log.red(e.constructor.name, e.message);
                }
            }
            else {
                log.red(exchange.id, "has['fetchTickers'] = false");
            }
        }
    };
    // create numWorkers "threads" (they aren't really threads)
    const workers = [...Array(numWorkers)].map(_ => worker());
    // wait for all of them to execute or fail
    await Promise.all(workers);
})();