From c698956f9f5bc98ce9b24e8addbe3f271a64081b Mon Sep 17 00:00:00 2001 From: Frederic Fortier Date: Sat, 16 Dec 2017 21:36:20 -0500 Subject: [PATCH] BUG: worked around CCXT issue with fetch_tickers, see: https://github.com/ccxt/ccxt/issues/870 --- catalyst/exchange/ccxt/ccxt_exchange.py | 11 ++++++----- catalyst/exchange/exchange.py | 18 ++++++++++++++---- catalyst/exchange/exchange_utils.py | 8 ++++++-- tests/exchange/test_ccxt.py | 11 ++++++----- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/catalyst/exchange/ccxt/ccxt_exchange.py b/catalyst/exchange/ccxt/ccxt_exchange.py index 3bfebfb6..56ca3909 100644 --- a/catalyst/exchange/ccxt/ccxt_exchange.py +++ b/catalyst/exchange/ccxt/ccxt_exchange.py @@ -701,18 +701,19 @@ class CCXT(Exchange): """ tickers = dict() try: - symbols = [self.get_symbol(asset) for asset in assets] - ccxt_tickers = self.api.fetch_tickers(symbols) - for asset in assets: symbol = self.get_symbol(asset) - if symbol not in ccxt_tickers: + # TODO: use fetch_tickers() for efficiency + # I tried using fetch_tickers() but noticed some + # inconsistencies, see issue: + # https://github.com/ccxt/ccxt/issues/870 + ticker = self.api.fetch_ticker(symbol=symbol) + if not ticker: log.warn('ticker not found for {} {}'.format( self.name, symbol )) continue - ticker = ccxt_tickers[symbol] ticker['last_traded'] = from_ms_timestamp(ticker['timestamp']) if 'last_price' not in ticker: diff --git a/catalyst/exchange/exchange.py b/catalyst/exchange/exchange.py index 87185fd1..873ac29e 100644 --- a/catalyst/exchange/exchange.py +++ b/catalyst/exchange/exchange.py @@ -236,10 +236,10 @@ class Exchange: elif data_frequency is not None: applies = ( - ( - data_frequency == 'minute' and a.end_minute is not None) - or ( - data_frequency == 'daily' and a.end_daily is not None) + ( + data_frequency == 'minute' and a.end_minute is not None) + or ( + data_frequency == 'daily' and a.end_daily is not None) ) else: @@ -281,6 +281,16 @@ class Exchange: self._symbol_maps[index] = symbol_map return symbol_map + @abstractmethod + def init(self): + """ + Load the asset list from the network. + + Returns + ------- + + """ + @abstractmethod def load_assets(self, is_local=False): """ diff --git a/catalyst/exchange/exchange_utils.py b/catalyst/exchange/exchange_utils.py index ac992c2f..20bd09e8 100644 --- a/catalyst/exchange/exchange_utils.py +++ b/catalyst/exchange/exchange_utils.py @@ -678,7 +678,7 @@ def get_catalyst_symbol(market_or_symbol): ) -def save_asset_data(folder, df): +def save_asset_data(folder, df, decimals=8): symbols = df.index.get_level_values('symbol') for symbol in symbols: symbol_df = df.loc[(symbols == symbol)] # Type: pd.DataFrame @@ -691,4 +691,8 @@ def save_asset_data(folder, df): print_headers = True with open(filename, 'a') as f: - symbol_df.to_csv(f, header=print_headers) + symbol_df.to_csv( + path_or_buf=f, + header=print_headers, + float_format='%.{}f'.format(decimals), + ) diff --git a/tests/exchange/test_ccxt.py b/tests/exchange/test_ccxt.py index 3ff44a8b..3d9d37f9 100644 --- a/tests/exchange/test_ccxt.py +++ b/tests/exchange/test_ccxt.py @@ -12,15 +12,15 @@ log = Logger('test_ccxt') class TestCCXT(BaseExchangeTestCase): @classmethod def setup(self): - exchange_name = 'gdax' + exchange_name = 'binance' auth = get_exchange_auth(exchange_name) self.exchange = CCXT( exchange_name=exchange_name, key=auth['key'], secret=auth['secret'], base_currency='eth', - portfolio=None ) + self.exchange.init() def test_order(self): log.info('creating order') @@ -68,9 +68,10 @@ class TestCCXT(BaseExchangeTestCase): def test_tickers(self): log.info('retrieving tickers') - tickers = self.exchange.tickers([ - self.exchange.get_asset('eth_btc'), - ]) + assets = [ + self.exchange.get_asset('eng_eth'), + ] + tickers = self.exchange.tickers(assets) assert len(tickers) == 1 pass