From b61cfada6db6ce99b9798452ccbc35bf58ba193a Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Thu, 24 Feb 2022 10:06:30 -0600 Subject: [PATCH] moved okex.load_leverage_tiers to new method --- freqtrade/exchange/exchange.py | 51 +++++++++++++++++++++++++--------- freqtrade/exchange/okx.py | 29 ------------------- tests/exchange/test_okx.py | 8 ++++-- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 2703c99bf..aa529024a 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -74,7 +74,6 @@ class Exchange: "mark_ohlcv_price": "mark", "mark_ohlcv_timeframe": "8h", "ccxt_futures_name": "swap", - "can_fetch_multiple_tiers": True, } _ft_has: Dict = {} @@ -1875,18 +1874,44 @@ class Exchange: @retrier def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - if self.trading_mode == TradingMode.FUTURES and self.exchange_has('fetchLeverageTiers'): - try: - return self._api.fetch_leverage_tiers() - except ccxt.DDoSProtection as e: - raise DDosProtection(e) from e - except (ccxt.NetworkError, ccxt.ExchangeError) as e: - raise TemporaryError( - f'Could not load leverage tiers due to {e.__class__.__name__}.' - f'Message: {e}' - ) from e - except ccxt.BaseError as e: - raise OperationalException(e) from e + if self.trading_mode == TradingMode.FUTURES: + if self.exchange_has('fetchLeverageTiers'): + try: + return self._api.fetch_leverage_tiers() + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.NetworkError, ccxt.ExchangeError) as e: + raise TemporaryError( + f'Could not load leverage tiers due to {e.__class__.__name__}.' + f'Message: {e}' + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e + elif self.exchange_has('fetchMarketLeverageTiers'): + # * This is slow(~45s) on Okex, makes ~90 api calls to load all linear swap markets + markets = self.markets + symbols = [] + + for symbol, market in markets.items(): + if (self.market_is_future(market) + and market['quote'] == self._config['stake_currency']): + symbols.append(symbol) + + tiers: Dict[str, List[Dict]] = {} + + # Be verbose here, as this delays startup by ~1 minute. + logger.info( + f"Initializing leverage_tiers for {len(symbols)} markets. " + "This will take about a minute.") + + for symbol in sorted(symbols): + res = self._api.fetch_market_leverage_tiers(symbol) + tiers[symbol] = res[symbol] + logger.info(f"Done initializing {len(symbols)} markets.") + + return tiers + else: + return {} else: return {} diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 8bdd81b14..08c29c7b2 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -22,7 +22,6 @@ class Okx(Exchange): "ohlcv_candle_limit": 300, "mark_ohlcv_timeframe": "4h", "funding_fee_timeframe": "8h", - "can_fetch_multiple_tiers": False, } _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ @@ -93,31 +92,3 @@ class Okx(Exchange): pair_tiers = self._leverage_tiers[pair] return pair_tiers[-1]['max'] / leverage - - @retrier - def load_leverage_tiers(self) -> Dict[str, List[Dict]]: - # * This is slow(~45s) on Okex, must make 90-some api calls to load all linear swap markets - if self.trading_mode == TradingMode.FUTURES: - markets = self.markets - symbols = [] - - for symbol, market in markets.items(): - if (self.market_is_future(market) - and market['quote'] == self._config['stake_currency']): - symbols.append(symbol) - - tiers: Dict[str, List[Dict]] = {} - - # Be verbose here, as this delays startup by ~1 minute. - logger.info( - f"Initializing leverage_tiers for {len(symbols)} markets. " - "This will take about a minute.") - - for symbol in sorted(symbols): - res = self._api.fetch_leverage_tiers(symbol) - tiers[symbol] = res[symbol] - logger.info(f"Done initializing {len(symbols)} markets.") - - return tiers - else: - return {} diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index 035e08f26..1f23f8b0a 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -1,4 +1,4 @@ -from unittest.mock import MagicMock # , PropertyMock +from unittest.mock import MagicMock, PropertyMock from freqtrade.enums import MarginMode, TradingMode from tests.conftest import get_patched_exchange @@ -172,7 +172,11 @@ def test_get_max_pair_stake_amount_okx(default_conf, mocker, leverage_tiers): def test_load_leverage_tiers_okx(default_conf, mocker, markets): api_mock = MagicMock() - api_mock.fetch_leverage_tiers = MagicMock(side_effect=[ + type(api_mock).has = PropertyMock(return_value={ + 'fetchLeverageTiers': False, + 'fetchMarketLeverageTiers': True, + }) + api_mock.fetch_market_leverage_tiers = MagicMock(side_effect=[ { 'ADA/USDT:USDT': [ {