Skip to content

Commit c901f6d

Browse files
committed
test: add test for custom_roi behavior
1 parent b4a5f66 commit c901f6d

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

tests/strategy/test_interface.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)