Esempio n. 1
0
def test_edge_results(edge_conf, mocker, caplog, data) -> None:
    """
    run functional tests
    """
    freqtrade = get_patched_freqtradebot(mocker, edge_conf)
    edge = Edge(edge_conf, freqtrade.exchange, freqtrade.strategy)
    frame = _build_backtest_dataframe(data.data)
    caplog.set_level(logging.DEBUG)
    edge.fee = 0

    trades = edge._find_trades_for_stoploss_range(frame, 'TEST/BTC',
                                                  [data.stop_loss])
    results = edge._fill_calculable_fields(
        DataFrame(trades)) if trades else DataFrame()

    assert len(trades) == len(data.trades)

    if not results.empty:
        assert round(results["profit_ratio"].sum(),
                     3) == round(data.profit_perc, 3)

    for c, trade in enumerate(data.trades):
        res = results.iloc[c]
        assert res.exit_type == trade.exit_reason
        assert res.open_date == _get_frame_time_from_offset(
            trade.open_tick).replace(tzinfo=None)
        assert res.close_date == _get_frame_time_from_offset(
            trade.close_tick).replace(tzinfo=None)
Esempio n. 2
0
def test_backtest_results(default_conf, fee, mocker, caplog, data) -> None:
    """
    run functional tests
    """
    default_conf["stoploss"] = data.stop_loss
    default_conf["minimal_roi"] = data.roi
    default_conf["timeframe"] = tests_timeframe
    default_conf["trailing_stop"] = data.trailing_stop
    default_conf[
        "trailing_only_offset_is_reached"] = data.trailing_only_offset_is_reached
    # Only add this to configuration If it's necessary
    if data.trailing_stop_positive is not None:
        default_conf["trailing_stop_positive"] = data.trailing_stop_positive
    default_conf[
        "trailing_stop_positive_offset"] = data.trailing_stop_positive_offset
    default_conf["use_sell_signal"] = data.use_sell_signal

    mocker.patch("freqtrade.exchange.Exchange.get_fee", return_value=0.0)
    mocker.patch("freqtrade.exchange.Exchange.get_min_pair_stake_amount",
                 return_value=0.00001)
    patch_exchange(mocker)
    frame = _build_backtest_dataframe(data.data)
    backtesting = Backtesting(default_conf)
    backtesting._set_strategy(backtesting.strategylist[0])
    backtesting.required_startup = 0
    backtesting.strategy.advise_buy = lambda a, m: frame
    backtesting.strategy.advise_sell = lambda a, m: frame
    backtesting.strategy.use_custom_stoploss = data.use_custom_stoploss
    caplog.set_level(logging.DEBUG)

    pair = "UNITTEST/BTC"
    # Dummy data as we mock the analyze functions
    data_processed = {pair: frame.copy()}
    min_date, max_date = get_timerange({pair: frame})
    result = backtesting.backtest(
        processed=data_processed,
        start_date=min_date,
        end_date=max_date,
        max_open_trades=10,
    )

    results = result['results']
    assert len(results) == len(data.trades)
    assert round(results["profit_ratio"].sum(),
                 3) == round(data.profit_perc, 3)

    for c, trade in enumerate(data.trades):
        res = results.iloc[c]
        assert res.sell_reason == trade.sell_reason.value
        assert res.buy_tag == trade.buy_tag
        assert res.open_date == _get_frame_time_from_offset(trade.open_tick)
        assert res.close_date == _get_frame_time_from_offset(trade.close_tick)
def test_backtest_results(default_conf, fee, mocker, caplog, data) -> None:
    """
    run functional tests
    """
    default_conf["stoploss"] = data.stop_loss
    default_conf["minimal_roi"] = data.roi
    default_conf["ticker_interval"] = tests_timeframe
    default_conf["trailing_stop"] = data.trailing_stop
    default_conf[
        "trailing_only_offset_is_reached"] = data.trailing_only_offset_is_reached
    # Only add this to configuration If it's necessary
    if data.trailing_stop_positive:
        default_conf["trailing_stop_positive"] = data.trailing_stop_positive
    default_conf[
        "trailing_stop_positive_offset"] = data.trailing_stop_positive_offset
    default_conf["ask_strategy"] = {"use_sell_signal": data.use_sell_signal}

    mocker.patch("freqtrade.exchange.Exchange.get_fee",
                 MagicMock(return_value=0.0))
    patch_exchange(mocker)
    frame = _build_backtest_dataframe(data.data)
    backtesting = Backtesting(default_conf)
    backtesting.strategy.advise_buy = lambda a, m: frame
    backtesting.strategy.advise_sell = lambda a, m: frame
    caplog.set_level(logging.DEBUG)

    pair = "UNITTEST/BTC"
    # Dummy data as we mock the analyze functions
    data_processed = {pair: frame.copy()}
    min_date, max_date = get_timeframe({pair: frame})
    results = backtesting.backtest({
        'stake_amount': default_conf['stake_amount'],
        'processed': data_processed,
        'max_open_trades': 10,
        'start_date': min_date,
        'end_date': max_date,
    })

    assert len(results) == len(data.trades)
    assert round(results["profit_percent"].sum(),
                 3) == round(data.profit_perc, 3)

    for c, trade in enumerate(data.trades):
        res = results.iloc[c]
        assert res.sell_reason == trade.sell_reason
        assert res.open_time == _get_frame_time_from_offset(trade.open_tick)
        assert res.close_time == _get_frame_time_from_offset(trade.close_tick)
def test_backtest_results(default_conf, fee, mocker, caplog,
                          data: BTContainer) -> None:
    """
    run functional tests
    """
    default_conf["stoploss"] = data.stop_loss
    default_conf["minimal_roi"] = data.roi
    default_conf["timeframe"] = tests_timeframe
    default_conf["trailing_stop"] = data.trailing_stop
    default_conf[
        "trailing_only_offset_is_reached"] = data.trailing_only_offset_is_reached
    # Only add this to configuration If it's necessary
    if data.trailing_stop_positive is not None:
        default_conf["trailing_stop_positive"] = data.trailing_stop_positive
    default_conf[
        "trailing_stop_positive_offset"] = data.trailing_stop_positive_offset
    default_conf["use_exit_signal"] = data.use_exit_signal

    mocker.patch("freqtrade.exchange.Exchange.get_fee", return_value=0.0)
    mocker.patch("freqtrade.exchange.Exchange.get_min_pair_stake_amount",
                 return_value=0.00001)
    mocker.patch("freqtrade.exchange.Exchange.get_max_pair_stake_amount",
                 return_value=float('inf'))
    mocker.patch("freqtrade.exchange.Binance.get_max_leverage",
                 return_value=100)
    patch_exchange(mocker)
    frame = _build_backtest_dataframe(data.data)
    backtesting = Backtesting(default_conf)
    # TODO: Should we initialize this properly??
    backtesting._can_short = True
    backtesting._set_strategy(backtesting.strategylist[0])
    backtesting.required_startup = 0
    backtesting.strategy.advise_entry = lambda a, m: frame
    backtesting.strategy.advise_exit = lambda a, m: frame
    if data.custom_entry_price:
        backtesting.strategy.custom_entry_price = MagicMock(
            return_value=data.custom_entry_price)
    if data.custom_exit_price:
        backtesting.strategy.custom_exit_price = MagicMock(
            return_value=data.custom_exit_price)
    backtesting.strategy.use_custom_stoploss = data.use_custom_stoploss
    backtesting.strategy.leverage = lambda **kwargs: data.leverage
    caplog.set_level(logging.DEBUG)

    pair = "UNITTEST/BTC"
    # Dummy data as we mock the analyze functions
    data_processed = {pair: frame.copy()}
    min_date, max_date = get_timerange({pair: frame})
    result = backtesting.backtest(
        processed=data_processed,
        start_date=min_date,
        end_date=max_date,
        max_open_trades=10,
    )

    results = result['results']
    assert len(results) == len(data.trades)
    assert round(results["profit_ratio"].sum(),
                 3) == round(data.profit_perc, 3)

    for c, trade in enumerate(data.trades):
        res: BTrade = results.iloc[c]
        assert res.exit_reason == trade.exit_reason.value
        assert res.enter_tag == trade.enter_tag
        assert res.open_date == _get_frame_time_from_offset(trade.open_tick)
        assert res.close_date == _get_frame_time_from_offset(trade.close_tick)
        assert res.is_short == trade.is_short