moved okex.load_leverage_tiers to new method
This commit is contained in:
		| @@ -74,7 +74,6 @@ 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", | ||||||
|         "can_fetch_multiple_tiers": True, |  | ||||||
|     } |     } | ||||||
|     _ft_has: Dict = {} |     _ft_has: Dict = {} | ||||||
|  |  | ||||||
| @@ -1875,18 +1874,44 @@ class Exchange: | |||||||
|  |  | ||||||
|     @retrier |     @retrier | ||||||
|     def load_leverage_tiers(self) -> Dict[str, List[Dict]]: |     def load_leverage_tiers(self) -> Dict[str, List[Dict]]: | ||||||
|         if self.trading_mode == TradingMode.FUTURES and self.exchange_has('fetchLeverageTiers'): |         if self.trading_mode == TradingMode.FUTURES: | ||||||
|             try: |             if self.exchange_has('fetchLeverageTiers'): | ||||||
|                 return self._api.fetch_leverage_tiers() |                 try: | ||||||
|             except ccxt.DDoSProtection as e: |                     return self._api.fetch_leverage_tiers() | ||||||
|                 raise DDosProtection(e) from e |                 except ccxt.DDoSProtection as e: | ||||||
|             except (ccxt.NetworkError, ccxt.ExchangeError) as e: |                     raise DDosProtection(e) from e | ||||||
|                 raise TemporaryError( |                 except (ccxt.NetworkError, ccxt.ExchangeError) as e: | ||||||
|                     f'Could not load leverage tiers due to {e.__class__.__name__}.' |                     raise TemporaryError( | ||||||
|                     f'Message: {e}' |                         f'Could not load leverage tiers due to {e.__class__.__name__}.' | ||||||
|                 ) from e |                         f'Message: {e}' | ||||||
|             except ccxt.BaseError as e: |                     ) from e | ||||||
|                 raise OperationalException(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: |         else: | ||||||
|             return {} |             return {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ class Okx(Exchange): | |||||||
|         "ohlcv_candle_limit": 300, |         "ohlcv_candle_limit": 300, | ||||||
|         "mark_ohlcv_timeframe": "4h", |         "mark_ohlcv_timeframe": "4h", | ||||||
|         "funding_fee_timeframe": "8h", |         "funding_fee_timeframe": "8h", | ||||||
|         "can_fetch_multiple_tiers": False, |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ |     _supported_trading_mode_margin_pairs: List[Tuple[TradingMode, MarginMode]] = [ | ||||||
| @@ -93,31 +92,3 @@ class Okx(Exchange): | |||||||
|  |  | ||||||
|         pair_tiers = self._leverage_tiers[pair] |         pair_tiers = self._leverage_tiers[pair] | ||||||
|         return pair_tiers[-1]['max'] / leverage |         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 {} |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| from unittest.mock import MagicMock  # , PropertyMock | from unittest.mock import MagicMock, PropertyMock | ||||||
|  |  | ||||||
| from freqtrade.enums import MarginMode, TradingMode | from freqtrade.enums import MarginMode, TradingMode | ||||||
| from tests.conftest import get_patched_exchange | 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): | def test_load_leverage_tiers_okx(default_conf, mocker, markets): | ||||||
|     api_mock = MagicMock() |     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': [ |             'ADA/USDT:USDT': [ | ||||||
|                 { |                 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user