def test_file_load_json(mocker) -> None: # 7m .json does not exist ret = file_load_json( make_testdata_path(None).joinpath('UNITTEST_BTC-7m.json')) assert not ret # 1m json exists (but no .gz exists) ret = file_load_json( make_testdata_path(None).joinpath('UNITTEST_BTC-1m.json')) assert ret # 8 .json is empty and will fail if it's loaded. .json.gz is a copy of 1.json ret = file_load_json( make_testdata_path(None).joinpath('UNITTEST_BTC-8m.json')) assert ret
def test_generate_profit_graph(): filename = history.make_testdata_path(None) / "backtest-result_test.json" trades = load_backtest_data(filename) timerange = Arguments.parse_timerange("20180110-20180112") pairs = ["POWR/BTC", "XLM/BTC"] tickers = history.load_data(datadir=None, pairs=pairs, ticker_interval='5m', timerange=timerange) trades = trades[trades['pair'].isin(pairs)] fig = generate_profit_graph(pairs, tickers, trades) assert isinstance(fig, go.Figure) assert fig.layout.title.text == "Profit plot" figure = fig.layout.figure assert len(figure.data) == 4 avgclose = find_trace_in_fig_data(figure.data, "Avg close price") assert isinstance(avgclose, go.Scattergl) profit = find_trace_in_fig_data(figure.data, "Profit") assert isinstance(profit, go.Scattergl) for pair in pairs: profit_pair = find_trace_in_fig_data(figure.data, f"Profit {pair}") assert isinstance(profit_pair, go.Scattergl)
def test_plot_trades(caplog): fig1 = generage_empty_figure() # nothing happens when no trades are available fig = plot_trades(fig1, None) assert fig == fig1 assert log_has("No trades found.", caplog.record_tuples) pair = "ADA/BTC" filename = history.make_testdata_path(None) / "backtest-result_test.json" trades = load_backtest_data(filename) trades = trades.loc[trades['pair'] == pair] fig = plot_trades(fig, trades) figure = fig1.layout.figure # Check buys - color, should be in first graph, ... trade_buy = find_trace_in_fig_data(figure.data, "trade_buy") assert isinstance(trade_buy, go.Scatter) assert trade_buy.yaxis == 'y' assert len(trades) == len(trade_buy.x) assert trade_buy.marker.color == 'green' trade_sell = find_trace_in_fig_data(figure.data, "trade_sell") assert isinstance(trade_sell, go.Scatter) assert trade_sell.yaxis == 'y' assert len(trades) == len(trade_sell.x) assert trade_sell.marker.color == 'red'
def test_init_plotscript(default_conf, mocker): default_conf['timerange'] = "20180110-20180112" default_conf['trade_source'] = "file" default_conf['ticker_interval'] = "5m" default_conf["datadir"] = history.make_testdata_path(None) default_conf['exportfilename'] = str( history.make_testdata_path(None) / "backtest-result_test.json") ret = init_plotscript(default_conf) assert "tickers" in ret assert "trades" in ret assert "pairs" in ret default_conf['pairs'] = ["POWR/BTC", "XLM/BTC"] ret = init_plotscript(default_conf) assert "tickers" in ret assert "POWR/BTC" in ret["tickers"] assert "XLM/BTC" in ret["tickers"]
def test_plot_profit(default_conf, mocker, caplog): default_conf['trade_source'] = 'file' default_conf["datadir"] = history.make_testdata_path(None) default_conf['exportfilename'] = str( history.make_testdata_path(None) / "backtest-result_test.json") default_conf['pairs'] = ["ETH/BTC", "LTC/BTC"] profit_mock = MagicMock() store_mock = MagicMock() mocker.patch.multiple("freqtrade.plot.plotting", generate_profit_graph=profit_mock, store_plot_file=store_mock) plot_profit(default_conf) # Plot-profit generates one combined plot assert profit_mock.call_count == 1 assert store_mock.call_count == 1 assert profit_mock.call_args_list[0][0][0] == default_conf['pairs'] assert store_mock.call_args_list[0][1]['auto_open'] is True
def test_load_backtest_data(): filename = make_testdata_path(None) / "backtest-result_test.json" bt_data = load_backtest_data(filename) assert isinstance(bt_data, DataFrame) assert list(bt_data.columns) == BT_DATA_COLUMNS + ["profitabs"] assert len(bt_data) == 179 # Test loading from string (must yield same result) bt_data2 = load_backtest_data(str(filename)) assert bt_data.equals(bt_data2) with pytest.raises(ValueError, match=r"File .* does not exist\."): load_backtest_data(str("filename") + "nofile")
def test_create_cum_profit(): filename = make_testdata_path(None) / "backtest-result_test.json" bt_data = load_backtest_data(filename) timerange = TimeRange.parse_timerange("20180110-20180112") df = load_pair_history(pair="POWR/BTC", ticker_interval='5m', datadir=None, timerange=timerange) cum_profits = create_cum_profit(df.set_index('date'), bt_data[bt_data["pair"] == 'POWR/BTC'], "cum_profits") assert "cum_profits" in cum_profits.columns assert cum_profits.iloc[0]['cum_profits'] == 0 assert cum_profits.iloc[-1]['cum_profits'] == 0.0798005
def test_analyse_and_plot_pairs(default_conf, mocker, caplog): default_conf['trade_source'] = 'file' default_conf["datadir"] = history.make_testdata_path(None) default_conf['exportfilename'] = str( history.make_testdata_path(None) / "backtest-result_test.json") default_conf['indicators1'] = ["sma5", "ema10"] default_conf['indicators2'] = ["macd"] default_conf['pairs'] = ["ETH/BTC", "LTC/BTC"] candle_mock = MagicMock() store_mock = MagicMock() mocker.patch.multiple("freqtrade.plot.plotting", generate_candlestick_graph=candle_mock, store_plot_file=store_mock) analyse_and_plot_pairs(default_conf) # Both mocks should be called once per pair assert candle_mock.call_count == 2 assert store_mock.call_count == 2 assert candle_mock.call_args_list[0][1]['indicators1'] == ['sma5', 'ema10'] assert candle_mock.call_args_list[0][1]['indicators2'] == ['macd'] assert log_has("End of plotting process. 2 plots generated", caplog)
def test_download_data_no_markets(mocker, default_conf, caplog): dl_mock = mocker.patch('freqtrade.data.history.download_pair_history', MagicMock()) mocker.patch('freqtrade.exchange.Exchange.markets', PropertyMock(return_value={})) ex = get_patched_exchange(mocker, default_conf) timerange = TimeRange.parse_timerange("20190101-20190102") unav_pairs = refresh_backtest_ohlcv_data(exchange=ex, pairs=["ETH/BTC", "XRP/BTC"], timeframes=["1m", "5m"], dl_path=make_testdata_path(None), timerange=timerange, erase=False) assert dl_mock.call_count == 0 assert "ETH/BTC" in unav_pairs assert "XRP/BTC" in unav_pairs assert log_has("Skipping pair ETH/BTC...", caplog)
def test_add_profit(): filename = history.make_testdata_path(None) / "backtest-result_test.json" bt_data = load_backtest_data(filename) timerange = TimeRange.parse_timerange("20180110-20180112") df = history.load_pair_history(pair="POWR/BTC", ticker_interval='5m', datadir=None, timerange=timerange) fig = generage_empty_figure() cum_profits = create_cum_profit(df.set_index('date'), bt_data[bt_data["pair"] == 'POWR/BTC'], "cum_profits") fig1 = add_profit(fig, row=2, data=cum_profits, column='cum_profits', name='Profits') figure = fig1.layout.figure profits = find_trace_in_fig_data(figure.data, "Profits") assert isinstance(profits, go.Scattergl) assert profits.yaxis == "y2"
def test_refresh_backtest_ohlcv_data(mocker, default_conf, markets, caplog): dl_mock = mocker.patch('freqtrade.data.history.download_pair_history', MagicMock()) mocker.patch('freqtrade.exchange.Exchange.markets', PropertyMock(return_value=markets)) mocker.patch.object(Path, "exists", MagicMock(return_value=True)) mocker.patch.object(Path, "unlink", MagicMock()) ex = get_patched_exchange(mocker, default_conf) timerange = TimeRange.parse_timerange("20190101-20190102") refresh_backtest_ohlcv_data(exchange=ex, pairs=["ETH/BTC", "XRP/BTC"], timeframes=["1m", "5m"], dl_path=make_testdata_path(None), timerange=timerange, erase=True) assert dl_mock.call_count == 4 assert dl_mock.call_args[1]['timerange'].starttype == 'date' assert log_has("Downloading pair ETH/BTC, interval 1m.", caplog)
def test_testdata_path() -> None: assert str(Path('freqtrade') / 'tests' / 'testdata') in str( make_testdata_path(None))