From f7a1cabe23018945d561b482fbe32fb836004347 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 16 Jan 2022 19:52:08 +0100 Subject: [PATCH] Add first version to fill orders "later" in backtesting --- freqtrade/optimize/backtesting.py | 12 ++++++++---- freqtrade/persistence/models.py | 7 +++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 4b9d7bbf1..0e9d95f53 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -670,10 +670,11 @@ class Backtesting: for open_trade in list(open_trades[pair]): # TODO: should open orders be stored in a separate list? if open_trade.open_order_id: - # FIXME: check order filling - # * Get open order - # * check if filled - open_trade.open_order_id = None + order = open_trade.select_order(is_open=True) + # Check for timeout!! + if self._get_order_filled(order.price): + open_trade.open_order_id = None + order.ft_is_open = False # without positionstacking, we can only have one open trade per pair. # max_open_trades must be respected @@ -698,6 +699,9 @@ class Backtesting: LocalTrade.add_bt_trade(trade) for trade in list(open_trades[pair]): + # TODO: This could be avoided with a separate list + if trade.open_order_id: + continue # also check the buying candle for sell conditions. trade_entry = self._get_sell_trade_entry(trade, row) # Sell occurred diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index ff500b549..ee7ad3fdd 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -635,14 +635,17 @@ class LocalTrade(): if self.stop_loss_pct is not None and self.open_rate is not None: self.adjust_stop_loss(self.open_rate, self.stop_loss_pct) - def select_order(self, order_side: str, is_open: Optional[bool]) -> Optional[Order]: + def select_order( + self, order_side: str = None, is_open: Optional[bool] = None) -> Optional[Order]: """ Finds latest order for this orderside and status :param order_side: Side of the order (either 'buy' or 'sell') :param is_open: Only search for open orders? :return: latest Order object if it exists, else None """ - orders = [o for o in self.orders if o.side == order_side] + orders = self.orders + if order_side: + orders = [o for o in self.orders if o.side == order_side] if is_open is not None: orders = [o for o in orders if o.ft_is_open == is_open] if len(orders) > 0: