| @@ -919,7 +919,8 @@ def test_start_test_pairlist(mocker, caplog, tickers, default_conf, capsys): | |||||||
|  |  | ||||||
|  |  | ||||||
| def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, | def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, | ||||||
|                        saved_hyperopt_results_legacy): |                        saved_hyperopt_results_legacy, tmpdir): | ||||||
|  |     csv_file = Path(tmpdir) / "test.csv" | ||||||
|     for _ in (saved_hyperopt_results, saved_hyperopt_results_legacy): |     for _ in (saved_hyperopt_results, saved_hyperopt_results_legacy): | ||||||
|         mocker.patch( |         mocker.patch( | ||||||
|             'freqtrade.optimize.hyperopt_tools.HyperoptTools.load_previous_results', |             'freqtrade.optimize.hyperopt_tools.HyperoptTools.load_previous_results', | ||||||
| @@ -1139,17 +1140,18 @@ def test_hyperopt_list(mocker, capsys, caplog, saved_hyperopt_results, | |||||||
|             "hyperopt-list", |             "hyperopt-list", | ||||||
|             "--no-details", |             "--no-details", | ||||||
|             "--no-color", |             "--no-color", | ||||||
|             "--export-csv", "test_file.csv", |             "--export-csv", | ||||||
|  |             str(csv_file), | ||||||
|         ] |         ] | ||||||
|         pargs = get_args(args) |         pargs = get_args(args) | ||||||
|         pargs['config'] = None |         pargs['config'] = None | ||||||
|         start_hyperopt_list(pargs) |         start_hyperopt_list(pargs) | ||||||
|         captured = capsys.readouterr() |         captured = capsys.readouterr() | ||||||
|         log_has("CSV file created: test_file.csv", caplog) |         log_has("CSV file created: test_file.csv", caplog) | ||||||
|         f = Path("test_file.csv") |         assert ('Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,"3,930.0 m",0.43662' | ||||||
|         assert 'Best,1,2,-1.25%,-1.2222,-0.00125625,,-2.51,"3,930.0 m",0.43662' in f.read_text() |                 in csv_file.read_text()) | ||||||
|         assert f.is_file() |         assert csv_file.is_file() | ||||||
|         f.unlink() |         csv_file.unlink() | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_hyperopt_show(mocker, capsys, saved_hyperopt_results): | def test_hyperopt_show(mocker, capsys, saved_hyperopt_results): | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| # pragma pylint: disable=missing-docstring, C0103 | # pragma pylint: disable=missing-docstring, C0103 | ||||||
| import logging | import logging | ||||||
|  | from pathlib import Path | ||||||
|  | from shutil import copyfile | ||||||
|  |  | ||||||
| import pytest | import pytest | ||||||
|  |  | ||||||
| @@ -11,7 +13,7 @@ from freqtrade.data.converter import (convert_ohlcv_format, convert_trades_forma | |||||||
| from freqtrade.data.history import (get_timerange, load_data, load_pair_history, | from freqtrade.data.history import (get_timerange, load_data, load_pair_history, | ||||||
|                                     validate_backtest_data) |                                     validate_backtest_data) | ||||||
| from tests.conftest import log_has, log_has_re | from tests.conftest import log_has, log_has_re | ||||||
| from tests.data.test_history import _backup_file, _clean_test_file | from tests.data.test_history import _clean_test_file | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_dataframe_correct_columns(result): | def test_dataframe_correct_columns(result): | ||||||
| @@ -251,17 +253,18 @@ def test_trades_dict_to_list(fetch_trades_result): | |||||||
|         assert t[6] == fetch_trades_result[i]['cost'] |         assert t[6] == fetch_trades_result[i]['cost'] | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_convert_trades_format(mocker, default_conf, testdatadir): | def test_convert_trades_format(default_conf, testdatadir, tmpdir): | ||||||
|     files = [{'old': testdatadir / "XRP_ETH-trades.json.gz", |     tmpdir1 = Path(tmpdir) | ||||||
|               'new': testdatadir / "XRP_ETH-trades.json"}, |     files = [{'old': tmpdir1 / "XRP_ETH-trades.json.gz", | ||||||
|              {'old': testdatadir / "XRP_OLD-trades.json.gz", |               'new': tmpdir1 / "XRP_ETH-trades.json"}, | ||||||
|               'new': testdatadir / "XRP_OLD-trades.json"}, |              {'old': tmpdir1 / "XRP_OLD-trades.json.gz", | ||||||
|  |               'new': tmpdir1 / "XRP_OLD-trades.json"}, | ||||||
|              ] |              ] | ||||||
|     for file in files: |     for file in files: | ||||||
|         _backup_file(file['old'], copy_file=True) |         copyfile(testdatadir / file['old'].name, file['old']) | ||||||
|         assert not file['new'].exists() |         assert not file['new'].exists() | ||||||
|  |  | ||||||
|     default_conf['datadir'] = testdatadir |     default_conf['datadir'] = tmpdir1 | ||||||
|  |  | ||||||
|     convert_trades_format(default_conf, convert_from='jsongz', |     convert_trades_format(default_conf, convert_from='jsongz', | ||||||
|                           convert_to='json', erase=False) |                           convert_to='json', erase=False) | ||||||
| @@ -284,14 +287,20 @@ def test_convert_trades_format(mocker, default_conf, testdatadir): | |||||||
|             file['new'].unlink() |             file['new'].unlink() | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_convert_ohlcv_format(mocker, default_conf, testdatadir): | def test_convert_ohlcv_format(default_conf, testdatadir, tmpdir): | ||||||
|     file1 = testdatadir / "XRP_ETH-5m.json" |     tmpdir1 = Path(tmpdir) | ||||||
|     file1_new = testdatadir / "XRP_ETH-5m.json.gz" |  | ||||||
|     file2 = testdatadir / "XRP_ETH-1m.json" |     file1_orig = testdatadir / "XRP_ETH-5m.json" | ||||||
|     file2_new = testdatadir / "XRP_ETH-1m.json.gz" |     file1 = tmpdir1 / "XRP_ETH-5m.json" | ||||||
|     _backup_file(file1, copy_file=True) |     file1_new = tmpdir1 / "XRP_ETH-5m.json.gz" | ||||||
|     _backup_file(file2, copy_file=True) |     file2_orig = testdatadir / "XRP_ETH-1m.json" | ||||||
|     default_conf['datadir'] = testdatadir |     file2 = tmpdir1 / "XRP_ETH-1m.json" | ||||||
|  |     file2_new = tmpdir1 / "XRP_ETH-1m.json.gz" | ||||||
|  |  | ||||||
|  |     copyfile(file1_orig, file1) | ||||||
|  |     copyfile(file2_orig, file2) | ||||||
|  |  | ||||||
|  |     default_conf['datadir'] = tmpdir1 | ||||||
|     default_conf['pairs'] = ['XRP_ETH'] |     default_conf['pairs'] = ['XRP_ETH'] | ||||||
|     default_conf['timeframes'] = ['1m', '5m'] |     default_conf['timeframes'] = ['1m', '5m'] | ||||||
|  |  | ||||||
| @@ -317,10 +326,3 @@ def test_convert_ohlcv_format(mocker, default_conf, testdatadir): | |||||||
|     assert file2.exists() |     assert file2.exists() | ||||||
|     assert not file1_new.exists() |     assert not file1_new.exists() | ||||||
|     assert not file2_new.exists() |     assert not file2_new.exists() | ||||||
|  |  | ||||||
|     _clean_test_file(file1) |  | ||||||
|     _clean_test_file(file2) |  | ||||||
|     if file1_new.exists(): |  | ||||||
|         file1_new.unlink() |  | ||||||
|     if file2_new.exists(): |  | ||||||
|         file2_new.unlink() |  | ||||||
|   | |||||||
| @@ -86,14 +86,12 @@ def test_load_data_7min_timeframe(mocker, caplog, default_conf, testdatadir) -> | |||||||
| def test_load_data_1min_timeframe(ohlcv_history, mocker, caplog, testdatadir) -> None: | def test_load_data_1min_timeframe(ohlcv_history, mocker, caplog, testdatadir) -> None: | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history) |     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history) | ||||||
|     file = testdatadir / 'UNITTEST_BTC-1m.json' |     file = testdatadir / 'UNITTEST_BTC-1m.json' | ||||||
|     _backup_file(file, copy_file=True) |  | ||||||
|     load_data(datadir=testdatadir, timeframe='1m', pairs=['UNITTEST/BTC']) |     load_data(datadir=testdatadir, timeframe='1m', pairs=['UNITTEST/BTC']) | ||||||
|     assert file.is_file() |     assert file.is_file() | ||||||
|     assert not log_has( |     assert not log_has( | ||||||
|         'Download history data for pair: "UNITTEST/BTC", interval: 1m ' |         'Download history data for pair: "UNITTEST/BTC", interval: 1m ' | ||||||
|         'and store in None.', caplog |         'and store in None.', caplog | ||||||
|     ) |     ) | ||||||
|     _clean_test_file(file) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_load_data_startup_candles(mocker, caplog, default_conf, testdatadir) -> None: | def test_load_data_startup_candles(mocker, caplog, default_conf, testdatadir) -> None: | ||||||
| @@ -112,17 +110,17 @@ def test_load_data_startup_candles(mocker, caplog, default_conf, testdatadir) -> | |||||||
|  |  | ||||||
|  |  | ||||||
| def test_load_data_with_new_pair_1min(ohlcv_history_list, mocker, caplog, | def test_load_data_with_new_pair_1min(ohlcv_history_list, mocker, caplog, | ||||||
|                                       default_conf, testdatadir) -> None: |                                       default_conf, tmpdir) -> None: | ||||||
|     """ |     """ | ||||||
|     Test load_pair_history() with 1 min timeframe |     Test load_pair_history() with 1 min timeframe | ||||||
|     """ |     """ | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history_list) |     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history_list) | ||||||
|     exchange = get_patched_exchange(mocker, default_conf) |     exchange = get_patched_exchange(mocker, default_conf) | ||||||
|     file = testdatadir / 'MEME_BTC-1m.json' |     file = tmpdir1 / 'MEME_BTC-1m.json' | ||||||
|  |  | ||||||
|     _backup_file(file) |  | ||||||
|     # do not download a new pair if refresh_pairs isn't set |     # do not download a new pair if refresh_pairs isn't set | ||||||
|     load_pair_history(datadir=testdatadir, timeframe='1m', pair='MEME/BTC') |     load_pair_history(datadir=tmpdir1, timeframe='1m', pair='MEME/BTC') | ||||||
|     assert not file.is_file() |     assert not file.is_file() | ||||||
|     assert log_has( |     assert log_has( | ||||||
|         'No history data for pair: "MEME/BTC", timeframe: 1m. ' |         'No history data for pair: "MEME/BTC", timeframe: 1m. ' | ||||||
| @@ -130,15 +128,14 @@ def test_load_data_with_new_pair_1min(ohlcv_history_list, mocker, caplog, | |||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     # download a new pair if refresh_pairs is set |     # download a new pair if refresh_pairs is set | ||||||
|     refresh_data(datadir=testdatadir, timeframe='1m', pairs=['MEME/BTC'], |     refresh_data(datadir=tmpdir1, timeframe='1m', pairs=['MEME/BTC'], | ||||||
|                  exchange=exchange) |                  exchange=exchange) | ||||||
|     load_pair_history(datadir=testdatadir, timeframe='1m', pair='MEME/BTC') |     load_pair_history(datadir=tmpdir1, timeframe='1m', pair='MEME/BTC') | ||||||
|     assert file.is_file() |     assert file.is_file() | ||||||
|     assert log_has_re( |     assert log_has_re( | ||||||
|         'Download history data for pair: "MEME/BTC", timeframe: 1m ' |         'Download history data for pair: "MEME/BTC", timeframe: 1m ' | ||||||
|         'and store in .*', caplog |         'and store in .*', caplog | ||||||
|     ) |     ) | ||||||
|     _clean_test_file(file) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_testdata_path(testdatadir) -> None: | def test_testdata_path(testdatadir) -> None: | ||||||
| @@ -231,26 +228,22 @@ def test_load_cached_data_for_updating(mocker, testdatadir) -> None: | |||||||
|     assert start_ts is None |     assert start_ts is None | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_download_pair_history(ohlcv_history_list, mocker, default_conf, testdatadir) -> None: | def test_download_pair_history(ohlcv_history_list, mocker, default_conf, tmpdir) -> None: | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history_list) |     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', return_value=ohlcv_history_list) | ||||||
|     exchange = get_patched_exchange(mocker, default_conf) |     exchange = get_patched_exchange(mocker, default_conf) | ||||||
|     file1_1 = testdatadir / 'MEME_BTC-1m.json' |     tmpdir1 = Path(tmpdir) | ||||||
|     file1_5 = testdatadir / 'MEME_BTC-5m.json' |     file1_1 = tmpdir1 / 'MEME_BTC-1m.json' | ||||||
|     file2_1 = testdatadir / 'CFI_BTC-1m.json' |     file1_5 = tmpdir1 / 'MEME_BTC-5m.json' | ||||||
|     file2_5 = testdatadir / 'CFI_BTC-5m.json' |     file2_1 = tmpdir1 / 'CFI_BTC-1m.json' | ||||||
|  |     file2_5 = tmpdir1 / 'CFI_BTC-5m.json' | ||||||
|     _backup_file(file1_1) |  | ||||||
|     _backup_file(file1_5) |  | ||||||
|     _backup_file(file2_1) |  | ||||||
|     _backup_file(file2_5) |  | ||||||
|  |  | ||||||
|     assert not file1_1.is_file() |     assert not file1_1.is_file() | ||||||
|     assert not file2_1.is_file() |     assert not file2_1.is_file() | ||||||
|  |  | ||||||
|     assert _download_pair_history(datadir=testdatadir, exchange=exchange, |     assert _download_pair_history(datadir=tmpdir1, exchange=exchange, | ||||||
|                                   pair='MEME/BTC', |                                   pair='MEME/BTC', | ||||||
|                                   timeframe='1m') |                                   timeframe='1m') | ||||||
|     assert _download_pair_history(datadir=testdatadir, exchange=exchange, |     assert _download_pair_history(datadir=tmpdir1, exchange=exchange, | ||||||
|                                   pair='CFI/BTC', |                                   pair='CFI/BTC', | ||||||
|                                   timeframe='1m') |                                   timeframe='1m') | ||||||
|     assert not exchange._pairs_last_refresh_time |     assert not exchange._pairs_last_refresh_time | ||||||
| @@ -264,20 +257,16 @@ def test_download_pair_history(ohlcv_history_list, mocker, default_conf, testdat | |||||||
|     assert not file1_5.is_file() |     assert not file1_5.is_file() | ||||||
|     assert not file2_5.is_file() |     assert not file2_5.is_file() | ||||||
|  |  | ||||||
|     assert _download_pair_history(datadir=testdatadir, exchange=exchange, |     assert _download_pair_history(datadir=tmpdir1, exchange=exchange, | ||||||
|                                   pair='MEME/BTC', |                                   pair='MEME/BTC', | ||||||
|                                   timeframe='5m') |                                   timeframe='5m') | ||||||
|     assert _download_pair_history(datadir=testdatadir, exchange=exchange, |     assert _download_pair_history(datadir=tmpdir1, exchange=exchange, | ||||||
|                                   pair='CFI/BTC', |                                   pair='CFI/BTC', | ||||||
|                                   timeframe='5m') |                                   timeframe='5m') | ||||||
|     assert not exchange._pairs_last_refresh_time |     assert not exchange._pairs_last_refresh_time | ||||||
|     assert file1_5.is_file() |     assert file1_5.is_file() | ||||||
|     assert file2_5.is_file() |     assert file2_5.is_file() | ||||||
|  |  | ||||||
|     # clean files freshly downloaded |  | ||||||
|     _clean_test_file(file1_5) |  | ||||||
|     _clean_test_file(file2_5) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_download_pair_history2(mocker, default_conf, testdatadir) -> None: | def test_download_pair_history2(mocker, default_conf, testdatadir) -> None: | ||||||
|     tick = [ |     tick = [ | ||||||
| @@ -294,24 +283,15 @@ def test_download_pair_history2(mocker, default_conf, testdatadir) -> None: | |||||||
|     assert json_dump_mock.call_count == 2 |     assert json_dump_mock.call_count == 2 | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_download_backtesting_data_exception(ohlcv_history, mocker, caplog, | def test_download_backtesting_data_exception(mocker, caplog, default_conf, tmpdir) -> None: | ||||||
|                                              default_conf, testdatadir) -> None: |  | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', |     mocker.patch('freqtrade.exchange.Exchange.get_historic_ohlcv', | ||||||
|                  side_effect=Exception('File Error')) |                  side_effect=Exception('File Error')) | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     exchange = get_patched_exchange(mocker, default_conf) |     exchange = get_patched_exchange(mocker, default_conf) | ||||||
|  |  | ||||||
|     file1_1 = testdatadir / 'MEME_BTC-1m.json' |     assert not _download_pair_history(datadir=tmpdir1, exchange=exchange, | ||||||
|     file1_5 = testdatadir / 'MEME_BTC-5m.json' |  | ||||||
|     _backup_file(file1_1) |  | ||||||
|     _backup_file(file1_5) |  | ||||||
|  |  | ||||||
|     assert not _download_pair_history(datadir=testdatadir, exchange=exchange, |  | ||||||
|                                       pair='MEME/BTC', |                                       pair='MEME/BTC', | ||||||
|                                       timeframe='1m') |                                       timeframe='1m') | ||||||
|     # clean files freshly downloaded |  | ||||||
|     _clean_test_file(file1_1) |  | ||||||
|     _clean_test_file(file1_5) |  | ||||||
|     assert log_has('Failed to download history data for pair: "MEME/BTC", timeframe: 1m.', caplog) |     assert log_has('Failed to download history data for pair: "MEME/BTC", timeframe: 1m.', caplog) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -528,15 +508,15 @@ def test_refresh_backtest_trades_data(mocker, default_conf, markets, caplog, tes | |||||||
|     assert log_has("Skipping pair XRP/ETH...", caplog) |     assert log_has("Skipping pair XRP/ETH...", caplog) | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_download_trades_history(trades_history, mocker, default_conf, testdatadir, caplog) -> None: | def test_download_trades_history(trades_history, mocker, default_conf, testdatadir, caplog, | ||||||
|  |                                  tmpdir) -> None: | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     ght_mock = MagicMock(side_effect=lambda pair, *args, **kwargs: (pair, trades_history)) |     ght_mock = MagicMock(side_effect=lambda pair, *args, **kwargs: (pair, trades_history)) | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', |     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', | ||||||
|                  ght_mock) |                  ght_mock) | ||||||
|     exchange = get_patched_exchange(mocker, default_conf) |     exchange = get_patched_exchange(mocker, default_conf) | ||||||
|     file1 = testdatadir / 'ETH_BTC-trades.json.gz' |     file1 = tmpdir1 / 'ETH_BTC-trades.json.gz' | ||||||
|     data_handler = get_datahandler(testdatadir, data_format='jsongz') |     data_handler = get_datahandler(tmpdir1, data_format='jsongz') | ||||||
|     _backup_file(file1) |  | ||||||
|  |  | ||||||
|     assert not file1.is_file() |     assert not file1.is_file() | ||||||
|  |  | ||||||
| @@ -557,8 +537,7 @@ def test_download_trades_history(trades_history, mocker, default_conf, testdatad | |||||||
|     assert int(ght_mock.call_args_list[0][1]['since'] // 1000) == since_time2 - 5 |     assert int(ght_mock.call_args_list[0][1]['since'] // 1000) == since_time2 - 5 | ||||||
|     assert ght_mock.call_args_list[0][1]['from_id'] is not None |     assert ght_mock.call_args_list[0][1]['from_id'] is not None | ||||||
|  |  | ||||||
|     # clean files freshly downloaded |     file1.unlink() | ||||||
|     _clean_test_file(file1) |  | ||||||
|  |  | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', |     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', | ||||||
|                  MagicMock(side_effect=ValueError)) |                  MagicMock(side_effect=ValueError)) | ||||||
| @@ -567,9 +546,8 @@ def test_download_trades_history(trades_history, mocker, default_conf, testdatad | |||||||
|                                         pair='ETH/BTC') |                                         pair='ETH/BTC') | ||||||
|     assert log_has_re('Failed to download historic trades for pair: "ETH/BTC".*', caplog) |     assert log_has_re('Failed to download historic trades for pair: "ETH/BTC".*', caplog) | ||||||
|  |  | ||||||
|     file2 = testdatadir / 'XRP_ETH-trades.json.gz' |     file2 = tmpdir1 / 'XRP_ETH-trades.json.gz' | ||||||
|  |     copyfile(testdatadir / file2.name, file2) | ||||||
|     _backup_file(file2, True) |  | ||||||
|  |  | ||||||
|     ght_mock.reset_mock() |     ght_mock.reset_mock() | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', |     mocker.patch('freqtrade.exchange.Exchange.get_historic_trades', | ||||||
| @@ -589,38 +567,37 @@ def test_download_trades_history(trades_history, mocker, default_conf, testdatad | |||||||
|     _clean_test_file(file2) |     _clean_test_file(file2) | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_convert_trades_to_ohlcv(mocker, default_conf, testdatadir, caplog): | def test_convert_trades_to_ohlcv(testdatadir, tmpdir, caplog): | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     pair = 'XRP/ETH' |     pair = 'XRP/ETH' | ||||||
|     file1 = testdatadir / 'XRP_ETH-1m.json' |     file1 = tmpdir1 / 'XRP_ETH-1m.json' | ||||||
|     file5 = testdatadir / 'XRP_ETH-5m.json' |     file5 = tmpdir1 / 'XRP_ETH-5m.json' | ||||||
|     # Compare downloaded dataset with converted dataset |     filetrades = tmpdir1 / 'XRP_ETH-trades.json.gz' | ||||||
|     dfbak_1m = load_pair_history(datadir=testdatadir, timeframe="1m", pair=pair) |     copyfile(testdatadir / file1.name, file1) | ||||||
|     dfbak_5m = load_pair_history(datadir=testdatadir, timeframe="5m", pair=pair) |     copyfile(testdatadir / file5.name, file5) | ||||||
|  |     copyfile(testdatadir / filetrades.name, filetrades) | ||||||
|  |  | ||||||
|     _backup_file(file1, copy_file=True) |     # Compare downloaded dataset with converted dataset | ||||||
|     _backup_file(file5) |     dfbak_1m = load_pair_history(datadir=tmpdir1, timeframe="1m", pair=pair) | ||||||
|  |     dfbak_5m = load_pair_history(datadir=tmpdir1, timeframe="5m", pair=pair) | ||||||
|  |  | ||||||
|     tr = TimeRange.parse_timerange('20191011-20191012') |     tr = TimeRange.parse_timerange('20191011-20191012') | ||||||
|  |  | ||||||
|     convert_trades_to_ohlcv([pair], timeframes=['1m', '5m'], |     convert_trades_to_ohlcv([pair], timeframes=['1m', '5m'], | ||||||
|                             datadir=testdatadir, timerange=tr, erase=True) |                             datadir=tmpdir1, timerange=tr, erase=True) | ||||||
|  |  | ||||||
|     assert log_has("Deleting existing data for pair XRP/ETH, interval 1m.", caplog) |     assert log_has("Deleting existing data for pair XRP/ETH, interval 1m.", caplog) | ||||||
|     # Load new data |     # Load new data | ||||||
|     df_1m = load_pair_history(datadir=testdatadir, timeframe="1m", pair=pair) |     df_1m = load_pair_history(datadir=tmpdir1, timeframe="1m", pair=pair) | ||||||
|     df_5m = load_pair_history(datadir=testdatadir, timeframe="5m", pair=pair) |     df_5m = load_pair_history(datadir=tmpdir1, timeframe="5m", pair=pair) | ||||||
|  |  | ||||||
|     assert df_1m.equals(dfbak_1m) |     assert df_1m.equals(dfbak_1m) | ||||||
|     assert df_5m.equals(dfbak_5m) |     assert df_5m.equals(dfbak_5m) | ||||||
|  |  | ||||||
|     _clean_test_file(file1) |  | ||||||
|     _clean_test_file(file5) |  | ||||||
|  |  | ||||||
|     assert not log_has('Could not convert NoDatapair to OHLCV.', caplog) |     assert not log_has('Could not convert NoDatapair to OHLCV.', caplog) | ||||||
|  |  | ||||||
|     convert_trades_to_ohlcv(['NoDatapair'], timeframes=['1m', '5m'], |     convert_trades_to_ohlcv(['NoDatapair'], timeframes=['1m', '5m'], | ||||||
|                             datadir=testdatadir, timerange=tr, erase=True) |                             datadir=tmpdir1, timerange=tr, erase=True) | ||||||
|     assert log_has('Could not convert NoDatapair to OHLCV.', caplog) |     assert log_has('Could not convert NoDatapair to OHLCV.', caplog) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -752,15 +729,17 @@ def test_hdf5datahandler_trades_load(testdatadir): | |||||||
|     assert len([t for t in trades2 if t[0] > timerange.stopts * 1000]) == 0 |     assert len([t for t in trades2 if t[0] > timerange.stopts * 1000]) == 0 | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_hdf5datahandler_trades_store(testdatadir): | def test_hdf5datahandler_trades_store(testdatadir, tmpdir): | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     dh = HDF5DataHandler(testdatadir) |     dh = HDF5DataHandler(testdatadir) | ||||||
|     trades = dh.trades_load('XRP/ETH') |     trades = dh.trades_load('XRP/ETH') | ||||||
|  |  | ||||||
|     dh.trades_store('XRP/NEW', trades) |     dh1 = HDF5DataHandler(tmpdir1) | ||||||
|     file = testdatadir / 'XRP_NEW-trades.h5' |     dh1.trades_store('XRP/NEW', trades) | ||||||
|  |     file = tmpdir1 / 'XRP_NEW-trades.h5' | ||||||
|     assert file.is_file() |     assert file.is_file() | ||||||
|     # Load trades back |     # Load trades back | ||||||
|     trades_new = dh.trades_load('XRP/NEW') |     trades_new = dh1.trades_load('XRP/NEW') | ||||||
|  |  | ||||||
|     assert len(trades_new) == len(trades) |     assert len(trades_new) == len(trades) | ||||||
|     assert trades[0][0] == trades_new[0][0] |     assert trades[0][0] == trades_new[0][0] | ||||||
| @@ -778,8 +757,6 @@ def test_hdf5datahandler_trades_store(testdatadir): | |||||||
|     assert trades[-1][5] == trades_new[-1][5] |     assert trades[-1][5] == trades_new[-1][5] | ||||||
|     assert trades[-1][6] == trades_new[-1][6] |     assert trades[-1][6] == trades_new[-1][6] | ||||||
|  |  | ||||||
|     _clean_test_file(file) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_hdf5datahandler_trades_purge(mocker, testdatadir): | def test_hdf5datahandler_trades_purge(mocker, testdatadir): | ||||||
|     mocker.patch.object(Path, "exists", MagicMock(return_value=False)) |     mocker.patch.object(Path, "exists", MagicMock(return_value=False)) | ||||||
| @@ -793,16 +770,18 @@ def test_hdf5datahandler_trades_purge(mocker, testdatadir): | |||||||
|     assert unlinkmock.call_count == 1 |     assert unlinkmock.call_count == 1 | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_hdf5datahandler_ohlcv_load_and_resave(testdatadir): | def test_hdf5datahandler_ohlcv_load_and_resave(testdatadir, tmpdir): | ||||||
|  |     tmpdir1 = Path(tmpdir) | ||||||
|     dh = HDF5DataHandler(testdatadir) |     dh = HDF5DataHandler(testdatadir) | ||||||
|     ohlcv = dh.ohlcv_load('UNITTEST/BTC', '5m') |     ohlcv = dh.ohlcv_load('UNITTEST/BTC', '5m') | ||||||
|     assert isinstance(ohlcv, DataFrame) |     assert isinstance(ohlcv, DataFrame) | ||||||
|     assert len(ohlcv) > 0 |     assert len(ohlcv) > 0 | ||||||
|  |  | ||||||
|     file = testdatadir / 'UNITTEST_NEW-5m.h5' |     file = tmpdir1 / 'UNITTEST_NEW-5m.h5' | ||||||
|     assert not file.is_file() |     assert not file.is_file() | ||||||
|  |  | ||||||
|     dh.ohlcv_store('UNITTEST/NEW', '5m', ohlcv) |     dh1 = HDF5DataHandler(tmpdir1) | ||||||
|  |     dh1.ohlcv_store('UNITTEST/NEW', '5m', ohlcv) | ||||||
|     assert file.is_file() |     assert file.is_file() | ||||||
|  |  | ||||||
|     assert not ohlcv[ohlcv['date'] < '2018-01-15'].empty |     assert not ohlcv[ohlcv['date'] < '2018-01-15'].empty | ||||||
| @@ -812,14 +791,12 @@ def test_hdf5datahandler_ohlcv_load_and_resave(testdatadir): | |||||||
|  |  | ||||||
|     # Call private function to ensure timerange is filtered in hdf5 |     # Call private function to ensure timerange is filtered in hdf5 | ||||||
|     ohlcv = dh._ohlcv_load('UNITTEST/BTC', '5m', timerange) |     ohlcv = dh._ohlcv_load('UNITTEST/BTC', '5m', timerange) | ||||||
|     ohlcv1 = dh._ohlcv_load('UNITTEST/NEW', '5m', timerange) |     ohlcv1 = dh1._ohlcv_load('UNITTEST/NEW', '5m', timerange) | ||||||
|     assert len(ohlcv) == len(ohlcv1) |     assert len(ohlcv) == len(ohlcv1) | ||||||
|     assert ohlcv.equals(ohlcv1) |     assert ohlcv.equals(ohlcv1) | ||||||
|     assert ohlcv[ohlcv['date'] < '2018-01-15'].empty |     assert ohlcv[ohlcv['date'] < '2018-01-15'].empty | ||||||
|     assert ohlcv[ohlcv['date'] > '2018-01-19'].empty |     assert ohlcv[ohlcv['date'] > '2018-01-19'].empty | ||||||
|  |  | ||||||
|     _clean_test_file(file) |  | ||||||
|  |  | ||||||
|     # Try loading inexisting file |     # Try loading inexisting file | ||||||
|     ohlcv = dh.ohlcv_load('UNITTEST/NONEXIST', '5m') |     ohlcv = dh.ohlcv_load('UNITTEST/NONEXIST', '5m') | ||||||
|     assert ohlcv.empty |     assert ohlcv.empty | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ def test_text_table_bt_results(): | |||||||
|     assert text_table_bt_results(pair_results, stake_currency='BTC') == result_str |     assert text_table_bt_results(pair_results, stake_currency='BTC') == result_str | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_generate_backtest_stats(default_conf, testdatadir): | def test_generate_backtest_stats(default_conf, testdatadir, tmpdir): | ||||||
|     default_conf.update({'strategy': 'DefaultStrategy'}) |     default_conf.update({'strategy': 'DefaultStrategy'}) | ||||||
|     StrategyResolver.load_strategy(default_conf) |     StrategyResolver.load_strategy(default_conf) | ||||||
|  |  | ||||||
| @@ -148,8 +148,8 @@ def test_generate_backtest_stats(default_conf, testdatadir): | |||||||
|     assert strat_stats['pairlist'] == ['UNITTEST/BTC'] |     assert strat_stats['pairlist'] == ['UNITTEST/BTC'] | ||||||
|  |  | ||||||
|     # Test storing stats |     # Test storing stats | ||||||
|     filename = Path(testdatadir / 'btresult.json') |     filename = Path(tmpdir / 'btresult.json') | ||||||
|     filename_last = Path(testdatadir / LAST_BT_RESULT_FN) |     filename_last = Path(tmpdir / LAST_BT_RESULT_FN) | ||||||
|     _backup_file(filename_last, copy_file=True) |     _backup_file(filename_last, copy_file=True) | ||||||
|     assert not filename.is_file() |     assert not filename.is_file() | ||||||
|  |  | ||||||
| @@ -159,7 +159,7 @@ def test_generate_backtest_stats(default_conf, testdatadir): | |||||||
|     last_fn = get_latest_backtest_filename(filename_last.parent) |     last_fn = get_latest_backtest_filename(filename_last.parent) | ||||||
|     assert re.match(r"btresult-.*\.json", last_fn) |     assert re.match(r"btresult-.*\.json", last_fn) | ||||||
|  |  | ||||||
|     filename1 = (testdatadir / last_fn) |     filename1 = Path(tmpdir / last_fn) | ||||||
|     assert filename1.is_file() |     assert filename1.is_file() | ||||||
|     content = filename1.read_text() |     content = filename1.read_text() | ||||||
|     assert 'max_drawdown' in content |     assert 'max_drawdown' in content | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user