Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 6
0
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")
Ejemplo n.º 7
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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"
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
def test_testdata_path() -> None:
    assert str(Path('freqtrade') / 'tests' / 'testdata') in str(
        make_testdata_path(None))