From c181fac6c706fb334ca6f5e8b9200faf62afce7d Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 18 Oct 2019 06:46:48 +0200 Subject: [PATCH] fix #2383 --- freqtrade/freqtradebot.py | 16 +++++++++++++--- tests/test_freqtradebot.py | 4 ++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 46ff09173..9b9fd3531 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -802,16 +802,26 @@ class FreqtradeBot: """Buy timeout - cancel order :return: True if order was fully cancelled """ - self.exchange.cancel_order(trade.open_order_id, trade.pair) - if order['remaining'] == order['amount']: + corder = self.exchange.cancel_order(trade.open_order_id, trade.pair) + if corder['remaining'] == corder['amount']: # if trade is not partially completed, just delete the trade self.handle_buy_order_full_cancel(trade, "cancelled due to timeout") return True # if trade is partially complete, edit the stake details for the trade # and close the order - trade.amount = order['amount'] - order['remaining'] + trade.amount = corder['amount'] - corder['remaining'] trade.stake_amount = trade.amount * trade.open_rate + # verify if fees were taken from amount to avoid problems during selling + try: + new_amount = self.get_real_amount(trade, corder) + if not isclose(order['amount'], new_amount, abs_tol=constants.MATH_CLOSE_PREC): + trade.amount = new_amount + # Fee was applied, so set to 0 + trade.fee_open = 0 + except DependencyException as e: + logger.warning("Could not update trade amount: %s", e) + trade.open_order_id = None logger.info('Partial buy order timeout for %s.', trade) self.rpc.send_msg({ diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 89e4a40da..b5d36f994 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -2053,7 +2053,7 @@ def test_check_handle_cancelled_sell(default_conf, ticker, limit_sell_order_old, def test_check_handle_timedout_partial(default_conf, ticker, limit_buy_order_old_partial, open_trade, mocker) -> None: rpc_mock = patch_RPCManager(mocker) - cancel_order_mock = MagicMock() + cancel_order_mock = MagicMock(return_value=limit_buy_order_old_partial) patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', @@ -2143,7 +2143,7 @@ def test_check_handle_timedout_exception(default_conf, ticker, open_trade, mocke def test_handle_timedout_limit_buy(mocker, default_conf, limit_buy_order) -> None: patch_RPCManager(mocker) patch_exchange(mocker) - cancel_order_mock = MagicMock() + cancel_order_mock = MagicMock(return_value=limit_buy_order) mocker.patch.multiple( 'freqtrade.exchange.Exchange', cancel_order=cancel_order_mock