From c901f6d1dd0db856af9dc73a34089d118eca8854 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 15 May 2025 07:22:18 +0200 Subject: [PATCH] test: add test for custom_roi behavior --- tests/strategy/test_interface.py | 51 ++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index 647484535..805140a83 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -425,6 +425,57 @@ def test_min_roi_reached3(default_conf, fee) -> None: assert strategy.min_roi_reached(trade, 0.31, dt_now() - timedelta(minutes=2)) +def test_min_roi_reached_custom_roi(default_conf, fee) -> None: + strategy = StrategyResolver.load_strategy(default_conf) + # Move traditional ROI out of the way + strategy.minimal_roi = {0: 2000} + strategy.use_custom_roi = True + + def custom_roi(*args, trade: Trade, current_time: datetime, **kwargs): + trade_dur = int((current_time.timestamp() - trade.open_date_utc.timestamp()) // 60) + # Profit is reduced after 30 minutes. + if trade.pair == "XRP/BTC": + return 0.2 + if trade_dur > 30: + return 0.05 + return 0.1 + + strategy.custom_roi = MagicMock(side_effect=custom_roi) + + trade = Trade( + pair="ETH/BTC", + stake_amount=0.001, + amount=5, + open_date=dt_now() - timedelta(hours=1), + fee_open=fee.return_value, + fee_close=fee.return_value, + exchange="binance", + open_rate=1, + ) + + assert not strategy.min_roi_reached(trade, 0.02, dt_now() - timedelta(minutes=56)) + assert strategy.custom_roi.call_count == 1 + assert strategy.min_roi_reached(trade, 0.12, dt_now() - timedelta(minutes=56)) + + # after 30 minutes, the profit is reduced to 5% + assert strategy.min_roi_reached(trade, 0.12, dt_now() - timedelta(minutes=29)) + assert strategy.min_roi_reached(trade, 0.06, dt_now() - timedelta(minutes=29)) + assert strategy.min_roi_reached(trade, 0.051, dt_now() - timedelta(minutes=29)) + # Comparison to exactly 5% should not trigger + assert not strategy.min_roi_reached(trade, 0.05, dt_now() - timedelta(minutes=29)) + + # XRP/BTC has a custom roi of 20%. + + trade.pair = "XRP/BTC" + assert not strategy.min_roi_reached(trade, 0.12, dt_now() - timedelta(minutes=56)) + assert not strategy.min_roi_reached(trade, 0.12, dt_now() - timedelta(minutes=1)) + # XRP/BTC is not time related + assert strategy.min_roi_reached(trade, 0.201, dt_now() - timedelta(minutes=1)) + assert strategy.min_roi_reached(trade, 0.201, dt_now() - timedelta(minutes=56)) + + assert strategy.custom_roi.call_count == 10 + + @pytest.mark.parametrize( "profit,adjusted,expected,liq,trailing,custom,profit2,adjusted2,expected2,custom_stop", [