Merge pull request #6914 from freqtrade/leverage_tiers_async
Leverage tiers async
This commit is contained in:
commit
3a0f31fe89
@ -2131,10 +2131,11 @@ class Exchange:
|
|||||||
except ccxt.BaseError as e:
|
except ccxt.BaseError as e:
|
||||||
raise OperationalException(e) from e
|
raise OperationalException(e) from e
|
||||||
|
|
||||||
@retrier
|
@retrier_async
|
||||||
def get_market_leverage_tiers(self, symbol) -> List[Dict]:
|
async def get_market_leverage_tiers(self, symbol: str) -> Tuple[str, List[Dict]]:
|
||||||
try:
|
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:
|
except ccxt.DDoSProtection as e:
|
||||||
raise DDosProtection(e) from e
|
raise DDosProtection(e) from e
|
||||||
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
|
except (ccxt.NetworkError, ccxt.ExchangeError) as e:
|
||||||
@ -2168,8 +2169,14 @@ class Exchange:
|
|||||||
f"Initializing leverage_tiers for {len(symbols)} markets. "
|
f"Initializing leverage_tiers for {len(symbols)} markets. "
|
||||||
"This will take about a minute.")
|
"This will take about a minute.")
|
||||||
|
|
||||||
for symbol in sorted(symbols):
|
coros = [self.get_market_leverage_tiers(symbol) for symbol in sorted(symbols)]
|
||||||
tiers[symbol] = self.get_market_leverage_tiers(symbol)
|
|
||||||
|
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.")
|
logger.info(f"Done initializing {len(symbols)} markets.")
|
||||||
|
|
||||||
|
@ -78,8 +78,20 @@ def get_args(args):
|
|||||||
|
|
||||||
|
|
||||||
# Source: https://stackoverflow.com/questions/29881236/how-to-mock-asyncio-coroutines
|
# 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):
|
async def mock_coro(*args, **kwargs):
|
||||||
|
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 return_value
|
||||||
|
|
||||||
return Mock(wraps=mock_coro)
|
return Mock(wraps=mock_coro)
|
||||||
|
@ -6,7 +6,7 @@ import pytest
|
|||||||
from freqtrade.enums import MarginMode, TradingMode
|
from freqtrade.enums import MarginMode, TradingMode
|
||||||
from freqtrade.enums.candletype import CandleType
|
from freqtrade.enums.candletype import CandleType
|
||||||
from freqtrade.exchange.exchange import timeframe_to_minutes
|
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
|
from tests.exchange.test_exchange import ccxt_exceptionhandlers
|
||||||
|
|
||||||
|
|
||||||
@ -273,7 +273,7 @@ def test_load_leverage_tiers_okx(default_conf, mocker, markets):
|
|||||||
'fetchLeverageTiers': False,
|
'fetchLeverageTiers': False,
|
||||||
'fetchMarketLeverageTiers': True,
|
'fetchMarketLeverageTiers': True,
|
||||||
})
|
})
|
||||||
api_mock.fetch_market_leverage_tiers = MagicMock(side_effect=[
|
api_mock.fetch_market_leverage_tiers = get_mock_coro(side_effect=[
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
'tier': 1,
|
'tier': 1,
|
||||||
|
Loading…
Reference in New Issue
Block a user