From 320c9ccf9052c44c36b7ef894ff4de31fe35bd57 Mon Sep 17 00:00:00 2001 From: Reigo Reinmets Date: Fri, 14 Jan 2022 20:02:35 +0200 Subject: [PATCH] Unify functions and make it easy to get a list of filled buy orders --- freqtrade/persistence/models.py | 20 +++++++++----- tests/test_persistence.py | 46 +++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index 60826cfd3..7d109ec7c 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -614,15 +614,25 @@ class LocalTrade(): else: return None + def select_filled_orders(self, order_side: str) -> List['Order']: + """ + Finds filled orders for this orderside. + :param order_side: Side of the order (either 'buy' or 'sell') + :return: array of Order objects + """ + return [o for o in self.orders if o.ft_order_side == order_side and + o.ft_is_open is False and + (o.filled or 0) > 0 and + o.status in NON_OPEN_EXCHANGE_STATES] + @property def nr_of_successful_buys(self) -> int: """ Helper function to count the number of buy orders that have been filled. :return: int count of buy orders that have been filled for this trade. """ - return len([o for o in self.orders if o.ft_order_side == 'buy' and - o.status in NON_OPEN_EXCHANGE_STATES and - (o.filled or 0) > 0]) + + return len(self.select_filled_orders('buy')) @property def nr_of_successful_sells(self) -> int: @@ -630,9 +640,7 @@ class LocalTrade(): Helper function to count the number of sell orders that have been filled. :return: int count of sell orders that have been filled for this trade. """ - return len([o for o in self.orders if o.ft_order_side == 'sell' and - o.status in NON_OPEN_EXCHANGE_STATES and - (o.filled or 0) > 0]) + return len(self.select_filled_orders('sell')) @staticmethod def get_trades_proxy(*, pair: str = None, is_open: bool = None, diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 729a7f64c..958f3c42e 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -1663,3 +1663,49 @@ def test_recalc_trade_from_orders_ignores_bad_orders(fee): assert trade.fee_open_cost == 2 * o1_fee_cost assert trade.open_trade_value == 2 * o1_trade_val assert trade.nr_of_successful_buys == 2 + + +@pytest.mark.usefixtures("init_persistence") +def test_select_filled_orders(fee): + create_mock_trades(fee) + + trades = Trade.get_trades().all() + + # Closed buy order, no sell order + orders = trades[0].select_filled_orders('buy') + assert orders is not None + assert len(orders) == 1 + order = orders[0] + assert order.amount > 0 + assert order.filled > 0 + assert order.side == 'buy' + assert order.ft_order_side == 'buy' + assert order.status == 'closed' + orders = trades[0].select_filled_orders('sell') + assert orders is not None + assert len(orders) == 0 + + # closed buy order, and closed sell order + orders = trades[1].select_filled_orders('buy') + assert orders is not None + assert len(orders) == 1 + + orders = trades[1].select_filled_orders('sell') + assert orders is not None + assert len(orders) == 1 + + # Has open buy order + orders = trades[3].select_filled_orders('buy') + assert orders is not None + assert len(orders) == 0 + orders = trades[3].select_filled_orders('sell') + assert orders is not None + assert len(orders) == 0 + + # Open sell order + orders = trades[4].select_filled_orders('buy') + assert orders is not None + assert len(orders) == 1 + orders = trades[4].select_filled_orders('sell') + assert orders is not None + assert len(orders) == 0