@@ -425,6 +425,57 @@ def test_min_roi_reached3(default_conf, fee) -> None:
425425 assert strategy .min_roi_reached (trade , 0.31 , dt_now () - timedelta (minutes = 2 ))
426426
427427
428+ def test_min_roi_reached_custom_roi (default_conf , fee ) -> None :
429+ strategy = StrategyResolver .load_strategy (default_conf )
430+ # Move traditional ROI out of the way
431+ strategy .minimal_roi = {0 : 2000 }
432+ strategy .use_custom_roi = True
433+
434+ def custom_roi (* args , trade : Trade , current_time : datetime , ** kwargs ):
435+ trade_dur = int ((current_time .timestamp () - trade .open_date_utc .timestamp ()) // 60 )
436+ # Profit is reduced after 30 minutes.
437+ if trade .pair == "XRP/BTC" :
438+ return 0.2
439+ if trade_dur > 30 :
440+ return 0.05
441+ return 0.1
442+
443+ strategy .custom_roi = MagicMock (side_effect = custom_roi )
444+
445+ trade = Trade (
446+ pair = "ETH/BTC" ,
447+ stake_amount = 0.001 ,
448+ amount = 5 ,
449+ open_date = dt_now () - timedelta (hours = 1 ),
450+ fee_open = fee .return_value ,
451+ fee_close = fee .return_value ,
452+ exchange = "binance" ,
453+ open_rate = 1 ,
454+ )
455+
456+ assert not strategy .min_roi_reached (trade , 0.02 , dt_now () - timedelta (minutes = 56 ))
457+ assert strategy .custom_roi .call_count == 1
458+ assert strategy .min_roi_reached (trade , 0.12 , dt_now () - timedelta (minutes = 56 ))
459+
460+ # after 30 minutes, the profit is reduced to 5%
461+ assert strategy .min_roi_reached (trade , 0.12 , dt_now () - timedelta (minutes = 29 ))
462+ assert strategy .min_roi_reached (trade , 0.06 , dt_now () - timedelta (minutes = 29 ))
463+ assert strategy .min_roi_reached (trade , 0.051 , dt_now () - timedelta (minutes = 29 ))
464+ # Comparison to exactly 5% should not trigger
465+ assert not strategy .min_roi_reached (trade , 0.05 , dt_now () - timedelta (minutes = 29 ))
466+
467+ # XRP/BTC has a custom roi of 20%.
468+
469+ trade .pair = "XRP/BTC"
470+ assert not strategy .min_roi_reached (trade , 0.12 , dt_now () - timedelta (minutes = 56 ))
471+ assert not strategy .min_roi_reached (trade , 0.12 , dt_now () - timedelta (minutes = 1 ))
472+ # XRP/BTC is not time related
473+ assert strategy .min_roi_reached (trade , 0.201 , dt_now () - timedelta (minutes = 1 ))
474+ assert strategy .min_roi_reached (trade , 0.201 , dt_now () - timedelta (minutes = 56 ))
475+
476+ assert strategy .custom_roi .call_count == 10
477+
478+
428479@pytest .mark .parametrize (
429480 "profit,adjusted,expected,liq,trailing,custom,profit2,adjusted2,expected2,custom_stop" ,
430481 [
0 commit comments