From 335d1fbbbcff5b09538f47076294914a37166412 Mon Sep 17 00:00:00 2001 From: xmatthias Date: Mon, 11 Jun 2018 19:50:43 +0200 Subject: [PATCH 1/2] Check if no backtest data is found and fail gracefully --- freqtrade/optimize/backtesting.py | 3 ++ freqtrade/tests/optimize/test_backtesting.py | 40 ++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 028a4f521..713f23ecc 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -237,6 +237,9 @@ class Backtesting(object): timerange=timerange ) + if not data: + logger.critical("No data found. Terminating.") + return # Ignore max_open_trades in backtesting, except realistic flag was passed if self.config.get('realistic_simulation', False): max_open_trades = self.config['max_open_trades'] diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index 33d9703de..41a00938c 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -416,6 +416,46 @@ def test_backtesting_start(default_conf, mocker, caplog) -> None: assert log_has(line, caplog.record_tuples) +def test_backtesting_start_no_data(default_conf, mocker, caplog) -> None: + """ + Test Backtesting.start() method if no data is found + """ + + def get_timeframe(input1, input2): + return Arrow(2017, 11, 14, 21, 17), Arrow(2017, 11, 14, 22, 59) + + mocker.patch('freqtrade.freqtradebot.Analyze', MagicMock()) + mocker.patch('freqtrade.optimize.load_data', MagicMock(return_value={})) + mocker.patch('freqtrade.exchange.get_ticker_history') + mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) + mocker.patch.multiple( + 'freqtrade.optimize.backtesting.Backtesting', + backtest=MagicMock(), + _generate_text_table=MagicMock(return_value='1'), + get_timeframe=get_timeframe, + ) + + conf = deepcopy(default_conf) + conf['exchange']['pair_whitelist'] = ['UNITTEST/BTC'] + conf['ticker_interval'] = 1 + conf['live'] = False + conf['datadir'] = None + conf['export'] = None + conf['timerange'] = '20180101-20180102' + + backtesting = Backtesting(conf) + backtesting.start() + # check the logs, that will contain the backtest result + exists = [ + 'Using local backtesting data (using whitelist in given config) ...', + 'Using stake_currency: BTC ...', + 'Using stake_amount: 0.001 ...', + 'No data found. Terminating.' + ] + for line in exists: + assert log_has(line, caplog.record_tuples) + + def test_backtest(default_conf, fee, mocker) -> None: """ Test Backtesting.backtest() method From a0f735d4f268d60c46236a7e115d874f833c0dbd Mon Sep 17 00:00:00 2001 From: xmatthias Date: Mon, 11 Jun 2018 21:02:24 +0200 Subject: [PATCH 2/2] reduce test-noise --- freqtrade/tests/optimize/test_backtesting.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/freqtrade/tests/optimize/test_backtesting.py b/freqtrade/tests/optimize/test_backtesting.py index 41a00938c..8c18cab4e 100644 --- a/freqtrade/tests/optimize/test_backtesting.py +++ b/freqtrade/tests/optimize/test_backtesting.py @@ -437,7 +437,7 @@ def test_backtesting_start_no_data(default_conf, mocker, caplog) -> None: conf = deepcopy(default_conf) conf['exchange']['pair_whitelist'] = ['UNITTEST/BTC'] - conf['ticker_interval'] = 1 + conf['ticker_interval'] = "1m" conf['live'] = False conf['datadir'] = None conf['export'] = None @@ -446,14 +446,8 @@ def test_backtesting_start_no_data(default_conf, mocker, caplog) -> None: backtesting = Backtesting(conf) backtesting.start() # check the logs, that will contain the backtest result - exists = [ - 'Using local backtesting data (using whitelist in given config) ...', - 'Using stake_currency: BTC ...', - 'Using stake_amount: 0.001 ...', - 'No data found. Terminating.' - ] - for line in exists: - assert log_has(line, caplog.record_tuples) + + assert log_has('No data found. Terminating.', caplog.record_tuples) def test_backtest(default_conf, fee, mocker) -> None: