Update gateio to patch fees
This commit is contained in:
parent
33229c91cb
commit
9a8c24ddf3
@ -75,6 +75,7 @@ class Exchange:
|
|||||||
"mark_ohlcv_price": "mark",
|
"mark_ohlcv_price": "mark",
|
||||||
"mark_ohlcv_timeframe": "8h",
|
"mark_ohlcv_timeframe": "8h",
|
||||||
"ccxt_futures_name": "swap",
|
"ccxt_futures_name": "swap",
|
||||||
|
"needs_trading_fees": False, # use fetch_trading_fees to cache fees
|
||||||
}
|
}
|
||||||
_ft_has: Dict = {}
|
_ft_has: Dict = {}
|
||||||
_ft_has_futures: Dict = {}
|
_ft_has_futures: Dict = {}
|
||||||
@ -451,6 +452,9 @@ class Exchange:
|
|||||||
self._markets = self._api.load_markets()
|
self._markets = self._api.load_markets()
|
||||||
self._load_async_markets()
|
self._load_async_markets()
|
||||||
self._last_markets_refresh = arrow.utcnow().int_timestamp
|
self._last_markets_refresh = arrow.utcnow().int_timestamp
|
||||||
|
if self._ft_has['needs_trading_fees']:
|
||||||
|
self.trading_fees = self.fetch_trading_fees()
|
||||||
|
|
||||||
except ccxt.BaseError:
|
except ccxt.BaseError:
|
||||||
logger.exception('Unable to initialize markets.')
|
logger.exception('Unable to initialize markets.')
|
||||||
|
|
||||||
|
@ -27,6 +27,10 @@ class Gateio(Exchange):
|
|||||||
"stoploss_on_exchange": True,
|
"stoploss_on_exchange": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ft_has_futures: Dict = {
|
||||||
|
"needs_trading_fees": True
|
||||||
|
}
|
||||||
|
|
||||||
_supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [
|
_supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [
|
||||||
# TradingMode.SPOT always supported and not required in this list
|
# TradingMode.SPOT always supported and not required in this list
|
||||||
# (TradingMode.MARGIN, MarginMode.CROSS),
|
# (TradingMode.MARGIN, MarginMode.CROSS),
|
||||||
@ -42,6 +46,26 @@ class Gateio(Exchange):
|
|||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f'Exchange {self.name} does not support market orders.')
|
f'Exchange {self.name} does not support market orders.')
|
||||||
|
|
||||||
|
def fetch_order(self, order_id: str, pair: str, params={}) -> Dict:
|
||||||
|
order = super().fetch_order(order_id, pair, params)
|
||||||
|
|
||||||
|
if self.trading_mode == TradingMode.FUTURES and order.get('fee') is None:
|
||||||
|
# Futures usually don't contain fees in the response.
|
||||||
|
# As such, futures orders on gateio will not contain a fee, which causes
|
||||||
|
# a repeated "update fee" cycle and wrong calculations.
|
||||||
|
# Therefore we patch the response with fees if it's not available.
|
||||||
|
# An alternative also contianing fees would be
|
||||||
|
# privateFuturesGetSettleAccountBook({"settle": "usdt"})
|
||||||
|
|
||||||
|
pair_fees = self.trading_fees.get(pair, {})
|
||||||
|
if pair_fees and pair_fees['taker'] is not None:
|
||||||
|
order['fee'] = {
|
||||||
|
'currency': self.get_pair_quote_currency(pair),
|
||||||
|
'cost': abs(order['cost']) * pair_fees['taker'],
|
||||||
|
'rate': pair_fees['taker'],
|
||||||
|
}
|
||||||
|
return order
|
||||||
|
|
||||||
def fetch_stoploss_order(self, order_id: str, pair: str, params={}) -> Dict:
|
def fetch_stoploss_order(self, order_id: str, pair: str, params={}) -> Dict:
|
||||||
return self.fetch_order(
|
return self.fetch_order(
|
||||||
order_id=order_id,
|
order_id=order_id,
|
||||||
|
@ -1564,6 +1564,7 @@ class FreqtradeBot(LoggingMixin):
|
|||||||
if not order_obj:
|
if not order_obj:
|
||||||
raise DependencyException(
|
raise DependencyException(
|
||||||
f"Order_obj not found for {order_id}. This should not have happened.")
|
f"Order_obj not found for {order_id}. This should not have happened.")
|
||||||
|
|
||||||
self.handle_order_fee(trade, order_obj, order)
|
self.handle_order_fee(trade, order_obj, order)
|
||||||
|
|
||||||
trade.update_trade(order_obj)
|
trade.update_trade(order_obj)
|
||||||
|
@ -1663,11 +1663,9 @@ def test_fetch_trading_fees(default_conf, mocker):
|
|||||||
api_mock.fetch_trading_fees = MagicMock(return_value=tick)
|
api_mock.fetch_trading_fees = MagicMock(return_value=tick)
|
||||||
mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True)
|
mocker.patch('freqtrade.exchange.Exchange.exchange_has', return_value=True)
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name)
|
||||||
# retrieve original ticker
|
|
||||||
tradingfees = exchange.fetch_trading_fees()
|
|
||||||
|
|
||||||
assert '1INCH/USDT:USDT' in tradingfees
|
assert '1INCH/USDT:USDT' in exchange.trading_fees
|
||||||
assert 'ETH/USDT:USDT' in tradingfees
|
assert 'ETH/USDT:USDT' in exchange.trading_fees
|
||||||
assert api_mock.fetch_trading_fees.call_count == 1
|
assert api_mock.fetch_trading_fees.call_count == 1
|
||||||
|
|
||||||
api_mock.fetch_trading_fees.reset_mock()
|
api_mock.fetch_trading_fees.reset_mock()
|
||||||
|
Loading…
Reference in New Issue
Block a user