diff --git a/catalyst/exchange/ccxt/ccxt_exchange.py b/catalyst/exchange/ccxt/ccxt_exchange.py index 9ac59c6d..5f5f7a06 100644 --- a/catalyst/exchange/ccxt/ccxt_exchange.py +++ b/catalyst/exchange/ccxt/ccxt_exchange.py @@ -61,6 +61,7 @@ class CCXT(Exchange): 'apiKey': key, 'secret': secret, }) + self.api.enableRateLimit = True except Exception: raise ExchangeNotFoundError(exchange_name=exchange_name) @@ -1001,6 +1002,7 @@ class CCXT(Exchange): for asset in assets: symbol = self.get_symbol(asset) + # Test the CCXT throttling further to see if we need this self.ask_request() # TODO: use fetch_tickers() for efficiency diff --git a/catalyst/exchange/exchange.py b/catalyst/exchange/exchange.py index 9e5ed934..71ae0689 100644 --- a/catalyst/exchange/exchange.py +++ b/catalyst/exchange/exchange.py @@ -234,11 +234,15 @@ class Exchange: """ asset = None + # TODO: temp mapping, fix to use a single symbol convention + og_symbol = symbol + symbol = self.get_symbol(symbol) if not is_exchange_symbol else symbol log.debug( 'searching assets for: {} {}'.format( self.name, symbol ) ) + # TODO: simplify and loose the loop for a in self.assets: if asset is not None: break @@ -260,7 +264,8 @@ class Exchange: # The symbol provided may use the Catalyst or the exchange # convention - key = a.exchange_symbol if is_exchange_symbol else a.symbol + key = a.exchange_symbol if \ + is_exchange_symbol else self.get_symbol(a) if not asset and key.lower() == symbol.lower(): if applies: asset = a @@ -276,7 +281,7 @@ class Exchange: supported_symbols = sorted([a.symbol for a in self.assets]) raise SymbolNotFoundOnExchange( - symbol=symbol, + symbol=og_symbol, exchange=self.name.title(), supported_symbols=supported_symbols ) diff --git a/catalyst/support/ccxt_issue_1358.py b/catalyst/support/ccxt_issue_1358.py new file mode 100644 index 00000000..b83b7380 --- /dev/null +++ b/catalyst/support/ccxt_issue_1358.py @@ -0,0 +1,8 @@ +import ccxt + +bitfinex = ccxt.bitfinex() +bitfinex.verbose = True +ohlcvs = bitfinex.fetch_ohlcv('ETH/BTC', '30m', 1504224000000) + +dt = bitfinex.iso8601(ohlcvs[0][0]) +print(dt) # should print '2017-09-01T00:00:00.000Z' diff --git a/etc/requirements.txt b/etc/requirements.txt index f01a54b5..b3f17d0e 100644 --- a/etc/requirements.txt +++ b/etc/requirements.txt @@ -81,6 +81,6 @@ empyrical==0.2.1 tables==3.3.0 #Catalyst dependencies -ccxt==1.10.565 +ccxt==1.10.774 boto3==1.4.8 redo==1.6 diff --git a/tests/exchange/test_ccxt.py b/tests/exchange/test_ccxt.py index 0ae5b0af..8bffe616 100644 --- a/tests/exchange/test_ccxt.py +++ b/tests/exchange/test_ccxt.py @@ -72,14 +72,14 @@ class TestCCXT(BaseExchangeTestCase): def test_tickers(self): log.info('retrieving tickers') assets = [ - self.exchange.get_asset('eng_eth'), + self.exchange.get_asset('iot_usd'), ] tickers = self.exchange.tickers(assets) assert len(tickers) == 1 pass def test_my_trades(self): - asset = self.exchange.get_asset('eng_eth') + asset = self.exchange.get_asset('dsh_btc') trades = self.exchange.get_trades(asset) assert trades diff --git a/tests/exchange/test_suites/test_suite_bundle.py b/tests/exchange/test_suites/test_suite_bundle.py index 091ebd0e..557d0744 100644 --- a/tests/exchange/test_suites/test_suite_bundle.py +++ b/tests/exchange/test_suites/test_suite_bundle.py @@ -117,7 +117,7 @@ class TestSuiteBundle: # population=exchange_population, # features=[bundle], # ) # Type: list[Exchange] - exchanges = [get_exchange('bitfinex', skip_init=True)] + exchanges = [get_exchange('poloniex', skip_init=True)] data_portal = TestSuiteBundle.get_data_portal(exchanges) for exchange in exchanges: diff --git a/tests/exchange/test_suites/test_suite_exchange.py b/tests/exchange/test_suites/test_suite_exchange.py index 29baf739..4088a675 100644 --- a/tests/exchange/test_suites/test_suite_exchange.py +++ b/tests/exchange/test_suites/test_suite_exchange.py @@ -15,6 +15,7 @@ from catalyst.exchange.utils.test_utils import select_random_exchanges, \ handle_exchange_error, select_random_assets from catalyst.testing import ZiplineTestCase from catalyst.testing.fixtures import WithLogger +from exchange.utils.factory import get_exchanges log = Logger('TestSuiteExchange') @@ -83,12 +84,13 @@ class TestSuiteExchange(WithLogger, ZiplineTestCase): def test_tickers(self): exchange_population = 3 - asset_population = 3 + asset_population = 15 - exchanges = select_random_exchanges( - exchange_population, - features=['fetchTickers'], - ) # Type: list[Exchange] + # exchanges = select_random_exchanges( + # exchange_population, + # features=['fetchTickers'], + # ) # Type: list[Exchange] + exchanges = list(get_exchanges(['bitfinex']).values()) for exchange in exchanges: exchange.init()