Merge pull request #6943 from freqtrade/cancel_outdated_orders
Cancel orders which can no longer be found after several days
This commit is contained in:
commit
ca281c5722
@ -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])
|
||||||
|
Loading…
Reference in New Issue
Block a user