diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index 6bd4b0a30..fe0b64bcc 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -421,6 +421,15 @@ class Trade(_DECL_BASE): for pair, rate, count in pair_rates ] + @staticmethod + def get_best_pair(): + best_pair = Trade.session.query( + Trade.pair, func.sum(Trade.close_profit).label('profit_sum') + ).filter(Trade.is_open.is_(False)) \ + .group_by(Trade.pair) \ + .order_by(desc('profit_sum')).first() + return best_pair + @staticmethod def get_open_trades() -> List[Any]: """ diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index c50a7937e..dc25c3743 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -225,11 +225,7 @@ class RPC: ) profit_all_perc.append(profit_percent) - best_pair = Trade.session.query( - Trade.pair, sql.func.sum(Trade.close_profit).label('profit_sum') - ).filter(Trade.is_open.is_(False)) \ - .group_by(Trade.pair) \ - .order_by(sql.text('profit_sum DESC')).first() + best_pair = Trade.get_best_pair() if not best_pair: raise RPCException('no closed trade') diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 8cf5f1756..4aa69423e 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -859,3 +859,16 @@ def test_get_overall_performance(fee): assert 'pair' in res[0] assert 'profit' in res[0] assert 'count' in res[0] + + +@pytest.mark.usefixtures("init_persistence") +def test_get_best_pair(fee): + + res = Trade.get_best_pair() + assert res is None + + create_mock_trades(fee) + res = Trade.get_best_pair() + assert len(res) == 2 + assert res[0] == 'ETC/BTC' + assert res[1] == 0.005