From 4b6cd69c81e1a3442941ec03c57f26260e57812d Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 5 May 2021 20:08:31 +0200 Subject: [PATCH] Add test for no-exchange dataprovider --- freqtrade/data/dataprovider.py | 14 +++++++++----- freqtrade/optimize/hyperopt.py | 1 - tests/data/test_dataprovider.py | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 731815572..aad50e404 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -19,6 +19,8 @@ from freqtrade.state import RunMode logger = logging.getLogger(__name__) +NO_EXCHANGE_EXCEPTION = 'Exchange is not available to DataProvider.' + class DataProvider: @@ -126,7 +128,7 @@ class DataProvider: Refresh data, called with each cycle """ if self._exchange is None: - raise OperationalException('Exchange is not available to DataProvider.') + raise OperationalException(NO_EXCHANGE_EXCEPTION) if helping_pairs: self._exchange.refresh_latest_ohlcv(pairlist + helping_pairs) else: @@ -139,7 +141,7 @@ class DataProvider: Should be whitelist + open trades. """ if self._exchange is None: - raise OperationalException('Exchange is not available to DataProvider.') + raise OperationalException(NO_EXCHANGE_EXCEPTION) return list(self._exchange._klines.keys()) def ohlcv(self, pair: str, timeframe: str = None, copy: bool = True) -> DataFrame: @@ -151,6 +153,8 @@ class DataProvider: :param copy: copy dataframe before returning if True. Use False only for read-only operations (where the dataframe is not modified) """ + if self._exchange is None: + raise OperationalException(NO_EXCHANGE_EXCEPTION) if self.runmode in (RunMode.DRY_RUN, RunMode.LIVE): return self._exchange.klines((pair, timeframe or self._config['timeframe']), copy=copy) @@ -164,7 +168,7 @@ class DataProvider: :return: Market data dict from ccxt or None if market info is not available for the pair """ if self._exchange is None: - raise OperationalException('Exchange is not available to DataProvider.') + raise OperationalException(NO_EXCHANGE_EXCEPTION) return self._exchange.markets.get(pair) def ticker(self, pair: str): @@ -174,7 +178,7 @@ class DataProvider: :return: Ticker dict from exchange or empty dict if ticker is not available for the pair """ if self._exchange is None: - raise OperationalException('Exchange is not available to DataProvider.') + raise OperationalException(NO_EXCHANGE_EXCEPTION) try: return self._exchange.fetch_ticker(pair) except ExchangeError: @@ -189,5 +193,5 @@ class DataProvider: :return: dict including bids/asks with a total of `maximum` entries. """ if self._exchange is None: - raise OperationalException('Exchange is not available to DataProvider.') + raise OperationalException(NO_EXCHANGE_EXCEPTION) return self._exchange.fetch_l2_order_book(pair, maximum) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 5e3d01047..5ccf02d01 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -31,7 +31,6 @@ from freqtrade.optimize.hyperopt_loss_interface import IHyperOptLoss # noqa: F4 from freqtrade.optimize.hyperopt_tools import HyperoptTools from freqtrade.optimize.optimize_reports import generate_strategy_stats from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver, HyperOptResolver -from freqtrade.strategy import IStrategy # Suppress scikit-learn FutureWarnings from skopt diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index 6b33fa7f2..c3b210d9d 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -246,3 +246,24 @@ def test_get_analyzed_dataframe(mocker, default_conf, ohlcv_history): assert dataframe.empty assert isinstance(time, datetime) assert time == datetime(1970, 1, 1, tzinfo=timezone.utc) + + +def test_no_exchange_mode(default_conf): + dp = DataProvider(default_conf, None) + + message = "Exchange is not available to DataProvider." + + with pytest.raises(OperationalException, match=message): + dp.refresh([()]) + + with pytest.raises(OperationalException, match=message): + dp.ohlcv('XRP/USDT', '5m') + + with pytest.raises(OperationalException, match=message): + dp.market('XRP/USDT') + + with pytest.raises(OperationalException, match=message): + dp.ticker('XRP/USDT') + + with pytest.raises(OperationalException, match=message): + dp.orderbook('XRP/USDT', 20)