Improve handling for immediately canceled orders
This commit is contained in:
@@ -1022,7 +1022,13 @@ class FreqtradeBot(LoggingMixin):
|
|||||||
|
|
||||||
# Update fees if order is non-opened
|
# Update fees if order is non-opened
|
||||||
if order_status in constants.NON_OPEN_EXCHANGE_STATES:
|
if order_status in constants.NON_OPEN_EXCHANGE_STATES:
|
||||||
self.update_trade_state(trade, order_id, order)
|
fully_canceled = self.update_trade_state(trade, order_id, order)
|
||||||
|
if fully_canceled and mode != "replace":
|
||||||
|
# Fully canceled orders, may happen with some time in force setups (IOC).
|
||||||
|
# Should be handled immediately.
|
||||||
|
self.handle_cancel_enter(
|
||||||
|
trade, order, order_obj, constants.CANCEL_REASON["TIMEOUT"]
|
||||||
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -1146,6 +1146,36 @@ def test_execute_entry_confirm_error(mocker, default_conf_usdt, fee, limit_order
|
|||||||
assert not freqtrade.execute_entry(pair, stake_amount)
|
assert not freqtrade.execute_entry(pair, stake_amount)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("is_short", [False, True])
|
||||||
|
def test_execute_entry_fully_canceled_on_create(
|
||||||
|
mocker, default_conf_usdt, fee, limit_order_open, is_short
|
||||||
|
) -> None:
|
||||||
|
freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt)
|
||||||
|
|
||||||
|
mock_hce = mocker.spy(freqtrade, "handle_cancel_enter")
|
||||||
|
order = limit_order_open[entry_side(is_short)]
|
||||||
|
pair = "ETH/USDT"
|
||||||
|
order["symbol"] = pair
|
||||||
|
order["status"] = "canceled"
|
||||||
|
order["filled"] = 0.0
|
||||||
|
|
||||||
|
mocker.patch.multiple(
|
||||||
|
EXMS,
|
||||||
|
fetch_ticker=MagicMock(return_value={"bid": 1.9, "ask": 2.2, "last": 1.9}),
|
||||||
|
create_order=MagicMock(return_value=order),
|
||||||
|
get_rate=MagicMock(return_value=0.11),
|
||||||
|
get_min_pair_stake_amount=MagicMock(return_value=1),
|
||||||
|
get_fee=fee,
|
||||||
|
)
|
||||||
|
stake_amount = 2
|
||||||
|
|
||||||
|
assert freqtrade.execute_entry(pair, stake_amount)
|
||||||
|
assert mock_hce.call_count == 1
|
||||||
|
# an order that immediately cancels completely should delete the order.
|
||||||
|
trades = Trade.get_trades().all()
|
||||||
|
assert len(trades) == 0
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("is_short", [False, True])
|
@pytest.mark.parametrize("is_short", [False, True])
|
||||||
def test_execute_entry_min_leverage(mocker, default_conf_usdt, fee, limit_order, is_short) -> None:
|
def test_execute_entry_min_leverage(mocker, default_conf_usdt, fee, limit_order, is_short) -> None:
|
||||||
default_conf_usdt["trading_mode"] = "futures"
|
default_conf_usdt["trading_mode"] = "futures"
|
||||||
|
|||||||
Reference in New Issue
Block a user