From 021e2b58ca87babab4d18f574cdc0ca435e1639d Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 1 May 2020 20:17:22 +0200 Subject: [PATCH] Support partially cancelled orders for fee calculation --- freqtrade/exchange/exchange.py | 3 ++- freqtrade/freqtradebot.py | 2 -- freqtrade/persistence.py | 2 +- tests/conftest.py | 2 +- tests/test_freqtradebot.py | 5 +++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index b7547cacb..e649e5ed2 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -1095,7 +1095,8 @@ class Exchange: # Calculate fee based on order details if fee_curr in self.get_pair_base_currency(order['symbol']): # Base currency - divide by amount - return round(order['fee']['cost'] / order['amount'], 8) + return round( + order['fee']['cost'] / safe_value_fallback(order, order, 'filled', 'amount'), 8) elif fee_curr in self.get_pair_quote_currency(order['symbol']): # Quote currency - divide by cost return round(order['fee']['cost'] / order['cost'], 8) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index d0a9a8348..32adc6d57 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1144,8 +1144,6 @@ class FreqtradeBot: if not isclose(order['amount'], new_amount, abs_tol=constants.MATH_CLOSE_PREC): order['amount'] = new_amount order.pop('filled', None) - # Fee was applied, so set to 0 - trade.fee_open = 0 trade.recalc_open_trade_price() except DependencyException as exception: logger.warning("Could not update trade amount: %s", exception) diff --git a/freqtrade/persistence.py b/freqtrade/persistence.py index 0f2c6bb52..17246633c 100644 --- a/freqtrade/persistence.py +++ b/freqtrade/persistence.py @@ -377,7 +377,7 @@ class Trade(_DECL_BASE): ) def update_fee(self, fee_cost: float, fee_currency: Optional[str], fee_rate: Optional[float], - side: str) -> None: + side) -> None: """ Update Fee parameters. Only acts once per side """ diff --git a/tests/conftest.py b/tests/conftest.py index 621f45407..10885d667 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -873,7 +873,7 @@ def limit_buy_order_old_partial(): def limit_buy_order_old_partial_canceled(limit_buy_order_old_partial): res = deepcopy(limit_buy_order_old_partial) res['status'] = 'canceled' - res['fee'] = {'cost': 0.0001, 'currency': 'ETH'} + res['fee'] = {'cost': 0.023, 'currency': 'ETH'} return res diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index cf5d30a79..19a094fab 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -2229,9 +2229,10 @@ def test_check_handle_timedout_partial_fee(default_conf, ticker, open_trade, cap assert len(trades) == 1 # Verify that trade has been updated assert trades[0].amount == (limit_buy_order_old_partial['amount'] - - limit_buy_order_old_partial['remaining']) - 0.0001 + limit_buy_order_old_partial['remaining']) - 0.023 assert trades[0].open_order_id is None - assert trades[0].fee_open == 0 + assert trades[0].fee_updated('buy') + assert pytest.approx(trades[0].fee_open) == 0.001 def test_check_handle_timedout_partial_except(default_conf, ticker, open_trade, caplog, fee,