# -*- coding: utf-8 -*- import ccxt.pro from asyncio import run, gather, sleep orderbooks = {} def handle_all_orderbooks(orderbooks): print('We have the following orderbooks:') for exchange_id, orderbooks_by_symbol in orderbooks.items(): for symbol in orderbooks_by_symbol.keys(): orderbook = orderbooks_by_symbol[symbol] print(ccxt.pro.Exchange.iso8601(orderbook['timestamp']), exchange_id, symbol, orderbook['asks'][0], orderbook['bids'][0]) async def handling_loop(orderbooks): delay = 5 while True: await sleep(delay) handle_all_orderbooks(orderbooks) async def symbol_loop(exchange, symbol): while True: try: orderbook = await exchange.watch_order_book(symbol) orderbooks[exchange.id] = orderbooks.get(exchange.id, {}) orderbooks[exchange.id][symbol] = orderbook except Exception as e: print(str(e)) # raise e # uncomment to break all loops in case of an error in any one of them break # you can break just this one loop if it fails async def exchange_loop(exchange_id, symbols): exchange = getattr(ccxt.pro, exchange_id)() loops = [symbol_loop(exchange, symbol) for symbol in symbols] await gather(*loops) await exchange.close() async def main(): symbols = ['BTC/USDT', 'ETH/BTC'] # symbols = [] exchanges = { 'okex': symbols + ['ETH/USDT'], 'binance': symbols, } loops = [exchange_loop(exchange_id, symbols) for exchange_id, symbols in exchanges.items()] loops += [handling_loop(orderbooks)] await gather(*loops) run(main())