Merge pull request #6914 from freqtrade/leverage_tiers_async
Leverage tiers async
This commit is contained in:
		| @@ -2131,10 +2131,11 @@ class Exchange: | ||||
|         except ccxt.BaseError as e: | ||||
|             raise OperationalException(e) from e | ||||
|  | ||||
|     @retrier | ||||
|     def get_market_leverage_tiers(self, symbol) -> List[Dict]: | ||||
|     @retrier_async | ||||
|     async def get_market_leverage_tiers(self, symbol: str) -> Tuple[str, List[Dict]]: | ||||
|         try: | ||||
|             return self._api.fetch_market_leverage_tiers(symbol) | ||||
|             tier = await self._api_async.fetch_market_leverage_tiers(symbol) | ||||
|             return symbol, tier | ||||
|         except ccxt.DDoSProtection as e: | ||||
|             raise DDosProtection(e) from e | ||||
|         except (ccxt.NetworkError, ccxt.ExchangeError) as e: | ||||
| @@ -2168,8 +2169,14 @@ class Exchange: | ||||
|                     f"Initializing leverage_tiers for {len(symbols)} markets. " | ||||
|                     "This will take about a minute.") | ||||
|  | ||||
|                 for symbol in sorted(symbols): | ||||
|                     tiers[symbol] = self.get_market_leverage_tiers(symbol) | ||||
|                 coros = [self.get_market_leverage_tiers(symbol) for symbol in sorted(symbols)] | ||||
|  | ||||
|                 for input_coro in chunks(coros, 100): | ||||
|  | ||||
|                     results = self.loop.run_until_complete( | ||||
|                         asyncio.gather(*input_coro, return_exceptions=True)) | ||||
|                     for symbol, res in results: | ||||
|                         tiers[symbol] = res | ||||
|  | ||||
|                 logger.info(f"Done initializing {len(symbols)} markets.") | ||||
|  | ||||
|   | ||||
| @@ -78,9 +78,21 @@ def get_args(args): | ||||
|  | ||||
|  | ||||
| # Source: https://stackoverflow.com/questions/29881236/how-to-mock-asyncio-coroutines | ||||
| def get_mock_coro(return_value): | ||||
| # TODO: This should be replaced with AsyncMock once support for python 3.7 is dropped. | ||||
| def get_mock_coro(return_value=None, side_effect=None): | ||||
|     async def mock_coro(*args, **kwargs): | ||||
|         return return_value | ||||
|         if side_effect: | ||||
|             if isinstance(side_effect, list): | ||||
|                 effect = side_effect.pop(0) | ||||
|             else: | ||||
|                 effect = side_effect | ||||
|             if isinstance(effect, Exception): | ||||
|                 raise effect | ||||
|             if callable(effect): | ||||
|                 return effect(*args, **kwargs) | ||||
|             return effect | ||||
|         else: | ||||
|             return return_value | ||||
|  | ||||
|     return Mock(wraps=mock_coro) | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import pytest | ||||
| from freqtrade.enums import MarginMode, TradingMode | ||||
| from freqtrade.enums.candletype import CandleType | ||||
| from freqtrade.exchange.exchange import timeframe_to_minutes | ||||
| from tests.conftest import get_patched_exchange | ||||
| from tests.conftest import get_mock_coro, get_patched_exchange | ||||
| from tests.exchange.test_exchange import ccxt_exceptionhandlers | ||||
|  | ||||
|  | ||||
| @@ -273,7 +273,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets): | ||||
|         'fetchLeverageTiers': False, | ||||
|         'fetchMarketLeverageTiers': True, | ||||
|     }) | ||||
|     api_mock.fetch_market_leverage_tiers = MagicMock(side_effect=[ | ||||
|     api_mock.fetch_market_leverage_tiers = get_mock_coro(side_effect=[ | ||||
|         [ | ||||
|             { | ||||
|                 'tier': 1, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user