From b7167ec88088a3541e6958233d98f8c4869053b3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 9 Jul 2022 08:24:29 +0200 Subject: [PATCH] Fix wrong fee calclulation for gateio futures --- freqtrade/exchange/exchange.py | 11 ++++++++--- freqtrade/exchange/gateio.py | 3 ++- freqtrade/exchange/okx.py | 1 + freqtrade/freqtradebot.py | 1 - freqtrade/persistence/trade_model.py | 2 +- tests/exchange/test_exchange.py | 3 +++ 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index c192ca830..fdf323582 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -77,6 +77,7 @@ class Exchange: "mark_ohlcv_price": "mark", "mark_ohlcv_timeframe": "8h", "ccxt_futures_name": "swap", + "fee_cost_in_contracts": False, # Fee cost needs contract conversion "needs_trading_fees": False, # use fetch_trading_fees to cache fees } _ft_has: Dict = {} @@ -1645,13 +1646,18 @@ class Exchange: fee_curr = fee.get('currency') if fee_curr is None: return None + fee_cost = fee['cost'] + if self._ft_has['fee_cost_in_contracts']: + # Convert cost via "contracts" conversion + fee_cost = self._contracts_to_amount(symbol, fee['cost']) + # Calculate fee based on order details if fee_curr == self.get_pair_base_currency(symbol): # Base currency - divide by amount return round(fee['cost'] / amount, 8) elif fee_curr == self.get_pair_quote_currency(symbol): # Quote currency - divide by cost - return round(self._contracts_to_amount(symbol, fee['cost']) / cost, 8) if cost else None + return round(fee_cost / cost, 8) if cost else None else: # If Fee currency is a different currency if not cost: @@ -1666,8 +1672,7 @@ class Exchange: fee_to_quote_rate = self._config['exchange'].get('unknown_fee_rate', None) if not fee_to_quote_rate: return None - return round((self._contracts_to_amount( - symbol, fee['cost']) * fee_to_quote_rate) / cost, 8) + return round((fee_cost * fee_to_quote_rate) / cost, 8) def extract_cost_curr_rate(self, fee: Dict, symbol: str, cost: float, amount: float) -> Tuple[float, str, Optional[float]]: diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index bf50167da..b9de212de 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -32,7 +32,8 @@ class Gateio(Exchange): } _ft_has_futures: Dict = { - "needs_trading_fees": True + "needs_trading_fees": True, + "fee_cost_in_contracts": False, # Set explicitly to false for clarity } _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 012f51080..afd7a672f 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -28,6 +28,7 @@ class Okx(Exchange): } _ft_has_futures: Dict = { "tickers_have_quoteVolume": False, + "fee_cost_in_contracts": True, } _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 3fd134078..469bfda7e 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1777,7 +1777,6 @@ class FreqtradeBot(LoggingMixin): fee_abs = 0.0 fee_cost = 0.0 trade_base_currency = self.exchange.get_pair_base_currency(trade.pair) - fee_rate_array: List[float] = [] for exectrade in trades: amount += exectrade['amount'] diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 324002685..5f302de71 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -821,7 +821,7 @@ class LocalTrade(): self.open_rate = total_stake / total_amount self.stake_amount = total_stake / (self.leverage or 1.0) self.amount = total_amount - self.fee_open_cost = self.fee_open * self.stake_amount + self.fee_open_cost = self.fee_open * total_stake self.recalc_open_trade_value() if self.stop_loss_pct is not None and self.open_rate is not None: self.adjust_stop_loss(self.open_rate, self.stop_loss_pct) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index f1d430437..6fce0bb8f 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -3584,6 +3584,9 @@ def test_extract_cost_curr_rate(mocker, default_conf, order, expected) -> None: 'fee': {'currency': 'POINT', 'cost': 2.0, 'rate': None}}, 1, 4.0), ({'symbol': 'POINT/BTC', 'amount': 0.04, 'cost': 0.5, 'fee': {'currency': 'POINT', 'cost': 2.0, 'rate': None}}, 2, 8.0), + # Missing currency + ({'symbol': 'ETH/BTC', 'amount': 0.04, 'cost': 0.05, + 'fee': {'currency': None, 'cost': 0.005}}, None, None), ]) def test_calculate_fee_rate(mocker, default_conf, order, expected, unknown_fee_rate) -> None: mocker.patch('freqtrade.exchange.Exchange.fetch_ticker', return_value={'last': 0.081})