diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 733fa11b3..318c414e1 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -688,6 +688,7 @@ CANCEL_REASON = { "CANCELLED_ON_EXCHANGE": "cancelled on exchange", "FORCE_EXIT": "forcesold", "REPLACE": "cancelled to be replaced by new limit order", + "REPLACE_FAILED": "failed to replace order, deleting Trade", "USER_CANCEL": "user requested order cancel" } diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 878b179d2..58cc8f862 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1420,6 +1420,13 @@ class FreqtradeBot(LoggingMixin): order_adjust=True, ): logger.warning(f"Could not replace order for {trade}.") + if trade.nr_of_successful_entries == 0: + # this is the first entry and we didn't get filled yet, delete trade + logger.warning(f"Removing {trade} from database.") + self._notify_enter_cancel( + trade, order_type=self.strategy.order_types['entry'], + reason=constants.CANCEL_REASON['REPLACE_FAILED']) + trade.delete() def cancel_all_open_orders(self) -> None: """ diff --git a/tests/test_integration.py b/tests/test_integration.py index 6f6ceaaaf..520cb4244 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -563,7 +563,7 @@ def test_dca_order_adjust_entry_replace_fails( assert log_has_re(msg, caplog) assert entry_mock.call_count == 2 - assert len(Trade.get_trades().all()) == 2 + assert len(Trade.get_trades().all()) == 1 assert len(Order.get_open_orders()) == 0