Cancel orders which can no longer be found after several days
This commit is contained in:
		| @@ -4,7 +4,7 @@ Freqtrade is the main module of this bot. It contains the class Freqtrade() | |||||||
| import copy | import copy | ||||||
| import logging | import logging | ||||||
| import traceback | import traceback | ||||||
| from datetime import datetime, time, timezone | from datetime import datetime, time, timedelta, timezone | ||||||
| from math import isclose | from math import isclose | ||||||
| from threading import Lock | from threading import Lock | ||||||
| from typing import Any, Dict, List, Optional, Tuple | from typing import Any, Dict, List, Optional, Tuple | ||||||
| @@ -302,6 +302,15 @@ class FreqtradeBot(LoggingMixin): | |||||||
|                 self.update_trade_state(order.trade, order.order_id, fo, |                 self.update_trade_state(order.trade, order.order_id, fo, | ||||||
|                                         stoploss_order=(order.ft_order_side == 'stoploss')) |                                         stoploss_order=(order.ft_order_side == 'stoploss')) | ||||||
|  |  | ||||||
|  |             except InvalidOrderException as e: | ||||||
|  |                 logger.warning(f"Error updating Order {order.order_id} due to {e}.") | ||||||
|  |                 if order.order_date_utc - timedelta(days=5) < datetime.now(timezone.utc): | ||||||
|  |                     logger.warning( | ||||||
|  |                         "Order is older than 5 days. Assuming order was fully cancelled.") | ||||||
|  |                     fo = order.to_ccxt_object() | ||||||
|  |                     fo['status'] = 'canceled' | ||||||
|  |                     self.handle_timedout_order(fo, order.trade) | ||||||
|  |  | ||||||
|             except ExchangeError as e: |             except ExchangeError as e: | ||||||
|  |  | ||||||
|                 logger.warning(f"Error updating Order {order.order_id} due to {e}") |                 logger.warning(f"Error updating Order {order.order_id} due to {e}") | ||||||
|   | |||||||
| @@ -4802,10 +4802,19 @@ def test_startup_update_open_orders(mocker, default_conf_usdt, fee, caplog, is_s | |||||||
|     assert len(Order.get_open_orders()) == 2 |     assert len(Order.get_open_orders()) == 2 | ||||||
|  |  | ||||||
|     caplog.clear() |     caplog.clear() | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.fetch_order', side_effect=InvalidOrderException) |     mocker.patch('freqtrade.exchange.Exchange.fetch_order', side_effect=ExchangeError) | ||||||
|     freqtrade.startup_update_open_orders() |     freqtrade.startup_update_open_orders() | ||||||
|     assert log_has_re(r"Error updating Order .*", caplog) |     assert log_has_re(r"Error updating Order .*", caplog) | ||||||
|  |  | ||||||
|  |     mocker.patch('freqtrade.exchange.Exchange.fetch_order', side_effect=InvalidOrderException) | ||||||
|  |     hto_mock = mocker.patch('freqtrade.freqtradebot.FreqtradeBot.handle_timedout_order') | ||||||
|  |     # Orders which are no longer found after X days should be assumed as canceled. | ||||||
|  |     freqtrade.startup_update_open_orders() | ||||||
|  |     assert log_has_re(r"Order is older than \d days.*", caplog) | ||||||
|  |     assert hto_mock.call_count == 2 | ||||||
|  |     assert hto_mock.call_args_list[0][0][0]['status'] == 'canceled' | ||||||
|  |     assert hto_mock.call_args_list[1][0][0]['status'] == 'canceled' | ||||||
|  |  | ||||||
|  |  | ||||||
| @pytest.mark.usefixtures("init_persistence") | @pytest.mark.usefixtures("init_persistence") | ||||||
| @pytest.mark.parametrize("is_short", [False, True]) | @pytest.mark.parametrize("is_short", [False, True]) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user