From 7ae23e23403df5f515230a72b955bd12b0cb3ee8 Mon Sep 17 00:00:00 2001 From: Frederic Fortier Date: Thu, 25 Jan 2018 17:40:45 -0500 Subject: [PATCH] BLD: conditionally fetching single or multi tickers for performance reasons --- catalyst/exchange/ccxt/ccxt_exchange.py | 38 +++++++++++++++++++------ catalyst/exchange/exchange.py | 2 +- tests/exchange/test_ccxt.py | 2 +- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/catalyst/exchange/ccxt/ccxt_exchange.py b/catalyst/exchange/ccxt/ccxt_exchange.py index 543466aa..3e5d5b29 100644 --- a/catalyst/exchange/ccxt/ccxt_exchange.py +++ b/catalyst/exchange/ccxt/ccxt_exchange.py @@ -997,16 +997,36 @@ class CCXT(Exchange): list[dict[str, float] """ - symbols = self.get_symbols(assets) - try: - results = self.api.fetch_tickers(symbols=symbols) - except (ExchangeError, NetworkError) as e: - log.warn( - 'unable to fetch tickers {} / {}: {}'.format( - self.name, symbols, e + if len(assets) == 1: + symbol = self.get_symbol(assets[0]) + try: + log.debug('fetching single ticker: {}'.format(symbol)) + results = dict() + results[symbol] = self.api.fetch_ticker(symbol=symbol) + + except (ExchangeError, NetworkError) as e: + log.warn( + 'unable to fetch ticker {} / {}: {}'.format( + self.name, symbol, e + ) ) - ) - raise ExchangeRequestError(error=e) + raise ExchangeRequestError(error=e) + + elif len(assets) > 1: + symbols = self.get_symbols(assets) + try: + log.debug('fetching multiple tickers: {}'.format(symbols)) + results = self.api.fetch_tickers(symbols=symbols) + + except (ExchangeError, NetworkError) as e: + log.warn( + 'unable to fetch tickers {} / {}: {}'.format( + self.name, symbols, e + ) + ) + raise ExchangeRequestError(error=e) + else: + raise ValueError('Cannot request tickers with not assets.') tickers = dict() for asset in assets: diff --git a/catalyst/exchange/exchange.py b/catalyst/exchange/exchange.py index c66121bc..1d96d886 100644 --- a/catalyst/exchange/exchange.py +++ b/catalyst/exchange/exchange.py @@ -701,7 +701,7 @@ class Exchange: ) positions_value = 0.0 - if positions is not None: + if positions: assets = set([position.asset for position in positions]) tickers = self.tickers(assets) diff --git a/tests/exchange/test_ccxt.py b/tests/exchange/test_ccxt.py index 3683ca4a..af455cc4 100644 --- a/tests/exchange/test_ccxt.py +++ b/tests/exchange/test_ccxt.py @@ -76,7 +76,7 @@ class TestCCXT(BaseExchangeTestCase): self.exchange.get_asset('zrx_eth'), ] tickers = self.exchange.tickers(assets) - assert len(tickers) == 1 + assert len(tickers) == 2 pass def test_my_trades(self):