From af16ce874c2bfe53b73f886bce04cf083fe68017 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Jun 2023 09:50:40 +0200 Subject: [PATCH] Allow webserver mode to cache multiple exchanges --- freqtrade/rpc/api_server/api_background_tasks.py | 1 - freqtrade/rpc/api_server/deps.py | 16 +++++++++++++--- freqtrade/rpc/api_server/webserver_bgwork.py | 8 +++++--- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/freqtrade/rpc/api_server/api_background_tasks.py b/freqtrade/rpc/api_server/api_background_tasks.py index 4cf2f7994..3aa432995 100644 --- a/freqtrade/rpc/api_server/api_background_tasks.py +++ b/freqtrade/rpc/api_server/api_background_tasks.py @@ -98,7 +98,6 @@ def pairlists_evaluate(payload: PairListsPayload, background_tasks: BackgroundTa 'result': {}, 'error': None, } - ApiBG.running_jobs.append(job_id) background_tasks.add_task(__run_pairlist, job_id, config_loc) ApiBG.pairlist_running = True diff --git a/freqtrade/rpc/api_server/deps.py b/freqtrade/rpc/api_server/deps.py index 4c118d274..bface89bd 100644 --- a/freqtrade/rpc/api_server/deps.py +++ b/freqtrade/rpc/api_server/deps.py @@ -3,6 +3,7 @@ from uuid import uuid4 from fastapi import Depends, HTTPException +from freqtrade.constants import Config from freqtrade.enums import RunMode from freqtrade.persistence import Trade from freqtrade.persistence.models import _request_id_ctx_var @@ -43,12 +44,21 @@ def get_api_config() -> Dict[str, Any]: return ApiServer._config['api_server'] +def _generate_exchange_key(config: Config) -> str: + """ + Exchange key - used for caching the exchange object. + """ + return f"{config['exchange']['name']}_{config.get('trading_mode', 'spot')}" + + def get_exchange(config=Depends(get_config)): - if not ApiBG.exchange: + exchange_key = _generate_exchange_key(config) + if not (exchange := ApiBG.exchanges.get(exchange_key)): from freqtrade.resolvers import ExchangeResolver - ApiBG.exchange = ExchangeResolver.load_exchange( + exchange = ExchangeResolver.load_exchange( config, load_leverage_tiers=False) - return ApiBG.exchange + ApiBG.exchanges[exchange_key] = exchange + return exchange def get_message_stream(): diff --git a/freqtrade/rpc/api_server/webserver_bgwork.py b/freqtrade/rpc/api_server/webserver_bgwork.py index d4c36536c..3846fe138 100644 --- a/freqtrade/rpc/api_server/webserver_bgwork.py +++ b/freqtrade/rpc/api_server/webserver_bgwork.py @@ -1,7 +1,9 @@ -from typing import Any, Dict, List, Literal, Optional, TypedDict +from typing import Any, Dict, Literal, Optional, TypedDict from uuid import uuid4 +from freqtrade.exchange.exchange import Exchange + class JobsContainer(TypedDict): category: Literal['pairlist'] @@ -23,10 +25,10 @@ class ApiBG(): } bgtask_running: bool = False # Exchange - only available in webserver mode. - exchange = None + exchanges: Dict[str, Exchange] = {} # Generic background jobs - running_jobs: List[str] = [] + # TODO: Change this to TTLCache jobs: Dict[str, JobsContainer] = {} # Pairlist evaluate things