From 0c34104e45f4fbeae66036452ade47fff13ff058 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 17 Aug 2022 15:18:44 +0200 Subject: [PATCH 001/437] extract download-data from freqai to prepare for future async changes --- freqtrade/freqai/data_kitchen.py | 102 ++++++++++++++++++++------- freqtrade/freqai/freqai_interface.py | 12 ++-- freqtrade/strategy/interface.py | 13 +++- 3 files changed, 94 insertions(+), 33 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 35f51baed..4554a5c1a 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -816,7 +816,7 @@ class FreqaiDataKitchen: return False def check_if_new_training_required( - self, trained_timestamp: int + self, trained_timestamp: int = 0 ) -> Tuple[bool, TimeRange, TimeRange]: time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() @@ -889,31 +889,6 @@ class FreqaiDataKitchen: self.model_filename = f"cb_{coin.lower()}_{int(trained_timerange.stopts)}" - def download_all_data_for_training(self, timerange: TimeRange, dp: DataProvider) -> None: - """ - Called only once upon start of bot to download the necessary data for - populating indicators and training the model. - :param timerange: TimeRange = The full data timerange for populating the indicators - and training the model. - :param dp: DataProvider instance attached to the strategy - """ - new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) - if not dp._exchange: - # Not realistic - this is only called in live mode. - raise OperationalException("Dataprovider did not have an exchange attached.") - refresh_backtest_ohlcv_data( - dp._exchange, - pairs=self.all_pairs, - timeframes=self.freqai_config["feature_parameters"].get("include_timeframes"), - datadir=self.config["datadir"], - timerange=timerange, - new_pairs_days=new_pairs_days, - erase=False, - data_format=self.config.get("dataformat_ohlcv", "json"), - trading_mode=self.config.get("trading_mode", "spot"), - prepend=self.config.get("prepend_data", False), - ) - def set_all_pairs(self) -> None: self.all_pairs = copy.deepcopy( @@ -1027,3 +1002,78 @@ class FreqaiDataKitchen: if self.unique_classes: for label in self.unique_classes: self.unique_class_list += list(self.unique_classes[label]) + +# Methods called by interface.py (load_freqai_model()) + + +def download_all_data_for_training(timerange: TimeRange, + dp: DataProvider, config: dict) -> None: + """ + Called only once upon start of bot to download the necessary data for + populating indicators and training the model. + :param timerange: TimeRange = The full data timerange for populating the indicators + and training the model. + :param dp: DataProvider instance attached to the strategy + """ + all_pairs = copy.deepcopy( + config["freqai"]["feature_parameters"].get("include_corr_pairlist", []) + ) + for pair in config.get("exchange", "").get("pair_whitelist"): + if pair not in all_pairs: + all_pairs.append(pair) + + new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) + if not dp._exchange: + # Not realistic - this is only called in live mode. + raise OperationalException("Dataprovider did not have an exchange attached.") + refresh_backtest_ohlcv_data( + dp._exchange, + pairs=all_pairs, + timeframes=config["freqai"]["feature_parameters"].get("include_timeframes"), + datadir=config["datadir"], + timerange=timerange, + new_pairs_days=new_pairs_days, + erase=False, + data_format=config.get("dataformat_ohlcv", "json"), + trading_mode=config.get("trading_mode", "spot"), + prepend=config.get("prepend_data", False), + ) + + +def get_required_data_timerange( + config: dict +) -> TimeRange: + """ + Used by interface.py to pre-download necessary data for FreqAI + user. + """ + time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() + trained_timerange = TimeRange() + data_load_timerange = TimeRange() + + timeframes = config["freqai"]["feature_parameters"].get("include_timeframes") + + max_tf_seconds = 0 + for tf in timeframes: + secs = timeframe_to_seconds(tf) + if secs > max_tf_seconds: + max_tf_seconds = secs + + max_period = config["freqai"]["feature_parameters"].get( + "indicator_max_period_candles", 20 + ) * 2 + additional_seconds = max_period * max_tf_seconds + + trained_timerange.startts = int( + time - config["freqai"].get("train_period_days", 0) * SECONDS_IN_DAY + ) + trained_timerange.stopts = int(time) + + data_load_timerange.startts = int( + time + - config["freqai"].get("train_period_days", 0) * SECONDS_IN_DAY + - additional_seconds + ) + data_load_timerange.stopts = int(time) + + return data_load_timerange diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 49e4ce5c3..5d85cc225 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -278,12 +278,12 @@ class IFreqaiModel(ABC): # download candle history if it is not already in memory if not self.dd.historic_data: - logger.info( - "Downloading all training data for all pairs in whitelist and " - "corr_pairlist, this may take a while if you do not have the " - "data saved" - ) - dk.download_all_data_for_training(data_load_timerange, strategy.dp) + # logger.info( + # "Downloading all training data for all pairs in whitelist and " + # "corr_pairlist, this may take a while if you do not have the " + # "data saved" + # ) + # dk.download_all_data_for_training(data_load_timerange, strategy.dp) self.dd.load_all_pair_histories(data_load_timerange, dk) if not self.scanning: diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 79dbd4c69..20a35ac3e 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -149,9 +149,20 @@ class IStrategy(ABC, HyperStrategyMixin): if self.config.get('freqai', {}).get('enabled', False): # Import here to avoid importing this if freqAI is disabled from freqtrade.resolvers.freqaimodel_resolver import FreqaiModelResolver - + from freqtrade.freqai.data_kitchen import (get_required_data_timerange, + download_all_data_for_training) self.freqai = FreqaiModelResolver.load_freqaimodel(self.config) self.freqai_info = self.config["freqai"] + + # download the desired data in dry/live + if self.config.get('runmode') in (RunMode.DRY_RUN, RunMode.LIVE): + logger.info( + "Downloading all training data for all pairs in whitelist and " + "corr_pairlist, this may take a while if you do not have the " + "data saved" + ) + data_load_timerange = get_required_data_timerange(self.config) + download_all_data_for_training(data_load_timerange, self.dp, self.config) else: # Gracious failures if freqAI is disabled but "start" is called. class DummyClass(): From 5155afb4e7adb62b219fab65df86ac29524e405a Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 17 Aug 2022 15:22:48 +0200 Subject: [PATCH 002/437] clean up code remnants --- freqtrade/freqai/data_kitchen.py | 2 +- freqtrade/freqai/freqai_interface.py | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 4554a5c1a..6541261eb 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -816,7 +816,7 @@ class FreqaiDataKitchen: return False def check_if_new_training_required( - self, trained_timestamp: int = 0 + self, trained_timestamp: int ) -> Tuple[bool, TimeRange, TimeRange]: time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 5d85cc225..1a9e549f6 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -276,14 +276,8 @@ class IFreqaiModel(ABC): ) dk.set_paths(metadata["pair"], new_trained_timerange.stopts) - # download candle history if it is not already in memory + # load candle history into memory if it is not yet. if not self.dd.historic_data: - # logger.info( - # "Downloading all training data for all pairs in whitelist and " - # "corr_pairlist, this may take a while if you do not have the " - # "data saved" - # ) - # dk.download_all_data_for_training(data_load_timerange, strategy.dp) self.dd.load_all_pair_histories(data_load_timerange, dk) if not self.scanning: From 88dd9920ea9dd66c17a55fad4d6fb69cacefb8c2 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 17 Aug 2022 16:38:09 +0200 Subject: [PATCH 003/437] sort imports for isort --- freqtrade/strategy/interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 20a35ac3e..1e51701f7 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -148,9 +148,9 @@ class IStrategy(ABC, HyperStrategyMixin): def load_freqAI_model(self) -> None: if self.config.get('freqai', {}).get('enabled', False): # Import here to avoid importing this if freqAI is disabled + from freqtrade.freqai.data_kitchen import (download_all_data_for_training, + get_required_data_timerange) from freqtrade.resolvers.freqaimodel_resolver import FreqaiModelResolver - from freqtrade.freqai.data_kitchen import (get_required_data_timerange, - download_all_data_for_training) self.freqai = FreqaiModelResolver.load_freqaimodel(self.config) self.freqai_info = self.config["freqai"] From 9f6bba40af1a407f190a89f5c0c8b4e3f528ba46 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 18 Aug 2022 10:39:20 -0600 Subject: [PATCH 004/437] initial concept for replicate, basic leader and follower logic --- .gitignore | 2 + freqtrade/__init__.py | 2 +- freqtrade/constants.py | 28 + freqtrade/enums/__init__.py | 1 + freqtrade/enums/replicate.py | 11 + freqtrade/enums/rpcmessagetype.py | 2 + freqtrade/rpc/api_server/webserver.py | 8 +- freqtrade/rpc/replicate/__init__.py | 385 ++++++++++++++ freqtrade/rpc/replicate/channel.py | 106 ++++ freqtrade/rpc/replicate/proxy.py | 60 +++ freqtrade/rpc/replicate/serializer.py | 42 ++ freqtrade/rpc/replicate/thread_queue.py | 650 ++++++++++++++++++++++++ freqtrade/rpc/replicate/types.py | 9 + freqtrade/rpc/replicate/utils.py | 10 + freqtrade/rpc/rpc_manager.py | 13 + requirements-replicate.txt | 5 + 16 files changed, 1330 insertions(+), 4 deletions(-) create mode 100644 freqtrade/enums/replicate.py create mode 100644 freqtrade/rpc/replicate/__init__.py create mode 100644 freqtrade/rpc/replicate/channel.py create mode 100644 freqtrade/rpc/replicate/proxy.py create mode 100644 freqtrade/rpc/replicate/serializer.py create mode 100644 freqtrade/rpc/replicate/thread_queue.py create mode 100644 freqtrade/rpc/replicate/types.py create mode 100644 freqtrade/rpc/replicate/utils.py create mode 100644 requirements-replicate.txt diff --git a/.gitignore b/.gitignore index e400c01f5..df2121990 100644 --- a/.gitignore +++ b/.gitignore @@ -113,3 +113,5 @@ target/ !config_examples/config_full.example.json !config_examples/config_kraken.example.json !config_examples/config_freqai.example.json + +*-config.json diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index 2572c03f1..9e022b2d9 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,5 +1,5 @@ """ Freqtrade bot """ -__version__ = '2022.8.dev' +__version__ = '2022.8.1+pubsub' # Metadata 1.2 mandates PEP 440 version, but 'develop' is not if 'dev' in __version__: try: diff --git a/freqtrade/constants.py b/freqtrade/constants.py index ddbc84fa9..416b4646f 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -60,6 +60,8 @@ USERPATH_FREQAIMODELS = 'freqaimodels' TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw'] +FOLLOWER_MODE_OPTIONS = ['follower', 'leader'] + ENV_VAR_PREFIX = 'FREQTRADE__' NON_OPEN_EXCHANGE_STATES = ('cancelled', 'canceled', 'closed', 'expired') @@ -242,6 +244,7 @@ CONF_SCHEMA = { 'exchange': {'$ref': '#/definitions/exchange'}, 'edge': {'$ref': '#/definitions/edge'}, 'freqai': {'$ref': '#/definitions/freqai'}, + 'replicate': {'$ref': '#/definitions/replicate'}, 'experimental': { 'type': 'object', 'properties': { @@ -483,6 +486,31 @@ CONF_SCHEMA = { }, 'required': ['process_throttle_secs', 'allowed_risk'] }, + 'replicate': { + 'type': 'object', + 'properties': { + 'enabled': {'type': 'boolean', 'default': False}, + 'mode': { + 'type': 'string', + 'enum': FOLLOWER_MODE_OPTIONS + }, + 'api_key': {'type': 'string', 'default': ''}, + 'leaders': { + 'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'url': {'type': 'string', 'default': ''}, + 'token': {'type': 'string', 'default': ''}, + } + } + }, + 'follower_reply_timeout': {'type': 'integer'}, + 'follower_sleep_time': {'type': 'integer'}, + 'follower_ping_timeout': {'type': 'integer'}, + }, + 'required': ['mode'] + }, "freqai": { "type": "object", "properties": { diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index e50ebc4a4..e1057208a 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -5,6 +5,7 @@ from freqtrade.enums.exitchecktuple import ExitCheckTuple from freqtrade.enums.exittype import ExitType from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues +from freqtrade.enums.replicate import LeaderMessageType, ReplicateModeType from freqtrade.enums.rpcmessagetype import RPCMessageType from freqtrade.enums.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode from freqtrade.enums.signaltype import SignalDirection, SignalTagType, SignalType diff --git a/freqtrade/enums/replicate.py b/freqtrade/enums/replicate.py new file mode 100644 index 000000000..d55d45b45 --- /dev/null +++ b/freqtrade/enums/replicate.py @@ -0,0 +1,11 @@ +from enum import Enum + + +class ReplicateModeType(str, Enum): + leader = "leader" + follower = "follower" + + +class LeaderMessageType(str, Enum): + Pairlist = "pairlist" + Dataframe = "dataframe" diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 415d8f18c..d5b3ce89c 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -19,6 +19,8 @@ class RPCMessageType(Enum): STRATEGY_MSG = 'strategy_msg' + EMIT_DATA = 'emit_data' + def __repr__(self): return self.value diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 0da129583..c98fb9fd4 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -54,7 +54,11 @@ class ApiServer(RPCHandler): ApiServer.__initialized = False return ApiServer.__instance - def __init__(self, config: Dict[str, Any], standalone: bool = False) -> None: + def __init__( + self, + config: Dict[str, Any], + standalone: bool = False, + ) -> None: ApiServer._config = config if self.__initialized and (standalone or self._standalone): return @@ -71,8 +75,6 @@ class ApiServer(RPCHandler): ) self.configure_app(self.app, self._config) - self.start_api() - def add_rpc_handler(self, rpc: RPC): """ Attach rpc handler diff --git a/freqtrade/rpc/replicate/__init__.py b/freqtrade/rpc/replicate/__init__.py new file mode 100644 index 000000000..d725a4a90 --- /dev/null +++ b/freqtrade/rpc/replicate/__init__.py @@ -0,0 +1,385 @@ +""" +This module manages replicate mode communication +""" +import asyncio +import logging +import secrets +import socket +from threading import Thread +from typing import Any, Coroutine, Dict, Union + +import websockets +from fastapi import Depends +from fastapi import WebSocket as FastAPIWebSocket +from fastapi import WebSocketDisconnect, status + +from freqtrade.enums import LeaderMessageType, ReplicateModeType, RPCMessageType +from freqtrade.rpc import RPC, RPCHandler +from freqtrade.rpc.replicate.channel import ChannelManager +from freqtrade.rpc.replicate.thread_queue import Queue as ThreadedQueue +from freqtrade.rpc.replicate.utils import is_websocket_alive + + +logger = logging.getLogger(__name__) + + +class ReplicateController(RPCHandler): + """ This class handles all websocket communication """ + + def __init__( + self, + rpc: RPC, + config: Dict[str, Any], + api_server: Union[Any, None] = None + ) -> None: + """ + Init the ReplicateRPC class, and init the super class RPCHandler + :param rpc: instance of RPC Helper class + :param config: Configuration object + :return: None + """ + super().__init__(rpc, config) + + self.api_server = api_server + + if not self.api_server: + raise RuntimeError("The API server must be enabled for replicate to work") + + self._loop = None + self._running = False + self._thread = None + self._queue = None + + self.channel_manager = ChannelManager() + + self.replicate_config = config.get('replicate', {}) + + # What the config should look like + # "replicate": { + # "enabled": true, + # "mode": "follower", + # "leaders": [ + # { + # "url": "ws://localhost:8080/replicate/ws", + # "token": "test" + # } + # ] + # } + + # "replicate": { + # "enabled": true, + # "mode": "leader", + # "api_key": "test" + # } + + self.mode = ReplicateModeType[self.replicate_config.get('mode', 'leader').lower()] + + self.leaders_list = self.replicate_config.get('leaders', []) + self.push_throttle_secs = self.replicate_config.get('push_throttle_secs', 1) + + self.reply_timeout = self.replicate_config.get('follower_reply_timeout', 10) + self.ping_timeout = self.replicate_config.get('follower_ping_timeout', 2) + self.sleep_time = self.replicate_config.get('follower_sleep_time', 1) + + if self.mode == ReplicateModeType.follower and len(self.leaders_list) == 0: + raise ValueError("You must specify at least 1 leader in follower mode.") + + # This is only used by the leader, the followers use the tokens specified + # in each of the leaders + # If you do not specify an API key in the config, one will be randomly + # generated and logged on startup + default_api_key = secrets.token_urlsafe(16) + self.secret_api_key = self.replicate_config.get('api_key', default_api_key) + + self.start_threaded_loop() + + if self.mode == ReplicateModeType.follower: + self.start_follower_mode() + elif self.mode == ReplicateModeType.leader: + self.start_leader_mode() + + def start_threaded_loop(self): + """ + Start the main internal loop in another thread to run coroutines + """ + self._loop = asyncio.new_event_loop() + + if not self._thread: + self._thread = Thread(target=self._loop.run_forever) + self._thread.start() + self._running = True + else: + raise RuntimeError("A loop is already running") + + def submit_coroutine(self, coroutine: Coroutine): + """ + Submit a coroutine to the threaded loop + """ + if not self._running: + raise RuntimeError("Cannot schedule new futures after shutdown") + + if not self._loop or not self._loop.is_running(): + raise RuntimeError("Loop must be started before any function can" + " be submitted") + + logger.debug(f"Running coroutine {repr(coroutine)} in loop") + try: + return asyncio.run_coroutine_threadsafe(coroutine, self._loop) + except Exception as e: + logger.error(f"Error running coroutine - {str(e)}") + return None + + def cleanup(self) -> None: + """ + Cleanup pending module resources. + """ + if self._thread: + if self._loop.is_running(): + + self._running = False + + # Tell all coroutines submitted to the loop they're cancelled + pending = asyncio.all_tasks(loop=self._loop) + for task in pending: + task.cancel() + + self._loop.call_soon_threadsafe(self.channel_manager.disconnect_all) + # This must be called threadsafe, otherwise would not work + self._loop.call_soon_threadsafe(self._loop.stop) + + self._thread.join() + + def send_msg(self, msg: Dict[str, Any]) -> None: + """ Push message through """ + + if msg["type"] == RPCMessageType.EMIT_DATA: + self._send_message( + { + "type": msg["data_type"], + "content": msg["data"] + } + ) + + # ----------------------- LEADER LOGIC ------------------------------ + + def start_leader_mode(self): + """ + Register the endpoint and start the leader loop + """ + + logger.info("Running rpc.replicate in Leader mode") + logger.info("-" * 15) + logger.info(f"API_KEY: {self.secret_api_key}") + logger.info("-" * 15) + + self.register_leader_endpoint() + self.submit_coroutine(self.leader_loop()) + + async def leader_loop(self): + """ + Main leader coroutine + At the moment this just broadcasts data that's in the queue to the followers + """ + try: + await self._broadcast_queue_data() + except Exception as e: + logger.error("Exception occurred in leader loop: ") + logger.exception(e) + + def _send_message(self, data: Dict[Any, Any]): + """ + Add data to the internal queue to be broadcasted. This func will block + if the queue is full. This is meant to be called in the main thread. + """ + + if self._queue: + self._queue.put(data) + else: + logger.warning("Can not send data, leader loop has not started yet!") + + async def _broadcast_queue_data(self): + """ + Loop over queue data and broadcast it + """ + # Instantiate the queue in this coroutine so it's attached to our loop + self._queue = ThreadedQueue() + async_queue = self._queue.async_q + + try: + while self._running: + # Get data from queue + data = await async_queue.get() + + # Broadcast it to everyone + await self.channel_manager.broadcast(data) + + # Sleep + await asyncio.sleep(self.push_throttle_secs) + except asyncio.CancelledError: + # Silently stop + pass + + async def get_api_token( + self, + websocket: FastAPIWebSocket, + token: Union[str, None] = None + ): + """ + Extract the API key from query param. Must match the + set secret_api_key or the websocket connection will be closed. + """ + if token == self.secret_api_key: + return token + else: + logger.info("Denying websocket request...") + await websocket.close(code=status.WS_1008_POLICY_VIOLATION) + + def register_leader_endpoint(self, path: str = "/replicate/ws"): + """ + Attach and start the main leader loop to the ApiServer + + :param path: The endpoint path + """ + + if not self.api_server: + raise RuntimeError("The leader needs the ApiServer to be active") + + # The endpoint function for running the main leader loop + @self.api_server.app.websocket(path) + async def leader_endpoint( + websocket: FastAPIWebSocket, + api_key: str = Depends(self.get_api_token) + ): + await self.leader_endpoint_loop(websocket) + + async def leader_endpoint_loop(self, websocket: FastAPIWebSocket): + """ + The WebSocket endpoint served by the ApiServer. This handles connections, + and adding them to the channel manager. + """ + try: + if is_websocket_alive(websocket): + logger.info(f"Follower connected - {websocket.client}") + channel = await self.channel_manager.on_connect(websocket) + + # Send initial data here + + # Keep connection open until explicitly closed, and sleep + try: + while not channel.is_closed(): + await channel.recv() + + except WebSocketDisconnect: + # Handle client disconnects + logger.info(f"Follower disconnected - {websocket.client}") + await self.channel_manager.on_disconnect(websocket) + except Exception as e: + logger.info(f"Follower connection failed - {websocket.client}") + logger.exception(e) + # Handle cases like - + # RuntimeError('Cannot call "send" once a closed message has been sent') + await self.channel_manager.on_disconnect(websocket) + + except Exception: + logger.error(f"Failed to serve - {websocket.client}") + await self.channel_manager.on_disconnect(websocket) + + # -------------------------------FOLLOWER LOGIC---------------------------- + + def start_follower_mode(self): + """ + Start the ReplicateController in Follower mode + """ + logger.info("Starting rpc.replicate in Follower mode") + + self.submit_coroutine(self.follower_loop()) + + async def follower_loop(self): + """ + Main follower coroutine + + This starts all of the leader connection coros + """ + try: + await self._connect_to_leaders() + except Exception as e: + logger.error("Exception occurred in follower loop: ") + logger.exception(e) + + async def _connect_to_leaders(self): + rpc_lock = asyncio.Lock() + + logger.info("Starting connections to Leaders...") + await asyncio.wait( + [ + self._handle_leader_connection(leader, rpc_lock) + for leader in self.leaders_list + ] + ) + + async def _handle_leader_connection(self, leader, lock): + """ + Given a leader, connect and wait on data. If connection is lost, + it will attempt to reconnect. + """ + url, token = leader["url"], leader["token"] + + websocket_url = f"{url}?token={token}" + + logger.info(f"Attempting to connect to leader at: {url}") + # TODO: limit the amount of connection retries + while True: + try: + async with websockets.connect(websocket_url) as ws: + channel = await self.channel_manager.on_connect(ws) + while True: + try: + data = await asyncio.wait_for( + channel.recv(), + timeout=self.reply_timeout + ) + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Just check the connection and continue. + try: + # ping + ping = await channel.ping() + await asyncio.wait_for(ping, timeout=self.ping_timeout) + logger.info(f"Connection to {url} still alive...") + continue + except Exception: + logger.info(f"Ping error {url} - retrying in {self.sleep_time}s") + asyncio.sleep(self.sleep_time) + break + + with lock: + # Should we have a lock here? + await self._handle_leader_message(data) + + except socket.gaierror: + logger.info(f"Socket error - retrying connection in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + continue + except ConnectionRefusedError: + logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + continue + + async def _handle_leader_message(self, message): + type = message.get("type") + + message_type_handlers = { + LeaderMessageType.Pairlist.value: self._handle_pairlist_message, + LeaderMessageType.Dataframe.value: self._handle_dataframe_message + } + + handler = message_type_handlers.get(type, self._handle_default_message) + return await handler(message) + + async def _handle_default_message(self, message): + logger.info(f"Default message handled: {message}") + + async def _handle_pairlist_message(self, message): + logger.info(f"Pairlist message handled: {message}") + + async def _handle_dataframe_message(self, message): + logger.info(f"Dataframe message handled: {message}") diff --git a/freqtrade/rpc/replicate/channel.py b/freqtrade/rpc/replicate/channel.py new file mode 100644 index 000000000..9950742da --- /dev/null +++ b/freqtrade/rpc/replicate/channel.py @@ -0,0 +1,106 @@ +from typing import Type + +from freqtrade.rpc.replicate.proxy import WebSocketProxy +from freqtrade.rpc.replicate.serializer import JSONWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.replicate.types import WebSocketType + + +class WebSocketChannel: + """ + Object to help facilitate managing a websocket connection + """ + + def __init__( + self, + websocket: WebSocketType, + serializer_cls: Type[WebSocketSerializer] = JSONWebSocketSerializer + ): + # The WebSocket object + self._websocket = WebSocketProxy(websocket) + # The Serializing class for the WebSocket object + self._serializer_cls = serializer_cls + + # Internal event to signify a closed websocket + self._closed = False + + # Wrap the WebSocket in the Serializing class + self._wrapped_ws = self._serializer_cls(self._websocket) + + async def send(self, data): + """ + Send data on the wrapped websocket + """ + await self._wrapped_ws.send(data) + + async def recv(self): + """ + Receive data on the wrapped websocket + """ + return await self._wrapped_ws.recv() + + async def ping(self): + """ + Ping the websocket + """ + return await self._websocket.ping() + + async def close(self): + """ + Close the WebSocketChannel + """ + + self._closed = True + + def is_closed(self): + return self._closed + + +class ChannelManager: + def __init__(self): + self.channels = dict() + + async def on_connect(self, websocket: WebSocketType): + """ + Wrap websocket connection into Channel and add to list + + :param websocket: The WebSocket object to attach to the Channel + """ + if hasattr(websocket, "accept"): + try: + await websocket.accept() + except RuntimeError: + # The connection was closed before we could accept it + return + + ws_channel = WebSocketChannel(websocket) + self.channels[websocket] = ws_channel + + return ws_channel + + async def on_disconnect(self, websocket: WebSocketType): + """ + Call close on the channel if it's not, and remove from channel list + + :param websocket: The WebSocket objet attached to the Channel + """ + if websocket in self.channels.keys(): + channel = self.channels[websocket] + if not channel.is_closed(): + await channel.close() + del channel + + async def disconnect_all(self): + """ + Disconnect all Channels + """ + for websocket in self.channels.keys(): + await self.on_disconnect(websocket) + + async def broadcast(self, data): + """ + Broadcast data on all Channels + + :param data: The data to send + """ + for channel in self.channels.values(): + await channel.send(data) diff --git a/freqtrade/rpc/replicate/proxy.py b/freqtrade/rpc/replicate/proxy.py new file mode 100644 index 000000000..b2173670b --- /dev/null +++ b/freqtrade/rpc/replicate/proxy.py @@ -0,0 +1,60 @@ +from typing import TYPE_CHECKING, Union + +from fastapi import WebSocket as FastAPIWebSocket +from websockets import WebSocketClientProtocol as WebSocket + + +if TYPE_CHECKING: + from freqtrade.rpc.replicate.types import WebSocketType + + +class WebSocketProxy: + """ + WebSocketProxy object to bring the FastAPIWebSocket and websockets.WebSocketClientProtocol + under the same API + """ + + def __init__(self, websocket: WebSocketType): + self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket + + async def send(self, data): + """ + Send data on the wrapped websocket + """ + if hasattr(self._websocket, "send_bytes"): + await self._websocket.send_bytes(data) + else: + await self._websocket.send(data) + + async def recv(self): + """ + Receive data on the wrapped websocket + """ + if hasattr(self._websocket, "receive_bytes"): + return await self._websocket.receive_bytes() + else: + return await self._websocket.recv() + + async def ping(self): + """ + Ping the websocket, not supported by FastAPI WebSockets + """ + if hasattr(self._websocket, "ping"): + return await self._websocket.ping() + return False + + async def close(self, code: int = 1000): + """ + Close the websocket connection, only supported by FastAPI WebSockets + """ + if hasattr(self._websocket, "close"): + return await self._websocket.close(code) + pass + + async def accept(self): + """ + Accept the WebSocket connection, only support by FastAPI WebSockets + """ + if hasattr(self._websocket, "accept"): + return await self._websocket.accept() + pass diff --git a/freqtrade/rpc/replicate/serializer.py b/freqtrade/rpc/replicate/serializer.py new file mode 100644 index 000000000..ae5e57b95 --- /dev/null +++ b/freqtrade/rpc/replicate/serializer.py @@ -0,0 +1,42 @@ +import json +from abc import ABC, abstractmethod + +from freqtrade.rpc.replicate.proxy import WebSocketProxy + + +class WebSocketSerializer(ABC): + def __init__(self, websocket: WebSocketProxy): + self._websocket: WebSocketProxy = websocket + + @abstractmethod + def _serialize(self, data): + raise NotImplementedError() + + @abstractmethod + def _deserialize(self, data): + raise NotImplementedError() + + async def send(self, data: bytes): + await self._websocket.send(self._serialize(data)) + + async def recv(self) -> bytes: + data = await self._websocket.recv() + + return self._deserialize(data) + + async def close(self, code: int = 1000): + await self._websocket.close(code) + +# Going to explore using MsgPack as the serialization, +# as that might be the best method for sending pandas +# dataframes over the wire + + +class JSONWebSocketSerializer(WebSocketSerializer): + def _serialize(self, data: bytes) -> bytes: + # json expects string not bytes + return json.dumps(data.decode()).encode() + + def _deserialize(self, data: bytes) -> bytes: + # The WebSocketSerializer gives bytes not string + return json.loads(data).encode() diff --git a/freqtrade/rpc/replicate/thread_queue.py b/freqtrade/rpc/replicate/thread_queue.py new file mode 100644 index 000000000..88321321b --- /dev/null +++ b/freqtrade/rpc/replicate/thread_queue.py @@ -0,0 +1,650 @@ +import asyncio +import sys +import threading +from asyncio import QueueEmpty as AsyncQueueEmpty +from asyncio import QueueFull as AsyncQueueFull +from collections import deque +from heapq import heappop, heappush +from queue import Empty as SyncQueueEmpty +from queue import Full as SyncQueueFull +from typing import Any, Callable, Deque, Generic, List, Optional, Set, TypeVar + +from typing_extensions import Protocol + + +__version__ = "1.0.0" +__all__ = ( + "Queue", + "PriorityQueue", + "LifoQueue", + "SyncQueue", + "AsyncQueue", + "BaseQueue", +) + + +T = TypeVar("T") +OptFloat = Optional[float] + + +class BaseQueue(Protocol[T]): + @property + def maxsize(self) -> int: + ... + + @property + def closed(self) -> bool: + ... + + def task_done(self) -> None: + ... + + def qsize(self) -> int: + ... + + @property + def unfinished_tasks(self) -> int: + ... + + def empty(self) -> bool: + ... + + def full(self) -> bool: + ... + + def put_nowait(self, item: T) -> None: + ... + + def get_nowait(self) -> T: + ... + + +class SyncQueue(BaseQueue[T], Protocol[T]): + @property + def maxsize(self) -> int: + ... + + @property + def closed(self) -> bool: + ... + + def task_done(self) -> None: + ... + + def qsize(self) -> int: + ... + + @property + def unfinished_tasks(self) -> int: + ... + + def empty(self) -> bool: + ... + + def full(self) -> bool: + ... + + def put_nowait(self, item: T) -> None: + ... + + def get_nowait(self) -> T: + ... + + def put(self, item: T, block: bool = True, timeout: OptFloat = None) -> None: + ... + + def get(self, block: bool = True, timeout: OptFloat = None) -> T: + ... + + def join(self) -> None: + ... + + +class AsyncQueue(BaseQueue[T], Protocol[T]): + async def put(self, item: T) -> None: + ... + + async def get(self) -> T: + ... + + async def join(self) -> None: + ... + + +class Queue(Generic[T]): + def __init__(self, maxsize: int = 0) -> None: + self._loop = asyncio.get_running_loop() + self._maxsize = maxsize + + self._init(maxsize) + + self._unfinished_tasks = 0 + + self._sync_mutex = threading.Lock() + self._sync_not_empty = threading.Condition(self._sync_mutex) + self._sync_not_full = threading.Condition(self._sync_mutex) + self._all_tasks_done = threading.Condition(self._sync_mutex) + + self._async_mutex = asyncio.Lock() + if sys.version_info[:3] == (3, 10, 0): + # Workaround for Python 3.10 bug, see #358: + getattr(self._async_mutex, "_get_loop", lambda: None)() + self._async_not_empty = asyncio.Condition(self._async_mutex) + self._async_not_full = asyncio.Condition(self._async_mutex) + self._finished = asyncio.Event() + self._finished.set() + + self._closing = False + self._pending = set() # type: Set[asyncio.Future[Any]] + + def checked_call_soon_threadsafe( + callback: Callable[..., None], *args: Any + ) -> None: + try: + self._loop.call_soon_threadsafe(callback, *args) + except RuntimeError: + # swallowing agreed in #2 + pass + + self._call_soon_threadsafe = checked_call_soon_threadsafe + + def checked_call_soon(callback: Callable[..., None], *args: Any) -> None: + if not self._loop.is_closed(): + self._loop.call_soon(callback, *args) + + self._call_soon = checked_call_soon + + self._sync_queue = _SyncQueueProxy(self) + self._async_queue = _AsyncQueueProxy(self) + + def close(self) -> None: + with self._sync_mutex: + self._closing = True + for fut in self._pending: + fut.cancel() + self._finished.set() # unblocks all async_q.join() + self._all_tasks_done.notify_all() # unblocks all sync_q.join() + + async def wait_closed(self) -> None: + # should be called from loop after close(). + # Nobody should put/get at this point, + # so lock acquiring is not required + if not self._closing: + raise RuntimeError("Waiting for non-closed queue") + # give execution chances for the task-done callbacks + # of async tasks created inside + # _notify_async_not_empty, _notify_async_not_full + # methods. + await asyncio.sleep(0) + if not self._pending: + return + await asyncio.wait(self._pending) + + @property + def closed(self) -> bool: + return self._closing and not self._pending + + @property + def maxsize(self) -> int: + return self._maxsize + + @property + def sync_q(self) -> "_SyncQueueProxy[T]": + return self._sync_queue + + @property + def async_q(self) -> "_AsyncQueueProxy[T]": + return self._async_queue + + # Override these methods to implement other queue organizations + # (e.g. stack or priority queue). + # These will only be called with appropriate locks held + + def _init(self, maxsize: int) -> None: + self._queue = deque() # type: Deque[T] + + def _qsize(self) -> int: + return len(self._queue) + + # Put a new item in the queue + def _put(self, item: T) -> None: + self._queue.append(item) + + # Get an item from the queue + def _get(self) -> T: + return self._queue.popleft() + + def _put_internal(self, item: T) -> None: + self._put(item) + self._unfinished_tasks += 1 + self._finished.clear() + + def _notify_sync_not_empty(self) -> None: + def f() -> None: + with self._sync_mutex: + self._sync_not_empty.notify() + + self._loop.run_in_executor(None, f) + + def _notify_sync_not_full(self) -> None: + def f() -> None: + with self._sync_mutex: + self._sync_not_full.notify() + + fut = asyncio.ensure_future(self._loop.run_in_executor(None, f)) + fut.add_done_callback(self._pending.discard) + self._pending.add(fut) + + def _notify_async_not_empty(self, *, threadsafe: bool) -> None: + async def f() -> None: + async with self._async_mutex: + self._async_not_empty.notify() + + def task_maker() -> None: + task = self._loop.create_task(f()) + task.add_done_callback(self._pending.discard) + self._pending.add(task) + + if threadsafe: + self._call_soon_threadsafe(task_maker) + else: + self._call_soon(task_maker) + + def _notify_async_not_full(self, *, threadsafe: bool) -> None: + async def f() -> None: + async with self._async_mutex: + self._async_not_full.notify() + + def task_maker() -> None: + task = self._loop.create_task(f()) + task.add_done_callback(self._pending.discard) + self._pending.add(task) + + if threadsafe: + self._call_soon_threadsafe(task_maker) + else: + self._call_soon(task_maker) + + def _check_closing(self) -> None: + if self._closing: + raise RuntimeError("Operation on the closed queue is forbidden") + + +class _SyncQueueProxy(SyncQueue[T]): + """Create a queue object with a given maximum size. + + If maxsize is <= 0, the queue size is infinite. + """ + + def __init__(self, parent: Queue[T]): + self._parent = parent + + @property + def maxsize(self) -> int: + return self._parent._maxsize + + @property + def closed(self) -> bool: + return self._parent.closed + + def task_done(self) -> None: + """Indicate that a formerly enqueued task is complete. + + Used by Queue consumer threads. For each get() used to fetch a task, + a subsequent call to task_done() tells the queue that the processing + on the task is complete. + + If a join() is currently blocking, it will resume when all items + have been processed (meaning that a task_done() call was received + for every item that had been put() into the queue). + + Raises a ValueError if called more times than there were items + placed in the queue. + """ + self._parent._check_closing() + with self._parent._all_tasks_done: + unfinished = self._parent._unfinished_tasks - 1 + if unfinished <= 0: + if unfinished < 0: + raise ValueError("task_done() called too many times") + self._parent._all_tasks_done.notify_all() + self._parent._loop.call_soon_threadsafe(self._parent._finished.set) + self._parent._unfinished_tasks = unfinished + + def join(self) -> None: + """Blocks until all items in the Queue have been gotten and processed. + + The count of unfinished tasks goes up whenever an item is added to the + queue. The count goes down whenever a consumer thread calls task_done() + to indicate the item was retrieved and all work on it is complete. + + When the count of unfinished tasks drops to zero, join() unblocks. + """ + self._parent._check_closing() + with self._parent._all_tasks_done: + while self._parent._unfinished_tasks: + self._parent._all_tasks_done.wait() + self._parent._check_closing() + + def qsize(self) -> int: + """Return the approximate size of the queue (not reliable!).""" + return self._parent._qsize() + + @property + def unfinished_tasks(self) -> int: + """Return the number of unfinished tasks.""" + return self._parent._unfinished_tasks + + def empty(self) -> bool: + """Return True if the queue is empty, False otherwise (not reliable!). + + This method is likely to be removed at some point. Use qsize() == 0 + as a direct substitute, but be aware that either approach risks a race + condition where a queue can grow before the result of empty() or + qsize() can be used. + + To create code that needs to wait for all queued tasks to be + completed, the preferred technique is to use the join() method. + """ + return not self._parent._qsize() + + def full(self) -> bool: + """Return True if the queue is full, False otherwise (not reliable!). + + This method is likely to be removed at some point. Use qsize() >= n + as a direct substitute, but be aware that either approach risks a race + condition where a queue can shrink before the result of full() or + qsize() can be used. + """ + return 0 < self._parent._maxsize <= self._parent._qsize() + + def put(self, item: T, block: bool = True, timeout: OptFloat = None) -> None: + """Put an item into the queue. + + If optional args 'block' is true and 'timeout' is None (the default), + block if necessary until a free slot is available. If 'timeout' is + a non-negative number, it blocks at most 'timeout' seconds and raises + the Full exception if no free slot was available within that time. + Otherwise ('block' is false), put an item on the queue if a free slot + is immediately available, else raise the Full exception ('timeout' + is ignored in that case). + """ + self._parent._check_closing() + with self._parent._sync_not_full: + if self._parent._maxsize > 0: + if not block: + if self._parent._qsize() >= self._parent._maxsize: + raise SyncQueueFull + elif timeout is None: + while self._parent._qsize() >= self._parent._maxsize: + self._parent._sync_not_full.wait() + elif timeout < 0: + raise ValueError("'timeout' must be a non-negative number") + else: + time = self._parent._loop.time + endtime = time() + timeout + while self._parent._qsize() >= self._parent._maxsize: + remaining = endtime - time() + if remaining <= 0.0: + raise SyncQueueFull + self._parent._sync_not_full.wait(remaining) + self._parent._put_internal(item) + self._parent._sync_not_empty.notify() + self._parent._notify_async_not_empty(threadsafe=True) + + def get(self, block: bool = True, timeout: OptFloat = None) -> T: + """Remove and return an item from the queue. + + If optional args 'block' is true and 'timeout' is None (the default), + block if necessary until an item is available. If 'timeout' is + a non-negative number, it blocks at most 'timeout' seconds and raises + the Empty exception if no item was available within that time. + Otherwise ('block' is false), return an item if one is immediately + available, else raise the Empty exception ('timeout' is ignored + in that case). + """ + self._parent._check_closing() + with self._parent._sync_not_empty: + if not block: + if not self._parent._qsize(): + raise SyncQueueEmpty + elif timeout is None: + while not self._parent._qsize(): + self._parent._sync_not_empty.wait() + elif timeout < 0: + raise ValueError("'timeout' must be a non-negative number") + else: + time = self._parent._loop.time + endtime = time() + timeout + while not self._parent._qsize(): + remaining = endtime - time() + if remaining <= 0.0: + raise SyncQueueEmpty + self._parent._sync_not_empty.wait(remaining) + item = self._parent._get() + self._parent._sync_not_full.notify() + self._parent._notify_async_not_full(threadsafe=True) + return item + + def put_nowait(self, item: T) -> None: + """Put an item into the queue without blocking. + + Only enqueue the item if a free slot is immediately available. + Otherwise raise the Full exception. + """ + return self.put(item, block=False) + + def get_nowait(self) -> T: + """Remove and return an item from the queue without blocking. + + Only get an item if one is immediately available. Otherwise + raise the Empty exception. + """ + return self.get(block=False) + + +class _AsyncQueueProxy(AsyncQueue[T]): + """Create a queue object with a given maximum size. + + If maxsize is <= 0, the queue size is infinite. + """ + + def __init__(self, parent: Queue[T]): + self._parent = parent + + @property + def closed(self) -> bool: + return self._parent.closed + + def qsize(self) -> int: + """Number of items in the queue.""" + return self._parent._qsize() + + @property + def unfinished_tasks(self) -> int: + """Return the number of unfinished tasks.""" + return self._parent._unfinished_tasks + + @property + def maxsize(self) -> int: + """Number of items allowed in the queue.""" + return self._parent._maxsize + + def empty(self) -> bool: + """Return True if the queue is empty, False otherwise.""" + return self.qsize() == 0 + + def full(self) -> bool: + """Return True if there are maxsize items in the queue. + + Note: if the Queue was initialized with maxsize=0 (the default), + then full() is never True. + """ + if self._parent._maxsize <= 0: + return False + else: + return self.qsize() >= self._parent._maxsize + + async def put(self, item: T) -> None: + """Put an item into the queue. + + Put an item into the queue. If the queue is full, wait until a free + slot is available before adding item. + + This method is a coroutine. + """ + self._parent._check_closing() + async with self._parent._async_not_full: + self._parent._sync_mutex.acquire() + locked = True + try: + if self._parent._maxsize > 0: + do_wait = True + while do_wait: + do_wait = self._parent._qsize() >= self._parent._maxsize + if do_wait: + locked = False + self._parent._sync_mutex.release() + await self._parent._async_not_full.wait() + self._parent._sync_mutex.acquire() + locked = True + + self._parent._put_internal(item) + self._parent._async_not_empty.notify() + self._parent._notify_sync_not_empty() + finally: + if locked: + self._parent._sync_mutex.release() + + def put_nowait(self, item: T) -> None: + """Put an item into the queue without blocking. + + If no free slot is immediately available, raise QueueFull. + """ + self._parent._check_closing() + with self._parent._sync_mutex: + if self._parent._maxsize > 0: + if self._parent._qsize() >= self._parent._maxsize: + raise AsyncQueueFull + + self._parent._put_internal(item) + self._parent._notify_async_not_empty(threadsafe=False) + self._parent._notify_sync_not_empty() + + async def get(self) -> T: + """Remove and return an item from the queue. + + If queue is empty, wait until an item is available. + + This method is a coroutine. + """ + self._parent._check_closing() + async with self._parent._async_not_empty: + self._parent._sync_mutex.acquire() + locked = True + try: + do_wait = True + while do_wait: + do_wait = self._parent._qsize() == 0 + + if do_wait: + locked = False + self._parent._sync_mutex.release() + await self._parent._async_not_empty.wait() + self._parent._sync_mutex.acquire() + locked = True + + item = self._parent._get() + self._parent._async_not_full.notify() + self._parent._notify_sync_not_full() + return item + finally: + if locked: + self._parent._sync_mutex.release() + + def get_nowait(self) -> T: + """Remove and return an item from the queue. + + Return an item if one is immediately available, else raise QueueEmpty. + """ + self._parent._check_closing() + with self._parent._sync_mutex: + if self._parent._qsize() == 0: + raise AsyncQueueEmpty + + item = self._parent._get() + self._parent._notify_async_not_full(threadsafe=False) + self._parent._notify_sync_not_full() + return item + + def task_done(self) -> None: + """Indicate that a formerly enqueued task is complete. + + Used by queue consumers. For each get() used to fetch a task, + a subsequent call to task_done() tells the queue that the processing + on the task is complete. + + If a join() is currently blocking, it will resume when all items have + been processed (meaning that a task_done() call was received for every + item that had been put() into the queue). + + Raises ValueError if called more times than there were items placed in + the queue. + """ + self._parent._check_closing() + with self._parent._all_tasks_done: + if self._parent._unfinished_tasks <= 0: + raise ValueError("task_done() called too many times") + self._parent._unfinished_tasks -= 1 + if self._parent._unfinished_tasks == 0: + self._parent._finished.set() + self._parent._all_tasks_done.notify_all() + + async def join(self) -> None: + """Block until all items in the queue have been gotten and processed. + + The count of unfinished tasks goes up whenever an item is added to the + queue. The count goes down whenever a consumer calls task_done() to + indicate that the item was retrieved and all work on it is complete. + When the count of unfinished tasks drops to zero, join() unblocks. + """ + while True: + with self._parent._sync_mutex: + self._parent._check_closing() + if self._parent._unfinished_tasks == 0: + break + await self._parent._finished.wait() + + +class PriorityQueue(Queue[T]): + """Variant of Queue that retrieves open entries in priority order + (lowest first). + + Entries are typically tuples of the form: (priority number, data). + + """ + + def _init(self, maxsize: int) -> None: + self._heap_queue = [] # type: List[T] + + def _qsize(self) -> int: + return len(self._heap_queue) + + def _put(self, item: T) -> None: + heappush(self._heap_queue, item) + + def _get(self) -> T: + return heappop(self._heap_queue) + + +class LifoQueue(Queue[T]): + """Variant of Queue that retrieves most recently added entries first.""" + + def _qsize(self) -> int: + return len(self._queue) + + def _put(self, item: T) -> None: + self._queue.append(item) + + def _get(self) -> T: + return self._queue.pop() diff --git a/freqtrade/rpc/replicate/types.py b/freqtrade/rpc/replicate/types.py new file mode 100644 index 000000000..5d8c158bd --- /dev/null +++ b/freqtrade/rpc/replicate/types.py @@ -0,0 +1,9 @@ +from typing import TypeVar + +from fastapi import WebSocket as FastAPIWebSocket +from websockets import WebSocketClientProtocol as WebSocket + +from freqtrade.rpc.replicate.channel import WebSocketProxy + + +WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket, WebSocketProxy) diff --git a/freqtrade/rpc/replicate/utils.py b/freqtrade/rpc/replicate/utils.py new file mode 100644 index 000000000..7b703810e --- /dev/null +++ b/freqtrade/rpc/replicate/utils.py @@ -0,0 +1,10 @@ +from starlette.websockets import WebSocket, WebSocketState + + +async def is_websocket_alive(ws: WebSocket) -> bool: + if ( + ws.application_state == WebSocketState.CONNECTED and + ws.client_state == WebSocketState.CONNECTED + ): + return True + return False diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 3ccf23228..140431586 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -44,10 +44,23 @@ class RPCManager: if config.get('api_server', {}).get('enabled', False): logger.info('Enabling rpc.api_server') from freqtrade.rpc.api_server import ApiServer + + # Pass replicate_rpc as param or defer starting api_server + # until we register the replicate rpc enpoint? apiserver = ApiServer(config) apiserver.add_rpc_handler(self._rpc) self.registered_modules.append(apiserver) + # Enable Replicate mode + # For this to be enabled, the API server must also be enabled + if config.get('replicate', {}).get('enabled', False): + logger.info('Enabling rpc.replicate') + from freqtrade.rpc.replicate import ReplicateController + replicate_rpc = ReplicateController(self._rpc, config, apiserver) + self.registered_modules.append(replicate_rpc) + + apiserver.start_api() + def cleanup(self) -> None: """ Stops all enabled rpc modules """ logger.info('Cleaning up rpc modules ...') diff --git a/requirements-replicate.txt b/requirements-replicate.txt new file mode 100644 index 000000000..7ee351d9d --- /dev/null +++ b/requirements-replicate.txt @@ -0,0 +1,5 @@ +# Include all requirements to run the bot. +-r requirements.txt + +# Required for follower +websockets From 6834db11f3ec4d0b9d9a6540633e1b363c11c889 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 19 Aug 2022 00:06:19 -0600 Subject: [PATCH 005/437] minor improvements and pairlist data transmission --- freqtrade/enums/replicate.py | 3 +- freqtrade/freqtradebot.py | 13 + .../plugins/pairlist/ExternalPairList.py | 59 +++++ freqtrade/rpc/replicate/__init__.py | 236 ++++++++++-------- freqtrade/rpc/replicate/channel.py | 23 +- freqtrade/rpc/replicate/proxy.py | 9 +- freqtrade/rpc/replicate/serializer.py | 8 +- freqtrade/rpc/replicate/types.py | 4 +- freqtrade/rpc/rpc_manager.py | 3 + 9 files changed, 243 insertions(+), 115 deletions(-) create mode 100644 freqtrade/plugins/pairlist/ExternalPairList.py diff --git a/freqtrade/enums/replicate.py b/freqtrade/enums/replicate.py index d55d45b45..501d119f3 100644 --- a/freqtrade/enums/replicate.py +++ b/freqtrade/enums/replicate.py @@ -7,5 +7,4 @@ class ReplicateModeType(str, Enum): class LeaderMessageType(str, Enum): - Pairlist = "pairlist" - Dataframe = "dataframe" + whitelist = "whitelist" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 4e3af64ea..ac6a998c5 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -75,6 +75,8 @@ class FreqtradeBot(LoggingMixin): PairLocks.timeframe = self.config['timeframe'] + self.replicate_controller = None + # RPC runs in separate threads, can start handling external commands just after # initialization, even before Freqtradebot has a chance to start its throttling, # so anything in the Freqtradebot instance should be ready (initialized), including @@ -264,6 +266,17 @@ class FreqtradeBot(LoggingMixin): # Extend active-pair whitelist with pairs of open trades # It ensures that candle (OHLCV) data are downloaded for open trades as well _whitelist.extend([trade.pair for trade in trades if trade.pair not in _whitelist]) + + # If replicate leader, broadcast whitelist data + if self.replicate_controller: + if self.replicate_controller.is_leader(): + self.replicate_controller.send_message( + { + "data_type": "whitelist", + "data": _whitelist + } + ) + return _whitelist def get_free_open_trades(self) -> int: diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py new file mode 100644 index 000000000..832c3d5eb --- /dev/null +++ b/freqtrade/plugins/pairlist/ExternalPairList.py @@ -0,0 +1,59 @@ +""" +External Pair List provider + +Provides pair list from Leader data +""" +import logging +from typing import Any, Dict, List + +from freqtrade.plugins.pairlist.IPairList import IPairList + + +logger = logging.getLogger(__name__) + + +class ExternalPairList(IPairList): + + def __init__(self, exchange, pairlistmanager, + config: Dict[str, Any], pairlistconfig: Dict[str, Any], + pairlist_pos: int) -> None: + super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos) + + self._num_assets = self._pairlistconfig.get('num_assets') + self._allow_inactive = self._pairlistconfig.get('allow_inactive', False) + + self._leader_pairs: List[str] = [] + + @property + def needstickers(self) -> bool: + """ + Boolean property defining if tickers are necessary. + If no Pairlist requires tickers, an empty Dict is passed + as tickers argument to filter_pairlist + """ + return False + + def short_desc(self) -> str: + """ + Short whitelist method description - used for startup-messages + -> Please overwrite in subclasses + """ + return f"{self.name}" + + def gen_pairlist(self, tickers: Dict) -> List[str]: + """ + Generate the pairlist + :param tickers: Tickers (from exchange.get_tickers()). May be cached. + :return: List of pairs + """ + pass + + def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]: + """ + Filters and sorts pairlist and returns the whitelist again. + Called on each bot iteration - please use internal caching if necessary + :param pairlist: pairlist to filter or sort + :param tickers: Tickers (from exchange.get_tickers()). May be cached. + :return: new whitelist + """ + pass diff --git a/freqtrade/rpc/replicate/__init__.py b/freqtrade/rpc/replicate/__init__.py index d725a4a90..80ac0836c 100644 --- a/freqtrade/rpc/replicate/__init__.py +++ b/freqtrade/rpc/replicate/__init__.py @@ -5,7 +5,7 @@ import asyncio import logging import secrets import socket -from threading import Thread +from threading import Event, Thread from typing import Any, Coroutine, Dict, Union import websockets @@ -50,6 +50,9 @@ class ReplicateController(RPCHandler): self._thread = None self._queue = None + self._stop_event = Event() + self._follower_tasks = None + self.channel_manager = ChannelManager() self.replicate_config = config.get('replicate', {}) @@ -93,10 +96,7 @@ class ReplicateController(RPCHandler): self.start_threaded_loop() - if self.mode == ReplicateModeType.follower: - self.start_follower_mode() - elif self.mode == ReplicateModeType.leader: - self.start_leader_mode() + self.start() def start_threaded_loop(self): """ @@ -129,6 +129,29 @@ class ReplicateController(RPCHandler): logger.error(f"Error running coroutine - {str(e)}") return None + async def main_loop(self): + """ + Main loop coro + + Start the loop based on what mode we're in + """ + try: + if self.mode == ReplicateModeType.leader: + await self.leader_loop() + elif self.mode == ReplicateModeType.follower: + await self.follower_loop() + + except asyncio.CancelledError: + pass + finally: + self._loop.stop() + + def start(self): + """ + Start the controller main loop + """ + self.submit_coroutine(self.main_loop()) + def cleanup(self) -> None: """ Cleanup pending module resources. @@ -144,27 +167,62 @@ class ReplicateController(RPCHandler): task.cancel() self._loop.call_soon_threadsafe(self.channel_manager.disconnect_all) - # This must be called threadsafe, otherwise would not work - self._loop.call_soon_threadsafe(self._loop.stop) self._thread.join() def send_msg(self, msg: Dict[str, Any]) -> None: - """ Push message through """ - + """ + Support RPC calls + """ if msg["type"] == RPCMessageType.EMIT_DATA: - self._send_message( + self.send_message( { - "type": msg["data_type"], - "content": msg["data"] + "data_type": msg.get("data_type"), + "data": msg.get("data") } ) + def send_message(self, msg: Dict[str, Any]) -> None: + """ Push message through """ + + if self.channel_manager.has_channels(): + self._send_message(msg) + else: + logger.debug("No listening followers, skipping...") + pass + + def _send_message(self, msg: Dict[Any, Any]): + """ + Add data to the internal queue to be broadcasted. This func will block + if the queue is full. This is meant to be called in the main thread. + """ + + if self._queue: + queue = self._queue.sync_q + queue.put(msg) + else: + logger.warning("Can not send data, leader loop has not started yet!") + + def is_leader(self): + """ + Leader flag + """ + return self.enabled() and self.mode == ReplicateModeType.leader + + def enabled(self): + """ + Enabled flag + """ + return self.replicate_config.get('enabled', False) + # ----------------------- LEADER LOGIC ------------------------------ - def start_leader_mode(self): + async def leader_loop(self): """ - Register the endpoint and start the leader loop + Main leader coroutine + + This starts all of the leader coros and registers the endpoint on + the ApiServer """ logger.info("Running rpc.replicate in Leader mode") @@ -173,30 +231,13 @@ class ReplicateController(RPCHandler): logger.info("-" * 15) self.register_leader_endpoint() - self.submit_coroutine(self.leader_loop()) - async def leader_loop(self): - """ - Main leader coroutine - At the moment this just broadcasts data that's in the queue to the followers - """ try: await self._broadcast_queue_data() except Exception as e: logger.error("Exception occurred in leader loop: ") logger.exception(e) - def _send_message(self, data: Dict[Any, Any]): - """ - Add data to the internal queue to be broadcasted. This func will block - if the queue is full. This is meant to be called in the main thread. - """ - - if self._queue: - self._queue.put(data) - else: - logger.warning("Can not send data, leader loop has not started yet!") - async def _broadcast_queue_data(self): """ Loop over queue data and broadcast it @@ -210,6 +251,8 @@ class ReplicateController(RPCHandler): # Get data from queue data = await async_queue.get() + logger.info(f"Found data - broadcasting: {data}") + # Broadcast it to everyone await self.channel_manager.broadcast(data) @@ -263,6 +306,9 @@ class ReplicateController(RPCHandler): channel = await self.channel_manager.on_connect(websocket) # Send initial data here + # Data is being broadcasted right away as soon as startup, + # we may not have to send initial data at all. Further testing + # required. # Keep connection open until explicitly closed, and sleep try: @@ -286,20 +332,15 @@ class ReplicateController(RPCHandler): # -------------------------------FOLLOWER LOGIC---------------------------- - def start_follower_mode(self): - """ - Start the ReplicateController in Follower mode - """ - logger.info("Starting rpc.replicate in Follower mode") - - self.submit_coroutine(self.follower_loop()) - async def follower_loop(self): """ Main follower coroutine - This starts all of the leader connection coros + This starts all of the follower connection coros """ + + logger.info("Starting rpc.replicate in Follower mode") + try: await self._connect_to_leaders() except Exception as e: @@ -307,79 +348,76 @@ class ReplicateController(RPCHandler): logger.exception(e) async def _connect_to_leaders(self): + """ + For each leader in `self.leaders_list` create a connection and + listen for data. + """ rpc_lock = asyncio.Lock() logger.info("Starting connections to Leaders...") - await asyncio.wait( - [ - self._handle_leader_connection(leader, rpc_lock) - for leader in self.leaders_list - ] - ) + + self.follower_tasks = [ + self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) + for leader in self.leaders_list + ] + return await asyncio.gather(*self.follower_tasks, return_exceptions=True) async def _handle_leader_connection(self, leader, lock): """ Given a leader, connect and wait on data. If connection is lost, it will attempt to reconnect. """ - url, token = leader["url"], leader["token"] + try: + url, token = leader["url"], leader["token"] - websocket_url = f"{url}?token={token}" + websocket_url = f"{url}?token={token}" - logger.info(f"Attempting to connect to leader at: {url}") - # TODO: limit the amount of connection retries - while True: - try: - async with websockets.connect(websocket_url) as ws: - channel = await self.channel_manager.on_connect(ws) - while True: - try: - data = await asyncio.wait_for( - channel.recv(), - timeout=self.reply_timeout - ) - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): - # We haven't received data yet. Just check the connection and continue. + logger.info(f"Attempting to connect to leader at: {url}") + # TODO: limit the amount of connection retries + while True: + try: + async with websockets.connect(websocket_url) as ws: + channel = await self.channel_manager.on_connect(ws) + while True: try: - # ping - ping = await channel.ping() - await asyncio.wait_for(ping, timeout=self.ping_timeout) - logger.info(f"Connection to {url} still alive...") - continue - except Exception: - logger.info(f"Ping error {url} - retrying in {self.sleep_time}s") - asyncio.sleep(self.sleep_time) - break + data = await asyncio.wait_for( + channel.recv(), + timeout=self.reply_timeout + ) + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Check the connection and continue. + try: + # ping + ping = await channel.ping() + await asyncio.wait_for(ping, timeout=self.ping_timeout) + logger.debug(f"Connection to {url} still alive...") + continue + except Exception: + logger.info( + f"Ping error {url} - retrying in {self.sleep_time}s") + asyncio.sleep(self.sleep_time) + break - with lock: - # Should we have a lock here? - await self._handle_leader_message(data) + async with lock: + # Acquire lock so only 1 coro handling at a time + # as we might call the RPC module in the main thread + await self._handle_leader_message(data) - except socket.gaierror: - logger.info(f"Socket error - retrying connection in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - continue - except ConnectionRefusedError: - logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - continue + except socket.gaierror: + logger.info(f"Socket error - retrying connection in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + continue + except ConnectionRefusedError: + logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + continue + + except asyncio.CancelledError: + pass async def _handle_leader_message(self, message): - type = message.get("type") + type = message.get('data_type') + data = message.get('data') - message_type_handlers = { - LeaderMessageType.Pairlist.value: self._handle_pairlist_message, - LeaderMessageType.Dataframe.value: self._handle_dataframe_message - } - - handler = message_type_handlers.get(type, self._handle_default_message) - return await handler(message) - - async def _handle_default_message(self, message): - logger.info(f"Default message handled: {message}") - - async def _handle_pairlist_message(self, message): - logger.info(f"Pairlist message handled: {message}") - - async def _handle_dataframe_message(self, message): - logger.info(f"Dataframe message handled: {message}") + if type == LeaderMessageType.whitelist: + logger.info(f"Received whitelist from Leader: {data}") diff --git a/freqtrade/rpc/replicate/channel.py b/freqtrade/rpc/replicate/channel.py index 9950742da..7aa316ff5 100644 --- a/freqtrade/rpc/replicate/channel.py +++ b/freqtrade/rpc/replicate/channel.py @@ -1,3 +1,4 @@ +import logging from typing import Type from freqtrade.rpc.replicate.proxy import WebSocketProxy @@ -5,6 +6,9 @@ from freqtrade.rpc.replicate.serializer import JSONWebSocketSerializer, WebSocke from freqtrade.rpc.replicate.types import WebSocketType +logger = logging.getLogger(__name__) + + class WebSocketChannel: """ Object to help facilitate managing a websocket connection @@ -85,9 +89,12 @@ class ChannelManager: """ if websocket in self.channels.keys(): channel = self.channels[websocket] + + logger.debug(f"Disconnecting channel - {channel}") + if not channel.is_closed(): await channel.close() - del channel + del self.channels[websocket] async def disconnect_all(self): """ @@ -102,5 +109,15 @@ class ChannelManager: :param data: The data to send """ - for channel in self.channels.values(): - await channel.send(data) + for websocket, channel in self.channels.items(): + try: + await channel.send(data) + except RuntimeError: + # Handle cannot send after close cases + await self.on_disconnect(websocket) + + def has_channels(self): + """ + Flag for more than 0 channels + """ + return len(self.channels) > 0 diff --git a/freqtrade/rpc/replicate/proxy.py b/freqtrade/rpc/replicate/proxy.py index b2173670b..aae536b6d 100644 --- a/freqtrade/rpc/replicate/proxy.py +++ b/freqtrade/rpc/replicate/proxy.py @@ -1,11 +1,9 @@ -from typing import TYPE_CHECKING, Union +from typing import Union from fastapi import WebSocket as FastAPIWebSocket from websockets import WebSocketClientProtocol as WebSocket - -if TYPE_CHECKING: - from freqtrade.rpc.replicate.types import WebSocketType +from freqtrade.rpc.replicate.types import WebSocketType class WebSocketProxy: @@ -21,6 +19,9 @@ class WebSocketProxy: """ Send data on the wrapped websocket """ + if isinstance(data, str): + data = data.encode() + if hasattr(self._websocket, "send_bytes"): await self._websocket.send_bytes(data) else: diff --git a/freqtrade/rpc/replicate/serializer.py b/freqtrade/rpc/replicate/serializer.py index ae5e57b95..717458f09 100644 --- a/freqtrade/rpc/replicate/serializer.py +++ b/freqtrade/rpc/replicate/serializer.py @@ -33,10 +33,10 @@ class WebSocketSerializer(ABC): class JSONWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data: bytes) -> bytes: + def _serialize(self, data): # json expects string not bytes - return json.dumps(data.decode()).encode() + return json.dumps(data) - def _deserialize(self, data: bytes) -> bytes: + def _deserialize(self, data): # The WebSocketSerializer gives bytes not string - return json.loads(data).encode() + return json.loads(data) diff --git a/freqtrade/rpc/replicate/types.py b/freqtrade/rpc/replicate/types.py index 5d8c158bd..763147196 100644 --- a/freqtrade/rpc/replicate/types.py +++ b/freqtrade/rpc/replicate/types.py @@ -3,7 +3,5 @@ from typing import TypeVar from fastapi import WebSocket as FastAPIWebSocket from websockets import WebSocketClientProtocol as WebSocket -from freqtrade.rpc.replicate.channel import WebSocketProxy - -WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket, WebSocketProxy) +WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 140431586..8eaec21ea 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -59,6 +59,9 @@ class RPCManager: replicate_rpc = ReplicateController(self._rpc, config, apiserver) self.registered_modules.append(replicate_rpc) + # Attach the controller to FreqTrade + freqtrade.replicate_controller = replicate_rpc + apiserver.start_api() def cleanup(self) -> None: From b44bd0171cf69c6dc527f8e008fe2f50539fcda5 Mon Sep 17 00:00:00 2001 From: Johan van der Vlugt <83158576+JohanVlugt@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:10:37 +0200 Subject: [PATCH 006/437] Example Classifier strat --- .../templates/FreqaiHybridExampleStrategy.py | 377 ++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 freqtrade/templates/FreqaiHybridExampleStrategy.py diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py new file mode 100644 index 000000000..acceccee7 --- /dev/null +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -0,0 +1,377 @@ +import logging +from datetime import datetime, timedelta +from functools import reduce +from typing import Optional + +import numpy as np +import pandas as pd +import talib.abstract as ta +from freqtrade.exchange import timeframe_to_prev_date +from freqtrade.persistence import Trade +from freqtrade.strategy import (DecimalParameter, IntParameter, IStrategy, + merge_informative_pair) +from numpy.lib import math +from pandas import DataFrame +from technical import qtpylib + +logger = logging.getLogger(__name__) + + +class FreqaiExampleHybridStrategy(IStrategy): + """ + Example classifier hybrid strategy showing how the user connects their own + IFreqaiModel to the strategy. Namely, the user uses: + self.freqai.start(dataframe, metadata) + + to make predictions on their data. populate_any_indicators() automatically + generates the variety of features indicated by the user in the + canonical freqtrade configuration file under config['freqai']. + + The underlying original supertrend strat is authored by @juankysoriano (Juan Carlos Soriano) + * github: https://github.com/juankysoriano/ + + This strategy is not designed to be used live + """ + + minimal_roi = {"0": 0.1, "30": 0.75, "60": 0.05, "120": 0.025, "240": -1} + + plot_config = { + "main_plot": {}, + "subplots": { + "prediction": {"prediction": {"color": "blue"}}, + "target_roi": { + "target_roi": {"color": "brown"}, + }, + "do_predict": { + "do_predict": {"color": "brown"}, + }, + }, + } + + process_only_new_candles = True + stoploss = -0.1 + use_exit_signal = True + startup_candle_count: int = 300 + can_short = True + + linear_roi_offset = DecimalParameter( + 0.00, 0.02, default=0.005, space="sell", optimize=False, load=True + ) + max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True) + + buy_params = { + "buy_m1": 4, + "buy_m2": 7, + "buy_m3": 1, + "buy_p1": 8, + "buy_p2": 9, + "buy_p3": 8, + } + + # Sell hyperspace params: + sell_params = { + "sell_m1": 1, + "sell_m2": 3, + "sell_m3": 6, + "sell_p1": 16, + "sell_p2": 18, + "sell_p3": 18, + } + + buy_m1 = IntParameter(1, 7, default=1) + buy_m2 = IntParameter(1, 7, default=3) + buy_m3 = IntParameter(1, 7, default=4) + buy_p1 = IntParameter(7, 21, default=14) + buy_p2 = IntParameter(7, 21, default=10) + buy_p3 = IntParameter(7, 21, default=10) + + sell_m1 = IntParameter(1, 7, default=1) + sell_m2 = IntParameter(1, 7, default=3) + sell_m3 = IntParameter(1, 7, default=4) + sell_p1 = IntParameter(7, 21, default=14) + sell_p2 = IntParameter(7, 21, default=10) + sell_p3 = IntParameter(7, 21, default=10) + + def informative_pairs(self): + whitelist_pairs = self.dp.current_whitelist() + corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] + informative_pairs = [] + for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]: + for pair in whitelist_pairs: + informative_pairs.append((pair, tf)) + for pair in corr_pairs: + if pair in whitelist_pairs: + continue # avoid duplication + informative_pairs.append((pair, tf)) + return informative_pairs + + def populate_any_indicators( + self, pair, df, tf, informative=None, set_generalized_indicators=False + ): + """ + Function designed to automatically generate, name and merge features + from user indicated timeframes in the configuration file. User controls the indicators + passed to the training/prediction by prepending indicators with `'%-' + coin ` + (see convention below). I.e. user should not prepend any supporting metrics + (e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the + model. + :param pair: pair to be used as informative + :param df: strategy dataframe which will receive merges from informatives + :param tf: timeframe of the dataframe which will modify the feature names + :param informative: the dataframe associated with the informative pair + """ + + coin = pair.split('/')[0] + + if informative is None: + informative = self.dp.get_pair_dataframe(pair, tf) + + # first loop is automatically duplicating indicators for time periods + for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]: + + t = int(t) + informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) + informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) + informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) + informative[f"%-{coin}sma-period_{t}"] = ta.SMA(informative, timeperiod=t) + informative[f"%-{coin}ema-period_{t}"] = ta.EMA(informative, timeperiod=t) + + informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) + + bollinger = qtpylib.bollinger_bands( + qtpylib.typical_price(informative), window=t, stds=2.2 + ) + informative[f"{coin}bb_lowerband-period_{t}"] = bollinger["lower"] + informative[f"{coin}bb_middleband-period_{t}"] = bollinger["mid"] + informative[f"{coin}bb_upperband-period_{t}"] = bollinger["upper"] + + informative[f"%-{coin}bb_width-period_{t}"] = ( + informative[f"{coin}bb_upperband-period_{t}"] + - informative[f"{coin}bb_lowerband-period_{t}"] + ) / informative[f"{coin}bb_middleband-period_{t}"] + informative[f"%-{coin}close-bb_lower-period_{t}"] = ( + informative["close"] / informative[f"{coin}bb_lowerband-period_{t}"] + ) + + informative[f"%-{coin}roc-period_{t}"] = ta.ROC(informative, timeperiod=t) + + informative[f"%-{coin}relative_volume-period_{t}"] = ( + informative["volume"] / informative["volume"].rolling(t).mean() + ) + + informative[f"%-{coin}pct-change"] = informative["close"].pct_change() + informative[f"%-{coin}raw_volume"] = informative["volume"] + informative[f"%-{coin}raw_price"] = informative["close"] + + indicators = [col for col in informative if col.startswith("%")] + # This loop duplicates and shifts all indicators to add a sense of recency to data + for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): + if n == 0: + continue + informative_shift = informative[indicators].shift(n) + informative_shift = informative_shift.add_suffix("_shift-" + str(n)) + informative = pd.concat((informative, informative_shift), axis=1) + + df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True) + skip_columns = [ + (s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"] + ] + df = df.drop(columns=skip_columns) + + # Add generalized indicators here (because in live, it will call this + # function to populate indicators during training). Notice how we ensure not to + # add them multiple times + if set_generalized_indicators: + df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7 + df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25 + + # Classifiers are typically set up with strings as targets: + df['&s-up_or_down'] = np.where( df["close"].shift(-50) > + df["close"], 'up', 'down') + + # REGRESSOR Model: Can use single or multi traget + # user adds targets here by prepending them with &- (see convention below) + #df["&-s_close"] = ( + # df["close"] + # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + # .mean() + # / df["close"] + # - 1 + #) + # If user wishes to use multiple targets, they can add more by + # appending more columns with '&'. User should keep in mind that multi targets + # requires a multioutput prediction model such as + # templates/CatboostPredictionMultiModel.py, + + # df["&-s_range"] = ( + # df["close"] + # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + # .max() + # - + # df["close"] + # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + # .min() + # ) + + return df + + def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + + # All indicators must be populated by populate_any_indicators() for live functionality + # to work correctly. + + # the model will return all labels created by user in `populate_any_indicators` + # (& appended targets), an indication of whether or not the prediction should be accepted, + # the target mean/std values for each of the labels created by user in + # `populate_any_indicators()` for each training period. + + for multiplier in self.buy_m1.range: + for period in self.buy_p1.range: + dataframe[f"supertrend_1_buy_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + for multiplier in self.buy_m2.range: + for period in self.buy_p2.range: + dataframe[f"supertrend_2_buy_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + for multiplier in self.buy_m3.range: + for period in self.buy_p3.range: + dataframe[f"supertrend_3_buy_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + for multiplier in self.sell_m1.range: + for period in self.sell_p1.range: + dataframe[f"supertrend_1_sell_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + for multiplier in self.sell_m2.range: + for period in self.sell_p2.range: + dataframe[f"supertrend_2_sell_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + for multiplier in self.sell_m3.range: + for period in self.sell_p3.range: + dataframe[f"supertrend_3_sell_{multiplier}_{period}"] = self.supertrend( + dataframe, multiplier, period + )["STX"] + + dataframe = self.freqai.start(dataframe, metadata, self) + + return dataframe + + def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: + + df.loc[ + (df[f"supertrend_1_buy_{self.buy_m1.value}_{self.buy_p1.value}"] == "up") & + (df[f"supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}"] == "up") & + (df[f"supertrend_3_buy_{self.buy_m3.value}_{self.buy_p3.value}"] == "up") & + (df["do_predict"] == 1) & + (df['&s-up_or_down'] == 'up'), + "enter_long", + ] = 1 + + df.loc[ + (df[f"supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}"] == "down") & + (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down") & + (df[f"supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}"] == "down") & + (df["do_predict"] == 1) & + (df['&s-up_or_down'] == 'down'), + "enter_short", + ] = 1 + + return df + + def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame: + + df.loc[ + (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down"), + "exit_long", + ] = 1 + + df.loc[ + (df[f"supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}"] == "up"), + "exit_short", + ] = 1 + + return df + + def get_ticker_indicator(self): + return int(self.config["timeframe"][:-1]) + + def confirm_trade_entry(self, pair: str, order_type: str, amount: float, + rate: float, time_in_force: str, current_time, entry_tag, side: str, + **kwargs, ) -> bool: + + df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) + last_candle = df.iloc[-1].squeeze() + + if side == "long": + if rate > (last_candle["close"] * (1 + 0.0025)): + return False + else: + if rate < (last_candle["close"] * (1 - 0.0025)): + return False + + return True + + def leverage(self, pair: str, current_time: datetime, current_rate: float, + proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, + **kwargs) -> float: + + return 1 + + """ + Supertrend Indicator; adapted for freqtrade, optimized by the math genius. + from: Perkmeister#2394 + """ + + def supertrend(self, dataframe: DataFrame, multiplier, period): + df = dataframe.copy() + last_row = dataframe.tail(1).index.item() + + df['TR'] = ta.TRANGE(df) + df['ATR'] = ta.SMA(df['TR'], period) + + st = 'ST_' + str(period) + '_' + str(multiplier) + stx = 'STX_' + str(period) + '_' + str(multiplier) + + # Compute basic upper and lower bands + BASIC_UB = ((df['high'] + df['low']) / 2 + multiplier * df['ATR']).values + BASIC_LB = ((df['high'] + df['low']) / 2 - multiplier * df['ATR']).values + FINAL_UB = np.zeros(last_row + 1) + FINAL_LB = np.zeros(last_row + 1) + ST = np.zeros(last_row + 1) + CLOSE = df['close'].values + + # Compute final upper and lower bands + for i in range(period, last_row + 1): + FINAL_UB[i] = BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - 1] or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1] + FINAL_LB[i] = BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - 1] or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1] + + # Set the Supertrend value + for i in range(period, last_row + 1): + ST[i] = FINAL_UB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] <= FINAL_UB[i] else \ + FINAL_LB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] > FINAL_UB[i] else \ + FINAL_LB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] >= FINAL_LB[i] else \ + FINAL_UB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] < FINAL_LB[i] else 0.00 + df_ST = pd.DataFrame(ST, columns=[st]) + df = pd.concat([df, df_ST],axis=1) + + # Mark the trend direction up/down + df[stx] = np.where((df[st] > 0.00), np.where((df['close'] < df[st]), 'down', 'up'), np.NaN) + + df.fillna(0, inplace=True) + + return DataFrame(index=df.index, data={ + 'ST' : df[st], + 'STX' : df[stx] + }) From 739b68f8fd5c3ca5cc6eacc1f8a49a76fdedd620 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 19 Aug 2022 22:40:01 -0600 Subject: [PATCH 007/437] ExternalPairList plugin --- freqtrade/constants.py | 3 +- freqtrade/enums/replicate.py | 2 +- freqtrade/freqtradebot.py | 30 +++++---- .../plugins/pairlist/ExternalPairList.py | 61 +++++++++++++++++-- freqtrade/rpc/replicate/__init__.py | 27 +++++--- 5 files changed, 96 insertions(+), 27 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 416b4646f..55363cca1 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -33,7 +33,8 @@ HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss', AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList', 'AgeFilter', 'OffsetFilter', 'PerformanceFilter', 'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter', - 'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter'] + 'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter', + 'ExternalPairList'] AVAILABLE_PROTECTIONS = ['CooldownPeriod', 'LowProfitPairs', 'MaxDrawdown', 'StoplossGuard'] AVAILABLE_DATAHANDLERS = ['json', 'jsongz', 'hdf5'] BACKTEST_BREAKDOWNS = ['day', 'week', 'month'] diff --git a/freqtrade/enums/replicate.py b/freqtrade/enums/replicate.py index 501d119f3..73be996c0 100644 --- a/freqtrade/enums/replicate.py +++ b/freqtrade/enums/replicate.py @@ -7,4 +7,4 @@ class ReplicateModeType(str, Enum): class LeaderMessageType(str, Enum): - whitelist = "whitelist" + pairlist = "pairlist" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index ac6a998c5..b2ec1448e 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -17,8 +17,8 @@ from freqtrade.constants import BuySell, LongShort from freqtrade.data.converter import order_book_to_dataframe from freqtrade.data.dataprovider import DataProvider from freqtrade.edge import Edge -from freqtrade.enums import (ExitCheckTuple, ExitType, RPCMessageType, RunMode, SignalDirection, - State, TradingMode) +from freqtrade.enums import (ExitCheckTuple, ExitType, LeaderMessageType, RPCMessageType, RunMode, + SignalDirection, State, TradingMode) from freqtrade.exceptions import (DependencyException, ExchangeError, InsufficientFundsError, InvalidOrderException, PricingError) from freqtrade.exchange import timeframe_to_minutes, timeframe_to_seconds @@ -257,6 +257,22 @@ class FreqtradeBot(LoggingMixin): self.pairlists.refresh_pairlist() _whitelist = self.pairlists.whitelist + # If replicate leader, broadcast whitelist data + # Should we broadcast before trade pairs are added? What if + # the follower doesn't have trades with those pairs. They would be added for + # no reason. + + # Or should this class be made available to the PairListManager and ran + # when filter_pairlist is called? + if self.replicate_controller: + if self.replicate_controller.is_leader(): + self.replicate_controller.send_message( + { + "data_type": LeaderMessageType.pairlist, + "data": _whitelist + } + ) + # Calculating Edge positioning if self.edge: self.edge.calculate(_whitelist) @@ -267,16 +283,6 @@ class FreqtradeBot(LoggingMixin): # It ensures that candle (OHLCV) data are downloaded for open trades as well _whitelist.extend([trade.pair for trade in trades if trade.pair not in _whitelist]) - # If replicate leader, broadcast whitelist data - if self.replicate_controller: - if self.replicate_controller.is_leader(): - self.replicate_controller.send_message( - { - "data_type": "whitelist", - "data": _whitelist - } - ) - return _whitelist def get_free_open_trades(self) -> int: diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py index 832c3d5eb..82fc12ff9 100644 --- a/freqtrade/plugins/pairlist/ExternalPairList.py +++ b/freqtrade/plugins/pairlist/ExternalPairList.py @@ -4,6 +4,7 @@ External Pair List provider Provides pair list from Leader data """ import logging +from threading import Event from typing import Any, Dict, List from freqtrade.plugins.pairlist.IPairList import IPairList @@ -13,16 +14,41 @@ logger = logging.getLogger(__name__) class ExternalPairList(IPairList): + """ + PairList plugin for use with replicate follower mode. + Will use pairs given from leader data. + + Usage: + "pairlists": [ + { + "method": "ExternalPairList", + "number_assets": 5, # We can limit the amount of pairs to use from leader + } + ], + """ def __init__(self, exchange, pairlistmanager, config: Dict[str, Any], pairlistconfig: Dict[str, Any], pairlist_pos: int) -> None: super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos) - self._num_assets = self._pairlistconfig.get('num_assets') - self._allow_inactive = self._pairlistconfig.get('allow_inactive', False) + # Not sure how to enforce ExternalPairList as the only PairList + + self._num_assets = self._pairlistconfig.get('number_assets') self._leader_pairs: List[str] = [] + self._has_data = Event() + + def _clamped_pairlist(self): + """ + Return the self._leader_pairs pairlist limited to the maximum set num_assets + or the length of it. + """ + length = len(self._leader_pairs) + if self._num_assets: + return self._leader_pairs[:min(length, self._num_assets)] + else: + return self._leader_pairs @property def needstickers(self) -> bool: @@ -40,13 +66,40 @@ class ExternalPairList(IPairList): """ return f"{self.name}" + def add_pairlist_data(self, pairlist: List[str]): + """ + Add pairs from Leader + """ + + # If some pairs were removed on Leader, remove them here + for pair in self._leader_pairs: + if pair not in pairlist: + logger.debug(f"Leader removed pair: {pair}") + self._leader_pairs.remove(pair) + + # Only add new pairs + seen = set(self._leader_pairs) + for pair in pairlist: + if pair in seen: + logger.debug(f"Encountered already existing pair {pair}") + continue + self._leader_pairs.append(pair) + + if not self._has_data.is_set(): + self._has_data.set() + def gen_pairlist(self, tickers: Dict) -> List[str]: """ Generate the pairlist :param tickers: Tickers (from exchange.get_tickers()). May be cached. :return: List of pairs """ - pass + if not self._has_data.is_set(): + logger.info("Waiting on pairlists from Leaders...") + self._has_data.wait() + logger.info("Pairlist data received...") + + return self._clamped_pairlist() def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]: """ @@ -56,4 +109,4 @@ class ExternalPairList(IPairList): :param tickers: Tickers (from exchange.get_tickers()). May be cached. :return: new whitelist """ - pass + return self._clamped_pairlist() diff --git a/freqtrade/rpc/replicate/__init__.py b/freqtrade/rpc/replicate/__init__.py index 80ac0836c..fd718197e 100644 --- a/freqtrade/rpc/replicate/__init__.py +++ b/freqtrade/rpc/replicate/__init__.py @@ -40,6 +40,7 @@ class ReplicateController(RPCHandler): """ super().__init__(rpc, config) + self.freqtrade = rpc._freqtrade self.api_server = api_server if not self.api_server: @@ -122,7 +123,6 @@ class ReplicateController(RPCHandler): raise RuntimeError("Loop must be started before any function can" " be submitted") - logger.debug(f"Running coroutine {repr(coroutine)} in loop") try: return asyncio.run_coroutine_threadsafe(coroutine, self._loop) except Exception as e: @@ -185,6 +185,8 @@ class ReplicateController(RPCHandler): def send_message(self, msg: Dict[str, Any]) -> None: """ Push message through """ + # We should probably do some type of schema validation here + if self.channel_manager.has_channels(): self._send_message(msg) else: @@ -199,7 +201,7 @@ class ReplicateController(RPCHandler): if self._queue: queue = self._queue.sync_q - queue.put(msg) + queue.put(msg) # This will block if the queue is full else: logger.warning("Can not send data, leader loop has not started yet!") @@ -235,7 +237,7 @@ class ReplicateController(RPCHandler): try: await self._broadcast_queue_data() except Exception as e: - logger.error("Exception occurred in leader loop: ") + logger.error("Exception occurred in Leader loop: ") logger.exception(e) async def _broadcast_queue_data(self): @@ -342,10 +344,14 @@ class ReplicateController(RPCHandler): logger.info("Starting rpc.replicate in Follower mode") try: - await self._connect_to_leaders() + results = await self._connect_to_leaders() except Exception as e: - logger.error("Exception occurred in follower loop: ") + logger.error("Exception occurred in Follower loop: ") logger.exception(e) + finally: + for result in results: + if isinstance(result, Exception): + logger.debug(f"Exception in Follower loop: {result}") async def _connect_to_leaders(self): """ @@ -372,7 +378,7 @@ class ReplicateController(RPCHandler): websocket_url = f"{url}?token={token}" - logger.info(f"Attempting to connect to leader at: {url}") + logger.info(f"Attempting to connect to Leader at: {url}") # TODO: limit the amount of connection retries while True: try: @@ -415,9 +421,12 @@ class ReplicateController(RPCHandler): except asyncio.CancelledError: pass - async def _handle_leader_message(self, message): + async def _handle_leader_message(self, message: Dict[str, Any]): type = message.get('data_type') data = message.get('data') - if type == LeaderMessageType.whitelist: - logger.info(f"Received whitelist from Leader: {data}") + logger.info(f"Received message from Leader: {type} - {data}") + + if type == LeaderMessageType.pairlist: + # Add the data to the ExternalPairlist + self.freqtrade.pairlists._pairlist_handlers[0].add_pairlist_data(data) From 90c03178b1a8a9ee458b6d46c10525bdd7ff4966 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 20 Aug 2022 17:02:18 +0200 Subject: [PATCH 008/437] provide user directions, clean up strategy, remove unnecessary code. --- config_examples/config_freqai.example.json | 1 - .../templates/FreqaiHybridExampleStrategy.py | 204 +++++++----------- 2 files changed, 82 insertions(+), 123 deletions(-) diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index aeb1cb13d..330bcd9f5 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -75,7 +75,6 @@ "weight_factor": 0.9, "principal_component_analysis": false, "use_SVM_to_remove_outliers": true, - "stratify_training_data": 0, "indicator_max_period_candles": 20, "indicator_periods_candles": [10, 20] }, diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index acceccee7..99abf27d4 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -1,64 +1,72 @@ import logging -from datetime import datetime, timedelta -from functools import reduce from typing import Optional import numpy as np import pandas as pd import talib.abstract as ta -from freqtrade.exchange import timeframe_to_prev_date -from freqtrade.persistence import Trade from freqtrade.strategy import (DecimalParameter, IntParameter, IStrategy, merge_informative_pair) -from numpy.lib import math from pandas import DataFrame -from technical import qtpylib logger = logging.getLogger(__name__) class FreqaiExampleHybridStrategy(IStrategy): """ - Example classifier hybrid strategy showing how the user connects their own - IFreqaiModel to the strategy. Namely, the user uses: - self.freqai.start(dataframe, metadata) + Example of a hybrid FreqAI strat, designed to illustrate how a user may employ + FreqAI to bolster a typical Freqtrade strategy. + + Launching this strategy would be: + + freqtrade trade --strategy FreqaiExampleHyridStrategy --strategy-path freqtrade/templates + --freqaimodel CatboostClassifier --config config_examples/config_freqai.example.json + + or the user simply adds this to their config: + + "freqai": { + "enabled": true, + "purge_old_models": true, + "train_period_days": 15, + "identifier": "uniqe-id", + "feature_parameters": { + "include_timeframes": [ + "3m", + "15m", + "1h" + ], + "include_corr_pairlist": [ + "BTC/USDT", + "ETH/USDT" + ], + "label_period_candles": 20, + "include_shifted_candles": 2, + "DI_threshold": 0.9, + "weight_factor": 0.9, + "principal_component_analysis": false, + "use_SVM_to_remove_outliers": true, + "indicator_max_period_candles": 20, + "indicator_periods_candles": [10, 20] + }, + "data_split_parameters": { + "test_size": 0.33, + "random_state": 1 + }, + "model_training_parameters": { + "n_estimators": 800 + } + }, - to make predictions on their data. populate_any_indicators() automatically - generates the variety of features indicated by the user in the - canonical freqtrade configuration file under config['freqai']. - - The underlying original supertrend strat is authored by @juankysoriano (Juan Carlos Soriano) - * github: https://github.com/juankysoriano/ - This strategy is not designed to be used live """ minimal_roi = {"0": 0.1, "30": 0.75, "60": 0.05, "120": 0.025, "240": -1} - plot_config = { - "main_plot": {}, - "subplots": { - "prediction": {"prediction": {"color": "blue"}}, - "target_roi": { - "target_roi": {"color": "brown"}, - }, - "do_predict": { - "do_predict": {"color": "brown"}, - }, - }, - } - process_only_new_candles = True stoploss = -0.1 use_exit_signal = True startup_candle_count: int = 300 can_short = True - linear_roi_offset = DecimalParameter( - 0.00, 0.02, default=0.005, space="sell", optimize=False, load=True - ) - max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True) - buy_params = { "buy_m1": 4, "buy_m2": 7, @@ -77,7 +85,7 @@ class FreqaiExampleHybridStrategy(IStrategy): "sell_p2": 18, "sell_p3": 18, } - + buy_m1 = IntParameter(1, 7, default=1) buy_m2 = IntParameter(1, 7, default=3) buy_m3 = IntParameter(1, 7, default=4) @@ -92,6 +100,7 @@ class FreqaiExampleHybridStrategy(IStrategy): sell_p2 = IntParameter(7, 21, default=10) sell_p3 = IntParameter(7, 21, default=10) + # FreqAI required function, leave as is or add you additional informatives to existing structure. def informative_pairs(self): whitelist_pairs = self.dp.current_whitelist() corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] @@ -105,16 +114,15 @@ class FreqaiExampleHybridStrategy(IStrategy): informative_pairs.append((pair, tf)) return informative_pairs + # FreqAI required function, user can add or remove indicators, but general structure + # must stay the same. def populate_any_indicators( self, pair, df, tf, informative=None, set_generalized_indicators=False ): """ - Function designed to automatically generate, name and merge features - from user indicated timeframes in the configuration file. User controls the indicators - passed to the training/prediction by prepending indicators with `'%-' + coin ` - (see convention below). I.e. user should not prepend any supporting metrics - (e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the - model. + User feeds these indicators to FreqAI to train a classifier to decide + if the market will go up or down. + :param pair: pair to be used as informative :param df: strategy dataframe which will receive merges from informatives :param tf: timeframe of the dataframe which will modify the feature names @@ -135,34 +143,14 @@ class FreqaiExampleHybridStrategy(IStrategy): informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) informative[f"%-{coin}sma-period_{t}"] = ta.SMA(informative, timeperiod=t) informative[f"%-{coin}ema-period_{t}"] = ta.EMA(informative, timeperiod=t) - informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - - bollinger = qtpylib.bollinger_bands( - qtpylib.typical_price(informative), window=t, stds=2.2 - ) - informative[f"{coin}bb_lowerband-period_{t}"] = bollinger["lower"] - informative[f"{coin}bb_middleband-period_{t}"] = bollinger["mid"] - informative[f"{coin}bb_upperband-period_{t}"] = bollinger["upper"] - - informative[f"%-{coin}bb_width-period_{t}"] = ( - informative[f"{coin}bb_upperband-period_{t}"] - - informative[f"{coin}bb_lowerband-period_{t}"] - ) / informative[f"{coin}bb_middleband-period_{t}"] - informative[f"%-{coin}close-bb_lower-period_{t}"] = ( - informative["close"] / informative[f"{coin}bb_lowerband-period_{t}"] - ) - informative[f"%-{coin}roc-period_{t}"] = ta.ROC(informative, timeperiod=t) - informative[f"%-{coin}relative_volume-period_{t}"] = ( informative["volume"] / informative["volume"].rolling(t).mean() ) - informative[f"%-{coin}pct-change"] = informative["close"].pct_change() - informative[f"%-{coin}raw_volume"] = informative["volume"] - informative[f"%-{coin}raw_price"] = informative["close"] - + # FreqAI needs the following lines in order to detect features and automatically + # expand upon them. indicators = [col for col in informative if col.startswith("%")] # This loop duplicates and shifts all indicators to add a sense of recency to data for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): @@ -178,56 +166,22 @@ class FreqaiExampleHybridStrategy(IStrategy): ] df = df.drop(columns=skip_columns) - # Add generalized indicators here (because in live, it will call this - # function to populate indicators during training). Notice how we ensure not to - # add them multiple times + # User can set the "target" here (in present case it is the + # "up" or "down") if set_generalized_indicators: - df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7 - df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25 - - # Classifiers are typically set up with strings as targets: - df['&s-up_or_down'] = np.where( df["close"].shift(-50) > - df["close"], 'up', 'down') - - # REGRESSOR Model: Can use single or multi traget - # user adds targets here by prepending them with &- (see convention below) - #df["&-s_close"] = ( - # df["close"] - # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - # .mean() - # / df["close"] - # - 1 - #) - # If user wishes to use multiple targets, they can add more by - # appending more columns with '&'. User should keep in mind that multi targets - # requires a multioutput prediction model such as - # templates/CatboostPredictionMultiModel.py, - - # df["&-s_range"] = ( - # df["close"] - # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - # .max() - # - - # df["close"] - # .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - # .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - # .min() - # ) + # User "looks into the future" here to figure out if the future + # will be "up" or "down". This same column name is available to + # the user + df['&s-up_or_down'] = np.where(df["close"].shift(-50) > + df["close"], 'up', 'down') return df def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - # All indicators must be populated by populate_any_indicators() for live functionality - # to work correctly. + # User creates their own custom strat here. Present example is a supertrend + # based strategy. - # the model will return all labels created by user in `populate_any_indicators` - # (& appended targets), an indication of whether or not the prediction should be accepted, - # the target mean/std values for each of the labels created by user in - # `populate_any_indicators()` for each training period. - for multiplier in self.buy_m1.range: for period in self.buy_p1.range: dataframe[f"supertrend_1_buy_{multiplier}_{period}"] = self.supertrend( @@ -270,20 +224,23 @@ class FreqaiExampleHybridStrategy(IStrategy): def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: + # User now can use their custom strat creation in addition to their + # future prediction "up" or "down". + df.loc[ (df[f"supertrend_1_buy_{self.buy_m1.value}_{self.buy_p1.value}"] == "up") & (df[f"supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}"] == "up") & (df[f"supertrend_3_buy_{self.buy_m3.value}_{self.buy_p3.value}"] == "up") & (df["do_predict"] == 1) & - (df['&s-up_or_down'] == 'up'), + (df['&s-up_or_down'] == 'up'), "enter_long", ] = 1 df.loc[ - (df[f"supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}"] == "down") & - (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down") & - (df[f"supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}"] == "down") & - (df["do_predict"] == 1) & + (df[f"supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}"] == "down") & + (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down") & + (df[f"supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}"] == "down") & + (df["do_predict"] == 1) & (df['&s-up_or_down'] == 'down'), "enter_short", ] = 1 @@ -291,7 +248,7 @@ class FreqaiExampleHybridStrategy(IStrategy): return df def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame: - + df.loc[ (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down"), "exit_long", @@ -308,8 +265,8 @@ class FreqaiExampleHybridStrategy(IStrategy): return int(self.config["timeframe"][:-1]) def confirm_trade_entry(self, pair: str, order_type: str, amount: float, - rate: float, time_in_force: str, current_time, entry_tag, side: str, - **kwargs, ) -> bool: + rate: float, time_in_force: str, current_time, entry_tag, side: str, + **kwargs, ) -> bool: df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) last_candle = df.iloc[-1].squeeze() @@ -322,7 +279,7 @@ class FreqaiExampleHybridStrategy(IStrategy): return False return True - + def leverage(self, pair: str, current_time: datetime, current_rate: float, proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, **kwargs) -> float: @@ -335,6 +292,7 @@ class FreqaiExampleHybridStrategy(IStrategy): """ def supertrend(self, dataframe: DataFrame, multiplier, period): + df = dataframe.copy() last_row = dataframe.tail(1).index.item() @@ -354,17 +312,19 @@ class FreqaiExampleHybridStrategy(IStrategy): # Compute final upper and lower bands for i in range(period, last_row + 1): - FINAL_UB[i] = BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - 1] or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1] - FINAL_LB[i] = BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - 1] or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1] + FINAL_UB[i] = BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - + 1] or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1] + FINAL_LB[i] = BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - + 1] or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1] # Set the Supertrend value for i in range(period, last_row + 1): ST[i] = FINAL_UB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] <= FINAL_UB[i] else \ - FINAL_LB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] > FINAL_UB[i] else \ + FINAL_LB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] > FINAL_UB[i] else \ FINAL_LB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] >= FINAL_LB[i] else \ - FINAL_UB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] < FINAL_LB[i] else 0.00 + FINAL_UB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] < FINAL_LB[i] else 0.00 df_ST = pd.DataFrame(ST, columns=[st]) - df = pd.concat([df, df_ST],axis=1) + df = pd.concat([df, df_ST], axis=1) # Mark the trend direction up/down df[stx] = np.where((df[st] > 0.00), np.where((df['close'] < df[st]), 'down', 'up'), np.NaN) @@ -372,6 +332,6 @@ class FreqaiExampleHybridStrategy(IStrategy): df.fillna(0, inplace=True) return DataFrame(index=df.index, data={ - 'ST' : df[st], - 'STX' : df[stx] + 'ST': df[st], + 'STX': df[stx] }) From 64b083443752e9aa9af5fd81a2c77cf42db4c690 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 20 Aug 2022 17:04:38 +0200 Subject: [PATCH 009/437] add credit in docstring --- freqtrade/templates/FreqaiHybridExampleStrategy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index 99abf27d4..145590add 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -56,7 +56,7 @@ class FreqaiExampleHybridStrategy(IStrategy): } }, - This strategy is not designed to be used live + Thanks to @smarm and @jooopieeert for developing and sharing the strategy. """ minimal_roi = {"0": 0.1, "30": 0.75, "60": 0.05, "120": 0.025, "240": -1} From 6189aa817ce3dcb6b5185d62350e641d32c41a3e Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 20 Aug 2022 19:50:18 +0200 Subject: [PATCH 010/437] Fix HybridExample formatting --- .../templates/FreqaiHybridExampleStrategy.py | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index 145590add..bb9c37b03 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -1,13 +1,13 @@ import logging -from typing import Optional import numpy as np import pandas as pd import talib.abstract as ta -from freqtrade.strategy import (DecimalParameter, IntParameter, IStrategy, - merge_informative_pair) from pandas import DataFrame +from freqtrade.strategy import IntParameter, IStrategy, merge_informative_pair + + logger = logging.getLogger(__name__) @@ -100,7 +100,7 @@ class FreqaiExampleHybridStrategy(IStrategy): sell_p2 = IntParameter(7, 21, default=10) sell_p3 = IntParameter(7, 21, default=10) - # FreqAI required function, leave as is or add you additional informatives to existing structure. + # FreqAI required function, leave as is or add additional informatives to existing structure. def informative_pairs(self): whitelist_pairs = self.dp.current_whitelist() corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] @@ -120,7 +120,7 @@ class FreqaiExampleHybridStrategy(IStrategy): self, pair, df, tf, informative=None, set_generalized_indicators=False ): """ - User feeds these indicators to FreqAI to train a classifier to decide + User feeds these indicators to FreqAI to train a classifier to decide if the market will go up or down. :param pair: pair to be used as informative @@ -177,6 +177,7 @@ class FreqaiExampleHybridStrategy(IStrategy): return df + # flake8: noqa: C901 def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # User creates their own custom strat here. Present example is a supertrend @@ -280,12 +281,6 @@ class FreqaiExampleHybridStrategy(IStrategy): return True - def leverage(self, pair: str, current_time: datetime, current_rate: float, - proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, - **kwargs) -> float: - - return 1 - """ Supertrend Indicator; adapted for freqtrade, optimized by the math genius. from: Perkmeister#2394 @@ -312,10 +307,10 @@ class FreqaiExampleHybridStrategy(IStrategy): # Compute final upper and lower bands for i in range(period, last_row + 1): - FINAL_UB[i] = BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - - 1] or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1] - FINAL_LB[i] = BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - - 1] or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1] + FINAL_UB[i] = (BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - 1] + or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1]) + FINAL_LB[i] = (BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - 1] + or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1]) # Set the Supertrend value for i in range(period, last_row + 1): From 6f5478cc029bc146e3980affa61dd7956c5cb416 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 21 Aug 2022 22:45:36 -0600 Subject: [PATCH 011/437] DataFrame transmission, strategy follower logic --- freqtrade/data/dataprovider.py | 57 ++++++++++- freqtrade/enums/replicate.py | 1 + freqtrade/freqtradebot.py | 43 +++++++-- freqtrade/misc.py | 22 +++++ .../plugins/pairlist/ExternalPairList.py | 3 +- freqtrade/rpc/replicate/__init__.py | 94 +++++++++++-------- freqtrade/rpc/replicate/channel.py | 16 +++- freqtrade/rpc/replicate/serializer.py | 27 +++++- freqtrade/rpc/replicate/types.py | 3 +- freqtrade/rpc/rpc.py | 39 +++++++- freqtrade/rpc/rpc_manager.py | 13 ++- freqtrade/strategy/interface.py | 92 +++++++++++++++--- requirements-replicate.txt | 1 + 13 files changed, 332 insertions(+), 79 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 21cead77f..3de73bb0d 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -7,6 +7,7 @@ Common Interface for bot and strategy to access data. import logging from collections import deque from datetime import datetime, timezone +from threading import Event from typing import Any, Dict, List, Optional, Tuple from pandas import DataFrame @@ -28,13 +29,16 @@ MAX_DATAFRAME_CANDLES = 1000 class DataProvider: - def __init__(self, config: dict, exchange: Optional[Exchange], pairlists=None) -> None: + def __init__(self, config: dict, exchange: Optional[Exchange], + pairlists=None, replicate_controller=None) -> None: self._config = config self._exchange = exchange self._pairlists = pairlists self.__cached_pairs: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} self.__slice_index: Optional[int] = None self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {} + self.__external_pairs_df: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} + self.__external_pairs_event: Dict[str, Event] = {} self._msg_queue: deque = deque() self.__msg_cache = PeriodicCache( @@ -63,9 +67,58 @@ class DataProvider: :param dataframe: analyzed dataframe :param candle_type: Any of the enum CandleType (must match trading mode!) """ - self.__cached_pairs[(pair, timeframe, candle_type)] = ( + pair_key = (pair, timeframe, candle_type) + self.__cached_pairs[pair_key] = ( dataframe, datetime.now(timezone.utc)) + def add_external_df( + self, + pair: str, + timeframe: str, + dataframe: DataFrame, + candle_type: CandleType + ) -> None: + """ + Add the DataFrame to the __external_pairs_df. If a pair event exists, + set it to release the main thread from waiting. + """ + pair_key = (pair, timeframe, candle_type) + + # Delete stale data + if pair_key in self.__external_pairs_df: + del self.__external_pairs_df[pair_key] + + self.__external_pairs_df[pair_key] = (dataframe, datetime.now(timezone.utc)) + + pair_event = self.__external_pairs_event.get(pair) + if pair_event: + logger.debug(f"Leader data for pair {pair_key} has been added") + pair_event.set() + + def get_external_df( + self, + pair: str, + timeframe: str, + candle_type: CandleType + ) -> DataFrame: + """ + If the pair exists in __external_pairs_df, return it. If it doesn't, + create a new threading Event in __external_pairs_event and wait on it. + """ + pair_key = (pair, timeframe, candle_type) + if pair_key not in self.__external_pairs_df: + pair_event = Event() + self.__external_pairs_event[pair] = pair_event + + logger.debug(f"Waiting on Leader data for: {pair_key}") + self.__external_pairs_event[pair].wait() + + if pair_key in self.__external_pairs_df: + return self.__external_pairs_df[pair_key] + + # Because of the waiting mechanism, this should never return + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + def add_pairlisthandler(self, pairlists) -> None: """ Allow adding pairlisthandler after initialization diff --git a/freqtrade/enums/replicate.py b/freqtrade/enums/replicate.py index 73be996c0..8d036f0b9 100644 --- a/freqtrade/enums/replicate.py +++ b/freqtrade/enums/replicate.py @@ -8,3 +8,4 @@ class ReplicateModeType(str, Enum): class LeaderMessageType(str, Enum): pairlist = "pairlist" + analyzed_df = "analyzed_df" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index b2ec1448e..3b850dd4e 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -23,7 +23,7 @@ from freqtrade.exceptions import (DependencyException, ExchangeError, Insufficie InvalidOrderException, PricingError) from freqtrade.exchange import timeframe_to_minutes, timeframe_to_seconds from freqtrade.exchange.exchange import timeframe_to_next_date -from freqtrade.misc import safe_value_fallback, safe_value_fallback2 +from freqtrade.misc import dataframe_to_json, safe_value_fallback, safe_value_fallback2 from freqtrade.mixins import LoggingMixin from freqtrade.persistence import Order, PairLocks, Trade, init_db from freqtrade.plugins.pairlistmanager import PairListManager @@ -77,6 +77,8 @@ class FreqtradeBot(LoggingMixin): self.replicate_controller = None + self.pairlists = PairListManager(self.exchange, self.config) + # RPC runs in separate threads, can start handling external commands just after # initialization, even before Freqtradebot has a chance to start its throttling, # so anything in the Freqtradebot instance should be ready (initialized), including @@ -84,8 +86,6 @@ class FreqtradeBot(LoggingMixin): # Keep this at the end of this initialization method. self.rpc: RPCManager = RPCManager(self) - self.pairlists = PairListManager(self.exchange, self.config) - self.dataprovider = DataProvider(self.config, self.exchange, self.pairlists) # Attach Dataprovider to strategy instance @@ -93,6 +93,9 @@ class FreqtradeBot(LoggingMixin): # Attach Wallets to strategy instance self.strategy.wallets = self.wallets + # Attach ReplicateController to the strategy + # self.strategy.replicate_controller = self.replicate_controller + # Initializing Edge only if enabled self.edge = Edge(self.config, self.exchange, self.strategy) if \ self.config.get('edge', {}).get('enabled', False) else None @@ -194,7 +197,28 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - self.strategy.analyze(self.active_pair_whitelist) + if self.replicate_controller: + if not self.replicate_controller.is_leader(): + # Run Follower mode analyzing + leader_pairs = self.pairlists._whitelist + self.strategy.analyze_external(self.active_pair_whitelist, leader_pairs) + else: + # We are leader, make sure to pass callback func to emit data + def emit_on_finish(pair, dataframe, timeframe, candle_type): + logger.debug(f"Emitting dataframe for {pair}") + return self.rpc.emit_data( + { + "data_type": LeaderMessageType.analyzed_df, + "data": { + "key": (pair, timeframe, candle_type), + "value": dataframe_to_json(dataframe) + } + } + ) + + self.strategy.analyze(self.active_pair_whitelist, finish_callback=emit_on_finish) + else: + self.strategy.analyze(self.active_pair_whitelist) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace @@ -264,14 +288,13 @@ class FreqtradeBot(LoggingMixin): # Or should this class be made available to the PairListManager and ran # when filter_pairlist is called? + if self.replicate_controller: if self.replicate_controller.is_leader(): - self.replicate_controller.send_message( - { - "data_type": LeaderMessageType.pairlist, - "data": _whitelist - } - ) + self.rpc.emit_data({ + "data_type": LeaderMessageType.pairlist, + "data": _whitelist + }) # Calculating Edge positioning if self.edge: diff --git a/freqtrade/misc.py b/freqtrade/misc.py index c3968e61c..bc644a7ec 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -10,6 +10,7 @@ from typing import Any, Iterator, List from typing.io import IO from urllib.parse import urlparse +import pandas import rapidjson from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN @@ -249,3 +250,24 @@ def parse_db_uri_for_logging(uri: str): return uri pwd = parsed_db_uri.netloc.split(':')[1].split('@')[0] return parsed_db_uri.geturl().replace(f':{pwd}@', ':*****@') + + +def dataframe_to_json(dataframe: pandas.DataFrame) -> str: + """ + Serialize a DataFrame for transmission over the wire using JSON + :param dataframe: A pandas DataFrame + :returns: A JSON string of the pandas DataFrame + """ + return dataframe.to_json(orient='records') + + +def json_to_dataframe(data: str) -> pandas.DataFrame: + """ + Deserialize JSON into a DataFrame + :param data: A JSON string + :returns: A pandas DataFrame from the JSON string + """ + dataframe = pandas.read_json(data) + dataframe['date'] = pandas.to_datetime(dataframe['date'], unit='ms', utc=True) + + return dataframe diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py index 82fc12ff9..bd36c7cf3 100644 --- a/freqtrade/plugins/pairlist/ExternalPairList.py +++ b/freqtrade/plugins/pairlist/ExternalPairList.py @@ -81,11 +81,10 @@ class ExternalPairList(IPairList): seen = set(self._leader_pairs) for pair in pairlist: if pair in seen: - logger.debug(f"Encountered already existing pair {pair}") continue self._leader_pairs.append(pair) - if not self._has_data.is_set(): + if not self._has_data.is_set() and len(self._leader_pairs) > 0: self._has_data.set() def gen_pairlist(self, tickers: Dict) -> List[str]: diff --git a/freqtrade/rpc/replicate/__init__.py b/freqtrade/rpc/replicate/__init__.py index fd718197e..5cc2ae6a9 100644 --- a/freqtrade/rpc/replicate/__init__.py +++ b/freqtrade/rpc/replicate/__init__.py @@ -5,6 +5,7 @@ import asyncio import logging import secrets import socket +import traceback from threading import Event, Thread from typing import Any, Coroutine, Dict, Union @@ -17,6 +18,7 @@ from freqtrade.enums import LeaderMessageType, ReplicateModeType, RPCMessageType from freqtrade.rpc import RPC, RPCHandler from freqtrade.rpc.replicate.channel import ChannelManager from freqtrade.rpc.replicate.thread_queue import Queue as ThreadedQueue +from freqtrade.rpc.replicate.types import MessageType from freqtrade.rpc.replicate.utils import is_websocket_alive @@ -79,11 +81,11 @@ class ReplicateController(RPCHandler): self.mode = ReplicateModeType[self.replicate_config.get('mode', 'leader').lower()] self.leaders_list = self.replicate_config.get('leaders', []) - self.push_throttle_secs = self.replicate_config.get('push_throttle_secs', 1) + self.push_throttle_secs = self.replicate_config.get('push_throttle_secs', 0.1) self.reply_timeout = self.replicate_config.get('follower_reply_timeout', 10) self.ping_timeout = self.replicate_config.get('follower_ping_timeout', 2) - self.sleep_time = self.replicate_config.get('follower_sleep_time', 1) + self.sleep_time = self.replicate_config.get('follower_sleep_time', 5) if self.mode == ReplicateModeType.follower and len(self.leaders_list) == 0: raise ValueError("You must specify at least 1 leader in follower mode.") @@ -143,6 +145,8 @@ class ReplicateController(RPCHandler): except asyncio.CancelledError: pass + except Exception: + pass finally: self._loop.stop() @@ -170,22 +174,19 @@ class ReplicateController(RPCHandler): self._thread.join() - def send_msg(self, msg: Dict[str, Any]) -> None: + def send_msg(self, msg: MessageType) -> None: """ Support RPC calls """ if msg["type"] == RPCMessageType.EMIT_DATA: - self.send_message( - { - "data_type": msg.get("data_type"), - "data": msg.get("data") - } - ) + message = msg.get("message") + if message: + self.send_message(message) + else: + logger.error(f"Message is empty! {msg}") - def send_message(self, msg: Dict[str, Any]) -> None: - """ Push message through """ - - # We should probably do some type of schema validation here + def send_message(self, msg: MessageType) -> None: + """ Broadcast message over all channels if there are any """ if self.channel_manager.has_channels(): self._send_message(msg) @@ -193,12 +194,11 @@ class ReplicateController(RPCHandler): logger.debug("No listening followers, skipping...") pass - def _send_message(self, msg: Dict[Any, Any]): + def _send_message(self, msg: MessageType): """ Add data to the internal queue to be broadcasted. This func will block if the queue is full. This is meant to be called in the main thread. """ - if self._queue: queue = self._queue.sync_q queue.put(msg) # This will block if the queue is full @@ -226,7 +226,6 @@ class ReplicateController(RPCHandler): This starts all of the leader coros and registers the endpoint on the ApiServer """ - logger.info("Running rpc.replicate in Leader mode") logger.info("-" * 15) logger.info(f"API_KEY: {self.secret_api_key}") @@ -253,16 +252,17 @@ class ReplicateController(RPCHandler): # Get data from queue data = await async_queue.get() - logger.info(f"Found data - broadcasting: {data}") - # Broadcast it to everyone await self.channel_manager.broadcast(data) # Sleep await asyncio.sleep(self.push_throttle_secs) + except asyncio.CancelledError: # Silently stop pass + except Exception as e: + logger.exception(e) async def get_api_token( self, @@ -285,7 +285,6 @@ class ReplicateController(RPCHandler): :param path: The endpoint path """ - if not self.api_server: raise RuntimeError("The leader needs the ApiServer to be active") @@ -312,10 +311,13 @@ class ReplicateController(RPCHandler): # we may not have to send initial data at all. Further testing # required. + await self.send_initial_data(channel) + # Keep connection open until explicitly closed, and sleep try: while not channel.is_closed(): - await channel.recv() + request = await channel.recv() + logger.info(f"Follower request - {request}") except WebSocketDisconnect: # Handle client disconnects @@ -332,6 +334,17 @@ class ReplicateController(RPCHandler): logger.error(f"Failed to serve - {websocket.client}") await self.channel_manager.on_disconnect(websocket) + async def send_initial_data(self, channel): + logger.info("Sending initial data through channel") + + # We first send pairlist data + initial_data = { + "data_type": LeaderMessageType.pairlist, + "data": self.freqtrade.pairlists.whitelist + } + + await channel.send(initial_data) + # -------------------------------FOLLOWER LOGIC---------------------------- async def follower_loop(self): @@ -340,18 +353,27 @@ class ReplicateController(RPCHandler): This starts all of the follower connection coros """ - logger.info("Starting rpc.replicate in Follower mode") - try: - results = await self._connect_to_leaders() - except Exception as e: - logger.error("Exception occurred in Follower loop: ") - logger.exception(e) - finally: - for result in results: - if isinstance(result, Exception): - logger.debug(f"Exception in Follower loop: {result}") + responses = await self._connect_to_leaders() + + # Eventually add the ability to send requests to the Leader + # await self._send_requests() + + for result in responses: + if isinstance(result, Exception): + logger.debug(f"Exception in Follower loop: {result}") + traceback_message = ''.join(traceback.format_tb(result.__traceback__)) + logger.error(traceback_message) + + async def _handle_leader_message(self, message: MessageType): + """ + Handle message received from a Leader + """ + type = message.get("data_type") + data = message.get("data") + + self._rpc._handle_emitted_data(type, data) async def _connect_to_leaders(self): """ @@ -375,7 +397,6 @@ class ReplicateController(RPCHandler): """ try: url, token = leader["url"], leader["token"] - websocket_url = f"{url}?token={token}" logger.info(f"Attempting to connect to Leader at: {url}") @@ -384,6 +405,7 @@ class ReplicateController(RPCHandler): try: async with websockets.connect(websocket_url) as ws: channel = await self.channel_manager.on_connect(ws) + logger.info(f"Connection to Leader at {url} successful") while True: try: data = await asyncio.wait_for( @@ -420,13 +442,3 @@ class ReplicateController(RPCHandler): except asyncio.CancelledError: pass - - async def _handle_leader_message(self, message: Dict[str, Any]): - type = message.get('data_type') - data = message.get('data') - - logger.info(f"Received message from Leader: {type} - {data}") - - if type == LeaderMessageType.pairlist: - # Add the data to the ExternalPairlist - self.freqtrade.pairlists._pairlist_handlers[0].add_pairlist_data(data) diff --git a/freqtrade/rpc/replicate/channel.py b/freqtrade/rpc/replicate/channel.py index 7aa316ff5..62ed3e025 100644 --- a/freqtrade/rpc/replicate/channel.py +++ b/freqtrade/rpc/replicate/channel.py @@ -2,7 +2,7 @@ import logging from typing import Type from freqtrade.rpc.replicate.proxy import WebSocketProxy -from freqtrade.rpc.replicate.serializer import JSONWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.replicate.serializer import MsgPackWebSocketSerializer, WebSocketSerializer from freqtrade.rpc.replicate.types import WebSocketType @@ -17,7 +17,7 @@ class WebSocketChannel: def __init__( self, websocket: WebSocketType, - serializer_cls: Type[WebSocketSerializer] = JSONWebSocketSerializer + serializer_cls: Type[WebSocketSerializer] = MsgPackWebSocketSerializer ): # The WebSocket object self._websocket = WebSocketProxy(websocket) @@ -34,6 +34,7 @@ class WebSocketChannel: """ Send data on the wrapped websocket """ + # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") await self._wrapped_ws.send(data) async def recv(self): @@ -116,6 +117,17 @@ class ChannelManager: # Handle cannot send after close cases await self.on_disconnect(websocket) + async def send_direct(self, channel, data): + """ + Send data directly through direct_channel only + + :param direct_channel: The WebSocketChannel object to send data through + :param data: The data to send + """ + # We iterate over the channels to get reference to the websocket object + # so we can disconnect incase of failure + await channel.send(data) + def has_channels(self): """ Flag for more than 0 channels diff --git a/freqtrade/rpc/replicate/serializer.py b/freqtrade/rpc/replicate/serializer.py index 717458f09..98bdc8934 100644 --- a/freqtrade/rpc/replicate/serializer.py +++ b/freqtrade/rpc/replicate/serializer.py @@ -1,9 +1,16 @@ import json +import logging from abc import ABC, abstractmethod +import msgpack +import orjson + from freqtrade.rpc.replicate.proxy import WebSocketProxy +logger = logging.getLogger(__name__) + + class WebSocketSerializer(ABC): def __init__(self, websocket: WebSocketProxy): self._websocket: WebSocketProxy = websocket @@ -34,9 +41,25 @@ class WebSocketSerializer(ABC): class JSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data): - # json expects string not bytes return json.dumps(data) def _deserialize(self, data): - # The WebSocketSerializer gives bytes not string return json.loads(data) + + +class ORJSONWebSocketSerializer(WebSocketSerializer): + ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY + + def _serialize(self, data): + return orjson.dumps(data, option=self.ORJSON_OPTIONS) + + def _deserialize(self, data): + return orjson.loads(data, option=self.ORJSON_OPTIONS) + + +class MsgPackWebSocketSerializer(WebSocketSerializer): + def _serialize(self, data): + return msgpack.packb(data, use_bin_type=True) + + def _deserialize(self, data): + return msgpack.unpackb(data, raw=False) diff --git a/freqtrade/rpc/replicate/types.py b/freqtrade/rpc/replicate/types.py index 763147196..814fe6649 100644 --- a/freqtrade/rpc/replicate/types.py +++ b/freqtrade/rpc/replicate/types.py @@ -1,7 +1,8 @@ -from typing import TypeVar +from typing import Any, Dict, TypeVar from fastapi import WebSocket as FastAPIWebSocket from websockets import WebSocketClientProtocol as WebSocket WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) +MessageType = Dict[str, Any] diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index ed7f13a96..2c7b2ec72 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -19,12 +19,12 @@ from freqtrade.configuration.timerange import TimeRange from freqtrade.constants import CANCEL_REASON, DATETIME_PRINT_FORMAT from freqtrade.data.history import load_data from freqtrade.data.metrics import calculate_max_drawdown -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, State, - TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, LeaderMessageType, + SignalDirection, State, TradingMode) from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler -from freqtrade.misc import decimals_per_coin, shorten_date +from freqtrade.misc import decimals_per_coin, json_to_dataframe, shorten_date from freqtrade.persistence import PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -1089,3 +1089,36 @@ class RPC: 'last_process_loc': last_p.astimezone(tzlocal()).strftime(DATETIME_PRINT_FORMAT), 'last_process_ts': int(last_p.timestamp()), } + + def _handle_emitted_data(self, type, data): + """ + Handles the emitted data from the Leaders + + :param type: The data_type of the data + :param data: The data + """ + logger.debug(f"Handling emitted data of type ({type})") + + if type == LeaderMessageType.pairlist: + pairlist = data + + logger.debug(pairlist) + + # Add the pairlist data to the ExternalPairList object + external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] + external_pairlist.add_pairlist_data(pairlist) + + elif type == LeaderMessageType.analyzed_df: + # Convert the dataframe back from json + key, value = data["key"], data["value"] + + pair, timeframe, candle_type = key + dataframe = json_to_dataframe(value) + + dataprovider = self._freqtrade.dataprovider + + logger.debug(f"Received analyzed dataframe for {pair}") + logger.debug(dataframe.tail()) + + # Add the dataframe to the dataprovider + dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 8eaec21ea..3d561cc8e 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -20,6 +20,7 @@ class RPCManager: def __init__(self, freqtrade) -> None: """ Initializes all enabled rpc modules """ self.registered_modules: List[RPCHandler] = [] + self._freqtrade = freqtrade self._rpc = RPC(freqtrade) config = freqtrade.config # Enable telegram @@ -82,7 +83,8 @@ class RPCManager: 'status': 'stopping bot' } """ - logger.info('Sending rpc message: %s', msg) + if msg.get("type") != RPCMessageType.EMIT_DATA: + logger.info('Sending rpc message: %s', msg) if 'pair' in msg: msg.update({ 'base_currency': self._rpc._freqtrade.exchange.get_pair_base_currency(msg['pair']) @@ -141,3 +143,12 @@ class RPCManager: 'type': RPCMessageType.STARTUP, 'status': f'Using Protections: \n{prots}' }) + + def emit_data(self, data: Dict[str, Any]): + """ + Send a message via RPC with type RPCMessageType.EMIT_DATA + """ + self.send_msg({ + "type": RPCMessageType.EMIT_DATA, + "message": data + }) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 79dbd4c69..ddd10dd8e 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -5,7 +5,7 @@ This module defines the interface to apply for strategies import logging from abc import ABC, abstractmethod from datetime import datetime, timedelta, timezone -from typing import Dict, List, Optional, Tuple, Union +from typing import Callable, Dict, List, Optional, Tuple, Union import arrow from pandas import DataFrame @@ -18,6 +18,7 @@ from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds from freqtrade.persistence import Order, PairLocks, Trade +from freqtrade.rpc.replicate import ReplicateController from freqtrade.strategy.hyper import HyperStrategyMixin from freqtrade.strategy.informative_decorator import (InformativeData, PopulateIndicators, _create_and_merge_informative_pair, @@ -110,6 +111,7 @@ class IStrategy(ABC, HyperStrategyMixin): # the dataprovider (dp) (access to other candles, historic data, ...) # and wallets - access to the current balance. dp: DataProvider + replicate_controller: Optional[ReplicateController] wallets: Optional[Wallets] = None # Filled from configuration stake_currency: str @@ -123,6 +125,7 @@ class IStrategy(ABC, HyperStrategyMixin): self.config = config # Dict to determine if analysis is necessary self._last_candle_seen_per_pair: Dict[str, datetime] = {} + self._last_candle_seen_external: Dict[str, datetime] = {} super().__init__(config) # Gather informative pairs from @informative-decorated methods. @@ -678,7 +681,12 @@ class IStrategy(ABC, HyperStrategyMixin): lock_time = timeframe_to_next_date(self.timeframe, candle_date) return PairLocks.is_pair_locked(pair, lock_time, side=side) - def analyze_ticker(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def analyze_ticker( + self, + dataframe: DataFrame, + metadata: dict, + populate_indicators: bool = True + ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame add several TA indicators and entry order signal to it @@ -687,12 +695,19 @@ class IStrategy(ABC, HyperStrategyMixin): :return: DataFrame of candle (OHLCV) data with indicator data and signals added """ logger.debug("TA Analysis Launched") - dataframe = self.advise_indicators(dataframe, metadata) + if populate_indicators: + dataframe = self.advise_indicators(dataframe, metadata) dataframe = self.advise_entry(dataframe, metadata) dataframe = self.advise_exit(dataframe, metadata) return dataframe - def _analyze_ticker_internal(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + def _analyze_ticker_internal( + self, + dataframe: DataFrame, + metadata: dict, + external_data: bool = False, + finish_callback: Optional[Callable] = None, + ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame add several TA indicators and buy signal to it @@ -707,12 +722,19 @@ class IStrategy(ABC, HyperStrategyMixin): # always run if process_only_new_candles is set to false if (not self.process_only_new_candles or self._last_candle_seen_per_pair.get(pair, None) != dataframe.iloc[-1]['date']): + + populate_indicators = not external_data # Defs that only make change on new candle data. - dataframe = self.analyze_ticker(dataframe, metadata) + dataframe = self.analyze_ticker(dataframe, metadata, populate_indicators) + self._last_candle_seen_per_pair[pair] = dataframe.iloc[-1]['date'] - self.dp._set_cached_df( - pair, self.timeframe, dataframe, - candle_type=self.config.get('candle_type_def', CandleType.SPOT)) + + candle_type = self.config.get('candle_type_def', CandleType.SPOT) + self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) + + if finish_callback: + finish_callback(pair, dataframe, self.timeframe, candle_type) + else: logger.debug("Skipping TA Analysis for already analyzed candle") dataframe[SignalType.ENTER_LONG.value] = 0 @@ -726,16 +748,25 @@ class IStrategy(ABC, HyperStrategyMixin): return dataframe - def analyze_pair(self, pair: str) -> None: + def analyze_pair( + self, + pair: str, + external_data: bool = False, + finish_callback: Optional[Callable] = None, + ) -> None: """ Fetch data for this pair from dataprovider and analyze. Stores the dataframe into the dataprovider. The analyzed dataframe is then accessible via `dp.get_analyzed_dataframe()`. :param pair: Pair to analyze. """ - dataframe = self.dp.ohlcv( - pair, self.timeframe, candle_type=self.config.get('candle_type_def', CandleType.SPOT) - ) + candle_type = self.config.get('candle_type_def', CandleType.SPOT) + + if not external_data: + dataframe = self.dp.ohlcv(pair, self.timeframe, candle_type) + else: + dataframe, last_analyzed = self.dp.get_external_df(pair, self.timeframe, candle_type) + if not isinstance(dataframe, DataFrame) or dataframe.empty: logger.warning('Empty candle (OHLCV) data for pair %s', pair) return @@ -745,7 +776,7 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = strategy_safe_wrapper( self._analyze_ticker_internal, message="" - )(dataframe, {'pair': pair}) + )(dataframe, {'pair': pair}, external_data, finish_callback) self.assert_df(dataframe, df_len, df_close, df_date) except StrategyError as error: @@ -756,15 +787,43 @@ class IStrategy(ABC, HyperStrategyMixin): logger.warning('Empty dataframe for pair %s', pair) return - def analyze(self, pairs: List[str]) -> None: + def analyze( + self, + pairs: List[str], + finish_callback: Optional[Callable] = None + ) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze """ for pair in pairs: + self.analyze_pair(pair, finish_callback=finish_callback) + + def analyze_external(self, pairs: List[str], leader_pairs: List[str]) -> None: + """ + Analyze the pre-populated dataframes from the Leader + + :param pairs: The active pair whitelist + :param leader_pairs: The list of pairs from the Leaders + """ + + # Get the extra pairs not listed in Leader pairs, and process + # them normally. + # List order is not preserved when doing this! + # We use ^ instead of - for symmetric difference + # What do we do with these? + extra_pairs = list(set(pairs) ^ set(leader_pairs)) + # These would be the pairs that we have trades in, which means + # we would have to analyze them normally + + for pair in leader_pairs: + # Analyze the pairs, but get the dataframe from the external data + self.analyze_pair(pair, external_data=True) + + for pair in extra_pairs: self.analyze_pair(pair) - @staticmethod + @ staticmethod def preserve_df(dataframe: DataFrame) -> Tuple[int, float, datetime]: """ keep some data for dataframes """ return len(dataframe), dataframe["close"].iloc[-1], dataframe["date"].iloc[-1] @@ -1185,6 +1244,9 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = _create_and_merge_informative_pair( self, dataframe, metadata, inf_data, populate_fn) + # If in follower mode, get analyzed dataframe from leader df's in dp + # otherise run populate_indicators + return self.populate_indicators(dataframe, metadata) def advise_entry(self, dataframe: DataFrame, metadata: dict) -> DataFrame: diff --git a/requirements-replicate.txt b/requirements-replicate.txt index 7ee351d9d..2c994ea2f 100644 --- a/requirements-replicate.txt +++ b/requirements-replicate.txt @@ -3,3 +3,4 @@ # Required for follower websockets +msgpack From 4fa01548f6c6ac49e63b7a4960ede268c0bf3aab Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 21 Aug 2022 22:49:42 -0600 Subject: [PATCH 012/437] Remove old var from strategy interface --- freqtrade/strategy/interface.py | 1 - 1 file changed, 1 deletion(-) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index ddd10dd8e..1084838ec 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -125,7 +125,6 @@ class IStrategy(ABC, HyperStrategyMixin): self.config = config # Dict to determine if analysis is necessary self._last_candle_seen_per_pair: Dict[str, datetime] = {} - self._last_candle_seen_external: Dict[str, datetime] = {} super().__init__(config) # Gather informative pairs from @informative-decorated methods. From ac42c0153da716e0a70abd7a8024d8d3162e4ba6 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 22 Aug 2022 18:19:07 +0200 Subject: [PATCH 013/437] deprecate indicator_max_period_candles, automatically compute startup candles for FreqAI backtesting. --- config_examples/config_freqai.example.json | 2 +- docs/freqai.md | 2 +- docs/strategy-customization.md | 2 +- freqtrade/data/dataprovider.py | 13 +++++++- freqtrade/freqai/data_kitchen.py | 32 +++++++++---------- freqtrade/optimize/backtesting.py | 33 ++++++++++++++------ freqtrade/strategy/interface.py | 1 + freqtrade/templates/FreqaiExampleStrategy.py | 3 +- tests/freqai/conftest.py | 1 - tests/freqai/test_freqai_backtesting.py | 10 +++--- 10 files changed, 61 insertions(+), 38 deletions(-) diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index aeb1cb13d..093e11b2a 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -9,6 +9,7 @@ "dry_run": true, "timeframe": "3m", "dry_run_wallet": 1000, + "startup_candle_count": 20, "cancel_open_orders_on_exit": true, "unfilledtimeout": { "entry": 10, @@ -53,7 +54,6 @@ ], "freqai": { "enabled": true, - "startup_candles": 10000, "purge_old_models": true, "train_period_days": 15, "backtest_period_days": 7, diff --git a/docs/freqai.md b/docs/freqai.md index b22e1cd31..f3c9021ed 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -113,7 +113,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `use_SVM_to_remove_outliers` | Ask FreqAI to train a support vector machine to detect and remove outliers from the training data set as well as from incoming data points.
**Datatype:** boolean. | `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. E.g. `nu` *Very* broadly, is the percentage of data points that should be considered outliers. `shuffle` is by default false to maintain reproducibility. But these and all others can be added/changed in this dictionary.
**Datatype:** dictionary. | `stratify_training_data` | This value is used to indicate the stratification of the data. e.g. 2 would set every 2nd data point into a separate dataset to be pulled from during training/testing.
**Datatype:** positive integer. -| `indicator_max_period_candles` | The maximum *period* used in `populate_any_indicators()` for indicator creation. FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. +| `indicator_max_period_candles` | **Deprecated in favor of** strategy set `startup_candle_count`, however, both configuration parameters provide the same functionality; the maximum *period* used in `populate_any_indicators()` for indicator creation (timeframe independent). FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. | `indicator_periods_candles` | A list of integers used to duplicate all indicators according to a set of periods and add them to the feature set.
**Datatype:** list of positive integers. | `use_DBSCAN_to_remove_outliers` | Inactive by default. If true, FreqAI clusters data using DBSCAN to identify and remove outliers from training and prediction data.
**Datatype:** float (fraction of 1). | | **Data split parameters** diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 260e253c4..a452b8f05 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -166,7 +166,7 @@ Additional technical libraries can be installed as necessary, or custom indicato Most indicators have an instable startup period, in which they are either not available (NaN), or the calculation is incorrect. This can lead to inconsistencies, since Freqtrade does not know how long this instable period should be. To account for this, the strategy can be assigned the `startup_candle_count` attribute. -This should be set to the maximum number of candles that the strategy requires to calculate stable indicators. +This should be set to the maximum number of candles that the strategy requires to calculate stable indicators. In the case where a user includes higher timeframes with informative pairs, the `startup_candle_count` does not necessarily change. The value is the maximum period (in candles) that any of the informatives timeframes need to compute stable indicators. In this example strategy, this should be set to 100 (`startup_candle_count = 100`), since the longest needed history is 100 candles. diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 21cead77f..529a12690 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -92,7 +92,7 @@ class DataProvider: 'timerange') is None else str(self._config.get('timerange'))) # Move informative start time respecting startup_candle_count timerange.subtract_start( - timeframe_to_seconds(str(timeframe)) * self._config.get('startup_candle_count', 0) + self.get_required_startup_seconds(str(timeframe)) ) self.__cached_pairs_backtesting[saved_pair] = load_pair_history( pair=pair, @@ -105,6 +105,17 @@ class DataProvider: ) return self.__cached_pairs_backtesting[saved_pair].copy() + def get_required_startup_seconds(self, timeframe: str) -> int: + tf_seconds = timeframe_to_seconds(timeframe) + base_seconds = tf_seconds * self._config.get('startup_candle_count', 0) + if not self._config['freqai']['enabled']: + return base_seconds + else: + train_seconds = self._config['freqai']['train_period_days'] * 86400 + # multiplied by safety factor of 2 because FreqAI users + # typically do not know the correct window. + return base_seconds * 2 + int(train_seconds) + def get_pair_dataframe( self, pair: str, diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 6541261eb..c768fc30e 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -20,6 +20,8 @@ from freqtrade.data.dataprovider import DataProvider from freqtrade.data.history.history_utils import refresh_backtest_ohlcv_data from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_seconds +from freqtrade.exchange.exchange import market_is_active +from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist from freqtrade.strategy.interface import IStrategy @@ -834,9 +836,7 @@ class FreqaiDataKitchen: # We notice that users like to use exotic indicators where # they do not know the required timeperiod. Here we include a factor # of safety by multiplying the user considered "max" by 2. - max_period = self.freqai_config["feature_parameters"].get( - "indicator_max_period_candles", 20 - ) * 2 + max_period = self.config.get('startup_candle_count', 20) * 2 additional_seconds = max_period * max_tf_seconds if trained_timestamp != 0: @@ -1015,12 +1015,15 @@ def download_all_data_for_training(timerange: TimeRange, and training the model. :param dp: DataProvider instance attached to the strategy """ - all_pairs = copy.deepcopy( - config["freqai"]["feature_parameters"].get("include_corr_pairlist", []) - ) - for pair in config.get("exchange", "").get("pair_whitelist"): - if pair not in all_pairs: - all_pairs.append(pair) + + if dp._exchange is not None: + markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) + or config.get('include_inactive')] + else: + # This should not occur: + raise OperationalException('No exchange object found.') + + all_pairs = dynamic_expand_pairlist(config, markets) new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) if not dp._exchange: @@ -1048,7 +1051,6 @@ def get_required_data_timerange( user. """ time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() - trained_timerange = TimeRange() data_load_timerange = TimeRange() timeframes = config["freqai"]["feature_parameters"].get("include_timeframes") @@ -1059,15 +1061,9 @@ def get_required_data_timerange( if secs > max_tf_seconds: max_tf_seconds = secs - max_period = config["freqai"]["feature_parameters"].get( - "indicator_max_period_candles", 20 - ) * 2 - additional_seconds = max_period * max_tf_seconds + max_period = config.get('startup_candle_count', 20) * 2 - trained_timerange.startts = int( - time - config["freqai"].get("train_period_days", 0) * SECONDS_IN_DAY - ) - trained_timerange.stopts = int(time) + additional_seconds = max_period * max_tf_seconds data_load_timerange.startts = int( time diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 6528481d5..8f0302ada 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -211,21 +211,21 @@ class Backtesting: """ self.progress.init_step(BacktestState.DATALOAD, 1) - if self.config.get('freqai', {}).get('enabled', False): - startup_candles = int(self.config.get('freqai', {}).get('startup_candles', 0)) - if not startup_candles: - raise OperationalException('FreqAI backtesting module requires user set ' - 'startup_candles in config.') - self.required_startup += int(self.config.get('freqai', {}).get('startup_candles', 0)) - logger.info(f'Increasing startup_candle_count for freqai to {self.required_startup}') - self.config['startup_candle_count'] = self.required_startup + # if self.config.get('freqai', {}).get('enabled', False): + # startup_candles = int(self.config.get('freqai', {}).get('startup_candles', 0)) + # if not startup_candles: + # raise OperationalException('FreqAI backtesting module requires user set ' + # 'startup_candles in config.') + # self.required_startup += int(self.config.get('freqai', {}).get('startup_candles', 0)) + # logger.info(f'Increasing startup_candle_count for freqai to {self.required_startup}') + # self.config['startup_candle_count'] = self.required_startup data = history.load_data( datadir=self.config['datadir'], pairs=self.pairlists.whitelist, timeframe=self.timeframe, timerange=self.timerange, - startup_candles=self.required_startup, + startup_candles=self.get_required_startup(self.timeframe), fail_without_data=True, data_format=self.config.get('dataformat_ohlcv', 'json'), candle_type=self.config.get('candle_type_def', CandleType.SPOT) @@ -244,6 +244,21 @@ class Backtesting: self.progress.set_new_value(1) return data, self.timerange + def get_required_startup(self, timeframe: str) -> int: + if not self.config['freqai']['enabled']: + return self.required_startup + else: + if not self.config['startup_candle_count']: + raise OperationalException('FreqAI backtesting module requires strategy ' + 'set startup_candle_count.') + tf_seconds = timeframe_to_seconds(timeframe) + train_candles = self.config['freqai']['train_period_days'] * 86400 / tf_seconds + # multiplied by safety factor of 2 because FreqAI users + # typically do not know the correct window. + total_candles = self.required_startup * 2 + train_candles + logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') + return total_candles + def load_bt_data_detail(self) -> None: """ Loads backtest detail data (smaller timeframe) if necessary. diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 1e51701f7..284727d2b 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -163,6 +163,7 @@ class IStrategy(ABC, HyperStrategyMixin): ) data_load_timerange = get_required_data_timerange(self.config) download_all_data_for_training(data_load_timerange, self.dp, self.config) + else: # Gracious failures if freqAI is disabled but "start" is called. class DummyClass(): diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 5810e7881..aa584bfbc 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -43,7 +43,8 @@ class FreqaiExampleStrategy(IStrategy): process_only_new_candles = True stoploss = -0.05 use_exit_signal = True - startup_candle_count: int = 300 + # this is the maximum period fed to talib (timeframe independent) + startup_candle_count: int = 20 can_short = False linear_roi_offset = DecimalParameter( diff --git a/tests/freqai/conftest.py b/tests/freqai/conftest.py index 6ace13677..113cb3a79 100644 --- a/tests/freqai/conftest.py +++ b/tests/freqai/conftest.py @@ -44,7 +44,6 @@ def freqai_conf(default_conf, tmpdir): "principal_component_analysis": False, "use_SVM_to_remove_outliers": True, "stratify_training_data": 0, - "indicator_max_period_candles": 10, "indicator_periods_candles": [10], }, "data_split_parameters": {"test_size": 0.33, "random_state": 1}, diff --git a/tests/freqai/test_freqai_backtesting.py b/tests/freqai/test_freqai_backtesting.py index 273791609..c8a51edb0 100644 --- a/tests/freqai/test_freqai_backtesting.py +++ b/tests/freqai/test_freqai_backtesting.py @@ -48,10 +48,10 @@ def test_freqai_backtest_load_data(freqai_conf, mocker, caplog): assert log_has_re('Increasing startup_candle_count for freqai to.*', caplog) - del freqai_conf['freqai']['startup_candles'] - backtesting = Backtesting(freqai_conf) - with pytest.raises(OperationalException, - match=r'FreqAI backtesting module.*startup_candles in config.'): - backtesting.load_bt_data() + # del freqai_conf['freqai']['startup_candles'] + # backtesting = Backtesting(freqai_conf) + # with pytest.raises(OperationalException, + # match=r'FreqAI backtesting module.*startup_candles in config.'): + # backtesting.load_bt_data() Backtesting.cleanup() From 592373f096ce80c458673b92715b82b09e6b57eb Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 24 Aug 2022 18:30:30 -0600 Subject: [PATCH 014/437] Remove pairlist waiting, add .db files to .gitignore --- .gitignore | 1 + freqtrade/plugins/pairlist/ExternalPairList.py | 10 ---------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index df2121990..015c0a8d9 100644 --- a/.gitignore +++ b/.gitignore @@ -115,3 +115,4 @@ target/ !config_examples/config_freqai.example.json *-config.json +*.db* diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py index bd36c7cf3..40e3f9a7f 100644 --- a/freqtrade/plugins/pairlist/ExternalPairList.py +++ b/freqtrade/plugins/pairlist/ExternalPairList.py @@ -4,7 +4,6 @@ External Pair List provider Provides pair list from Leader data """ import logging -from threading import Event from typing import Any, Dict, List from freqtrade.plugins.pairlist.IPairList import IPairList @@ -37,7 +36,6 @@ class ExternalPairList(IPairList): self._num_assets = self._pairlistconfig.get('number_assets') self._leader_pairs: List[str] = [] - self._has_data = Event() def _clamped_pairlist(self): """ @@ -84,20 +82,12 @@ class ExternalPairList(IPairList): continue self._leader_pairs.append(pair) - if not self._has_data.is_set() and len(self._leader_pairs) > 0: - self._has_data.set() - def gen_pairlist(self, tickers: Dict) -> List[str]: """ Generate the pairlist :param tickers: Tickers (from exchange.get_tickers()). May be cached. :return: List of pairs """ - if not self._has_data.is_set(): - logger.info("Waiting on pairlists from Leaders...") - self._has_data.wait() - logger.info("Pairlist data received...") - return self._clamped_pairlist() def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]: From d474111a65a07c3133d7e2502be648b362fb72ce Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 24 Aug 2022 22:42:29 -0600 Subject: [PATCH 015/437] Renamed to external signals, controller class refactored --- freqtrade/constants.py | 8 +- freqtrade/data/dataprovider.py | 33 +- freqtrade/enums/__init__.py | 2 +- .../enums/{replicate.py => externalsignal.py} | 2 +- freqtrade/freqtradebot.py | 19 +- .../plugins/pairlist/ExternalPairList.py | 4 +- freqtrade/rpc/external_signal/__init__.py | 5 + .../{replicate => external_signal}/channel.py | 6 +- .../controller.py} | 288 +++++++++--------- .../{replicate => external_signal}/proxy.py | 2 +- .../serializer.py | 2 +- .../thread_queue.py | 0 .../{replicate => external_signal}/types.py | 0 .../{replicate => external_signal}/utils.py | 0 freqtrade/rpc/rpc.py | 10 +- freqtrade/rpc/rpc_manager.py | 12 +- freqtrade/strategy/interface.py | 4 +- 17 files changed, 203 insertions(+), 194 deletions(-) rename freqtrade/enums/{replicate.py => externalsignal.py} (80%) create mode 100644 freqtrade/rpc/external_signal/__init__.py rename freqtrade/rpc/{replicate => external_signal}/channel.py (94%) rename freqtrade/rpc/{replicate/__init__.py => external_signal/controller.py} (74%) rename freqtrade/rpc/{replicate => external_signal}/proxy.py (96%) rename freqtrade/rpc/{replicate => external_signal}/serializer.py (96%) rename freqtrade/rpc/{replicate => external_signal}/thread_queue.py (100%) rename freqtrade/rpc/{replicate => external_signal}/types.py (100%) rename freqtrade/rpc/{replicate => external_signal}/utils.py (100%) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 55363cca1..ad0758e22 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -245,7 +245,7 @@ CONF_SCHEMA = { 'exchange': {'$ref': '#/definitions/exchange'}, 'edge': {'$ref': '#/definitions/edge'}, 'freqai': {'$ref': '#/definitions/freqai'}, - 'replicate': {'$ref': '#/definitions/replicate'}, + 'external_signal': {'$ref': '#/definitions/external_signal'}, 'experimental': { 'type': 'object', 'properties': { @@ -487,7 +487,7 @@ CONF_SCHEMA = { }, 'required': ['process_throttle_secs', 'allowed_risk'] }, - 'replicate': { + 'external_signal': { 'type': 'object', 'properties': { 'enabled': {'type': 'boolean', 'default': False}, @@ -495,14 +495,14 @@ CONF_SCHEMA = { 'type': 'string', 'enum': FOLLOWER_MODE_OPTIONS }, - 'api_key': {'type': 'string', 'default': ''}, + 'api_token': {'type': 'string', 'default': ''}, 'leaders': { 'type': 'array', 'items': { 'type': 'object', 'properties': { 'url': {'type': 'string', 'default': ''}, - 'token': {'type': 'string', 'default': ''}, + 'api_token': {'type': 'string', 'default': ''}, } } }, diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 3de73bb0d..036005c84 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -29,8 +29,7 @@ MAX_DATAFRAME_CANDLES = 1000 class DataProvider: - def __init__(self, config: dict, exchange: Optional[Exchange], - pairlists=None, replicate_controller=None) -> None: + def __init__(self, config: dict, exchange: Optional[Exchange], pairlists=None) -> None: self._config = config self._exchange = exchange self._pairlists = pairlists @@ -99,25 +98,33 @@ class DataProvider: self, pair: str, timeframe: str, - candle_type: CandleType + candle_type: CandleType, + wait: bool = True ) -> DataFrame: """ - If the pair exists in __external_pairs_df, return it. If it doesn't, - create a new threading Event in __external_pairs_event and wait on it. + If the pair exists in __external_pairs_df, return it. + If it doesn't, and wait is False, then return an empty df with the columns filled. + If it doesn't, and wait is True (default) create a new threading Event + in __external_pairs_event and wait on it. """ pair_key = (pair, timeframe, candle_type) + if pair_key not in self.__external_pairs_df: - pair_event = Event() - self.__external_pairs_event[pair] = pair_event + if wait: + pair_event = Event() + self.__external_pairs_event[pair] = pair_event - logger.debug(f"Waiting on Leader data for: {pair_key}") - self.__external_pairs_event[pair].wait() + logger.debug(f"Waiting on Leader data for: {pair_key}") + self.__external_pairs_event[pair].wait(timeout=5) - if pair_key in self.__external_pairs_df: - return self.__external_pairs_df[pair_key] + if pair_key not in self.__external_pairs_df: + # Return empty dataframe but with expected columns merged and filled with NaN + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + else: + # Return empty dataframe but with expected columns merged and filled with NaN + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) - # Because of the waiting mechanism, this should never return - return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + return self.__external_pairs_df[pair_key] def add_pairlisthandler(self, pairlists) -> None: """ diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index e1057208a..913ef82dd 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -3,9 +3,9 @@ from freqtrade.enums.backteststate import BacktestState from freqtrade.enums.candletype import CandleType from freqtrade.enums.exitchecktuple import ExitCheckTuple from freqtrade.enums.exittype import ExitType +from freqtrade.enums.externalsignal import ExternalSignalModeType, LeaderMessageType from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues -from freqtrade.enums.replicate import LeaderMessageType, ReplicateModeType from freqtrade.enums.rpcmessagetype import RPCMessageType from freqtrade.enums.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode from freqtrade.enums.signaltype import SignalDirection, SignalTagType, SignalType diff --git a/freqtrade/enums/replicate.py b/freqtrade/enums/externalsignal.py similarity index 80% rename from freqtrade/enums/replicate.py rename to freqtrade/enums/externalsignal.py index 8d036f0b9..4695a4eab 100644 --- a/freqtrade/enums/replicate.py +++ b/freqtrade/enums/externalsignal.py @@ -1,7 +1,7 @@ from enum import Enum -class ReplicateModeType(str, Enum): +class ExternalSignalModeType(str, Enum): leader = "leader" follower = "follower" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 3b850dd4e..9704b7e08 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -75,7 +75,7 @@ class FreqtradeBot(LoggingMixin): PairLocks.timeframe = self.config['timeframe'] - self.replicate_controller = None + self.external_signal_controller = None self.pairlists = PairListManager(self.exchange, self.config) @@ -93,9 +93,6 @@ class FreqtradeBot(LoggingMixin): # Attach Wallets to strategy instance self.strategy.wallets = self.wallets - # Attach ReplicateController to the strategy - # self.strategy.replicate_controller = self.replicate_controller - # Initializing Edge only if enabled self.edge = Edge(self.config, self.exchange, self.strategy) if \ self.config.get('edge', {}).get('enabled', False) else None @@ -197,8 +194,8 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - if self.replicate_controller: - if not self.replicate_controller.is_leader(): + if self.external_signal_controller: + if not self.external_signal_controller.is_leader(): # Run Follower mode analyzing leader_pairs = self.pairlists._whitelist self.strategy.analyze_external(self.active_pair_whitelist, leader_pairs) @@ -281,16 +278,14 @@ class FreqtradeBot(LoggingMixin): self.pairlists.refresh_pairlist() _whitelist = self.pairlists.whitelist - # If replicate leader, broadcast whitelist data - # Should we broadcast before trade pairs are added? What if - # the follower doesn't have trades with those pairs. They would be added for - # no reason. + # If external signal leader, broadcast whitelist data + # Should we broadcast before trade pairs are added? # Or should this class be made available to the PairListManager and ran # when filter_pairlist is called? - if self.replicate_controller: - if self.replicate_controller.is_leader(): + if self.external_signal_controller: + if self.external_signal_controller.is_leader(): self.rpc.emit_data({ "data_type": LeaderMessageType.pairlist, "data": _whitelist diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py index 40e3f9a7f..27a328060 100644 --- a/freqtrade/plugins/pairlist/ExternalPairList.py +++ b/freqtrade/plugins/pairlist/ExternalPairList.py @@ -14,7 +14,7 @@ logger = logging.getLogger(__name__) class ExternalPairList(IPairList): """ - PairList plugin for use with replicate follower mode. + PairList plugin for use with external signal follower mode. Will use pairs given from leader data. Usage: @@ -67,6 +67,8 @@ class ExternalPairList(IPairList): def add_pairlist_data(self, pairlist: List[str]): """ Add pairs from Leader + + :param pairlist: List of pairs """ # If some pairs were removed on Leader, remove them here diff --git a/freqtrade/rpc/external_signal/__init__.py b/freqtrade/rpc/external_signal/__init__.py new file mode 100644 index 000000000..c1b05b3f0 --- /dev/null +++ b/freqtrade/rpc/external_signal/__init__.py @@ -0,0 +1,5 @@ +# flake8: noqa: F401 +from freqtrade.rpc.external_signal.controller import ExternalSignalController + + +__all__ = ('ExternalSignalController') diff --git a/freqtrade/rpc/replicate/channel.py b/freqtrade/rpc/external_signal/channel.py similarity index 94% rename from freqtrade/rpc/replicate/channel.py rename to freqtrade/rpc/external_signal/channel.py index 62ed3e025..585b6bae5 100644 --- a/freqtrade/rpc/replicate/channel.py +++ b/freqtrade/rpc/external_signal/channel.py @@ -1,9 +1,9 @@ import logging from typing import Type -from freqtrade.rpc.replicate.proxy import WebSocketProxy -from freqtrade.rpc.replicate.serializer import MsgPackWebSocketSerializer, WebSocketSerializer -from freqtrade.rpc.replicate.types import WebSocketType +from freqtrade.rpc.external_signal.proxy import WebSocketProxy +from freqtrade.rpc.external_signal.serializer import MsgPackWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.external_signal.types import WebSocketType logger = logging.getLogger(__name__) diff --git a/freqtrade/rpc/replicate/__init__.py b/freqtrade/rpc/external_signal/controller.py similarity index 74% rename from freqtrade/rpc/replicate/__init__.py rename to freqtrade/rpc/external_signal/controller.py index 5cc2ae6a9..af91a67b7 100644 --- a/freqtrade/rpc/replicate/__init__.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -5,8 +5,7 @@ import asyncio import logging import secrets import socket -import traceback -from threading import Event, Thread +from threading import Thread from typing import Any, Coroutine, Dict, Union import websockets @@ -14,18 +13,18 @@ from fastapi import Depends from fastapi import WebSocket as FastAPIWebSocket from fastapi import WebSocketDisconnect, status -from freqtrade.enums import LeaderMessageType, ReplicateModeType, RPCMessageType +from freqtrade.enums import ExternalSignalModeType, LeaderMessageType, RPCMessageType from freqtrade.rpc import RPC, RPCHandler -from freqtrade.rpc.replicate.channel import ChannelManager -from freqtrade.rpc.replicate.thread_queue import Queue as ThreadedQueue -from freqtrade.rpc.replicate.types import MessageType -from freqtrade.rpc.replicate.utils import is_websocket_alive +from freqtrade.rpc.external_signal.channel import ChannelManager +from freqtrade.rpc.external_signal.thread_queue import Queue as ThreadedQueue +from freqtrade.rpc.external_signal.types import MessageType +from freqtrade.rpc.external_signal.utils import is_websocket_alive logger = logging.getLogger(__name__) -class ReplicateController(RPCHandler): +class ExternalSignalController(RPCHandler): """ This class handles all websocket communication """ def __init__( @@ -35,9 +34,10 @@ class ReplicateController(RPCHandler): api_server: Union[Any, None] = None ) -> None: """ - Init the ReplicateRPC class, and init the super class RPCHandler + Init the ExternalSignalController class, and init the super class RPCHandler :param rpc: instance of RPC Helper class :param config: Configuration object + :param api_server: The ApiServer object :return: None """ super().__init__(rpc, config) @@ -46,48 +46,50 @@ class ReplicateController(RPCHandler): self.api_server = api_server if not self.api_server: - raise RuntimeError("The API server must be enabled for replicate to work") + raise RuntimeError("The API server must be enabled for external signals to work") self._loop = None self._running = False self._thread = None self._queue = None - self._stop_event = Event() - self._follower_tasks = None + self._main_task = None + self._sub_tasks = None self.channel_manager = ChannelManager() - self.replicate_config = config.get('replicate', {}) + self.external_signal_config = config.get('external_signal', {}) # What the config should look like - # "replicate": { + # "external_signal": { # "enabled": true, # "mode": "follower", # "leaders": [ # { - # "url": "ws://localhost:8080/replicate/ws", - # "token": "test" + # "url": "ws://localhost:8080/signals/ws", + # "api_token": "test" # } # ] # } - # "replicate": { + # "external_signal": { # "enabled": true, # "mode": "leader", - # "api_key": "test" + # "api_token": "test" # } - self.mode = ReplicateModeType[self.replicate_config.get('mode', 'leader').lower()] + self.mode = ExternalSignalModeType[ + self.external_signal_config.get('mode', 'leader').lower() + ] - self.leaders_list = self.replicate_config.get('leaders', []) - self.push_throttle_secs = self.replicate_config.get('push_throttle_secs', 0.1) + self.leaders_list = self.external_signal_config.get('leaders', []) + self.push_throttle_secs = self.external_signal_config.get('push_throttle_secs', 0.1) - self.reply_timeout = self.replicate_config.get('follower_reply_timeout', 10) - self.ping_timeout = self.replicate_config.get('follower_ping_timeout', 2) - self.sleep_time = self.replicate_config.get('follower_sleep_time', 5) + self.reply_timeout = self.external_signal_config.get('follower_reply_timeout', 10) + self.ping_timeout = self.external_signal_config.get('follower_ping_timeout', 2) + self.sleep_time = self.external_signal_config.get('follower_sleep_time', 5) - if self.mode == ReplicateModeType.follower and len(self.leaders_list) == 0: + if self.mode == ExternalSignalModeType.follower and len(self.leaders_list) == 0: raise ValueError("You must specify at least 1 leader in follower mode.") # This is only used by the leader, the followers use the tokens specified @@ -95,12 +97,23 @@ class ReplicateController(RPCHandler): # If you do not specify an API key in the config, one will be randomly # generated and logged on startup default_api_key = secrets.token_urlsafe(16) - self.secret_api_key = self.replicate_config.get('api_key', default_api_key) + self.secret_api_key = self.external_signal_config.get('api_token', default_api_key) self.start_threaded_loop() - self.start() + def is_leader(self): + """ + Leader flag + """ + return self.enabled() and self.mode == ExternalSignalModeType.leader + + def enabled(self): + """ + Enabled flag + """ + return self.external_signal_config.get('enabled', False) + def start_threaded_loop(self): """ Start the main internal loop in another thread to run coroutines @@ -125,36 +138,29 @@ class ReplicateController(RPCHandler): raise RuntimeError("Loop must be started before any function can" " be submitted") - try: - return asyncio.run_coroutine_threadsafe(coroutine, self._loop) - except Exception as e: - logger.error(f"Error running coroutine - {str(e)}") - return None - - async def main_loop(self): - """ - Main loop coro - - Start the loop based on what mode we're in - """ - try: - if self.mode == ReplicateModeType.leader: - await self.leader_loop() - elif self.mode == ReplicateModeType.follower: - await self.follower_loop() - - except asyncio.CancelledError: - pass - except Exception: - pass - finally: - self._loop.stop() + return asyncio.run_coroutine_threadsafe(coroutine, self._loop) def start(self): """ Start the controller main loop """ - self.submit_coroutine(self.main_loop()) + self._main_task = self.submit_coroutine(self.main()) + + async def shutdown(self): + """ + Shutdown all tasks and close up + """ + logger.info("Stopping rpc.externalsignalcontroller") + + # Flip running flag + self._running = False + + # Cancel sub tasks + for task in self._sub_tasks: + task.cancel() + + # Then disconnect all channels + await self.channel_manager.disconnect_all() def cleanup(self) -> None: """ @@ -162,18 +168,44 @@ class ReplicateController(RPCHandler): """ if self._thread: if self._loop.is_running(): - - self._running = False - - # Tell all coroutines submitted to the loop they're cancelled - pending = asyncio.all_tasks(loop=self._loop) - for task in pending: - task.cancel() - - self._loop.call_soon_threadsafe(self.channel_manager.disconnect_all) - + self._main_task.cancel() self._thread.join() + async def main(self): + """ + Main coro + + Start the loop based on what mode we're in + """ + try: + if self.mode == ExternalSignalModeType.leader: + logger.info("Starting rpc.externalsignalcontroller in Leader mode") + + await self.run_leader_mode() + elif self.mode == ExternalSignalModeType.follower: + logger.info("Starting rpc.externalsignalcontroller in Follower mode") + + await self.run_follower_mode() + + except asyncio.CancelledError: + # We're cancelled + await self.shutdown() + except Exception as e: + # Log the error + logger.error(f"Exception occurred in main task: {e}") + logger.exception(e) + finally: + # This coroutine is the last thing to be ended, so it should stop the loop + self._loop.stop() + + def log_api_token(self): + """ + Log the API token + """ + logger.info("-" * 15) + logger.info(f"API_KEY: {self.secret_api_key}") + logger.info("-" * 15) + def send_msg(self, msg: MessageType) -> None: """ Support RPC calls @@ -186,7 +218,9 @@ class ReplicateController(RPCHandler): logger.error(f"Message is empty! {msg}") def send_message(self, msg: MessageType) -> None: - """ Broadcast message over all channels if there are any """ + """ + Broadcast message over all channels if there are any + """ if self.channel_manager.has_channels(): self._send_message(msg) @@ -205,39 +239,60 @@ class ReplicateController(RPCHandler): else: logger.warning("Can not send data, leader loop has not started yet!") - def is_leader(self): - """ - Leader flag - """ - return self.enabled() and self.mode == ReplicateModeType.leader + async def send_initial_data(self, channel): + logger.info("Sending initial data through channel") - def enabled(self): - """ - Enabled flag - """ - return self.replicate_config.get('enabled', False) + # We first send pairlist data + # We should move this to a func in the RPC object + initial_data = { + "data_type": LeaderMessageType.pairlist, + "data": self.freqtrade.pairlists.whitelist + } - # ----------------------- LEADER LOGIC ------------------------------ + await channel.send(initial_data) - async def leader_loop(self): + async def _handle_leader_message(self, message: MessageType): + """ + Handle message received from a Leader + """ + type = message.get("data_type") + data = message.get("data") + + self._rpc._handle_emitted_data(type, data) + + # ---------------------------------------------------------------------- + + async def run_leader_mode(self): """ Main leader coroutine This starts all of the leader coros and registers the endpoint on the ApiServer """ - logger.info("Running rpc.replicate in Leader mode") - logger.info("-" * 15) - logger.info(f"API_KEY: {self.secret_api_key}") - logger.info("-" * 15) - self.register_leader_endpoint() + self.log_api_token() - try: - await self._broadcast_queue_data() - except Exception as e: - logger.error("Exception occurred in Leader loop: ") - logger.exception(e) + self._sub_tasks = [ + self._loop.create_task(self._broadcast_queue_data()) + ] + + return await asyncio.gather(*self._sub_tasks) + + async def run_follower_mode(self): + """ + Main follower coroutine + + This starts all of the follower connection coros + """ + + rpc_lock = asyncio.Lock() + + self._sub_tasks = [ + self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) + for leader in self.leaders_list + ] + + return await asyncio.gather(*self._sub_tasks) async def _broadcast_queue_data(self): """ @@ -261,8 +316,6 @@ class ReplicateController(RPCHandler): except asyncio.CancelledError: # Silently stop pass - except Exception as e: - logger.exception(e) async def get_api_token( self, @@ -279,7 +332,7 @@ class ReplicateController(RPCHandler): logger.info("Denying websocket request...") await websocket.close(code=status.WS_1008_POLICY_VIOLATION) - def register_leader_endpoint(self, path: str = "/replicate/ws"): + def register_leader_endpoint(self, path: str = "/signals/ws"): """ Attach and start the main leader loop to the ApiServer @@ -334,73 +387,16 @@ class ReplicateController(RPCHandler): logger.error(f"Failed to serve - {websocket.client}") await self.channel_manager.on_disconnect(websocket) - async def send_initial_data(self, channel): - logger.info("Sending initial data through channel") - - # We first send pairlist data - initial_data = { - "data_type": LeaderMessageType.pairlist, - "data": self.freqtrade.pairlists.whitelist - } - - await channel.send(initial_data) - - # -------------------------------FOLLOWER LOGIC---------------------------- - - async def follower_loop(self): - """ - Main follower coroutine - - This starts all of the follower connection coros - """ - logger.info("Starting rpc.replicate in Follower mode") - - responses = await self._connect_to_leaders() - - # Eventually add the ability to send requests to the Leader - # await self._send_requests() - - for result in responses: - if isinstance(result, Exception): - logger.debug(f"Exception in Follower loop: {result}") - traceback_message = ''.join(traceback.format_tb(result.__traceback__)) - logger.error(traceback_message) - - async def _handle_leader_message(self, message: MessageType): - """ - Handle message received from a Leader - """ - type = message.get("data_type") - data = message.get("data") - - self._rpc._handle_emitted_data(type, data) - - async def _connect_to_leaders(self): - """ - For each leader in `self.leaders_list` create a connection and - listen for data. - """ - rpc_lock = asyncio.Lock() - - logger.info("Starting connections to Leaders...") - - self.follower_tasks = [ - self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) - for leader in self.leaders_list - ] - return await asyncio.gather(*self.follower_tasks, return_exceptions=True) - async def _handle_leader_connection(self, leader, lock): """ Given a leader, connect and wait on data. If connection is lost, it will attempt to reconnect. """ try: - url, token = leader["url"], leader["token"] + url, token = leader["url"], leader["api_token"] websocket_url = f"{url}?token={token}" logger.info(f"Attempting to connect to Leader at: {url}") - # TODO: limit the amount of connection retries while True: try: async with websockets.connect(websocket_url) as ws: diff --git a/freqtrade/rpc/replicate/proxy.py b/freqtrade/rpc/external_signal/proxy.py similarity index 96% rename from freqtrade/rpc/replicate/proxy.py rename to freqtrade/rpc/external_signal/proxy.py index aae536b6d..36ff4a74e 100644 --- a/freqtrade/rpc/replicate/proxy.py +++ b/freqtrade/rpc/external_signal/proxy.py @@ -3,7 +3,7 @@ from typing import Union from fastapi import WebSocket as FastAPIWebSocket from websockets import WebSocketClientProtocol as WebSocket -from freqtrade.rpc.replicate.types import WebSocketType +from freqtrade.rpc.external_signal.types import WebSocketType class WebSocketProxy: diff --git a/freqtrade/rpc/replicate/serializer.py b/freqtrade/rpc/external_signal/serializer.py similarity index 96% rename from freqtrade/rpc/replicate/serializer.py rename to freqtrade/rpc/external_signal/serializer.py index 98bdc8934..2a0f53037 100644 --- a/freqtrade/rpc/replicate/serializer.py +++ b/freqtrade/rpc/external_signal/serializer.py @@ -5,7 +5,7 @@ from abc import ABC, abstractmethod import msgpack import orjson -from freqtrade.rpc.replicate.proxy import WebSocketProxy +from freqtrade.rpc.external_signal.proxy import WebSocketProxy logger = logging.getLogger(__name__) diff --git a/freqtrade/rpc/replicate/thread_queue.py b/freqtrade/rpc/external_signal/thread_queue.py similarity index 100% rename from freqtrade/rpc/replicate/thread_queue.py rename to freqtrade/rpc/external_signal/thread_queue.py diff --git a/freqtrade/rpc/replicate/types.py b/freqtrade/rpc/external_signal/types.py similarity index 100% rename from freqtrade/rpc/replicate/types.py rename to freqtrade/rpc/external_signal/types.py diff --git a/freqtrade/rpc/replicate/utils.py b/freqtrade/rpc/external_signal/utils.py similarity index 100% rename from freqtrade/rpc/replicate/utils.py rename to freqtrade/rpc/external_signal/utils.py diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 2c7b2ec72..68871a15a 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1109,16 +1109,22 @@ class RPC: external_pairlist.add_pairlist_data(pairlist) elif type == LeaderMessageType.analyzed_df: + # Convert the dataframe back from json key, value = data["key"], data["value"] pair, timeframe, candle_type = key - dataframe = json_to_dataframe(value) - dataprovider = self._freqtrade.dataprovider + # Skip any pairs that we don't have in the pairlist? + # leader_pairlist = self._freqtrade.pairlists._whitelist + # if pair not in leader_pairlist: + # return + + dataframe = json_to_dataframe(value) logger.debug(f"Received analyzed dataframe for {pair}") logger.debug(dataframe.tail()) # Add the dataframe to the dataprovider + dataprovider = self._freqtrade.dataprovider dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 3d561cc8e..0a0e285a4 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -54,14 +54,14 @@ class RPCManager: # Enable Replicate mode # For this to be enabled, the API server must also be enabled - if config.get('replicate', {}).get('enabled', False): - logger.info('Enabling rpc.replicate') - from freqtrade.rpc.replicate import ReplicateController - replicate_rpc = ReplicateController(self._rpc, config, apiserver) - self.registered_modules.append(replicate_rpc) + if config.get('external_signal', {}).get('enabled', False): + logger.info('Enabling RPC.ExternalSignalController') + from freqtrade.rpc.external_signal import ExternalSignalController + external_signal_rpc = ExternalSignalController(self._rpc, config, apiserver) + self.registered_modules.append(external_signal_rpc) # Attach the controller to FreqTrade - freqtrade.replicate_controller = replicate_rpc + freqtrade.external_signal_controller = external_signal_rpc apiserver.start_api() diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 1084838ec..22a10b4d3 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -18,7 +18,6 @@ from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds from freqtrade.persistence import Order, PairLocks, Trade -from freqtrade.rpc.replicate import ReplicateController from freqtrade.strategy.hyper import HyperStrategyMixin from freqtrade.strategy.informative_decorator import (InformativeData, PopulateIndicators, _create_and_merge_informative_pair, @@ -111,7 +110,6 @@ class IStrategy(ABC, HyperStrategyMixin): # the dataprovider (dp) (access to other candles, historic data, ...) # and wallets - access to the current balance. dp: DataProvider - replicate_controller: Optional[ReplicateController] wallets: Optional[Wallets] = None # Filled from configuration stake_currency: str @@ -764,7 +762,7 @@ class IStrategy(ABC, HyperStrategyMixin): if not external_data: dataframe = self.dp.ohlcv(pair, self.timeframe, candle_type) else: - dataframe, last_analyzed = self.dp.get_external_df(pair, self.timeframe, candle_type) + dataframe, _ = self.dp.get_external_df(pair, self.timeframe, candle_type) if not isinstance(dataframe, DataFrame) or dataframe.empty: logger.warning('Empty candle (OHLCV) data for pair %s', pair) From 3e786a9b8b791f06c1cf24e7af738ea29f23dc75 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 24 Aug 2022 22:44:22 -0600 Subject: [PATCH 016/437] added example configs --- .gitignore | 2 + config_examples/config_follower.example.json | 85 +++++++++++++++++ config_examples/config_leader.example.json | 97 ++++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 config_examples/config_follower.example.json create mode 100644 config_examples/config_leader.example.json diff --git a/.gitignore b/.gitignore index 015c0a8d9..b8c4c3846 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,8 @@ target/ !config_examples/config_full.example.json !config_examples/config_kraken.example.json !config_examples/config_freqai.example.json +!config_examples/config_leader.example.json +!config_examples/config_follower.example.json *-config.json *.db* diff --git a/config_examples/config_follower.example.json b/config_examples/config_follower.example.json new file mode 100644 index 000000000..5317c8df2 --- /dev/null +++ b/config_examples/config_follower.example.json @@ -0,0 +1,85 @@ + +{ + "db_url": "sqlite:///follower.db", + "strategy": "SampleStrategy", + "max_open_trades": 3, + "stake_currency": "USDT", + "stake_amount": 100, + "tradable_balance_ratio": 0.99, + "fiat_display_currency": "USD", + "dry_run": true, + "cancel_open_orders_on_exit": false, + "trading_mode": "spot", + "margin_mode": "", + "unfilledtimeout": { + "entry": 10, + "exit": 10, + "exit_timeout_count": 0, + "unit": "minutes" + }, + "entry_pricing": { + "price_side": "same", + "use_order_book": true, + "order_book_top": 1, + "price_last_balance": 0.0, + "check_depth_of_market": { + "enabled": false, + "bids_to_ask_delta": 1 + } + }, + "exit_pricing":{ + "price_side": "same", + "use_order_book": true, + "order_book_top": 1 + }, + "exchange": { + "name": "kucoin", + "key": "", + "secret": "", + "password": "", + "ccxt_config": {}, + "ccxt_async_config": {}, + "pair_whitelist": [ + ], + "pair_blacklist": [ + ] + }, + "pairlists": [ + { + "method": "ExternalPairList", + "number_assets": 5, + } + ], + "telegram": { + "enabled": false, + "token": "", + "chat_id": "" + }, + "api_server": { + "enabled": true, + "listen_ip_address": "127.0.0.1", + "listen_port": 8081, + "verbosity": "error", + "enable_openapi": false, + "jwt_secret_key": "fcc24d31d6581ad2c90c3fc438c8a8b2ccce1393126959934568707f0bd2d647", + "CORS_origins": [], + "username": "freqtrader", + "password": "testing123" + }, + "external_signal": { + "enabled": true, + "mode": "follower", + "leaders": [ + { + "url": "ws://localhost:8080/signals/ws", + "api_token": "testtoken" + } + ] + }, + "bot_name": "freqtrade", + "initial_state": "running", + "force_entry_enable": false, + "internals": { + "process_throttle_secs": 5, + } +} diff --git a/config_examples/config_leader.example.json b/config_examples/config_leader.example.json new file mode 100644 index 000000000..5103fdbd4 --- /dev/null +++ b/config_examples/config_leader.example.json @@ -0,0 +1,97 @@ + +{ + "db_url": "sqlite:///leader.db", + "strategy": "SampleStrategy", + "max_open_trades": 3, + "stake_currency": "USDT", + "stake_amount": 100, + "tradable_balance_ratio": 0.99, + "fiat_display_currency": "USD", + "dry_run": true, + "cancel_open_orders_on_exit": false, + "trading_mode": "spot", + "margin_mode": "", + "unfilledtimeout": { + "entry": 10, + "exit": 10, + "exit_timeout_count": 0, + "unit": "minutes" + }, + "entry_pricing": { + "price_side": "same", + "use_order_book": true, + "order_book_top": 1, + "price_last_balance": 0.0, + "check_depth_of_market": { + "enabled": false, + "bids_to_ask_delta": 1 + } + }, + "exit_pricing":{ + "price_side": "same", + "use_order_book": true, + "order_book_top": 1 + }, + "exchange": { + "name": "kucoin", + "key": "", + "secret": "", + "password": "", + "ccxt_config": {}, + "ccxt_async_config": {}, + "pair_whitelist": [ + ], + "pair_blacklist": [ + ] + }, + "pairlists": [ + { + "method": "VolumePairList", + "number_assets": 20, + "sort_key": "quoteVolume", + "min_value": 0, + "refresh_period": 1800 + } + ], + "edge": { + "enabled": false, + "process_throttle_secs": 3600, + "calculate_since_number_of_days": 7, + "allowed_risk": 0.01, + "stoploss_range_min": -0.01, + "stoploss_range_max": -0.1, + "stoploss_range_step": -0.01, + "minimum_winrate": 0.60, + "minimum_expectancy": 0.20, + "min_trade_number": 10, + "max_trade_duration_minute": 1440, + "remove_pumps": false + }, + "telegram": { + "enabled": false, + "token": "", + "chat_id": "" + }, + "api_server": { + "enabled": true, + "listen_ip_address": "127.0.0.1", + "listen_port": 8080, + "verbosity": "error", + "enable_openapi": false, + "jwt_secret_key": "fcc24d31d6581ad2c90c3fc438c8a8b2ccce1393126959934568707f0bd2d647", + "CORS_origins": [], + "username": "freqtrader", + "password": "testing123" + }, + "external_signal": { + "enabled": true, + "mode": "leader", + "api_token": "testtoken", + }, + "bot_name": "freqtrade", + "initial_state": "running", + "force_entry_enable": false, + "internals": { + "process_throttle_secs": 5, + } +} From 4b7e640f31f2a35ba3b73a3bfbbfb2882ecb7a81 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 26 Aug 2022 13:56:44 +0200 Subject: [PATCH 017/437] reduce code duplication, optimize auto data download per tf --- freqtrade/data/dataprovider.py | 26 ++++++------ freqtrade/freqai/data_kitchen.py | 67 +++++++++++-------------------- freqtrade/optimize/backtesting.py | 26 +----------- freqtrade/strategy/interface.py | 7 ++-- 4 files changed, 41 insertions(+), 85 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 529a12690..a21114901 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -91,9 +91,9 @@ class DataProvider: timerange = TimeRange.parse_timerange(None if self._config.get( 'timerange') is None else str(self._config.get('timerange'))) # Move informative start time respecting startup_candle_count - timerange.subtract_start( - self.get_required_startup_seconds(str(timeframe)) - ) + startup_candles = self.get_required_startup(str(timeframe)) + tf_seconds = timeframe_to_seconds(str(timeframe)) + timerange.subtract_start(tf_seconds * startup_candles) self.__cached_pairs_backtesting[saved_pair] = load_pair_history( pair=pair, timeframe=timeframe or self._config['timeframe'], @@ -105,16 +105,18 @@ class DataProvider: ) return self.__cached_pairs_backtesting[saved_pair].copy() - def get_required_startup_seconds(self, timeframe: str) -> int: - tf_seconds = timeframe_to_seconds(timeframe) - base_seconds = tf_seconds * self._config.get('startup_candle_count', 0) - if not self._config['freqai']['enabled']: - return base_seconds + def get_required_startup(self, timeframe: str) -> int: + if not self._config.get('freqai', {}).get('enabled', False): + return self._config.get('startup_candle_count', 0) else: - train_seconds = self._config['freqai']['train_period_days'] * 86400 - # multiplied by safety factor of 2 because FreqAI users - # typically do not know the correct window. - return base_seconds * 2 + int(train_seconds) + if not self._config['startup_candle_count']: + raise OperationalException('FreqAI backtesting module requires strategy ' + 'set startup_candle_count.') + tf_seconds = timeframe_to_seconds(timeframe) + train_candles = self._config['freqai']['train_period_days'] * 86400 / tf_seconds + total_candles = int(self._config.get('startup_candle_count', 0) + train_candles) + logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') + return total_candles def get_pair_dataframe( self, diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index c768fc30e..1a8063add 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -1006,8 +1006,7 @@ class FreqaiDataKitchen: # Methods called by interface.py (load_freqai_model()) -def download_all_data_for_training(timerange: TimeRange, - dp: DataProvider, config: dict) -> None: +def download_all_data_for_training(dp: DataProvider, config: dict) -> None: """ Called only once upon start of bot to download the necessary data for populating indicators and training the model. @@ -1025,51 +1024,31 @@ def download_all_data_for_training(timerange: TimeRange, all_pairs = dynamic_expand_pairlist(config, markets) - new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) if not dp._exchange: # Not realistic - this is only called in live mode. raise OperationalException("Dataprovider did not have an exchange attached.") - refresh_backtest_ohlcv_data( - dp._exchange, - pairs=all_pairs, - timeframes=config["freqai"]["feature_parameters"].get("include_timeframes"), - datadir=config["datadir"], - timerange=timerange, - new_pairs_days=new_pairs_days, - erase=False, - data_format=config.get("dataformat_ohlcv", "json"), - trading_mode=config.get("trading_mode", "spot"), - prepend=config.get("prepend_data", False), - ) - -def get_required_data_timerange( - config: dict -) -> TimeRange: - """ - Used by interface.py to pre-download necessary data for FreqAI - user. - """ time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() - data_load_timerange = TimeRange() - timeframes = config["freqai"]["feature_parameters"].get("include_timeframes") - - max_tf_seconds = 0 - for tf in timeframes: - secs = timeframe_to_seconds(tf) - if secs > max_tf_seconds: - max_tf_seconds = secs - - max_period = config.get('startup_candle_count', 20) * 2 - - additional_seconds = max_period * max_tf_seconds - - data_load_timerange.startts = int( - time - - config["freqai"].get("train_period_days", 0) * SECONDS_IN_DAY - - additional_seconds - ) - data_load_timerange.stopts = int(time) - - return data_load_timerange + for tf in config["freqai"]["feature_parameters"].get("include_timeframes"): + timerange = TimeRange() + timerange.startts = int(time) + timerange.stopts = int(time) + startup_candles = dp.get_required_startup(str(tf)) + tf_seconds = timeframe_to_seconds(str(tf)) + timerange.subtract_start(tf_seconds * startup_candles) + new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) + # FIXME: now that we are looping on `refresh_backtest_ohlcv_data`, the function + # redownloads the funding rate for each pair. + refresh_backtest_ohlcv_data( + dp._exchange, + pairs=all_pairs, + timeframes=[tf], + datadir=config["datadir"], + timerange=timerange, + new_pairs_days=new_pairs_days, + erase=False, + data_format=config.get("dataformat_ohlcv", "json"), + trading_mode=config.get("trading_mode", "spot"), + prepend=config.get("prepend_data", False), + ) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 8f0302ada..3d715c82d 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -211,21 +211,12 @@ class Backtesting: """ self.progress.init_step(BacktestState.DATALOAD, 1) - # if self.config.get('freqai', {}).get('enabled', False): - # startup_candles = int(self.config.get('freqai', {}).get('startup_candles', 0)) - # if not startup_candles: - # raise OperationalException('FreqAI backtesting module requires user set ' - # 'startup_candles in config.') - # self.required_startup += int(self.config.get('freqai', {}).get('startup_candles', 0)) - # logger.info(f'Increasing startup_candle_count for freqai to {self.required_startup}') - # self.config['startup_candle_count'] = self.required_startup - data = history.load_data( datadir=self.config['datadir'], pairs=self.pairlists.whitelist, timeframe=self.timeframe, timerange=self.timerange, - startup_candles=self.get_required_startup(self.timeframe), + startup_candles=self.dataprovider.get_required_startup(self.timeframe), fail_without_data=True, data_format=self.config.get('dataformat_ohlcv', 'json'), candle_type=self.config.get('candle_type_def', CandleType.SPOT) @@ -244,21 +235,6 @@ class Backtesting: self.progress.set_new_value(1) return data, self.timerange - def get_required_startup(self, timeframe: str) -> int: - if not self.config['freqai']['enabled']: - return self.required_startup - else: - if not self.config['startup_candle_count']: - raise OperationalException('FreqAI backtesting module requires strategy ' - 'set startup_candle_count.') - tf_seconds = timeframe_to_seconds(timeframe) - train_candles = self.config['freqai']['train_period_days'] * 86400 / tf_seconds - # multiplied by safety factor of 2 because FreqAI users - # typically do not know the correct window. - total_candles = self.required_startup * 2 + train_candles - logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') - return total_candles - def load_bt_data_detail(self) -> None: """ Loads backtest detail data (smaller timeframe) if necessary. diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 284727d2b..9124a0427 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -148,8 +148,7 @@ class IStrategy(ABC, HyperStrategyMixin): def load_freqAI_model(self) -> None: if self.config.get('freqai', {}).get('enabled', False): # Import here to avoid importing this if freqAI is disabled - from freqtrade.freqai.data_kitchen import (download_all_data_for_training, - get_required_data_timerange) + from freqtrade.freqai.data_kitchen import (download_all_data_for_training) from freqtrade.resolvers.freqaimodel_resolver import FreqaiModelResolver self.freqai = FreqaiModelResolver.load_freqaimodel(self.config) self.freqai_info = self.config["freqai"] @@ -161,8 +160,8 @@ class IStrategy(ABC, HyperStrategyMixin): "corr_pairlist, this may take a while if you do not have the " "data saved" ) - data_load_timerange = get_required_data_timerange(self.config) - download_all_data_for_training(data_load_timerange, self.dp, self.config) + # data_load_timerange = get_required_data_timerange(self.config) + download_all_data_for_training(self.dp, self.config) else: # Gracious failures if freqAI is disabled but "start" is called. From 65b552e310fe751989e43848498e03157cc50232 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 26 Aug 2022 15:30:01 +0200 Subject: [PATCH 018/437] make docs reflect reality, move download_all_data to new utils.py file, automatic startup_candle detection --- docs/freqai.md | 7 +++-- freqtrade/data/dataprovider.py | 14 +++++---- freqtrade/freqai/data_kitchen.py | 54 -------------------------------- freqtrade/strategy/interface.py | 2 +- 4 files changed, 14 insertions(+), 63 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index f3c9021ed..bd746c984 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -113,7 +113,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `use_SVM_to_remove_outliers` | Ask FreqAI to train a support vector machine to detect and remove outliers from the training data set as well as from incoming data points.
**Datatype:** boolean. | `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. E.g. `nu` *Very* broadly, is the percentage of data points that should be considered outliers. `shuffle` is by default false to maintain reproducibility. But these and all others can be added/changed in this dictionary.
**Datatype:** dictionary. | `stratify_training_data` | This value is used to indicate the stratification of the data. e.g. 2 would set every 2nd data point into a separate dataset to be pulled from during training/testing.
**Datatype:** positive integer. -| `indicator_max_period_candles` | **Deprecated in favor of** strategy set `startup_candle_count`, however, both configuration parameters provide the same functionality; the maximum *period* used in `populate_any_indicators()` for indicator creation (timeframe independent). FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. +| `indicator_max_period_candles` | **No longer used**. User must use the strategy set `startup_candle_count` which defines the maximum *period* used in `populate_any_indicators()` for indicator creation (timeframe independent). FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. | `indicator_periods_candles` | A list of integers used to duplicate all indicators according to a set of periods and add them to the feature set.
**Datatype:** list of positive integers. | `use_DBSCAN_to_remove_outliers` | Inactive by default. If true, FreqAI clusters data using DBSCAN to identify and remove outliers from training and prediction data.
**Datatype:** float (fraction of 1). | | **Data split parameters** @@ -162,7 +162,6 @@ The user interface is isolated to the typical config file. A typical FreqAI conf "label_period_candles": 24, "include_shifted_candles": 2, "weight_factor": 0, - "indicator_max_period_candles": 20, "indicator_periods_candles": [10, 20] }, "data_split_parameters" : { @@ -387,6 +386,10 @@ The FreqAI strategy requires the user to include the following lines of code in ```python + # user should define the maximum startup candle count (the largest number of candles + # passed to any single indicator) + startup_candle_count: int = 20 + def informative_pairs(self): whitelist_pairs = self.dp.current_whitelist() corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index a21114901..4151b7419 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -106,15 +106,17 @@ class DataProvider: return self.__cached_pairs_backtesting[saved_pair].copy() def get_required_startup(self, timeframe: str) -> int: - if not self._config.get('freqai', {}).get('enabled', False): + freqai_config = self._config.get('freqai', {}) + if not freqai_config.get('enabled', False): return self._config.get('startup_candle_count', 0) else: - if not self._config['startup_candle_count']: - raise OperationalException('FreqAI backtesting module requires strategy ' - 'set startup_candle_count.') + startup_candles = self._config.get('startup_candle_count', 0) + indicator_periods = freqai_config['feature_parameters']['indicator_periods_candles'] + # make sure the startupcandles is at least the set maximum indicator periods + self._config['startup_candle_count'] = max(startup_candles, max(indicator_periods)) tf_seconds = timeframe_to_seconds(timeframe) - train_candles = self._config['freqai']['train_period_days'] * 86400 / tf_seconds - total_candles = int(self._config.get('startup_candle_count', 0) + train_candles) + train_candles = freqai_config['train_period_days'] * 86400 / tf_seconds + total_candles = int(self._config['startup_candle_count'] + train_candles) logger.info(f'Increasing startup_candle_count for freqai to {total_candles}') return total_candles diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 1a8063add..1b88405c1 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -16,12 +16,8 @@ from sklearn.model_selection import train_test_split from sklearn.neighbors import NearestNeighbors from freqtrade.configuration import TimeRange -from freqtrade.data.dataprovider import DataProvider -from freqtrade.data.history.history_utils import refresh_backtest_ohlcv_data from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_seconds -from freqtrade.exchange.exchange import market_is_active -from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist from freqtrade.strategy.interface import IStrategy @@ -1002,53 +998,3 @@ class FreqaiDataKitchen: if self.unique_classes: for label in self.unique_classes: self.unique_class_list += list(self.unique_classes[label]) - -# Methods called by interface.py (load_freqai_model()) - - -def download_all_data_for_training(dp: DataProvider, config: dict) -> None: - """ - Called only once upon start of bot to download the necessary data for - populating indicators and training the model. - :param timerange: TimeRange = The full data timerange for populating the indicators - and training the model. - :param dp: DataProvider instance attached to the strategy - """ - - if dp._exchange is not None: - markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) - or config.get('include_inactive')] - else: - # This should not occur: - raise OperationalException('No exchange object found.') - - all_pairs = dynamic_expand_pairlist(config, markets) - - if not dp._exchange: - # Not realistic - this is only called in live mode. - raise OperationalException("Dataprovider did not have an exchange attached.") - - time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() - - for tf in config["freqai"]["feature_parameters"].get("include_timeframes"): - timerange = TimeRange() - timerange.startts = int(time) - timerange.stopts = int(time) - startup_candles = dp.get_required_startup(str(tf)) - tf_seconds = timeframe_to_seconds(str(tf)) - timerange.subtract_start(tf_seconds * startup_candles) - new_pairs_days = int((timerange.stopts - timerange.startts) / SECONDS_IN_DAY) - # FIXME: now that we are looping on `refresh_backtest_ohlcv_data`, the function - # redownloads the funding rate for each pair. - refresh_backtest_ohlcv_data( - dp._exchange, - pairs=all_pairs, - timeframes=[tf], - datadir=config["datadir"], - timerange=timerange, - new_pairs_days=new_pairs_days, - erase=False, - data_format=config.get("dataformat_ohlcv", "json"), - trading_mode=config.get("trading_mode", "spot"), - prepend=config.get("prepend_data", False), - ) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 9124a0427..c9ec466de 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -148,7 +148,7 @@ class IStrategy(ABC, HyperStrategyMixin): def load_freqAI_model(self) -> None: if self.config.get('freqai', {}).get('enabled', False): # Import here to avoid importing this if freqAI is disabled - from freqtrade.freqai.data_kitchen import (download_all_data_for_training) + from freqtrade.freqai.utils import download_all_data_for_training from freqtrade.resolvers.freqaimodel_resolver import FreqaiModelResolver self.freqai = FreqaiModelResolver.load_freqaimodel(self.config) self.freqai_info = self.config["freqai"] From e7261cf51577dc30b530370f81df620c898f6a11 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 26 Aug 2022 15:30:28 +0200 Subject: [PATCH 019/437] add freqai utils.py file --- freqtrade/freqai/utils.py | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 freqtrade/freqai/utils.py diff --git a/freqtrade/freqai/utils.py b/freqtrade/freqai/utils.py new file mode 100644 index 000000000..056458115 --- /dev/null +++ b/freqtrade/freqai/utils.py @@ -0,0 +1,56 @@ +from freqtrade.data.dataprovider import DataProvider +from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist +from freqtrade.exchange.exchange import market_is_active +from freqtrade.exchange import timeframe_to_seconds +from freqtrade.data.history.history_utils import refresh_backtest_ohlcv_data +from datetime import datetime, timezone +from freqtrade.exceptions import OperationalException +from freqtrade.configuration import TimeRange + + +def download_all_data_for_training(dp: DataProvider, config: dict) -> None: + """ + Called only once upon start of bot to download the necessary data for + populating indicators and training a FreqAI model. + :param timerange: TimeRange = The full data timerange for populating the indicators + and training the model. + :param dp: DataProvider instance attached to the strategy + """ + + if dp._exchange is not None: + markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) + or config.get('include_inactive')] + else: + # This should not occur: + raise OperationalException('No exchange object found.') + + all_pairs = dynamic_expand_pairlist(config, markets) + + if not dp._exchange: + # Not realistic - this is only called in live mode. + raise OperationalException("Dataprovider did not have an exchange attached.") + + time = datetime.now(tz=timezone.utc).timestamp() + + for tf in config["freqai"]["feature_parameters"].get("include_timeframes"): + timerange = TimeRange() + timerange.startts = int(time) + timerange.stopts = int(time) + startup_candles = dp.get_required_startup(str(tf)) + tf_seconds = timeframe_to_seconds(str(tf)) + timerange.subtract_start(tf_seconds * startup_candles) + new_pairs_days = int((timerange.stopts - timerange.startts) / 86400) + # FIXME: now that we are looping on `refresh_backtest_ohlcv_data`, the function + # redownloads the funding rate for each pair. + refresh_backtest_ohlcv_data( + dp._exchange, + pairs=all_pairs, + timeframes=[tf], + datadir=config["datadir"], + timerange=timerange, + new_pairs_days=new_pairs_days, + erase=False, + data_format=config.get("dataformat_ohlcv", "json"), + trading_mode=config.get("trading_mode", "spot"), + prepend=config.get("prepend_data", False), + ) From bb3523f3838686f92420b27e58cc1b5a37df6b9e Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 26 Aug 2022 18:51:42 +0200 Subject: [PATCH 020/437] download data homogeneously across timeframes --- freqtrade/freqai/utils.py | 140 +++++++++++++++++++++++++------- freqtrade/strategy/interface.py | 6 +- 2 files changed, 113 insertions(+), 33 deletions(-) diff --git a/freqtrade/freqai/utils.py b/freqtrade/freqai/utils.py index 056458115..d56702049 100644 --- a/freqtrade/freqai/utils.py +++ b/freqtrade/freqai/utils.py @@ -1,17 +1,22 @@ -from freqtrade.data.dataprovider import DataProvider -from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist -from freqtrade.exchange.exchange import market_is_active -from freqtrade.exchange import timeframe_to_seconds -from freqtrade.data.history.history_utils import refresh_backtest_ohlcv_data +import logging from datetime import datetime, timezone -from freqtrade.exceptions import OperationalException + from freqtrade.configuration import TimeRange +from freqtrade.data.dataprovider import DataProvider +from freqtrade.data.history.history_utils import refresh_backtest_ohlcv_data +from freqtrade.exceptions import OperationalException +from freqtrade.exchange import timeframe_to_seconds +from freqtrade.exchange.exchange import market_is_active +from freqtrade.plugins.pairlist.pairlist_helpers import dynamic_expand_pairlist + + +logger = logging.getLogger(__name__) def download_all_data_for_training(dp: DataProvider, config: dict) -> None: """ Called only once upon start of bot to download the necessary data for - populating indicators and training a FreqAI model. + populating indicators and training the model. :param timerange: TimeRange = The full data timerange for populating the indicators and training the model. :param dp: DataProvider instance attached to the strategy @@ -26,31 +31,108 @@ def download_all_data_for_training(dp: DataProvider, config: dict) -> None: all_pairs = dynamic_expand_pairlist(config, markets) + timerange = get_required_data_timerange(config) + + new_pairs_days = int((timerange.stopts - timerange.startts) / 86400) if not dp._exchange: # Not realistic - this is only called in live mode. raise OperationalException("Dataprovider did not have an exchange attached.") + refresh_backtest_ohlcv_data( + dp._exchange, + pairs=all_pairs, + timeframes=config["freqai"]["feature_parameters"].get("include_timeframes"), + datadir=config["datadir"], + timerange=timerange, + new_pairs_days=new_pairs_days, + erase=False, + data_format=config.get("dataformat_ohlcv", "json"), + trading_mode=config.get("trading_mode", "spot"), + prepend=config.get("prepend_data", False), + ) + +def get_required_data_timerange( + config: dict +) -> TimeRange: + """ + Used to compute the required data download time range + for auto data-download in FreqAI + """ time = datetime.now(tz=timezone.utc).timestamp() + data_load_timerange = TimeRange() - for tf in config["freqai"]["feature_parameters"].get("include_timeframes"): - timerange = TimeRange() - timerange.startts = int(time) - timerange.stopts = int(time) - startup_candles = dp.get_required_startup(str(tf)) - tf_seconds = timeframe_to_seconds(str(tf)) - timerange.subtract_start(tf_seconds * startup_candles) - new_pairs_days = int((timerange.stopts - timerange.startts) / 86400) - # FIXME: now that we are looping on `refresh_backtest_ohlcv_data`, the function - # redownloads the funding rate for each pair. - refresh_backtest_ohlcv_data( - dp._exchange, - pairs=all_pairs, - timeframes=[tf], - datadir=config["datadir"], - timerange=timerange, - new_pairs_days=new_pairs_days, - erase=False, - data_format=config.get("dataformat_ohlcv", "json"), - trading_mode=config.get("trading_mode", "spot"), - prepend=config.get("prepend_data", False), - ) + timeframes = config["freqai"]["feature_parameters"].get("include_timeframes") + + max_tf_seconds = 0 + for tf in timeframes: + secs = timeframe_to_seconds(tf) + if secs > max_tf_seconds: + max_tf_seconds = secs + + startup_candles = config.get('startup_candle_count', 0) + indicator_periods = config["freqai"]["feature_parameters"]["indicator_periods_candles"] + + # factor the max_period as a factor of safety. + max_period = int(max(startup_candles, max(indicator_periods)) * 1.5) + config['startup_candle_count'] = max_period + logger.info(f'FreqAI auto-downloader using {max_period} startup candles.') + + additional_seconds = max_period * max_tf_seconds + + data_load_timerange.startts = int( + time + - config["freqai"].get("train_period_days", 0) * 86400 + - additional_seconds + ) + data_load_timerange.stopts = int(time) + + return data_load_timerange + + +# Keep below for when we wish to download heterogeneously lengthed data for FreqAI. +# def download_all_data_for_training(dp: DataProvider, config: dict) -> None: +# """ +# Called only once upon start of bot to download the necessary data for +# populating indicators and training a FreqAI model. +# :param timerange: TimeRange = The full data timerange for populating the indicators +# and training the model. +# :param dp: DataProvider instance attached to the strategy +# """ + +# if dp._exchange is not None: +# markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) +# or config.get('include_inactive')] +# else: +# # This should not occur: +# raise OperationalException('No exchange object found.') + +# all_pairs = dynamic_expand_pairlist(config, markets) + +# if not dp._exchange: +# # Not realistic - this is only called in live mode. +# raise OperationalException("Dataprovider did not have an exchange attached.") + +# time = datetime.now(tz=timezone.utc).timestamp() + +# for tf in config["freqai"]["feature_parameters"].get("include_timeframes"): +# timerange = TimeRange() +# timerange.startts = int(time) +# timerange.stopts = int(time) +# startup_candles = dp.get_required_startup(str(tf)) +# tf_seconds = timeframe_to_seconds(str(tf)) +# timerange.subtract_start(tf_seconds * startup_candles) +# new_pairs_days = int((timerange.stopts - timerange.startts) / 86400) +# # FIXME: now that we are looping on `refresh_backtest_ohlcv_data`, the function +# # redownloads the funding rate for each pair. +# refresh_backtest_ohlcv_data( +# dp._exchange, +# pairs=all_pairs, +# timeframes=[tf], +# datadir=config["datadir"], +# timerange=timerange, +# new_pairs_days=new_pairs_days, +# erase=False, +# data_format=config.get("dataformat_ohlcv", "json"), +# trading_mode=config.get("trading_mode", "spot"), +# prepend=config.get("prepend_data", False), +# ) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index c9ec466de..3ea1a3fae 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -157,12 +157,10 @@ class IStrategy(ABC, HyperStrategyMixin): if self.config.get('runmode') in (RunMode.DRY_RUN, RunMode.LIVE): logger.info( "Downloading all training data for all pairs in whitelist and " - "corr_pairlist, this may take a while if you do not have the " - "data saved" + "corr_pairlist, this may take a while if the data is not " + "already on disk." ) - # data_load_timerange = get_required_data_timerange(self.config) download_all_data_for_training(self.dp, self.config) - else: # Gracious failures if freqAI is disabled but "start" is called. class DummyClass(): From a998d6d7735a37b37259e988bf2ed17152891338 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 26 Aug 2022 14:52:15 -0600 Subject: [PATCH 021/437] fix tests --- tests/rpc/test_rpc_apiserver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 9aa965da2..9a7bdfef6 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -52,6 +52,7 @@ def botclient(default_conf, mocker): try: apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(rpc) + apiserver.start_api() yield ftbot, TestClient(apiserver.app) # Cleanup ... ? finally: @@ -332,6 +333,7 @@ def test_api_run(default_conf, mocker, caplog): apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) + apiserver.start_api() assert server_mock.call_count == 1 assert apiserver._config == default_conf apiserver.start_api() @@ -406,6 +408,7 @@ def test_api_cleanup(default_conf, mocker, caplog): apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) + apiserver.start_api() apiserver.cleanup() assert apiserver._server.cleanup.call_count == 1 From 2b5f0678772bea0abaf4abe93efc55de43ea3e0e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 26 Aug 2022 23:40:13 -0600 Subject: [PATCH 022/437] Refactoring, minor improvements, data provider improvements --- freqtrade/constants.py | 6 + freqtrade/data/dataprovider.py | 106 ++++++++++++------ freqtrade/enums/__init__.py | 2 +- freqtrade/enums/externalsignal.py | 7 ++ freqtrade/freqtradebot.py | 3 - freqtrade/misc.py | 17 +++ freqtrade/rpc/api_server/webserver.py | 1 + freqtrade/rpc/external_signal/channel.py | 40 ++++--- freqtrade/rpc/external_signal/controller.py | 34 ++++-- freqtrade/rpc/external_signal/utils.py | 12 ++ freqtrade/rpc/rpc.py | 72 ++++++++---- freqtrade/rpc/rpc_manager.py | 13 +-- ...te.txt => requirements-externalsignals.txt | 1 + tests/rpc/test_rpc_apiserver.py | 2 - 14 files changed, 218 insertions(+), 98 deletions(-) rename requirements-replicate.txt => requirements-externalsignals.txt (94%) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index ad0758e22..b1f189093 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -62,6 +62,7 @@ TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw'] FOLLOWER_MODE_OPTIONS = ['follower', 'leader'] +WAIT_DATA_POLICY_OPTIONS = ['none', 'first', 'all'] ENV_VAR_PREFIX = 'FREQTRADE__' @@ -509,6 +510,11 @@ CONF_SCHEMA = { 'follower_reply_timeout': {'type': 'integer'}, 'follower_sleep_time': {'type': 'integer'}, 'follower_ping_timeout': {'type': 'integer'}, + 'wait_data_policy': { + 'type': 'string', + 'enum': WAIT_DATA_POLICY_OPTIONS + }, + 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False} }, 'required': ['mode'] }, diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 036005c84..cd70db9a3 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -15,7 +15,7 @@ from pandas import DataFrame from freqtrade.configuration import TimeRange from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe from freqtrade.data.history import load_pair_history -from freqtrade.enums import CandleType, RunMode +from freqtrade.enums import CandleType, RunMode, WaitDataPolicy from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange, timeframe_to_seconds from freqtrade.util import PeriodicCache @@ -29,7 +29,12 @@ MAX_DATAFRAME_CANDLES = 1000 class DataProvider: - def __init__(self, config: dict, exchange: Optional[Exchange], pairlists=None) -> None: + def __init__( + self, + config: dict, + exchange: Optional[Exchange], + pairlists=None + ) -> None: self._config = config self._exchange = exchange self._pairlists = pairlists @@ -37,12 +42,18 @@ class DataProvider: self.__slice_index: Optional[int] = None self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {} self.__external_pairs_df: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} - self.__external_pairs_event: Dict[str, Event] = {} + self.__external_pairs_event: Dict[PairWithTimeframe, Tuple[int, Event]] = {} self._msg_queue: deque = deque() self.__msg_cache = PeriodicCache( maxsize=1000, ttl=timeframe_to_seconds(self._config.get('timeframe', '1h'))) + self._num_sources = len(self._config.get('external_signal', {}).get('leader_list', [])) + self._wait_data_policy = self._config.get('external_signal', {}).get( + 'wait_data_policy', WaitDataPolicy.all) + self._wait_data_timeout = self._config.get( + 'external_signal', {}).get('wait_data_timeout', 5) + def _set_dataframe_max_index(self, limit_index: int): """ Limit analyzed dataframe to max specified index. @@ -75,57 +86,88 @@ class DataProvider: pair: str, timeframe: str, dataframe: DataFrame, - candle_type: CandleType + candle_type: CandleType, ) -> None: """ - Add the DataFrame to the __external_pairs_df. If a pair event exists, - set it to release the main thread from waiting. + Add the pair data to this class from an external source. + + :param pair: pair to get the data for + :param timeframe: Timeframe to get data for + :param candle_type: Any of the enum CandleType (must match trading mode!) """ pair_key = (pair, timeframe, candle_type) - # Delete stale data - if pair_key in self.__external_pairs_df: - del self.__external_pairs_df[pair_key] - + # For multiple leaders, if the data already exists, we'd merge self.__external_pairs_df[pair_key] = (dataframe, datetime.now(timezone.utc)) - - pair_event = self.__external_pairs_event.get(pair) - if pair_event: - logger.debug(f"Leader data for pair {pair_key} has been added") - pair_event.set() + self._set_data_event(pair_key) def get_external_df( self, pair: str, timeframe: str, - candle_type: CandleType, - wait: bool = True + candle_type: CandleType ) -> DataFrame: """ - If the pair exists in __external_pairs_df, return it. - If it doesn't, and wait is False, then return an empty df with the columns filled. - If it doesn't, and wait is True (default) create a new threading Event - in __external_pairs_event and wait on it. + Get the pair data from the external sources. Will wait if the policy is + set to, and data is not available. + + :param pair: pair to get the data for + :param timeframe: Timeframe to get data for + :param candle_type: Any of the enum CandleType (must match trading mode!) """ pair_key = (pair, timeframe, candle_type) if pair_key not in self.__external_pairs_df: - if wait: - pair_event = Event() - self.__external_pairs_event[pair] = pair_event + self._wait_on_data(pair_key) - logger.debug(f"Waiting on Leader data for: {pair_key}") - self.__external_pairs_event[pair].wait(timeout=5) - - if pair_key not in self.__external_pairs_df: - # Return empty dataframe but with expected columns merged and filled with NaN - return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) - else: - # Return empty dataframe but with expected columns merged and filled with NaN + if pair_key not in self.__external_pairs_df: return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) return self.__external_pairs_df[pair_key] + def _set_data_event(self, key: PairWithTimeframe): + """ + Depending on the WaitDataPolicy, if an event exists for this PairWithTimeframe + then set the event to release main thread from waiting. + + :param key: PairWithTimeframe + """ + pair_event = self.__external_pairs_event.get(key) + + if pair_event: + num_concat, event = pair_event + self.__external_pairs_event[key] = (num_concat + 1, event) + + if self._wait_data_policy == WaitDataPolicy.one: + logger.debug("Setting Data as policy is One") + event.set() + elif self._wait_data_policy == WaitDataPolicy.all and num_concat == self._num_sources: + logger.debug("Setting Data as policy is all, and is complete") + event.set() + + del self.__external_pairs_event[key] + + def _wait_on_data(self, key: PairWithTimeframe): + """ + Depending on the WaitDataPolicy, we will create and wait on an event until + set that determines the full amount of data is available + + :param key: PairWithTimeframe + """ + if self._wait_data_policy is not WaitDataPolicy.none: + pair, timeframe, candle_type = key + + pair_event = Event() + self.__external_pairs_event[key] = (0, pair_event) + + timeout = self._wait_data_timeout \ + if self._wait_data_policy is not WaitDataPolicy.all else 0 + + timeout_str = f"for {timeout} seconds" if timeout > 0 else "indefinitely" + logger.debug(f"Waiting for external data on {pair} for {timeout_str}") + + pair_event.wait(timeout=timeout) + def add_pairlisthandler(self, pairlists) -> None: """ Allow adding pairlisthandler after initialization diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index 913ef82dd..ffeb8cc12 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -3,7 +3,7 @@ from freqtrade.enums.backteststate import BacktestState from freqtrade.enums.candletype import CandleType from freqtrade.enums.exitchecktuple import ExitCheckTuple from freqtrade.enums.exittype import ExitType -from freqtrade.enums.externalsignal import ExternalSignalModeType, LeaderMessageType +from freqtrade.enums.externalsignal import ExternalSignalModeType, LeaderMessageType, WaitDataPolicy from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues from freqtrade.enums.rpcmessagetype import RPCMessageType diff --git a/freqtrade/enums/externalsignal.py b/freqtrade/enums/externalsignal.py index 4695a4eab..05dc604a2 100644 --- a/freqtrade/enums/externalsignal.py +++ b/freqtrade/enums/externalsignal.py @@ -7,5 +7,12 @@ class ExternalSignalModeType(str, Enum): class LeaderMessageType(str, Enum): + default = "default" pairlist = "pairlist" analyzed_df = "analyzed_df" + + +class WaitDataPolicy(str, Enum): + none = "none" + one = "one" + all = "all" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 9704b7e08..6aee3d104 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -281,9 +281,6 @@ class FreqtradeBot(LoggingMixin): # If external signal leader, broadcast whitelist data # Should we broadcast before trade pairs are added? - # Or should this class be made available to the PairListManager and ran - # when filter_pairlist is called? - if self.external_signal_controller: if self.external_signal_controller.is_leader(): self.rpc.emit_data({ diff --git a/freqtrade/misc.py b/freqtrade/misc.py index bc644a7ec..ceace4ed8 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -14,6 +14,7 @@ import pandas import rapidjson from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN +from freqtrade.enums.signaltype import SignalTagType, SignalType logger = logging.getLogger(__name__) @@ -271,3 +272,19 @@ def json_to_dataframe(data: str) -> pandas.DataFrame: dataframe['date'] = pandas.to_datetime(dataframe['date'], unit='ms', utc=True) return dataframe + + +def remove_entry_exit_signals(dataframe: pandas.DataFrame): + """ + Remove Entry and Exit signals from a DataFrame + + :param dataframe: The DataFrame to remove signals from + """ + dataframe[SignalType.ENTER_LONG.value] = 0 + dataframe[SignalType.EXIT_LONG.value] = 0 + dataframe[SignalType.ENTER_SHORT.value] = 0 + dataframe[SignalType.EXIT_SHORT.value] = 0 + dataframe[SignalTagType.ENTER_TAG.value] = None + dataframe[SignalTagType.EXIT_TAG.value] = None + + return dataframe diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index c98fb9fd4..049e7dbc2 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -74,6 +74,7 @@ class ApiServer(RPCHandler): default_response_class=FTJSONResponse, ) self.configure_app(self.app, self._config) + self.start_api() def add_rpc_handler(self, rpc: RPC): """ diff --git a/freqtrade/rpc/external_signal/channel.py b/freqtrade/rpc/external_signal/channel.py index 585b6bae5..4ccb2d864 100644 --- a/freqtrade/rpc/external_signal/channel.py +++ b/freqtrade/rpc/external_signal/channel.py @@ -1,4 +1,5 @@ import logging +from threading import RLock from typing import Type from freqtrade.rpc.external_signal.proxy import WebSocketProxy @@ -63,6 +64,7 @@ class WebSocketChannel: class ChannelManager: def __init__(self): self.channels = dict() + self._lock = RLock() # Re-entrant Lock async def on_connect(self, websocket: WebSocketType): """ @@ -78,7 +80,9 @@ class ChannelManager: return ws_channel = WebSocketChannel(websocket) - self.channels[websocket] = ws_channel + + with self._lock: + self.channels[websocket] = ws_channel return ws_channel @@ -88,21 +92,26 @@ class ChannelManager: :param websocket: The WebSocket objet attached to the Channel """ - if websocket in self.channels.keys(): - channel = self.channels[websocket] + with self._lock: + channel = self.channels.get(websocket) + if channel: + logger.debug(f"Disconnecting channel - {channel}") - logger.debug(f"Disconnecting channel - {channel}") + if not channel.is_closed(): + await channel.close() - if not channel.is_closed(): - await channel.close() - del self.channels[websocket] + del self.channels[websocket] async def disconnect_all(self): """ Disconnect all Channels """ - for websocket in self.channels.keys(): - await self.on_disconnect(websocket) + with self._lock: + for websocket, channel in self.channels.items(): + if not channel.is_closed(): + await channel.close() + + self.channels = dict() async def broadcast(self, data): """ @@ -110,12 +119,13 @@ class ChannelManager: :param data: The data to send """ - for websocket, channel in self.channels.items(): - try: - await channel.send(data) - except RuntimeError: - # Handle cannot send after close cases - await self.on_disconnect(websocket) + with self._lock: + for websocket, channel in self.channels.items(): + try: + await channel.send(data) + except RuntimeError: + # Handle cannot send after close cases + await self.on_disconnect(websocket) async def send_direct(self, channel, data): """ diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py index af91a67b7..01c15fc15 100644 --- a/freqtrade/rpc/external_signal/controller.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -6,7 +6,7 @@ import logging import secrets import socket from threading import Thread -from typing import Any, Coroutine, Dict, Union +from typing import Any, Callable, Coroutine, Dict, Union import websockets from fastapi import Depends @@ -56,8 +56,13 @@ class ExternalSignalController(RPCHandler): self._main_task = None self._sub_tasks = None - self.channel_manager = ChannelManager() + self._message_handlers = { + LeaderMessageType.pairlist: self._rpc._handle_pairlist_message, + LeaderMessageType.analyzed_df: self._rpc._handle_analyzed_df_message, + LeaderMessageType.default: self._rpc._handle_default_message + } + self.channel_manager = ChannelManager() self.external_signal_config = config.get('external_signal', {}) # What the config should look like @@ -89,6 +94,8 @@ class ExternalSignalController(RPCHandler): self.ping_timeout = self.external_signal_config.get('follower_ping_timeout', 2) self.sleep_time = self.external_signal_config.get('follower_sleep_time', 5) + # Validate external_signal_config here? + if self.mode == ExternalSignalModeType.follower and len(self.leaders_list) == 0: raise ValueError("You must specify at least 1 leader in follower mode.") @@ -99,7 +106,6 @@ class ExternalSignalController(RPCHandler): default_api_key = secrets.token_urlsafe(16) self.secret_api_key = self.external_signal_config.get('api_token', default_api_key) - self.start_threaded_loop() self.start() def is_leader(self): @@ -114,6 +120,12 @@ class ExternalSignalController(RPCHandler): """ return self.external_signal_config.get('enabled', False) + def num_leaders(self): + """ + The number of leaders we should be connected to + """ + return len(self.leaders_list) + def start_threaded_loop(self): """ Start the main internal loop in another thread to run coroutines @@ -144,6 +156,7 @@ class ExternalSignalController(RPCHandler): """ Start the controller main loop """ + self.start_threaded_loop() self._main_task = self.submit_coroutine(self.main()) async def shutdown(self): @@ -242,23 +255,20 @@ class ExternalSignalController(RPCHandler): async def send_initial_data(self, channel): logger.info("Sending initial data through channel") - # We first send pairlist data - # We should move this to a func in the RPC object - initial_data = { - "data_type": LeaderMessageType.pairlist, - "data": self.freqtrade.pairlists.whitelist - } + data = self._rpc._initial_leader_data() - await channel.send(initial_data) + for message in data: + await channel.send(message) async def _handle_leader_message(self, message: MessageType): """ Handle message received from a Leader """ - type = message.get("data_type") + type = message.get("data_type", LeaderMessageType.default) data = message.get("data") - self._rpc._handle_emitted_data(type, data) + handler: Callable = self._message_handlers[type] + handler(type, data) # ---------------------------------------------------------------------- diff --git a/freqtrade/rpc/external_signal/utils.py b/freqtrade/rpc/external_signal/utils.py index 7b703810e..e5469dce3 100644 --- a/freqtrade/rpc/external_signal/utils.py +++ b/freqtrade/rpc/external_signal/utils.py @@ -1,5 +1,8 @@ +from pandas import DataFrame from starlette.websockets import WebSocket, WebSocketState +from freqtrade.enums.signaltype import SignalTagType, SignalType + async def is_websocket_alive(ws: WebSocket) -> bool: if ( @@ -8,3 +11,12 @@ async def is_websocket_alive(ws: WebSocket) -> bool: ): return True return False + + +def remove_entry_exit_signals(dataframe: DataFrame): + dataframe[SignalType.ENTER_LONG.value] = 0 + dataframe[SignalType.EXIT_LONG.value] = 0 + dataframe[SignalType.ENTER_SHORT.value] = 0 + dataframe[SignalType.EXIT_SHORT.value] = 0 + dataframe[SignalTagType.ENTER_TAG.value] = None + dataframe[SignalTagType.EXIT_TAG.value] = None diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 68871a15a..82d50f33c 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -24,7 +24,8 @@ from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, LeaderMessage from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler -from freqtrade.misc import decimals_per_coin, json_to_dataframe, shorten_date +from freqtrade.misc import (decimals_per_coin, json_to_dataframe, remove_entry_exit_signals, + shorten_date) from freqtrade.persistence import PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -1090,41 +1091,64 @@ class RPC: 'last_process_ts': int(last_p.timestamp()), } - def _handle_emitted_data(self, type, data): + # ------------------------------ EXTERNAL SIGNALS ----------------------- + + def _initial_leader_data(self): + # We create a list of Messages to send to the follower on connect + data = [] + + # Send Pairlist data + data.append({ + "data_type": LeaderMessageType.pairlist, + "data": self._freqtrade.pairlists._whitelist + }) + + return data + + def _handle_pairlist_message(self, type, data): """ - Handles the emitted data from the Leaders + Handles the emitted pairlists from the Leaders :param type: The data_type of the data :param data: The data """ - logger.debug(f"Handling emitted data of type ({type})") + pairlist = data - if type == LeaderMessageType.pairlist: - pairlist = data + logger.debug(f"Handling Pairlist message: {pairlist}") - logger.debug(pairlist) + external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] + external_pairlist.add_pairlist_data(pairlist) - # Add the pairlist data to the ExternalPairList object - external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] - external_pairlist.add_pairlist_data(pairlist) + def _handle_analyzed_df_message(self, type, data): + """ + Handles the analyzed dataframes from the Leaders - elif type == LeaderMessageType.analyzed_df: + :param type: The data_type of the data + :param data: The data + """ + key, value = data["key"], data["value"] + pair, timeframe, candle_type = key - # Convert the dataframe back from json - key, value = data["key"], data["value"] + # Skip any pairs that we don't have in the pairlist? + # leader_pairlist = self._freqtrade.pairlists._whitelist + # if pair not in leader_pairlist: + # return - pair, timeframe, candle_type = key + dataframe = json_to_dataframe(value) - # Skip any pairs that we don't have in the pairlist? - # leader_pairlist = self._freqtrade.pairlists._whitelist - # if pair not in leader_pairlist: - # return + if self._config.get('external_signal', {}).get('remove_signals_analyzed_df', False): + dataframe = remove_entry_exit_signals(dataframe) - dataframe = json_to_dataframe(value) + logger.debug(f"Handling analyzed dataframe for {pair}") + logger.debug(dataframe.tail()) - logger.debug(f"Received analyzed dataframe for {pair}") - logger.debug(dataframe.tail()) + # Add the dataframe to the dataprovider + dataprovider = self._freqtrade.dataprovider + dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) - # Add the dataframe to the dataprovider - dataprovider = self._freqtrade.dataprovider - dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) + def _handle_default_message(self, type, data): + """ + Default leader message handler, just logs it. We should never have to + run this unless the leader sends us some weird message. + """ + logger.debug(f"Received message from Leader of type {type}: {data}") diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 0a0e285a4..11e21da6f 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -45,25 +45,20 @@ class RPCManager: if config.get('api_server', {}).get('enabled', False): logger.info('Enabling rpc.api_server') from freqtrade.rpc.api_server import ApiServer - - # Pass replicate_rpc as param or defer starting api_server - # until we register the replicate rpc enpoint? apiserver = ApiServer(config) apiserver.add_rpc_handler(self._rpc) self.registered_modules.append(apiserver) - # Enable Replicate mode + # Enable External Signals mode # For this to be enabled, the API server must also be enabled if config.get('external_signal', {}).get('enabled', False): logger.info('Enabling RPC.ExternalSignalController') from freqtrade.rpc.external_signal import ExternalSignalController - external_signal_rpc = ExternalSignalController(self._rpc, config, apiserver) - self.registered_modules.append(external_signal_rpc) + external_signals = ExternalSignalController(self._rpc, config, apiserver) + self.registered_modules.append(external_signals) # Attach the controller to FreqTrade - freqtrade.external_signal_controller = external_signal_rpc - - apiserver.start_api() + freqtrade.external_signal_controller = external_signals def cleanup(self) -> None: """ Stops all enabled rpc modules """ diff --git a/requirements-replicate.txt b/requirements-externalsignals.txt similarity index 94% rename from requirements-replicate.txt rename to requirements-externalsignals.txt index 2c994ea2f..7920b34f6 100644 --- a/requirements-replicate.txt +++ b/requirements-externalsignals.txt @@ -4,3 +4,4 @@ # Required for follower websockets msgpack +janus diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 9a7bdfef6..af9f9d248 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -52,7 +52,6 @@ def botclient(default_conf, mocker): try: apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(rpc) - apiserver.start_api() yield ftbot, TestClient(apiserver.app) # Cleanup ... ? finally: @@ -333,7 +332,6 @@ def test_api_run(default_conf, mocker, caplog): apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) - apiserver.start_api() assert server_mock.call_count == 1 assert apiserver._config == default_conf apiserver.start_api() From fcceb744c5b0362464b59c13fb462291f4a977bb Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 26 Aug 2022 23:43:05 -0600 Subject: [PATCH 023/437] Add janus to requirements.txt --- freqtrade/rpc/external_signal/controller.py | 2 +- freqtrade/rpc/external_signal/thread_queue.py | 650 ------------------ 2 files changed, 1 insertion(+), 651 deletions(-) delete mode 100644 freqtrade/rpc/external_signal/thread_queue.py diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py index 01c15fc15..0d43b0b2d 100644 --- a/freqtrade/rpc/external_signal/controller.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -12,11 +12,11 @@ import websockets from fastapi import Depends from fastapi import WebSocket as FastAPIWebSocket from fastapi import WebSocketDisconnect, status +from janus import Queue as ThreadedQueue from freqtrade.enums import ExternalSignalModeType, LeaderMessageType, RPCMessageType from freqtrade.rpc import RPC, RPCHandler from freqtrade.rpc.external_signal.channel import ChannelManager -from freqtrade.rpc.external_signal.thread_queue import Queue as ThreadedQueue from freqtrade.rpc.external_signal.types import MessageType from freqtrade.rpc.external_signal.utils import is_websocket_alive diff --git a/freqtrade/rpc/external_signal/thread_queue.py b/freqtrade/rpc/external_signal/thread_queue.py deleted file mode 100644 index 88321321b..000000000 --- a/freqtrade/rpc/external_signal/thread_queue.py +++ /dev/null @@ -1,650 +0,0 @@ -import asyncio -import sys -import threading -from asyncio import QueueEmpty as AsyncQueueEmpty -from asyncio import QueueFull as AsyncQueueFull -from collections import deque -from heapq import heappop, heappush -from queue import Empty as SyncQueueEmpty -from queue import Full as SyncQueueFull -from typing import Any, Callable, Deque, Generic, List, Optional, Set, TypeVar - -from typing_extensions import Protocol - - -__version__ = "1.0.0" -__all__ = ( - "Queue", - "PriorityQueue", - "LifoQueue", - "SyncQueue", - "AsyncQueue", - "BaseQueue", -) - - -T = TypeVar("T") -OptFloat = Optional[float] - - -class BaseQueue(Protocol[T]): - @property - def maxsize(self) -> int: - ... - - @property - def closed(self) -> bool: - ... - - def task_done(self) -> None: - ... - - def qsize(self) -> int: - ... - - @property - def unfinished_tasks(self) -> int: - ... - - def empty(self) -> bool: - ... - - def full(self) -> bool: - ... - - def put_nowait(self, item: T) -> None: - ... - - def get_nowait(self) -> T: - ... - - -class SyncQueue(BaseQueue[T], Protocol[T]): - @property - def maxsize(self) -> int: - ... - - @property - def closed(self) -> bool: - ... - - def task_done(self) -> None: - ... - - def qsize(self) -> int: - ... - - @property - def unfinished_tasks(self) -> int: - ... - - def empty(self) -> bool: - ... - - def full(self) -> bool: - ... - - def put_nowait(self, item: T) -> None: - ... - - def get_nowait(self) -> T: - ... - - def put(self, item: T, block: bool = True, timeout: OptFloat = None) -> None: - ... - - def get(self, block: bool = True, timeout: OptFloat = None) -> T: - ... - - def join(self) -> None: - ... - - -class AsyncQueue(BaseQueue[T], Protocol[T]): - async def put(self, item: T) -> None: - ... - - async def get(self) -> T: - ... - - async def join(self) -> None: - ... - - -class Queue(Generic[T]): - def __init__(self, maxsize: int = 0) -> None: - self._loop = asyncio.get_running_loop() - self._maxsize = maxsize - - self._init(maxsize) - - self._unfinished_tasks = 0 - - self._sync_mutex = threading.Lock() - self._sync_not_empty = threading.Condition(self._sync_mutex) - self._sync_not_full = threading.Condition(self._sync_mutex) - self._all_tasks_done = threading.Condition(self._sync_mutex) - - self._async_mutex = asyncio.Lock() - if sys.version_info[:3] == (3, 10, 0): - # Workaround for Python 3.10 bug, see #358: - getattr(self._async_mutex, "_get_loop", lambda: None)() - self._async_not_empty = asyncio.Condition(self._async_mutex) - self._async_not_full = asyncio.Condition(self._async_mutex) - self._finished = asyncio.Event() - self._finished.set() - - self._closing = False - self._pending = set() # type: Set[asyncio.Future[Any]] - - def checked_call_soon_threadsafe( - callback: Callable[..., None], *args: Any - ) -> None: - try: - self._loop.call_soon_threadsafe(callback, *args) - except RuntimeError: - # swallowing agreed in #2 - pass - - self._call_soon_threadsafe = checked_call_soon_threadsafe - - def checked_call_soon(callback: Callable[..., None], *args: Any) -> None: - if not self._loop.is_closed(): - self._loop.call_soon(callback, *args) - - self._call_soon = checked_call_soon - - self._sync_queue = _SyncQueueProxy(self) - self._async_queue = _AsyncQueueProxy(self) - - def close(self) -> None: - with self._sync_mutex: - self._closing = True - for fut in self._pending: - fut.cancel() - self._finished.set() # unblocks all async_q.join() - self._all_tasks_done.notify_all() # unblocks all sync_q.join() - - async def wait_closed(self) -> None: - # should be called from loop after close(). - # Nobody should put/get at this point, - # so lock acquiring is not required - if not self._closing: - raise RuntimeError("Waiting for non-closed queue") - # give execution chances for the task-done callbacks - # of async tasks created inside - # _notify_async_not_empty, _notify_async_not_full - # methods. - await asyncio.sleep(0) - if not self._pending: - return - await asyncio.wait(self._pending) - - @property - def closed(self) -> bool: - return self._closing and not self._pending - - @property - def maxsize(self) -> int: - return self._maxsize - - @property - def sync_q(self) -> "_SyncQueueProxy[T]": - return self._sync_queue - - @property - def async_q(self) -> "_AsyncQueueProxy[T]": - return self._async_queue - - # Override these methods to implement other queue organizations - # (e.g. stack or priority queue). - # These will only be called with appropriate locks held - - def _init(self, maxsize: int) -> None: - self._queue = deque() # type: Deque[T] - - def _qsize(self) -> int: - return len(self._queue) - - # Put a new item in the queue - def _put(self, item: T) -> None: - self._queue.append(item) - - # Get an item from the queue - def _get(self) -> T: - return self._queue.popleft() - - def _put_internal(self, item: T) -> None: - self._put(item) - self._unfinished_tasks += 1 - self._finished.clear() - - def _notify_sync_not_empty(self) -> None: - def f() -> None: - with self._sync_mutex: - self._sync_not_empty.notify() - - self._loop.run_in_executor(None, f) - - def _notify_sync_not_full(self) -> None: - def f() -> None: - with self._sync_mutex: - self._sync_not_full.notify() - - fut = asyncio.ensure_future(self._loop.run_in_executor(None, f)) - fut.add_done_callback(self._pending.discard) - self._pending.add(fut) - - def _notify_async_not_empty(self, *, threadsafe: bool) -> None: - async def f() -> None: - async with self._async_mutex: - self._async_not_empty.notify() - - def task_maker() -> None: - task = self._loop.create_task(f()) - task.add_done_callback(self._pending.discard) - self._pending.add(task) - - if threadsafe: - self._call_soon_threadsafe(task_maker) - else: - self._call_soon(task_maker) - - def _notify_async_not_full(self, *, threadsafe: bool) -> None: - async def f() -> None: - async with self._async_mutex: - self._async_not_full.notify() - - def task_maker() -> None: - task = self._loop.create_task(f()) - task.add_done_callback(self._pending.discard) - self._pending.add(task) - - if threadsafe: - self._call_soon_threadsafe(task_maker) - else: - self._call_soon(task_maker) - - def _check_closing(self) -> None: - if self._closing: - raise RuntimeError("Operation on the closed queue is forbidden") - - -class _SyncQueueProxy(SyncQueue[T]): - """Create a queue object with a given maximum size. - - If maxsize is <= 0, the queue size is infinite. - """ - - def __init__(self, parent: Queue[T]): - self._parent = parent - - @property - def maxsize(self) -> int: - return self._parent._maxsize - - @property - def closed(self) -> bool: - return self._parent.closed - - def task_done(self) -> None: - """Indicate that a formerly enqueued task is complete. - - Used by Queue consumer threads. For each get() used to fetch a task, - a subsequent call to task_done() tells the queue that the processing - on the task is complete. - - If a join() is currently blocking, it will resume when all items - have been processed (meaning that a task_done() call was received - for every item that had been put() into the queue). - - Raises a ValueError if called more times than there were items - placed in the queue. - """ - self._parent._check_closing() - with self._parent._all_tasks_done: - unfinished = self._parent._unfinished_tasks - 1 - if unfinished <= 0: - if unfinished < 0: - raise ValueError("task_done() called too many times") - self._parent._all_tasks_done.notify_all() - self._parent._loop.call_soon_threadsafe(self._parent._finished.set) - self._parent._unfinished_tasks = unfinished - - def join(self) -> None: - """Blocks until all items in the Queue have been gotten and processed. - - The count of unfinished tasks goes up whenever an item is added to the - queue. The count goes down whenever a consumer thread calls task_done() - to indicate the item was retrieved and all work on it is complete. - - When the count of unfinished tasks drops to zero, join() unblocks. - """ - self._parent._check_closing() - with self._parent._all_tasks_done: - while self._parent._unfinished_tasks: - self._parent._all_tasks_done.wait() - self._parent._check_closing() - - def qsize(self) -> int: - """Return the approximate size of the queue (not reliable!).""" - return self._parent._qsize() - - @property - def unfinished_tasks(self) -> int: - """Return the number of unfinished tasks.""" - return self._parent._unfinished_tasks - - def empty(self) -> bool: - """Return True if the queue is empty, False otherwise (not reliable!). - - This method is likely to be removed at some point. Use qsize() == 0 - as a direct substitute, but be aware that either approach risks a race - condition where a queue can grow before the result of empty() or - qsize() can be used. - - To create code that needs to wait for all queued tasks to be - completed, the preferred technique is to use the join() method. - """ - return not self._parent._qsize() - - def full(self) -> bool: - """Return True if the queue is full, False otherwise (not reliable!). - - This method is likely to be removed at some point. Use qsize() >= n - as a direct substitute, but be aware that either approach risks a race - condition where a queue can shrink before the result of full() or - qsize() can be used. - """ - return 0 < self._parent._maxsize <= self._parent._qsize() - - def put(self, item: T, block: bool = True, timeout: OptFloat = None) -> None: - """Put an item into the queue. - - If optional args 'block' is true and 'timeout' is None (the default), - block if necessary until a free slot is available. If 'timeout' is - a non-negative number, it blocks at most 'timeout' seconds and raises - the Full exception if no free slot was available within that time. - Otherwise ('block' is false), put an item on the queue if a free slot - is immediately available, else raise the Full exception ('timeout' - is ignored in that case). - """ - self._parent._check_closing() - with self._parent._sync_not_full: - if self._parent._maxsize > 0: - if not block: - if self._parent._qsize() >= self._parent._maxsize: - raise SyncQueueFull - elif timeout is None: - while self._parent._qsize() >= self._parent._maxsize: - self._parent._sync_not_full.wait() - elif timeout < 0: - raise ValueError("'timeout' must be a non-negative number") - else: - time = self._parent._loop.time - endtime = time() + timeout - while self._parent._qsize() >= self._parent._maxsize: - remaining = endtime - time() - if remaining <= 0.0: - raise SyncQueueFull - self._parent._sync_not_full.wait(remaining) - self._parent._put_internal(item) - self._parent._sync_not_empty.notify() - self._parent._notify_async_not_empty(threadsafe=True) - - def get(self, block: bool = True, timeout: OptFloat = None) -> T: - """Remove and return an item from the queue. - - If optional args 'block' is true and 'timeout' is None (the default), - block if necessary until an item is available. If 'timeout' is - a non-negative number, it blocks at most 'timeout' seconds and raises - the Empty exception if no item was available within that time. - Otherwise ('block' is false), return an item if one is immediately - available, else raise the Empty exception ('timeout' is ignored - in that case). - """ - self._parent._check_closing() - with self._parent._sync_not_empty: - if not block: - if not self._parent._qsize(): - raise SyncQueueEmpty - elif timeout is None: - while not self._parent._qsize(): - self._parent._sync_not_empty.wait() - elif timeout < 0: - raise ValueError("'timeout' must be a non-negative number") - else: - time = self._parent._loop.time - endtime = time() + timeout - while not self._parent._qsize(): - remaining = endtime - time() - if remaining <= 0.0: - raise SyncQueueEmpty - self._parent._sync_not_empty.wait(remaining) - item = self._parent._get() - self._parent._sync_not_full.notify() - self._parent._notify_async_not_full(threadsafe=True) - return item - - def put_nowait(self, item: T) -> None: - """Put an item into the queue without blocking. - - Only enqueue the item if a free slot is immediately available. - Otherwise raise the Full exception. - """ - return self.put(item, block=False) - - def get_nowait(self) -> T: - """Remove and return an item from the queue without blocking. - - Only get an item if one is immediately available. Otherwise - raise the Empty exception. - """ - return self.get(block=False) - - -class _AsyncQueueProxy(AsyncQueue[T]): - """Create a queue object with a given maximum size. - - If maxsize is <= 0, the queue size is infinite. - """ - - def __init__(self, parent: Queue[T]): - self._parent = parent - - @property - def closed(self) -> bool: - return self._parent.closed - - def qsize(self) -> int: - """Number of items in the queue.""" - return self._parent._qsize() - - @property - def unfinished_tasks(self) -> int: - """Return the number of unfinished tasks.""" - return self._parent._unfinished_tasks - - @property - def maxsize(self) -> int: - """Number of items allowed in the queue.""" - return self._parent._maxsize - - def empty(self) -> bool: - """Return True if the queue is empty, False otherwise.""" - return self.qsize() == 0 - - def full(self) -> bool: - """Return True if there are maxsize items in the queue. - - Note: if the Queue was initialized with maxsize=0 (the default), - then full() is never True. - """ - if self._parent._maxsize <= 0: - return False - else: - return self.qsize() >= self._parent._maxsize - - async def put(self, item: T) -> None: - """Put an item into the queue. - - Put an item into the queue. If the queue is full, wait until a free - slot is available before adding item. - - This method is a coroutine. - """ - self._parent._check_closing() - async with self._parent._async_not_full: - self._parent._sync_mutex.acquire() - locked = True - try: - if self._parent._maxsize > 0: - do_wait = True - while do_wait: - do_wait = self._parent._qsize() >= self._parent._maxsize - if do_wait: - locked = False - self._parent._sync_mutex.release() - await self._parent._async_not_full.wait() - self._parent._sync_mutex.acquire() - locked = True - - self._parent._put_internal(item) - self._parent._async_not_empty.notify() - self._parent._notify_sync_not_empty() - finally: - if locked: - self._parent._sync_mutex.release() - - def put_nowait(self, item: T) -> None: - """Put an item into the queue without blocking. - - If no free slot is immediately available, raise QueueFull. - """ - self._parent._check_closing() - with self._parent._sync_mutex: - if self._parent._maxsize > 0: - if self._parent._qsize() >= self._parent._maxsize: - raise AsyncQueueFull - - self._parent._put_internal(item) - self._parent._notify_async_not_empty(threadsafe=False) - self._parent._notify_sync_not_empty() - - async def get(self) -> T: - """Remove and return an item from the queue. - - If queue is empty, wait until an item is available. - - This method is a coroutine. - """ - self._parent._check_closing() - async with self._parent._async_not_empty: - self._parent._sync_mutex.acquire() - locked = True - try: - do_wait = True - while do_wait: - do_wait = self._parent._qsize() == 0 - - if do_wait: - locked = False - self._parent._sync_mutex.release() - await self._parent._async_not_empty.wait() - self._parent._sync_mutex.acquire() - locked = True - - item = self._parent._get() - self._parent._async_not_full.notify() - self._parent._notify_sync_not_full() - return item - finally: - if locked: - self._parent._sync_mutex.release() - - def get_nowait(self) -> T: - """Remove and return an item from the queue. - - Return an item if one is immediately available, else raise QueueEmpty. - """ - self._parent._check_closing() - with self._parent._sync_mutex: - if self._parent._qsize() == 0: - raise AsyncQueueEmpty - - item = self._parent._get() - self._parent._notify_async_not_full(threadsafe=False) - self._parent._notify_sync_not_full() - return item - - def task_done(self) -> None: - """Indicate that a formerly enqueued task is complete. - - Used by queue consumers. For each get() used to fetch a task, - a subsequent call to task_done() tells the queue that the processing - on the task is complete. - - If a join() is currently blocking, it will resume when all items have - been processed (meaning that a task_done() call was received for every - item that had been put() into the queue). - - Raises ValueError if called more times than there were items placed in - the queue. - """ - self._parent._check_closing() - with self._parent._all_tasks_done: - if self._parent._unfinished_tasks <= 0: - raise ValueError("task_done() called too many times") - self._parent._unfinished_tasks -= 1 - if self._parent._unfinished_tasks == 0: - self._parent._finished.set() - self._parent._all_tasks_done.notify_all() - - async def join(self) -> None: - """Block until all items in the queue have been gotten and processed. - - The count of unfinished tasks goes up whenever an item is added to the - queue. The count goes down whenever a consumer calls task_done() to - indicate that the item was retrieved and all work on it is complete. - When the count of unfinished tasks drops to zero, join() unblocks. - """ - while True: - with self._parent._sync_mutex: - self._parent._check_closing() - if self._parent._unfinished_tasks == 0: - break - await self._parent._finished.wait() - - -class PriorityQueue(Queue[T]): - """Variant of Queue that retrieves open entries in priority order - (lowest first). - - Entries are typically tuples of the form: (priority number, data). - - """ - - def _init(self, maxsize: int) -> None: - self._heap_queue = [] # type: List[T] - - def _qsize(self) -> int: - return len(self._heap_queue) - - def _put(self, item: T) -> None: - heappush(self._heap_queue, item) - - def _get(self) -> T: - return heappop(self._heap_queue) - - -class LifoQueue(Queue[T]): - """Variant of Queue that retrieves most recently added entries first.""" - - def _qsize(self) -> int: - return len(self._queue) - - def _put(self, item: T) -> None: - self._queue.append(item) - - def _get(self) -> T: - return self._queue.pop() From 05ca673883146a543bfb3d739a1ad05368dd28bc Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 27 Aug 2022 00:06:03 -0600 Subject: [PATCH 024/437] Catch status code errors --- freqtrade/rpc/external_signal/controller.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py index 0d43b0b2d..29a318b53 100644 --- a/freqtrade/rpc/external_signal/controller.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -437,12 +437,12 @@ class ExternalSignalController(RPCHandler): # as we might call the RPC module in the main thread await self._handle_leader_message(data) - except socket.gaierror: - logger.info(f"Socket error - retrying connection in {self.sleep_time}s") + except (socket.gaierror, ConnectionRefusedError): + logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") await asyncio.sleep(self.sleep_time) continue - except ConnectionRefusedError: - logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") + except websockets.exceptions.InvalidStatusCode as e: + logger.error(f"Connection Refused - {e}") await asyncio.sleep(self.sleep_time) continue From 104a73025dac841c2d13819b260cf1ab70325fce Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 27 Aug 2022 10:24:56 +0200 Subject: [PATCH 025/437] Uppercase TimeInForce (align with ccxt) --- config_examples/config_full.example.json | 4 ++-- docs/configuration.md | 8 ++++---- docs/exchanges.md | 2 +- docs/strategy_migration.md | 4 ++-- freqtrade/constants.py | 3 ++- freqtrade/exchange/binance.py | 3 +-- freqtrade/exchange/exchange.py | 12 ++++++------ freqtrade/exchange/gateio.py | 7 +++---- freqtrade/exchange/kraken.py | 2 +- freqtrade/exchange/kucoin.py | 3 +-- freqtrade/exchange/okx.py | 2 +- freqtrade/strategy/interface.py | 4 ++-- freqtrade/templates/base_strategy.py.j2 | 4 ++-- freqtrade/templates/sample_strategy.py | 4 ++-- tests/exchange/test_exchange.py | 20 ++++++++++---------- tests/exchange/test_kraken.py | 2 +- tests/strategy/test_strategy_loading.py | 8 ++++---- tests/test_configuration.py | 8 ++++---- 18 files changed, 49 insertions(+), 51 deletions(-) diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index 74457d2b6..8155cb145 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -64,8 +64,8 @@ "stoploss_on_exchange_limit_ratio": 0.99 }, "order_time_in_force": { - "entry": "gtc", - "exit": "gtc" + "entry": "GTC", + "exit": "GTC" }, "pairlists": [ {"method": "StaticPairList"}, diff --git a/docs/configuration.md b/docs/configuration.md index d5c0b3d8b..851bbcd82 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -525,16 +525,16 @@ It means if the order is not executed immediately AND fully then it is cancelled It is the same as FOK (above) except it can be partially fulfilled. The remaining part is automatically cancelled by the exchange. -The `order_time_in_force` parameter contains a dict with buy and sell time in force policy values. +The `order_time_in_force` parameter contains a dict with entry and exit time in force policy values. This can be set in the configuration file or in the strategy. Values set in the configuration file overwrites values set in the strategy. -The possible values are: `gtc` (default), `fok` or `ioc`. +The possible values are: `GTC` (default), `FOK` or `IOC`. ``` python "order_time_in_force": { - "entry": "gtc", - "exit": "gtc" + "entry": "GTC", + "exit": "GTC" }, ``` diff --git a/docs/exchanges.md b/docs/exchanges.md index 50ebf9e0a..407a67d70 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -278,7 +278,7 @@ For example, to test the order type `FOK` with Kraken, and modify candle limit t "exchange": { "name": "kraken", "_ft_has_params": { - "order_time_in_force": ["gtc", "fok"], + "order_time_in_force": ["GTC", "FOK"], "ohlcv_candle_limit": 200 } //... diff --git a/docs/strategy_migration.md b/docs/strategy_migration.md index 064e7a59d..ac65abff4 100644 --- a/docs/strategy_migration.md +++ b/docs/strategy_migration.md @@ -332,8 +332,8 @@ After: ``` python hl_lines="2 3" order_time_in_force: Dict = { - "entry": "gtc", - "exit": "gtc", + "entry": "GTC", + "exit": "GTC", } ``` diff --git a/freqtrade/constants.py b/freqtrade/constants.py index ddbc84fa9..bab8c4816 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -23,7 +23,8 @@ REQUIRED_ORDERTIF = ['entry', 'exit'] REQUIRED_ORDERTYPES = ['entry', 'exit', 'stoploss', 'stoploss_on_exchange'] PRICING_SIDES = ['ask', 'bid', 'same', 'other'] ORDERTYPE_POSSIBILITIES = ['limit', 'market'] -ORDERTIF_POSSIBILITIES = ['gtc', 'fok', 'ioc'] +_ORDERTIF_POSSIBILITIES = ['GTC', 'FOK', 'IOC', 'PO'] +ORDERTIF_POSSIBILITIES = _ORDERTIF_POSSIBILITIES + [t.lower() for t in _ORDERTIF_POSSIBILITIES] HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss', 'SharpeHyperOptLoss', 'SharpeHyperOptLossDaily', 'SortinoHyperOptLoss', 'SortinoHyperOptLossDaily', diff --git a/freqtrade/exchange/binance.py b/freqtrade/exchange/binance.py index a5e9fd37c..026ba1c65 100644 --- a/freqtrade/exchange/binance.py +++ b/freqtrade/exchange/binance.py @@ -23,8 +23,7 @@ class Binance(Exchange): _ft_has: Dict = { "stoploss_on_exchange": True, "stoploss_order_types": {"limit": "stop_loss_limit"}, - "order_time_in_force": ['gtc', 'fok', 'ioc'], - "time_in_force_parameter": "timeInForce", + "order_time_in_force": ['GTC', 'FOK', 'IOC'], "ohlcv_candle_limit": 1000, "trades_pagination": "id", "trades_pagination_arg": "fromId", diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 4386f47f6..586a364c5 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -62,7 +62,7 @@ class Exchange: # or by specifying them in the configuration. _ft_has_default: Dict = { "stoploss_on_exchange": False, - "order_time_in_force": ["gtc"], + "order_time_in_force": ["GTC"], "time_in_force_parameter": "timeInForce", "ohlcv_params": {}, "ohlcv_candle_limit": 500, @@ -611,7 +611,7 @@ class Exchange: """ Checks if order time in force configured in strategy/config are supported """ - if any(v not in self._ft_has["order_time_in_force"] + if any(v.upper() not in self._ft_has["order_time_in_force"] for k, v in order_time_in_force.items()): raise OperationalException( f'Time in force policies are not supported for {self.name} yet.') @@ -989,12 +989,12 @@ class Exchange: ordertype: str, leverage: float, reduceOnly: bool, - time_in_force: str = 'gtc', + time_in_force: str = 'GTC', ) -> Dict: params = self._params.copy() - if time_in_force != 'gtc' and ordertype != 'market': + if time_in_force != 'GTC' and ordertype != 'market': param = self._ft_has.get('time_in_force_parameter', '') - params.update({param: time_in_force}) + params.update({param: time_in_force.upper()}) if reduceOnly: params.update({'reduceOnly': True}) return params @@ -1009,7 +1009,7 @@ class Exchange: rate: float, leverage: float, reduceOnly: bool = False, - time_in_force: str = 'gtc', + time_in_force: str = 'GTC', ) -> Dict: if self._config['dry_run']: dry_order = self.create_dry_run_order( diff --git a/freqtrade/exchange/gateio.py b/freqtrade/exchange/gateio.py index 426a4b64d..ab127a036 100644 --- a/freqtrade/exchange/gateio.py +++ b/freqtrade/exchange/gateio.py @@ -25,8 +25,7 @@ class Gateio(Exchange): _ft_has: Dict = { "ohlcv_candle_limit": 1000, - "time_in_force_parameter": "timeInForce", - "order_time_in_force": ['gtc', 'ioc'], + "order_time_in_force": ['GTC', 'IOC'], "stoploss_order_types": {"limit": "limit"}, "stoploss_on_exchange": True, } @@ -57,7 +56,7 @@ class Gateio(Exchange): ordertype: str, leverage: float, reduceOnly: bool, - time_in_force: str = 'gtc', + time_in_force: str = 'GTC', ) -> Dict: params = super()._get_params( side=side, @@ -69,7 +68,7 @@ class Gateio(Exchange): if ordertype == 'market' and self.trading_mode == TradingMode.FUTURES: params['type'] = 'market' param = self._ft_has.get('time_in_force_parameter', '') - params.update({param: 'ioc'}) + params.update({param: 'IOC'}) return params def get_trades_for_order(self, order_id: str, pair: str, since: datetime, diff --git a/freqtrade/exchange/kraken.py b/freqtrade/exchange/kraken.py index 0103e2702..6c9b88eae 100644 --- a/freqtrade/exchange/kraken.py +++ b/freqtrade/exchange/kraken.py @@ -171,7 +171,7 @@ class Kraken(Exchange): ordertype: str, leverage: float, reduceOnly: bool, - time_in_force: str = 'gtc' + time_in_force: str = 'GTC' ) -> Dict: params = super()._get_params( side=side, diff --git a/freqtrade/exchange/kucoin.py b/freqtrade/exchange/kucoin.py index 21eaa4bc3..f05fd3f56 100644 --- a/freqtrade/exchange/kucoin.py +++ b/freqtrade/exchange/kucoin.py @@ -23,8 +23,7 @@ class Kucoin(Exchange): "stoploss_order_types": {"limit": "limit", "market": "market"}, "l2_limit_range": [20, 100], "l2_limit_range_required": False, - "order_time_in_force": ['gtc', 'fok', 'ioc'], - "time_in_force_parameter": "timeInForce", + "order_time_in_force": ['GTC', 'FOK', 'IOC'], "ohlcv_candle_limit": 1500, } diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index f039f2b3f..9340dd0e4 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -98,7 +98,7 @@ class Okx(Exchange): ordertype: str, leverage: float, reduceOnly: bool, - time_in_force: str = 'gtc', + time_in_force: str = 'GTC', ) -> Dict: params = super()._get_params( side=side, diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 79dbd4c69..db16ac383 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -78,8 +78,8 @@ class IStrategy(ABC, HyperStrategyMixin): # Optional time in force order_time_in_force: Dict = { - 'entry': 'gtc', - 'exit': 'gtc', + 'entry': 'GTC', + 'exit': 'GTC', } # run "populate_indicators" only for new candle diff --git a/freqtrade/templates/base_strategy.py.j2 b/freqtrade/templates/base_strategy.py.j2 index 610a7a96e..5a4504687 100644 --- a/freqtrade/templates/base_strategy.py.j2 +++ b/freqtrade/templates/base_strategy.py.j2 @@ -88,8 +88,8 @@ class {{ strategy }}(IStrategy): # Optional order time in force. order_time_in_force = { - 'entry': 'gtc', - 'exit': 'gtc' + 'entry': 'GTC', + 'exit': 'GTC' } {{ plot_config | indent(4) }} diff --git a/freqtrade/templates/sample_strategy.py b/freqtrade/templates/sample_strategy.py index 1b375714a..1eb3d4256 100644 --- a/freqtrade/templates/sample_strategy.py +++ b/freqtrade/templates/sample_strategy.py @@ -88,8 +88,8 @@ class SampleStrategy(IStrategy): # Optional order time in force. order_time_in_force = { - 'entry': 'gtc', - 'exit': 'gtc' + 'entry': 'GTC', + 'exit': 'GTC' } plot_config = { diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 093284668..b1f22e647 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -275,7 +275,7 @@ def test_validate_order_time_in_force(default_conf, mocker, caplog): ex.validate_order_time_in_force(tif2) # Patch to see if this will pass if the values are in the ft dict - ex._ft_has.update({"order_time_in_force": ["gtc", "fok", "ioc"]}) + ex._ft_has.update({"order_time_in_force": ["GTC", "FOK", "IOC"]}) ex.validate_order_time_in_force(tif2) @@ -1503,7 +1503,7 @@ def test_buy_considers_time_in_force(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][3] == 1 assert api_mock.create_order.call_args[0][4] == 200 assert "timeInForce" in api_mock.create_order.call_args[0][5] - assert api_mock.create_order.call_args[0][5]["timeInForce"] == time_in_force + assert api_mock.create_order.call_args[0][5]["timeInForce"] == time_in_force.upper() order_type = 'market' time_in_force = 'ioc' @@ -1642,10 +1642,10 @@ def test_sell_considers_time_in_force(default_conf, mocker, exchange_name): assert api_mock.create_order.call_args[0][3] == 1 assert api_mock.create_order.call_args[0][4] == 200 assert "timeInForce" in api_mock.create_order.call_args[0][5] - assert api_mock.create_order.call_args[0][5]["timeInForce"] == time_in_force + assert api_mock.create_order.call_args[0][5]["timeInForce"] == time_in_force.upper() order_type = 'market' - time_in_force = 'ioc' + time_in_force = 'IOC' order = exchange.create_order(pair='ETH/BTC', ordertype=order_type, side="sell", amount=1, rate=200, leverage=1.0, time_in_force=time_in_force) @@ -3319,7 +3319,7 @@ def test_merge_ft_has_dict(default_conf, mocker): ex = Binance(default_conf) assert ex._ft_has != Exchange._ft_has_default assert ex.get_option('stoploss_on_exchange') - assert ex.get_option('order_time_in_force') == ['gtc', 'fok', 'ioc'] + assert ex.get_option('order_time_in_force') == ['GTC', 'FOK', 'IOC'] assert ex.get_option('trades_pagination') == 'id' assert ex.get_option('trades_pagination_arg') == 'fromId' @@ -4954,7 +4954,7 @@ def test__get_params(mocker, default_conf, exchange_name): params1 = {'test': True} params2 = { 'test': True, - 'timeInForce': 'ioc', + 'timeInForce': 'IOC', 'reduceOnly': True, } @@ -4969,7 +4969,7 @@ def test__get_params(mocker, default_conf, exchange_name): side="buy", ordertype='market', reduceOnly=False, - time_in_force='gtc', + time_in_force='GTC', leverage=1.0, ) == params1 @@ -4977,7 +4977,7 @@ def test__get_params(mocker, default_conf, exchange_name): side="buy", ordertype='market', reduceOnly=False, - time_in_force='ioc', + time_in_force='IOC', leverage=1.0, ) == params1 @@ -4985,7 +4985,7 @@ def test__get_params(mocker, default_conf, exchange_name): side="buy", ordertype='limit', reduceOnly=False, - time_in_force='gtc', + time_in_force='GTC', leverage=1.0, ) == params1 @@ -4998,7 +4998,7 @@ def test__get_params(mocker, default_conf, exchange_name): side="buy", ordertype='limit', reduceOnly=True, - time_in_force='ioc', + time_in_force='IOC', leverage=3.0, ) == params2 diff --git a/tests/exchange/test_kraken.py b/tests/exchange/test_kraken.py index 02df60990..66006f2fe 100644 --- a/tests/exchange/test_kraken.py +++ b/tests/exchange/test_kraken.py @@ -50,7 +50,7 @@ def test_buy_kraken_trading_agreement(default_conf, mocker): assert api_mock.create_order.call_args[0][2] == 'buy' assert api_mock.create_order.call_args[0][3] == 1 assert api_mock.create_order.call_args[0][4] == 200 - assert api_mock.create_order.call_args[0][5] == {'timeInForce': 'ioc', + assert api_mock.create_order.call_args[0][5] == {'timeInForce': 'IOC', 'trading_agreement': 'agree'} diff --git a/tests/strategy/test_strategy_loading.py b/tests/strategy/test_strategy_loading.py index b794cdc99..bf81cd068 100644 --- a/tests/strategy/test_strategy_loading.py +++ b/tests/strategy/test_strategy_loading.py @@ -275,8 +275,8 @@ def test_strategy_override_order_tif(caplog, default_conf): caplog.set_level(logging.INFO) order_time_in_force = { - 'entry': 'fok', - 'exit': 'gtc', + 'entry': 'FOK', + 'exit': 'GTC', } default_conf.update({ @@ -290,11 +290,11 @@ def test_strategy_override_order_tif(caplog, default_conf): assert strategy.order_time_in_force[method] == order_time_in_force[method] assert log_has("Override strategy 'order_time_in_force' with value in config file:" - " {'entry': 'fok', 'exit': 'gtc'}.", caplog) + " {'entry': 'FOK', 'exit': 'GTC'}.", caplog) default_conf.update({ 'strategy': CURRENT_TEST_STRATEGY, - 'order_time_in_force': {'entry': 'fok'} + 'order_time_in_force': {'entry': 'FOK'} }) # Raise error for invalid configuration with pytest.raises(ImportError, diff --git a/tests/test_configuration.py b/tests/test_configuration.py index db87c405f..2825ede5c 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -973,17 +973,17 @@ def test_validate_time_in_force(default_conf, caplog) -> None: conf = deepcopy(default_conf) conf['order_time_in_force'] = { 'buy': 'gtc', - 'sell': 'gtc', + 'sell': 'GTC', } validate_config_consistency(conf) assert log_has_re(r"DEPRECATED: Using 'buy' and 'sell' for time_in_force is.*", caplog) assert conf['order_time_in_force']['entry'] == 'gtc' - assert conf['order_time_in_force']['exit'] == 'gtc' + assert conf['order_time_in_force']['exit'] == 'GTC' conf = deepcopy(default_conf) conf['order_time_in_force'] = { - 'buy': 'gtc', - 'sell': 'gtc', + 'buy': 'GTC', + 'sell': 'GTC', } conf['trading_mode'] = 'futures' with pytest.raises(OperationalException, From c61b986c3d7638640ed9b682db42a91f2c8ffe72 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 27 Aug 2022 10:30:38 +0200 Subject: [PATCH 026/437] FTX - support time_in_force (and PO ordertype) closes #7175 --- docs/configuration.md | 9 ++++++++- freqtrade/exchange/ftx.py | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 851bbcd82..940d5e8b0 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -525,6 +525,13 @@ It means if the order is not executed immediately AND fully then it is cancelled It is the same as FOK (above) except it can be partially fulfilled. The remaining part is automatically cancelled by the exchange. +**PO (Post only):** + +Post only order. The order is either placed as a maker order, or it is canceled. +This means the order must be placed on orderbook for at at least time in an unfilled state. + +#### time_in_force config + The `order_time_in_force` parameter contains a dict with entry and exit time in force policy values. This can be set in the configuration file or in the strategy. Values set in the configuration file overwrites values set in the strategy. @@ -539,7 +546,7 @@ The possible values are: `GTC` (default), `FOK` or `IOC`. ``` !!! Warning - This is ongoing work. For now, it is supported only for binance and kucoin. + This is ongoing work. For now, it is supported only for binance, gate, ftx and kucoin. Please don't change the default value unless you know what you are doing and have researched the impact of using different values for your particular exchange. ### What values can be used for fiat_display_currency? diff --git a/freqtrade/exchange/ftx.py b/freqtrade/exchange/ftx.py index b3c219542..6a43ab302 100644 --- a/freqtrade/exchange/ftx.py +++ b/freqtrade/exchange/ftx.py @@ -19,6 +19,7 @@ logger = logging.getLogger(__name__) class Ftx(Exchange): _ft_has: Dict = { + "order_time_in_force": ['GTC', 'IOC', 'PO'], "stoploss_on_exchange": True, "ohlcv_candle_limit": 1500, "ohlcv_require_since": True, From 005594c29cad73c7814059312af5def40ee8bfa6 Mon Sep 17 00:00:00 2001 From: smarmau Date: Sun, 28 Aug 2022 11:29:48 +0200 Subject: [PATCH 027/437] simplify hybrid template --- .../templates/FreqaiHybridExampleStrategy.py | 256 +++++++----------- 1 file changed, 93 insertions(+), 163 deletions(-) diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index bb9c37b03..dfd67ae90 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -4,6 +4,7 @@ import numpy as np import pandas as pd import talib.abstract as ta from pandas import DataFrame +from technical import qtpylib from freqtrade.strategy import IntParameter, IStrategy, merge_informative_pair @@ -48,7 +49,7 @@ class FreqaiExampleHybridStrategy(IStrategy): "indicator_periods_candles": [10, 20] }, "data_split_parameters": { - "test_size": 0.33, + "test_size": 0, "random_state": 1 }, "model_training_parameters": { @@ -56,49 +57,44 @@ class FreqaiExampleHybridStrategy(IStrategy): } }, - Thanks to @smarm and @jooopieeert for developing and sharing the strategy. + Thanks to @smarmau and @johanvulgt for developing and sharing the strategy. """ - minimal_roi = {"0": 0.1, "30": 0.75, "60": 0.05, "120": 0.025, "240": -1} + minimal_roi = { + "60": 0.01, + "30": 0.02, + "0": 0.04 + } + + plot_config = { + 'main_plot': { + 'tema': {}, + }, + 'subplots': { + "MACD": { + 'macd': {'color': 'blue'}, + 'macdsignal': {'color': 'orange'}, + }, + "RSI": { + 'rsi': {'color': 'red'}, + }, + "Up_or_down": { + '&s-up_or_down': {'color': 'green'}, + } + } + } process_only_new_candles = True - stoploss = -0.1 + stoploss = -0.05 use_exit_signal = True startup_candle_count: int = 300 can_short = True - buy_params = { - "buy_m1": 4, - "buy_m2": 7, - "buy_m3": 1, - "buy_p1": 8, - "buy_p2": 9, - "buy_p3": 8, - } - - # Sell hyperspace params: - sell_params = { - "sell_m1": 1, - "sell_m2": 3, - "sell_m3": 6, - "sell_p1": 16, - "sell_p2": 18, - "sell_p3": 18, - } - - buy_m1 = IntParameter(1, 7, default=1) - buy_m2 = IntParameter(1, 7, default=3) - buy_m3 = IntParameter(1, 7, default=4) - buy_p1 = IntParameter(7, 21, default=14) - buy_p2 = IntParameter(7, 21, default=10) - buy_p3 = IntParameter(7, 21, default=10) - - sell_m1 = IntParameter(1, 7, default=1) - sell_m2 = IntParameter(1, 7, default=3) - sell_m3 = IntParameter(1, 7, default=4) - sell_p1 = IntParameter(7, 21, default=14) - sell_p2 = IntParameter(7, 21, default=10) - sell_p3 = IntParameter(7, 21, default=10) + # Hyperoptable parameters + buy_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True) + sell_rsi = IntParameter(low=50, high=100, default=70, space='sell', optimize=True, load=True) + short_rsi = IntParameter(low=51, high=100, default=70, space='sell', optimize=True, load=True) + exit_short_rsi = IntParameter(low=1, high=50, default=30, space='buy', optimize=True, load=True) # FreqAI required function, leave as is or add additional informatives to existing structure. def informative_pairs(self): @@ -143,7 +139,6 @@ class FreqaiExampleHybridStrategy(IStrategy): informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) informative[f"%-{coin}sma-period_{t}"] = ta.SMA(informative, timeperiod=t) informative[f"%-{coin}ema-period_{t}"] = ta.EMA(informative, timeperiod=t) - informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) informative[f"%-{coin}roc-period_{t}"] = ta.ROC(informative, timeperiod=t) informative[f"%-{coin}relative_volume-period_{t}"] = ( informative["volume"] / informative["volume"].rolling(t).mean() @@ -183,150 +178,85 @@ class FreqaiExampleHybridStrategy(IStrategy): # User creates their own custom strat here. Present example is a supertrend # based strategy. - for multiplier in self.buy_m1.range: - for period in self.buy_p1.range: - dataframe[f"supertrend_1_buy_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - - for multiplier in self.buy_m2.range: - for period in self.buy_p2.range: - dataframe[f"supertrend_2_buy_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - - for multiplier in self.buy_m3.range: - for period in self.buy_p3.range: - dataframe[f"supertrend_3_buy_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - - for multiplier in self.sell_m1.range: - for period in self.sell_p1.range: - dataframe[f"supertrend_1_sell_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - - for multiplier in self.sell_m2.range: - for period in self.sell_p2.range: - dataframe[f"supertrend_2_sell_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - - for multiplier in self.sell_m3.range: - for period in self.sell_p3.range: - dataframe[f"supertrend_3_sell_{multiplier}_{period}"] = self.supertrend( - dataframe, multiplier, period - )["STX"] - dataframe = self.freqai.start(dataframe, metadata, self) + # TA indicators to combine with the Freqai targets + # RSI + dataframe['rsi'] = ta.RSI(dataframe) + + # Bollinger Bands + bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) + dataframe['bb_lowerband'] = bollinger['lower'] + dataframe['bb_middleband'] = bollinger['mid'] + dataframe['bb_upperband'] = bollinger['upper'] + dataframe["bb_percent"] = ( + (dataframe["close"] - dataframe["bb_lowerband"]) / + (dataframe["bb_upperband"] - dataframe["bb_lowerband"]) + ) + dataframe["bb_width"] = ( + (dataframe["bb_upperband"] - dataframe["bb_lowerband"]) / dataframe["bb_middleband"] + ) + + # TEMA - Triple Exponential Moving Average + dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9) + return dataframe def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: - # User now can use their custom strat creation in addition to their - # future prediction "up" or "down". + df.loc[ + ( + # Signal: RSI crosses above 30 + (qtpylib.crossed_above(df['rsi'], self.buy_rsi.value)) & + (df['tema'] <= df['bb_middleband']) & # Guard: tema below BB middle + (df['tema'] > df['tema'].shift(1)) & # Guard: tema is raising + (df['volume'] > 0) & # Make sure Volume is not 0 + (df['do_predict'] == 1) & # Make sure Freqai is confident in the prediction + # Only enter trade if Freqai thinks the trend is in this direction + (df['&s-up_or_down'] == 'up') + ), + 'enter_long'] = 1 df.loc[ - (df[f"supertrend_1_buy_{self.buy_m1.value}_{self.buy_p1.value}"] == "up") & - (df[f"supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}"] == "up") & - (df[f"supertrend_3_buy_{self.buy_m3.value}_{self.buy_p3.value}"] == "up") & - (df["do_predict"] == 1) & - (df['&s-up_or_down'] == 'up'), - "enter_long", - ] = 1 - - df.loc[ - (df[f"supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}"] == "down") & - (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down") & - (df[f"supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}"] == "down") & - (df["do_predict"] == 1) & - (df['&s-up_or_down'] == 'down'), - "enter_short", - ] = 1 + ( + # Signal: RSI crosses above 70 + (qtpylib.crossed_above(df['rsi'], self.short_rsi.value)) & + (df['tema'] > df['bb_middleband']) & # Guard: tema above BB middle + (df['tema'] < df['tema'].shift(1)) & # Guard: tema is falling + (df['volume'] > 0) & # Make sure Volume is not 0 + (df['do_predict'] == 1) & # Make sure Freqai is confident in the prediction + # Only enter trade if Freqai thinks the trend is in this direction + (df['&s-up_or_down'] == 'down') + ), + 'enter_short'] = 1 return df def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame: df.loc[ - (df[f"supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}"] == "down"), - "exit_long", - ] = 1 + ( + # Signal: RSI crosses above 70 + (qtpylib.crossed_above(df['rsi'], self.sell_rsi.value)) & + (df['tema'] > df['bb_middleband']) & # Guard: tema above BB middle + (df['tema'] < df['tema'].shift(1)) & # Guard: tema is falling + (df['volume'] > 0) # Make sure Volume is not 0 + ), + + 'exit_long'] = 1 df.loc[ - (df[f"supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}"] == "up"), - "exit_short", - ] = 1 + ( + # Signal: RSI crosses above 30 + (qtpylib.crossed_above(df['rsi'], self.exit_short_rsi.value)) & + # Guard: tema below BB middle + (df['tema'] <= df['bb_middleband']) & + (df['tema'] > df['tema'].shift(1)) & # Guard: tema is raising + (df['volume'] > 0) # Make sure Volume is not 0 + ), + 'exit_short'] = 1 return df def get_ticker_indicator(self): return int(self.config["timeframe"][:-1]) - - def confirm_trade_entry(self, pair: str, order_type: str, amount: float, - rate: float, time_in_force: str, current_time, entry_tag, side: str, - **kwargs, ) -> bool: - - df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) - last_candle = df.iloc[-1].squeeze() - - if side == "long": - if rate > (last_candle["close"] * (1 + 0.0025)): - return False - else: - if rate < (last_candle["close"] * (1 - 0.0025)): - return False - - return True - - """ - Supertrend Indicator; adapted for freqtrade, optimized by the math genius. - from: Perkmeister#2394 - """ - - def supertrend(self, dataframe: DataFrame, multiplier, period): - - df = dataframe.copy() - last_row = dataframe.tail(1).index.item() - - df['TR'] = ta.TRANGE(df) - df['ATR'] = ta.SMA(df['TR'], period) - - st = 'ST_' + str(period) + '_' + str(multiplier) - stx = 'STX_' + str(period) + '_' + str(multiplier) - - # Compute basic upper and lower bands - BASIC_UB = ((df['high'] + df['low']) / 2 + multiplier * df['ATR']).values - BASIC_LB = ((df['high'] + df['low']) / 2 - multiplier * df['ATR']).values - FINAL_UB = np.zeros(last_row + 1) - FINAL_LB = np.zeros(last_row + 1) - ST = np.zeros(last_row + 1) - CLOSE = df['close'].values - - # Compute final upper and lower bands - for i in range(period, last_row + 1): - FINAL_UB[i] = (BASIC_UB[i] if BASIC_UB[i] < FINAL_UB[i - 1] - or CLOSE[i - 1] > FINAL_UB[i - 1] else FINAL_UB[i - 1]) - FINAL_LB[i] = (BASIC_LB[i] if BASIC_LB[i] > FINAL_LB[i - 1] - or CLOSE[i - 1] < FINAL_LB[i - 1] else FINAL_LB[i - 1]) - - # Set the Supertrend value - for i in range(period, last_row + 1): - ST[i] = FINAL_UB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] <= FINAL_UB[i] else \ - FINAL_LB[i] if ST[i - 1] == FINAL_UB[i - 1] and CLOSE[i] > FINAL_UB[i] else \ - FINAL_LB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] >= FINAL_LB[i] else \ - FINAL_UB[i] if ST[i - 1] == FINAL_LB[i - 1] and CLOSE[i] < FINAL_LB[i] else 0.00 - df_ST = pd.DataFrame(ST, columns=[st]) - df = pd.concat([df, df_ST], axis=1) - - # Mark the trend direction up/down - df[stx] = np.where((df[st] > 0.00), np.where((df['close'] < df[st]), 'down', 'up'), np.NaN) - - df.fillna(0, inplace=True) - - return DataFrame(index=df.index, data={ - 'ST': df[st], - 'STX': df[stx] - }) From ff3a4995c1c34cc737313908cde420aa0ef50754 Mon Sep 17 00:00:00 2001 From: smarmau Date: Sun, 28 Aug 2022 11:45:20 +0200 Subject: [PATCH 028/437] remove unnecessary code --- freqtrade/templates/FreqaiHybridExampleStrategy.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index dfd67ae90..0a91455f5 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -257,6 +257,3 @@ class FreqaiExampleHybridStrategy(IStrategy): 'exit_short'] = 1 return df - - def get_ticker_indicator(self): - return int(self.config["timeframe"][:-1]) From 8c4e68b8eb21e6bb0e04e47befb15a9d2ad40913 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 28 Aug 2022 13:00:52 -0600 Subject: [PATCH 029/437] updated example configs --- config_examples/config_follower.example.json | 8 +++++--- freqtrade/rpc/external_signal/controller.py | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/config_examples/config_follower.example.json b/config_examples/config_follower.example.json index 5317c8df2..646310d9a 100644 --- a/config_examples/config_follower.example.json +++ b/config_examples/config_follower.example.json @@ -46,8 +46,8 @@ }, "pairlists": [ { - "method": "ExternalPairList", - "number_assets": 5, + "method": "ExternalPairList", // ExternalPairList is required in follower mode + "number_assets": 5, // We can limit the amount of pairs to use from the leaders } ], "telegram": { @@ -74,7 +74,9 @@ "url": "ws://localhost:8080/signals/ws", "api_token": "testtoken" } - ] + ], + "wait_data_policy": "all", // ['all', 'first', none] defaults to all + "remove_signals_analyzed_df": true, // Remove entry/exit signals from Leader df, Defaults to false }, "bot_name": "freqtrade", "initial_state": "running", diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py index 29a318b53..2b29cde6f 100644 --- a/freqtrade/rpc/external_signal/controller.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -373,7 +373,6 @@ class ExternalSignalController(RPCHandler): # Data is being broadcasted right away as soon as startup, # we may not have to send initial data at all. Further testing # required. - await self.send_initial_data(channel) # Keep connection open until explicitly closed, and sleep @@ -434,7 +433,7 @@ class ExternalSignalController(RPCHandler): async with lock: # Acquire lock so only 1 coro handling at a time - # as we might call the RPC module in the main thread + # as we call the RPC module in the main thread await self._handle_leader_message(data) except (socket.gaierror, ConnectionRefusedError): From e9e872ca206eb8b474f3a806812013179746be18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:18 +0000 Subject: [PATCH 030/437] Bump mkdocs-material from 8.4.1 to 8.4.2 Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.1 to 8.4.2. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.1...8.4.2) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index bffc04d1c..5a6c46471 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,6 +1,6 @@ markdown==3.3.7 mkdocs==1.3.1 -mkdocs-material==8.4.1 +mkdocs-material==8.4.2 mdx_truly_sane_lists==1.3 pymdown-extensions==9.5 jinja2==3.1.2 From 0af4bd294430e087a2e53997d154eb7690569384 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:25 +0000 Subject: [PATCH 031/437] Bump urllib3 from 1.26.11 to 1.26.12 Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.11 to 1.26.12. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/1.26.11...1.26.12) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4a0531ea8..2d9e42c56 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ python-telegram-bot==13.13 arrow==1.2.2 cachetools==4.2.2 requests==2.28.1 -urllib3==1.26.11 +urllib3==1.26.12 jsonschema==4.14.0 TA-Lib==0.4.24 technical==1.3.0 From e9f46f476878a4edbc57e78d14f278646f8e0d43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:30 +0000 Subject: [PATCH 032/437] Bump nbconvert from 6.5.3 to 7.0.0 Bumps [nbconvert](https://github.com/jupyter/nbconvert) from 6.5.3 to 7.0.0. - [Release notes](https://github.com/jupyter/nbconvert/releases) - [Commits](https://github.com/jupyter/nbconvert/compare/6.5.3...7.0.0) --- updated-dependencies: - dependency-name: nbconvert dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9c45e7277..26df7115c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -20,7 +20,7 @@ isort==5.10.1 time-machine==2.8.1 # Convert jupyter notebooks to markdown documents -nbconvert==6.5.3 +nbconvert==7.0.0 # mypy types types-cachetools==5.2.1 From 49dd1c1d4908fc07033549e2f9060da3ad0ca1e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:36 +0000 Subject: [PATCH 033/437] Bump scipy from 1.9.0 to 1.9.1 Bumps [scipy](https://github.com/scipy/scipy) from 1.9.0 to 1.9.1. - [Release notes](https://github.com/scipy/scipy/releases) - [Commits](https://github.com/scipy/scipy/compare/v1.9.0...v1.9.1) --- updated-dependencies: - dependency-name: scipy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-hyperopt.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-hyperopt.txt b/requirements-hyperopt.txt index 020ccdda8..efa31272a 100644 --- a/requirements-hyperopt.txt +++ b/requirements-hyperopt.txt @@ -2,7 +2,7 @@ -r requirements.txt # Required for hyperopt -scipy==1.9.0 +scipy==1.9.1 scikit-learn==1.1.2 scikit-optimize==0.9.0 filelock==3.8.0 From 3a7441a27d7dbeb8211fc11742243c1a9b4b9835 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:41 +0000 Subject: [PATCH 034/437] Bump uvicorn from 0.18.2 to 0.18.3 Bumps [uvicorn](https://github.com/encode/uvicorn) from 0.18.2 to 0.18.3. - [Release notes](https://github.com/encode/uvicorn/releases) - [Changelog](https://github.com/encode/uvicorn/blob/master/CHANGELOG.md) - [Commits](https://github.com/encode/uvicorn/compare/0.18.2...0.18.3) --- updated-dependencies: - dependency-name: uvicorn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4a0531ea8..f59b9631c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,7 +35,7 @@ sdnotify==0.3.2 # API Server fastapi==0.79.1 -uvicorn==0.18.2 +uvicorn==0.18.3 pyjwt==2.4.0 aiofiles==0.8.0 psutil==5.9.1 From d734f7612fccc3d3ebc3ed3be4e04f741e85cbe2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:50 +0000 Subject: [PATCH 035/437] Bump orjson from 3.7.12 to 3.8.0 Bumps [orjson](https://github.com/ijl/orjson) from 3.7.12 to 3.8.0. - [Release notes](https://github.com/ijl/orjson/releases) - [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md) - [Commits](https://github.com/ijl/orjson/compare/3.7.12...3.8.0) --- updated-dependencies: - dependency-name: orjson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4a0531ea8..657dfed0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,7 @@ py_find_1st==1.1.5 # Load ticker files 30% faster python-rapidjson==1.8 # Properly format api responses -orjson==3.7.12 +orjson==3.8.0 # Notify systemd sdnotify==0.3.2 From d7189847a7ef203d08998251a2b5b18072f8f518 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 03:01:59 +0000 Subject: [PATCH 036/437] Bump ccxt from 1.92.52 to 1.92.84 Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.92.52 to 1.92.84. - [Release notes](https://github.com/ccxt/ccxt/releases) - [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg) - [Commits](https://github.com/ccxt/ccxt/compare/1.92.52...1.92.84) --- updated-dependencies: - dependency-name: ccxt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4a0531ea8..795882ba6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.23.2 pandas==1.4.3 pandas-ta==0.3.14b -ccxt==1.92.52 +ccxt==1.92.84 # Pin cryptography for now due to rust build errors with piwheels cryptography==37.0.4 aiohttp==3.8.1 From 40c00d2d8f76defd5fee2a0106343830404790d5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 06:34:20 +0200 Subject: [PATCH 037/437] Version bump dev version to 2022.9 --- docs/developer.md | 5 +++-- freqtrade/__init__.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/developer.md b/docs/developer.md index aca4ce4ed..f88754c50 100644 --- a/docs/developer.md +++ b/docs/developer.md @@ -409,8 +409,9 @@ Determine if crucial bugfixes have been made between this commit and the current * Merge the release branch (stable) into this branch. * Edit `freqtrade/__init__.py` and add the version matching the current date (for example `2019.7` for July 2019). Minor versions can be `2019.7.1` should we need to do a second release that month. Version numbers must follow allowed versions from PEP0440 to avoid failures pushing to pypi. -* Commit this part -* push that branch to the remote and create a PR against the stable branch +* Commit this part. +* push that branch to the remote and create a PR against the stable branch. +* Update develop version to next version following the pattern `2019.8-dev`. ### Create changelog from git commits diff --git a/freqtrade/__init__.py b/freqtrade/__init__.py index 2572c03f1..77c305c66 100644 --- a/freqtrade/__init__.py +++ b/freqtrade/__init__.py @@ -1,5 +1,5 @@ """ Freqtrade bot """ -__version__ = '2022.8.dev' +__version__ = '2022.9.dev' if 'dev' in __version__: try: From 56cd80926a4159dbc72605003836dcce9a909173 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Aug 2022 04:52:12 +0000 Subject: [PATCH 038/437] Bump fastapi from 0.79.1 to 0.81.0 Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.79.1 to 0.81.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.79.1...0.81.0) --- updated-dependencies: - dependency-name: fastapi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3578a3659..5c56c91ea 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,7 @@ orjson==3.8.0 sdnotify==0.3.2 # API Server -fastapi==0.79.1 +fastapi==0.81.0 uvicorn==0.18.3 pyjwt==2.4.0 aiofiles==0.8.0 From 226fa5d93c74ebcf5d4d88cfb7c10ac2abfbf990 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 06:45:00 +0200 Subject: [PATCH 039/437] Simplify liquidation price calling structure --- freqtrade/exchange/exchange.py | 34 +------- freqtrade/freqtradebot.py | 6 +- freqtrade/optimize/backtesting.py | 2 +- tests/exchange/test_exchange.py | 128 +++++++++++++++--------------- 4 files changed, 69 insertions(+), 101 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 586a364c5..c9abb1988 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2432,36 +2432,6 @@ class Exchange: """ return 0.0 - def get_liquidation_price( - self, - pair: str, - open_rate: float, - amount: float, # quote currency, includes leverage - stake_amount: float, - leverage: float, - is_short: bool - ) -> Optional[float]: - - if self.trading_mode in TradingMode.SPOT: - return None - elif ( - self.trading_mode == TradingMode.FUTURES - ): - isolated_liq = self.get_or_calculate_liquidation_price( - pair=pair, - open_rate=open_rate, - is_short=is_short, - amount=amount, - stake_amount=stake_amount, - wallet_balance=stake_amount, # In isolated mode, stake-amount = wallet size - mm_ex_1=0.0, - upnl_ex_1=0.0, - ) - return isolated_liq - else: - raise OperationalException( - "Freqtrade currently only supports futures for leverage trading.") - def funding_fee_cutoff(self, open_date: datetime): """ :param open_date: The open date for a trade @@ -2622,7 +2592,7 @@ class Exchange: else: return 0.0 - def get_or_calculate_liquidation_price( + def get_liquidation_price( self, pair: str, # Dry-run @@ -2630,7 +2600,7 @@ class Exchange: is_short: bool, amount: float, # Absolute value of position size stake_amount: float, - wallet_balance: float, # Or margin balance + wallet_balance: float = 0.0, mm_ex_1: float = 0.0, # (Binance) Cross only upnl_ex_1: float = 0.0, # (Binance) Cross only ) -> Optional[float]: diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 35ba6bab2..ea9221213 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1732,12 +1732,12 @@ class FreqtradeBot(LoggingMixin): # TODO: Margin will need to use interest_rate as well. # interest_rate = self.exchange.get_interest_rate() trade.set_liquidation_price(self.exchange.get_liquidation_price( - leverage=trade.leverage, pair=trade.pair, + open_rate=trade.open_rate, + is_short=trade.is_short, amount=trade.amount, stake_amount=trade.stake_amount, - open_rate=trade.open_rate, - is_short=trade.is_short + wallet_balance=trade.stake_amount, )) # Updating wallets when order is closed diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 57b272e86..d65a75503 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -881,7 +881,7 @@ class Backtesting: open_rate=propose_rate, amount=amount, stake_amount=trade.stake_amount, - leverage=leverage, + wallet_balance=trade.stake_amount, is_short=is_short, )) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index b1f22e647..ff9017c13 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4089,68 +4089,6 @@ def test_combine_funding_and_mark( assert len(df) == 0 -def test_get_or_calculate_liquidation_price(mocker, default_conf): - - api_mock = MagicMock() - positions = [ - { - 'info': {}, - 'symbol': 'NEAR/USDT:USDT', - 'timestamp': 1642164737148, - 'datetime': '2022-01-14T12:52:17.148Z', - 'initialMargin': 1.51072, - 'initialMarginPercentage': 0.1, - 'maintenanceMargin': 0.38916147, - 'maintenanceMarginPercentage': 0.025, - 'entryPrice': 18.884, - 'notional': 15.1072, - 'leverage': 9.97, - 'unrealizedPnl': 0.0048, - 'contracts': 8, - 'contractSize': 0.1, - 'marginRatio': None, - 'liquidationPrice': 17.47, - 'markPrice': 18.89, - 'margin_mode': 1.52549075, - 'marginType': 'isolated', - 'side': 'buy', - 'percentage': 0.003177292946409658 - } - ] - api_mock.fetch_positions = MagicMock(return_value=positions) - mocker.patch.multiple( - 'freqtrade.exchange.Exchange', - exchange_has=MagicMock(return_value=True), - ) - default_conf['dry_run'] = False - default_conf['trading_mode'] = 'futures' - default_conf['margin_mode'] = 'isolated' - default_conf['liquidation_buffer'] = 0.0 - - exchange = get_patched_exchange(mocker, default_conf, api_mock) - liq_price = exchange.get_or_calculate_liquidation_price( - pair='NEAR/USDT:USDT', - open_rate=18.884, - is_short=False, - amount=0.8, - stake_amount=18.884 * 0.8, - wallet_balance=0.8, - ) - assert liq_price == 17.47 - - default_conf['liquidation_buffer'] = 0.05 - exchange = get_patched_exchange(mocker, default_conf, api_mock) - liq_price = exchange.get_or_calculate_liquidation_price( - pair='NEAR/USDT:USDT', - open_rate=18.884, - is_short=False, - amount=0.8, - stake_amount=18.884 * 0.8, - wallet_balance=0.8, - ) - assert liq_price == 17.540699999999998 - - @pytest.mark.parametrize('exchange,rate_start,rate_end,d1,d2,amount,expected_fees', [ ('binance', 0, 2, "2021-09-01 01:00:00", "2021-09-01 04:00:00", 30.0, 0.0), ('binance', 0, 2, "2021-09-01 00:00:00", "2021-09-01 08:00:00", 30.0, -0.00091409999), @@ -4541,7 +4479,7 @@ def test_liquidation_price_is_none( default_conf['trading_mode'] = trading_mode default_conf['margin_mode'] = margin_mode exchange = get_patched_exchange(mocker, default_conf, id=exchange_name) - assert exchange.get_or_calculate_liquidation_price( + assert exchange.get_liquidation_price( pair='DOGE/USDT', open_rate=open_rate, is_short=is_short, @@ -4576,7 +4514,7 @@ def test_liquidation_price( default_conf['liquidation_buffer'] = 0.0 exchange = get_patched_exchange(mocker, default_conf, id=exchange_name) exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(mm_ratio, maintenance_amt)) - assert isclose(round(exchange.get_or_calculate_liquidation_price( + assert isclose(round(exchange.get_liquidation_price( pair='DOGE/USDT', open_rate=open_rate, is_short=is_short, @@ -5003,6 +4941,66 @@ def test__get_params(mocker, default_conf, exchange_name): ) == params2 +def test_get_liquidation_price1(mocker, default_conf): + + api_mock = MagicMock() + positions = [ + { + 'info': {}, + 'symbol': 'NEAR/USDT:USDT', + 'timestamp': 1642164737148, + 'datetime': '2022-01-14T12:52:17.148Z', + 'initialMargin': 1.51072, + 'initialMarginPercentage': 0.1, + 'maintenanceMargin': 0.38916147, + 'maintenanceMarginPercentage': 0.025, + 'entryPrice': 18.884, + 'notional': 15.1072, + 'leverage': 9.97, + 'unrealizedPnl': 0.0048, + 'contracts': 8, + 'contractSize': 0.1, + 'marginRatio': None, + 'liquidationPrice': 17.47, + 'markPrice': 18.89, + 'margin_mode': 1.52549075, + 'marginType': 'isolated', + 'side': 'buy', + 'percentage': 0.003177292946409658 + } + ] + api_mock.fetch_positions = MagicMock(return_value=positions) + mocker.patch.multiple( + 'freqtrade.exchange.Exchange', + exchange_has=MagicMock(return_value=True), + ) + default_conf['dry_run'] = False + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + default_conf['liquidation_buffer'] = 0.0 + + exchange = get_patched_exchange(mocker, default_conf, api_mock) + liq_price = exchange.get_liquidation_price( + pair='NEAR/USDT:USDT', + open_rate=18.884, + is_short=False, + amount=0.8, + stake_amount=18.884 * 0.8, + ) + assert liq_price == 17.47 + + default_conf['liquidation_buffer'] = 0.05 + exchange = get_patched_exchange(mocker, default_conf, api_mock) + liq_price = exchange.get_liquidation_price( + pair='NEAR/USDT:USDT', + open_rate=18.884, + is_short=False, + amount=0.8, + stake_amount=18.884 * 0.8, + ) + assert liq_price == 17.540699999999998 + + @pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) @pytest.mark.parametrize( "is_short,trading_mode,exchange_name,margin_mode,leverage,open_rate,amount,expected_liq", [ @@ -5116,7 +5114,7 @@ def test_get_liquidation_price( open_rate=open_rate, amount=amount, stake_amount=amount * open_rate / leverage, - leverage=leverage, + # leverage=leverage, is_short=is_short, ) if expected_liq is None: From 27a9f98d5f3370f81bd09d040967ca72ba8a0c33 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 06:59:00 +0200 Subject: [PATCH 040/437] Simplify liquidation price structure, improve test cov --- freqtrade/exchange/exchange.py | 5 ++--- tests/exchange/test_exchange.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index c9abb1988..9d08d3d19 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2611,8 +2611,9 @@ class Exchange: return None elif (self.trading_mode != TradingMode.FUTURES): raise OperationalException( - f"{self.name} does not support {self.margin_mode.value} {self.trading_mode.value}") + f"{self.name} does not support {self.margin_mode} {self.trading_mode}") + isolated_liq = None if self._config['dry_run'] or not self.exchange_has("fetchPositions"): isolated_liq = self.dry_run_liquidation_price( @@ -2630,8 +2631,6 @@ class Exchange: if len(positions) > 0: pos = positions[0] isolated_liq = pos['liquidationPrice'] - else: - return None if isolated_liq: buffer_amount = abs(open_rate - isolated_liq) * self.liquidation_buffer diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index ff9017c13..47df5c739 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -5000,6 +5000,28 @@ def test_get_liquidation_price1(mocker, default_conf): ) assert liq_price == 17.540699999999998 + api_mock.fetch_positions = MagicMock(return_value=[]) + exchange = get_patched_exchange(mocker, default_conf, api_mock) + liq_price = exchange.get_liquidation_price( + pair='NEAR/USDT:USDT', + open_rate=18.884, + is_short=False, + amount=0.8, + stake_amount=18.884 * 0.8, + ) + assert liq_price is None + default_conf['trading_mode'] = 'margin' + + exchange = get_patched_exchange(mocker, default_conf, api_mock) + with pytest.raises(OperationalException, match=r'.*does not support .* margin'): + exchange.get_liquidation_price( + pair='NEAR/USDT:USDT', + open_rate=18.884, + is_short=False, + amount=0.8, + stake_amount=18.884 * 0.8, + ) + @pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) @pytest.mark.parametrize( From 62c0a174c878a7ca0e630ced835f0d23096c6f74 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 29 Aug 2022 11:04:58 +0200 Subject: [PATCH 041/437] allow users to properly reverse train-test data ordering --- docs/freqai.md | 1 + freqtrade/freqai/data_kitchen.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index 3d10280dd..e4a451324 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -114,6 +114,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. See details about some select parameters [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Dictionary. | `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. | `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` +| `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 8e68c9a38..5091073aa 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -168,9 +168,17 @@ class FreqaiDataKitchen: train_labels = labels train_weights = weights - return self.build_data_dictionary( - train_features, test_features, train_labels, test_labels, train_weights, test_weights - ) + # Simplest way to reverse the order of training and test data: + if self.freqai_config['feature_parameters'].get('reverse_train_test_order', False): + return self.build_data_dictionary( + test_features, train_features, test_labels, + train_labels, test_weights, train_weights + ) + else: + return self.build_data_dictionary( + train_features, test_features, train_labels, + test_labels, train_weights, test_weights + ) def filter_features( self, From efc3b39fb8f2c747472d42c1226a7f55ed03c454 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 20:01:03 +0200 Subject: [PATCH 042/437] Improve config overwriting wording #7181 --- docs/configuration.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 940d5e8b0..f8a600e76 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -57,10 +57,21 @@ You can specify additional configuration files in `add_config_files`. Files spec This is similar to using multiple `--config` parameters, but simpler in usage as you don't have to specify all files for all commands. !!! Tip "Use multiple configuration files to keep secrets secret" - You can use a 2nd configuration file containing your secrets. That way you can share your "primary" configuration file, while still keeping your API keys for yourself. + You can use a 2nd configuration file containing your secrets. That way you can share your "primary" configuration file, while still keeping your API keys for yourself. + The 2nd file should only specify what you intend to override. + If a key is in more than one of the configurations, then the "last specified configuration" wins (in the above example, `config-private.json`). + + For one-off commands, you can also use the below syntax by specifying multiple "--config" parameters. + + ``` bash + freqtrade trade --config user_data/config1.json --config user_data/config-private.json <...> + ``` + + The below is equivalent to the example above - but having 2 configuration files in the configuration, for easier reuse. ``` json title="user_data/config.json" "add_config_files": [ + "config1.json", "config-private.json" ] ``` @@ -69,17 +80,6 @@ This is similar to using multiple `--config` parameters, but simpler in usage as freqtrade trade --config user_data/config.json <...> ``` - The 2nd file should only specify what you intend to override. - If a key is in more than one of the configurations, then the "last specified configuration" wins (in the above example, `config-private.json`). - - For one-off commands, you can also use the below syntax by specifying multiple "--config" parameters. - - ``` bash - freqtrade trade --config user_data/config.json --config user_data/config-private.json <...> - ``` - - This is equivalent to the example above - but `config-private.json` is specified as cli argument. - ??? Note "config collision handling" If the same configuration setting takes place in both `config.json` and `config-import.json`, then the parent configuration wins. In the below case, `max_open_trades` would be 3 after the merging - as the reusable "import" configuration has this key overwritten. @@ -110,6 +110,8 @@ This is similar to using multiple `--config` parameters, but simpler in usage as "stake_amount": "unlimited" } ``` + + If multiple files are in the `add_config_files` section, then they will be assumed to be at identical levels, having the last occurrence override the earlier config (unless a parent already defined such a key). ## Configuration parameters From eee2071e32024b18a2879378580258ca2b46947f Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 21:04:09 +0200 Subject: [PATCH 043/437] Fix non-testing liquidation test --- tests/exchange/test_exchange.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 47df5c739..51890de79 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -5023,7 +5023,7 @@ def test_get_liquidation_price1(mocker, default_conf): ) -@pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) +@pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) @pytest.mark.parametrize( "is_short,trading_mode,exchange_name,margin_mode,leverage,open_rate,amount,expected_liq", [ (False, 'spot', 'binance', '', 5.0, 10.0, 1.0, None), @@ -5036,20 +5036,22 @@ def test_get_liquidation_price1(mocker, default_conf): (True, 'futures', 'binance', 'isolated', 5.0, 10.0, 1.0, 11.89108910891089), (True, 'futures', 'binance', 'isolated', 3.0, 10.0, 1.0, 13.211221122079207), (True, 'futures', 'binance', 'isolated', 5.0, 8.0, 1.0, 9.514851485148514), - (True, 'futures', 'binance', 'isolated', 5.0, 10.0, 0.6, 12.557755775577558), + (True, 'futures', 'binance', 'isolated', 5.0, 10.0, 0.6, 11.897689768976898), # Binance, long (False, 'futures', 'binance', 'isolated', 5, 10, 1.0, 8.070707070707071), (False, 'futures', 'binance', 'isolated', 5, 8, 1.0, 6.454545454545454), - (False, 'futures', 'binance', 'isolated', 3, 10, 1.0, 6.717171717171718), - (False, 'futures', 'binance', 'isolated', 5, 10, 0.6, 7.39057239057239), + (False, 'futures', 'binance', 'isolated', 3, 10, 1.0, 6.723905723905723), + (False, 'futures', 'binance', 'isolated', 5, 10, 0.6, 8.063973063973064), # Gateio/okx, short - (True, 'futures', 'gateio', 'isolated', 5, 10, 1.0, 11.87413417771621), - (True, 'futures', 'gateio', 'isolated', 5, 10, 2.0, 11.87413417771621), - (True, 'futures', 'gateio', 'isolated', 3, 10, 1.0, 13.476180850346978), - (True, 'futures', 'gateio', 'isolated', 5, 8, 1.0, 9.499307342172967), + (True, 'futures', 'gateio', 'isolated', 5, 10, 1.0, 11.89108910891089), + (True, 'futures', 'gateio', 'isolated', 5, 10, 2.0, 11.886138613861386), + (True, 'futures', 'gateio', 'isolated', 3, 10, 1.0, 13.211221122112212), + (True, 'futures', 'gateio', 'isolated', 5, 8, 1.0, 9.514851485148514), # Gateio/okx, long - (False, 'futures', 'gateio', 'isolated', 5.0, 10.0, 1.0, 8.085708510208207), - (False, 'futures', 'gateio', 'isolated', 3.0, 10.0, 1.0, 6.738090425173506), + (False, 'futures', 'gateio', 'isolated', 5.0, 10.0, 1.0, 8.070707070707071), + (False, 'futures', 'gateio', 'isolated', 3.0, 10.0, 1.0, 6.723905723905723), + (True, 'futures', 'okx', 'isolated', 5, 8, 1.0, 9.514851485148514), + (False, 'futures', 'okx', 'isolated', 3.0, 10.0, 1.0, 6.723905723905723), # (True, 'futures', 'okx', 'isolated', 11.87413417771621), # (False, 'futures', 'okx', 'isolated', 8.085708510208207), ] @@ -5135,7 +5137,8 @@ def test_get_liquidation_price( pair='ETH/USDT:USDT', open_rate=open_rate, amount=amount, - stake_amount=amount * open_rate / leverage, + stake_amount=(amount * open_rate) / leverage, + wallet_balance=(amount * open_rate) / leverage, # leverage=leverage, is_short=is_short, ) @@ -5144,7 +5147,7 @@ def test_get_liquidation_price( else: buffer_amount = liquidation_buffer * abs(open_rate - expected_liq) expected_liq = expected_liq - buffer_amount if is_short else expected_liq + buffer_amount - isclose(expected_liq, liq) + assert pytest.approx(expected_liq) == liq @pytest.mark.parametrize('contract_size,order_amount', [ From 7952e0df25914bef04bc0f8acda729e2b9a685d6 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 29 Aug 2022 13:41:15 -0600 Subject: [PATCH 044/437] initial rework separating server and client impl --- .gitignore | 3 - config_examples/config_follower.example.json | 87 -- config_examples/config_leader.example.json | 97 -- freqtrade/constants.py | 1 + freqtrade/enums/rpcmessagetype.py | 5 +- freqtrade/freqtradebot.py | 41 +- freqtrade/rpc/api_server/api_auth.py | 24 +- freqtrade/rpc/api_server/api_ws.py | 52 ++ freqtrade/rpc/api_server/deps.py | 4 + freqtrade/rpc/api_server/webserver.py | 76 +- freqtrade/rpc/api_server/ws/channel.py | 146 +++ freqtrade/rpc/api_server/ws/proxy.py | 61 ++ freqtrade/rpc/api_server/ws/serializer.py | 65 ++ freqtrade/rpc/api_server/ws/types.py | 8 + freqtrade/rpc/api_server/ws/utils.py | 12 + freqtrade/rpc/external_signal/__init__.py | 10 +- freqtrade/rpc/external_signal/channel.py | 290 +++--- freqtrade/rpc/external_signal/controller.py | 898 +++++++++---------- freqtrade/rpc/external_signal/proxy.py | 122 +-- freqtrade/rpc/external_signal/serializer.py | 130 +-- freqtrade/rpc/external_signal/types.py | 16 +- freqtrade/rpc/external_signal/utils.py | 32 +- freqtrade/rpc/rpc.py | 131 ++- freqtrade/rpc/rpc_manager.py | 28 +- scripts/test_ws_client.py | 58 ++ 25 files changed, 1329 insertions(+), 1068 deletions(-) delete mode 100644 config_examples/config_follower.example.json delete mode 100644 config_examples/config_leader.example.json create mode 100644 freqtrade/rpc/api_server/api_ws.py create mode 100644 freqtrade/rpc/api_server/ws/channel.py create mode 100644 freqtrade/rpc/api_server/ws/proxy.py create mode 100644 freqtrade/rpc/api_server/ws/serializer.py create mode 100644 freqtrade/rpc/api_server/ws/types.py create mode 100644 freqtrade/rpc/api_server/ws/utils.py create mode 100644 scripts/test_ws_client.py diff --git a/.gitignore b/.gitignore index b8c4c3846..6a47a7f81 100644 --- a/.gitignore +++ b/.gitignore @@ -115,6 +115,3 @@ target/ !config_examples/config_freqai.example.json !config_examples/config_leader.example.json !config_examples/config_follower.example.json - -*-config.json -*.db* diff --git a/config_examples/config_follower.example.json b/config_examples/config_follower.example.json deleted file mode 100644 index 646310d9a..000000000 --- a/config_examples/config_follower.example.json +++ /dev/null @@ -1,87 +0,0 @@ - -{ - "db_url": "sqlite:///follower.db", - "strategy": "SampleStrategy", - "max_open_trades": 3, - "stake_currency": "USDT", - "stake_amount": 100, - "tradable_balance_ratio": 0.99, - "fiat_display_currency": "USD", - "dry_run": true, - "cancel_open_orders_on_exit": false, - "trading_mode": "spot", - "margin_mode": "", - "unfilledtimeout": { - "entry": 10, - "exit": 10, - "exit_timeout_count": 0, - "unit": "minutes" - }, - "entry_pricing": { - "price_side": "same", - "use_order_book": true, - "order_book_top": 1, - "price_last_balance": 0.0, - "check_depth_of_market": { - "enabled": false, - "bids_to_ask_delta": 1 - } - }, - "exit_pricing":{ - "price_side": "same", - "use_order_book": true, - "order_book_top": 1 - }, - "exchange": { - "name": "kucoin", - "key": "", - "secret": "", - "password": "", - "ccxt_config": {}, - "ccxt_async_config": {}, - "pair_whitelist": [ - ], - "pair_blacklist": [ - ] - }, - "pairlists": [ - { - "method": "ExternalPairList", // ExternalPairList is required in follower mode - "number_assets": 5, // We can limit the amount of pairs to use from the leaders - } - ], - "telegram": { - "enabled": false, - "token": "", - "chat_id": "" - }, - "api_server": { - "enabled": true, - "listen_ip_address": "127.0.0.1", - "listen_port": 8081, - "verbosity": "error", - "enable_openapi": false, - "jwt_secret_key": "fcc24d31d6581ad2c90c3fc438c8a8b2ccce1393126959934568707f0bd2d647", - "CORS_origins": [], - "username": "freqtrader", - "password": "testing123" - }, - "external_signal": { - "enabled": true, - "mode": "follower", - "leaders": [ - { - "url": "ws://localhost:8080/signals/ws", - "api_token": "testtoken" - } - ], - "wait_data_policy": "all", // ['all', 'first', none] defaults to all - "remove_signals_analyzed_df": true, // Remove entry/exit signals from Leader df, Defaults to false - }, - "bot_name": "freqtrade", - "initial_state": "running", - "force_entry_enable": false, - "internals": { - "process_throttle_secs": 5, - } -} diff --git a/config_examples/config_leader.example.json b/config_examples/config_leader.example.json deleted file mode 100644 index 5103fdbd4..000000000 --- a/config_examples/config_leader.example.json +++ /dev/null @@ -1,97 +0,0 @@ - -{ - "db_url": "sqlite:///leader.db", - "strategy": "SampleStrategy", - "max_open_trades": 3, - "stake_currency": "USDT", - "stake_amount": 100, - "tradable_balance_ratio": 0.99, - "fiat_display_currency": "USD", - "dry_run": true, - "cancel_open_orders_on_exit": false, - "trading_mode": "spot", - "margin_mode": "", - "unfilledtimeout": { - "entry": 10, - "exit": 10, - "exit_timeout_count": 0, - "unit": "minutes" - }, - "entry_pricing": { - "price_side": "same", - "use_order_book": true, - "order_book_top": 1, - "price_last_balance": 0.0, - "check_depth_of_market": { - "enabled": false, - "bids_to_ask_delta": 1 - } - }, - "exit_pricing":{ - "price_side": "same", - "use_order_book": true, - "order_book_top": 1 - }, - "exchange": { - "name": "kucoin", - "key": "", - "secret": "", - "password": "", - "ccxt_config": {}, - "ccxt_async_config": {}, - "pair_whitelist": [ - ], - "pair_blacklist": [ - ] - }, - "pairlists": [ - { - "method": "VolumePairList", - "number_assets": 20, - "sort_key": "quoteVolume", - "min_value": 0, - "refresh_period": 1800 - } - ], - "edge": { - "enabled": false, - "process_throttle_secs": 3600, - "calculate_since_number_of_days": 7, - "allowed_risk": 0.01, - "stoploss_range_min": -0.01, - "stoploss_range_max": -0.1, - "stoploss_range_step": -0.01, - "minimum_winrate": 0.60, - "minimum_expectancy": 0.20, - "min_trade_number": 10, - "max_trade_duration_minute": 1440, - "remove_pumps": false - }, - "telegram": { - "enabled": false, - "token": "", - "chat_id": "" - }, - "api_server": { - "enabled": true, - "listen_ip_address": "127.0.0.1", - "listen_port": 8080, - "verbosity": "error", - "enable_openapi": false, - "jwt_secret_key": "fcc24d31d6581ad2c90c3fc438c8a8b2ccce1393126959934568707f0bd2d647", - "CORS_origins": [], - "username": "freqtrader", - "password": "testing123" - }, - "external_signal": { - "enabled": true, - "mode": "leader", - "api_token": "testtoken", - }, - "bot_name": "freqtrade", - "initial_state": "running", - "force_entry_enable": false, - "internals": { - "process_throttle_secs": 5, - } -} diff --git a/freqtrade/constants.py b/freqtrade/constants.py index b1f189093..96f8413b0 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -404,6 +404,7 @@ CONF_SCHEMA = { }, 'username': {'type': 'string'}, 'password': {'type': 'string'}, + 'api_token': {'type': 'string'}, 'jwt_secret_key': {'type': 'string'}, 'CORS_origins': {'type': 'array', 'items': {'type': 'string'}}, 'verbosity': {'type': 'string', 'enum': ['error', 'info']}, diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index d5b3ce89c..8e4182b33 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -1,7 +1,8 @@ from enum import Enum -class RPCMessageType(Enum): +# We need to inherit from str so we can use as a str +class RPCMessageType(str, Enum): STATUS = 'status' WARNING = 'warning' STARTUP = 'startup' @@ -19,7 +20,7 @@ class RPCMessageType(Enum): STRATEGY_MSG = 'strategy_msg' - EMIT_DATA = 'emit_data' + WHITELIST = 'whitelist' def __repr__(self): return self.value diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 6aee3d104..c9caaace6 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -17,13 +17,13 @@ from freqtrade.constants import BuySell, LongShort from freqtrade.data.converter import order_book_to_dataframe from freqtrade.data.dataprovider import DataProvider from freqtrade.edge import Edge -from freqtrade.enums import (ExitCheckTuple, ExitType, LeaderMessageType, RPCMessageType, RunMode, - SignalDirection, State, TradingMode) +from freqtrade.enums import (ExitCheckTuple, ExitType, RPCMessageType, RunMode, SignalDirection, + State, TradingMode) from freqtrade.exceptions import (DependencyException, ExchangeError, InsufficientFundsError, InvalidOrderException, PricingError) from freqtrade.exchange import timeframe_to_minutes, timeframe_to_seconds from freqtrade.exchange.exchange import timeframe_to_next_date -from freqtrade.misc import dataframe_to_json, safe_value_fallback, safe_value_fallback2 +from freqtrade.misc import safe_value_fallback, safe_value_fallback2 from freqtrade.mixins import LoggingMixin from freqtrade.persistence import Order, PairLocks, Trade, init_db from freqtrade.plugins.pairlistmanager import PairListManager @@ -75,8 +75,6 @@ class FreqtradeBot(LoggingMixin): PairLocks.timeframe = self.config['timeframe'] - self.external_signal_controller = None - self.pairlists = PairListManager(self.exchange, self.config) # RPC runs in separate threads, can start handling external commands just after @@ -194,28 +192,7 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - if self.external_signal_controller: - if not self.external_signal_controller.is_leader(): - # Run Follower mode analyzing - leader_pairs = self.pairlists._whitelist - self.strategy.analyze_external(self.active_pair_whitelist, leader_pairs) - else: - # We are leader, make sure to pass callback func to emit data - def emit_on_finish(pair, dataframe, timeframe, candle_type): - logger.debug(f"Emitting dataframe for {pair}") - return self.rpc.emit_data( - { - "data_type": LeaderMessageType.analyzed_df, - "data": { - "key": (pair, timeframe, candle_type), - "value": dataframe_to_json(dataframe) - } - } - ) - - self.strategy.analyze(self.active_pair_whitelist, finish_callback=emit_on_finish) - else: - self.strategy.analyze(self.active_pair_whitelist) + self.strategy.analyze(self.active_pair_whitelist) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace @@ -278,15 +255,7 @@ class FreqtradeBot(LoggingMixin): self.pairlists.refresh_pairlist() _whitelist = self.pairlists.whitelist - # If external signal leader, broadcast whitelist data - # Should we broadcast before trade pairs are added? - - if self.external_signal_controller: - if self.external_signal_controller.is_leader(): - self.rpc.emit_data({ - "data_type": LeaderMessageType.pairlist, - "data": _whitelist - }) + self.rpc.send_msg({'type': RPCMessageType.WHITELIST, 'msg': _whitelist}) # Calculating Edge positioning if self.edge: diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index a39e31b85..fd90918e1 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -1,8 +1,10 @@ +import logging import secrets from datetime import datetime, timedelta +from typing import Any, Dict, Union import jwt -from fastapi import APIRouter, Depends, HTTPException, status +from fastapi import APIRouter, Depends, HTTPException, WebSocket, status from fastapi.security import OAuth2PasswordBearer from fastapi.security.http import HTTPBasic, HTTPBasicCredentials @@ -10,6 +12,8 @@ from freqtrade.rpc.api_server.api_schemas import AccessAndRefreshToken, AccessTo from freqtrade.rpc.api_server.deps import get_api_config +logger = logging.getLogger(__name__) + ALGORITHM = "HS256" router_login = APIRouter() @@ -44,6 +48,24 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access"): return username +# This should be reimplemented to better realign with the existing tools provided +# by FastAPI regarding API Tokens +async def get_ws_token( + ws: WebSocket, + token: Union[str, None] = None, + api_config: Dict[str, Any] = Depends(get_api_config) +): + secret_ws_token = api_config['ws_token'] + + if token == secret_ws_token: + # Just return the token if it matches + return token + else: + logger.debug("Denying websocket request") + # If it doesn't match, close the websocket connection + await ws.close(code=status.WS_1008_POLICY_VIOLATION) + + def create_token(data: dict, secret_key: str, token_type: str = "access") -> str: to_encode = data.copy() if token_type == "access": diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py new file mode 100644 index 000000000..464ea22b2 --- /dev/null +++ b/freqtrade/rpc/api_server/api_ws.py @@ -0,0 +1,52 @@ +import logging + +from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect + +from freqtrade.rpc.api_server.deps import get_channel_manager +from freqtrade.rpc.api_server.ws.utils import is_websocket_alive + + +logger = logging.getLogger(__name__) + +# Private router, protected by API Key authentication +router = APIRouter() + + +@router.websocket("/message/ws") +async def message_endpoint( + ws: WebSocket, + channel_manager=Depends(get_channel_manager) +): + try: + if is_websocket_alive(ws): + logger.info(f"Consumer connected - {ws.client}") + + # TODO: + # Return a channel ID, pass that instead of ws to the rest of the methods + channel = await channel_manager.on_connect(ws) + + # Keep connection open until explicitly closed, and sleep + try: + while not channel.is_closed(): + request = await channel.recv() + + # This is where we'd parse the request. For now this should only + # be a list of topics to subscribe too. List[str] + # Maybe allow the consumer to update the topics subscribed + # during runtime? + logger.info(f"Consumer request - {request}") + + except WebSocketDisconnect: + # Handle client disconnects + logger.info(f"Consumer disconnected - {ws.client}") + await channel_manager.on_disconnect(ws) + except Exception as e: + logger.info(f"Consumer connection failed - {ws.client}") + logger.exception(e) + # Handle cases like - + # RuntimeError('Cannot call "send" once a closed message has been sent') + await channel_manager.on_disconnect(ws) + + except Exception: + logger.error(f"Failed to serve - {ws.client}") + await channel_manager.on_disconnect(ws) diff --git a/freqtrade/rpc/api_server/deps.py b/freqtrade/rpc/api_server/deps.py index 66654c0b1..360771d77 100644 --- a/freqtrade/rpc/api_server/deps.py +++ b/freqtrade/rpc/api_server/deps.py @@ -41,6 +41,10 @@ def get_exchange(config=Depends(get_config)): return ApiServer._exchange +def get_channel_manager(): + return ApiServer._channel_manager + + def is_webserver_mode(config=Depends(get_config)): if config['runmode'] != RunMode.WEBSERVER: raise RPCException('Bot is not in the correct state') diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 049e7dbc2..94cb8cd45 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -1,15 +1,20 @@ +import asyncio import logging from ipaddress import IPv4Address +from threading import Thread from typing import Any, Dict import orjson import uvicorn from fastapi import Depends, FastAPI from fastapi.middleware.cors import CORSMiddleware +# Look into alternatives +from janus import Queue as ThreadedQueue from starlette.responses import JSONResponse from freqtrade.exceptions import OperationalException from freqtrade.rpc.api_server.uvicorn_threaded import UvicornServer +from freqtrade.rpc.api_server.ws.channel import ChannelManager from freqtrade.rpc.rpc import RPC, RPCException, RPCHandler @@ -43,6 +48,10 @@ class ApiServer(RPCHandler): _config: Dict[str, Any] = {} # Exchange - only available in webserver mode. _exchange = None + # websocket message queue stuff + _channel_manager = None + _thread = None + _loop = None def __new__(cls, *args, **kwargs): """ @@ -64,10 +73,15 @@ class ApiServer(RPCHandler): return self._standalone: bool = standalone self._server = None + self._queue = None + self._background_task = None + ApiServer.__initialized = True api_config = self._config['api_server'] + ApiServer._channel_manager = ChannelManager() + self.app = FastAPI(title="Freqtrade API", docs_url='/docs' if api_config.get('enable_openapi', False) else None, redoc_url=None, @@ -95,6 +109,18 @@ class ApiServer(RPCHandler): logger.info("Stopping API Server") self._server.cleanup() + if self._thread and self._loop: + logger.info("Stopping API Server background tasks") + + if self._background_task: + # Cancel the queue task + self._background_task.cancel() + + # Finally stop the loop + self._loop.call_soon_threadsafe(self._loop.stop) + + self._thread.join() + @classmethod def shutdown(cls): cls.__initialized = False @@ -104,7 +130,10 @@ class ApiServer(RPCHandler): cls._rpc = None def send_msg(self, msg: Dict[str, str]) -> None: - pass + if self._queue: + logger.info(f"Adding message to queue: {msg}") + sync_q = self._queue.sync_q + sync_q.put(msg) def handle_rpc_exception(self, request, exc): logger.exception(f"API Error calling: {exc}") @@ -114,10 +143,12 @@ class ApiServer(RPCHandler): ) def configure_app(self, app: FastAPI, config): - from freqtrade.rpc.api_server.api_auth import http_basic_or_jwt_token, router_login + from freqtrade.rpc.api_server.api_auth import (get_ws_token, http_basic_or_jwt_token, + router_login) from freqtrade.rpc.api_server.api_backtest import router as api_backtest from freqtrade.rpc.api_server.api_v1 import router as api_v1 from freqtrade.rpc.api_server.api_v1 import router_public as api_v1_public + from freqtrade.rpc.api_server.api_ws import router as ws_router from freqtrade.rpc.api_server.web_ui import router_ui app.include_router(api_v1_public, prefix="/api/v1") @@ -128,6 +159,9 @@ class ApiServer(RPCHandler): app.include_router(api_backtest, prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token)], ) + app.include_router(ws_router, prefix="/api/v1", + dependencies=[Depends(get_ws_token)] + ) app.include_router(router_login, prefix="/api/v1", tags=["auth"]) # UI Router MUST be last! app.include_router(router_ui, prefix='') @@ -142,6 +176,43 @@ class ApiServer(RPCHandler): app.add_exception_handler(RPCException, self.handle_rpc_exception) + def start_message_queue(self): + # Create a new loop, as it'll be just for the background thread + self._loop = asyncio.new_event_loop() + + # Start the thread + if not self._thread: + self._thread = Thread(target=self._loop.run_forever) + self._thread.start() + else: + raise RuntimeError("Threaded loop is already running") + + # Finally, submit the coro to the thread + self._background_task = asyncio.run_coroutine_threadsafe( + self._broadcast_queue_data(), loop=self._loop) + + async def _broadcast_queue_data(self): + # Instantiate the queue in this coroutine so it's attached to our loop + self._queue = ThreadedQueue() + async_queue = self._queue.async_q + + try: + while True: + logger.debug("Getting queue data...") + # Get data from queue + data = await async_queue.get() + logger.debug(f"Found data: {data}") + # Broadcast it + await self._channel_manager.broadcast(data) + # Sleep, make this configurable? + await asyncio.sleep(0.1) + except asyncio.CancelledError: + # Silently stop + pass + # For testing, shouldn't happen when stable + except Exception as e: + logger.info(f"Exception happened in background task: {e}") + def start_api(self): """ Start API ... should be run in thread. @@ -179,6 +250,7 @@ class ApiServer(RPCHandler): if self._standalone: self._server.run() else: + self.start_message_queue() self._server.run_in_thread() except Exception: logger.exception("Api server failed to start.") diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py new file mode 100644 index 000000000..486e8657b --- /dev/null +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -0,0 +1,146 @@ +import logging +from threading import RLock +from typing import Type + +from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy +from freqtrade.rpc.api_server.ws.serializer import ORJSONWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.api_server.ws.types import WebSocketType + + +logger = logging.getLogger(__name__) + + +class WebSocketChannel: + """ + Object to help facilitate managing a websocket connection + """ + + def __init__( + self, + websocket: WebSocketType, + serializer_cls: Type[WebSocketSerializer] = ORJSONWebSocketSerializer + ): + # The WebSocket object + self._websocket = WebSocketProxy(websocket) + # The Serializing class for the WebSocket object + self._serializer_cls = serializer_cls + + # Internal event to signify a closed websocket + self._closed = False + + # Wrap the WebSocket in the Serializing class + self._wrapped_ws = self._serializer_cls(self._websocket) + + async def send(self, data): + """ + Send data on the wrapped websocket + """ + # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") + await self._wrapped_ws.send(data) + + async def recv(self): + """ + Receive data on the wrapped websocket + """ + return await self._wrapped_ws.recv() + + async def ping(self): + """ + Ping the websocket + """ + return await self._websocket.ping() + + async def close(self): + """ + Close the WebSocketChannel + """ + + self._closed = True + + def is_closed(self): + return self._closed + + +class ChannelManager: + def __init__(self): + self.channels = dict() + self._lock = RLock() # Re-entrant Lock + + async def on_connect(self, websocket: WebSocketType): + """ + Wrap websocket connection into Channel and add to list + + :param websocket: The WebSocket object to attach to the Channel + """ + if hasattr(websocket, "accept"): + try: + await websocket.accept() + except RuntimeError: + # The connection was closed before we could accept it + return + + ws_channel = WebSocketChannel(websocket) + + with self._lock: + self.channels[websocket] = ws_channel + + return ws_channel + + async def on_disconnect(self, websocket: WebSocketType): + """ + Call close on the channel if it's not, and remove from channel list + + :param websocket: The WebSocket objet attached to the Channel + """ + with self._lock: + channel = self.channels.get(websocket) + if channel: + logger.debug(f"Disconnecting channel - {channel}") + + if not channel.is_closed(): + await channel.close() + + del self.channels[websocket] + + async def disconnect_all(self): + """ + Disconnect all Channels + """ + with self._lock: + for websocket, channel in self.channels.items(): + if not channel.is_closed(): + await channel.close() + + self.channels = dict() + + async def broadcast(self, data): + """ + Broadcast data on all Channels + + :param data: The data to send + """ + with self._lock: + logger.debug(f"Broadcasting data: {data}") + for websocket, channel in self.channels.items(): + try: + await channel.send(data) + except RuntimeError: + # Handle cannot send after close cases + await self.on_disconnect(websocket) + + async def send_direct(self, channel, data): + """ + Send data directly through direct_channel only + + :param direct_channel: The WebSocketChannel object to send data through + :param data: The data to send + """ + # We iterate over the channels to get reference to the websocket object + # so we can disconnect incase of failure + await channel.send(data) + + def has_channels(self): + """ + Flag for more than 0 channels + """ + return len(self.channels) > 0 diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py new file mode 100644 index 000000000..6acc1d363 --- /dev/null +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -0,0 +1,61 @@ +from typing import Union + +from fastapi import WebSocket as FastAPIWebSocket +from websockets import WebSocketClientProtocol as WebSocket + +from freqtrade.rpc.api_server.ws.types import WebSocketType + + +class WebSocketProxy: + """ + WebSocketProxy object to bring the FastAPIWebSocket and websockets.WebSocketClientProtocol + under the same API + """ + + def __init__(self, websocket: WebSocketType): + self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket + + async def send(self, data): + """ + Send data on the wrapped websocket + """ + if isinstance(data, str): + data = data.encode() + + if hasattr(self._websocket, "send_bytes"): + await self._websocket.send_bytes(data) + else: + await self._websocket.send(data) + + async def recv(self): + """ + Receive data on the wrapped websocket + """ + if hasattr(self._websocket, "receive_bytes"): + return await self._websocket.receive_bytes() + else: + return await self._websocket.recv() + + async def ping(self): + """ + Ping the websocket, not supported by FastAPI WebSockets + """ + if hasattr(self._websocket, "ping"): + return await self._websocket.ping() + return False + + async def close(self, code: int = 1000): + """ + Close the websocket connection, only supported by FastAPI WebSockets + """ + if hasattr(self._websocket, "close"): + return await self._websocket.close(code) + pass + + async def accept(self): + """ + Accept the WebSocket connection, only support by FastAPI WebSockets + """ + if hasattr(self._websocket, "accept"): + return await self._websocket.accept() + pass diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py new file mode 100644 index 000000000..40cbbfad7 --- /dev/null +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -0,0 +1,65 @@ +import json +import logging +from abc import ABC, abstractmethod + +import msgpack +import orjson + +from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy + + +logger = logging.getLogger(__name__) + + +class WebSocketSerializer(ABC): + def __init__(self, websocket: WebSocketProxy): + self._websocket: WebSocketProxy = websocket + + @abstractmethod + def _serialize(self, data): + raise NotImplementedError() + + @abstractmethod + def _deserialize(self, data): + raise NotImplementedError() + + async def send(self, data: bytes): + await self._websocket.send(self._serialize(data)) + + async def recv(self) -> bytes: + data = await self._websocket.recv() + + return self._deserialize(data) + + async def close(self, code: int = 1000): + await self._websocket.close(code) + +# Going to explore using MsgPack as the serialization, +# as that might be the best method for sending pandas +# dataframes over the wire + + +class JSONWebSocketSerializer(WebSocketSerializer): + def _serialize(self, data): + return json.dumps(data) + + def _deserialize(self, data): + return json.loads(data) + + +class ORJSONWebSocketSerializer(WebSocketSerializer): + ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY + + def _serialize(self, data): + return orjson.dumps(data, option=self.ORJSON_OPTIONS) + + def _deserialize(self, data): + return orjson.loads(data, option=self.ORJSON_OPTIONS) + + +class MsgPackWebSocketSerializer(WebSocketSerializer): + def _serialize(self, data): + return msgpack.packb(data, use_bin_type=True) + + def _deserialize(self, data): + return msgpack.unpackb(data, raw=False) diff --git a/freqtrade/rpc/api_server/ws/types.py b/freqtrade/rpc/api_server/ws/types.py new file mode 100644 index 000000000..814fe6649 --- /dev/null +++ b/freqtrade/rpc/api_server/ws/types.py @@ -0,0 +1,8 @@ +from typing import Any, Dict, TypeVar + +from fastapi import WebSocket as FastAPIWebSocket +from websockets import WebSocketClientProtocol as WebSocket + + +WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) +MessageType = Dict[str, Any] diff --git a/freqtrade/rpc/api_server/ws/utils.py b/freqtrade/rpc/api_server/ws/utils.py new file mode 100644 index 000000000..1ceecab88 --- /dev/null +++ b/freqtrade/rpc/api_server/ws/utils.py @@ -0,0 +1,12 @@ +from fastapi import WebSocket +# fastapi does not make this available through it, so import directly from starlette +from starlette.websockets import WebSocketState + + +async def is_websocket_alive(ws: WebSocket) -> bool: + if ( + ws.application_state == WebSocketState.CONNECTED and + ws.client_state == WebSocketState.CONNECTED + ): + return True + return False diff --git a/freqtrade/rpc/external_signal/__init__.py b/freqtrade/rpc/external_signal/__init__.py index c1b05b3f0..decc51551 100644 --- a/freqtrade/rpc/external_signal/__init__.py +++ b/freqtrade/rpc/external_signal/__init__.py @@ -1,5 +1,5 @@ -# flake8: noqa: F401 -from freqtrade.rpc.external_signal.controller import ExternalSignalController - - -__all__ = ('ExternalSignalController') +# # flake8: noqa: F401 +# from freqtrade.rpc.external_signal.controller import ExternalSignalController +# +# +# __all__ = ('ExternalSignalController') diff --git a/freqtrade/rpc/external_signal/channel.py b/freqtrade/rpc/external_signal/channel.py index 4ccb2d864..5b278dfed 100644 --- a/freqtrade/rpc/external_signal/channel.py +++ b/freqtrade/rpc/external_signal/channel.py @@ -1,145 +1,145 @@ -import logging -from threading import RLock -from typing import Type - -from freqtrade.rpc.external_signal.proxy import WebSocketProxy -from freqtrade.rpc.external_signal.serializer import MsgPackWebSocketSerializer, WebSocketSerializer -from freqtrade.rpc.external_signal.types import WebSocketType - - -logger = logging.getLogger(__name__) - - -class WebSocketChannel: - """ - Object to help facilitate managing a websocket connection - """ - - def __init__( - self, - websocket: WebSocketType, - serializer_cls: Type[WebSocketSerializer] = MsgPackWebSocketSerializer - ): - # The WebSocket object - self._websocket = WebSocketProxy(websocket) - # The Serializing class for the WebSocket object - self._serializer_cls = serializer_cls - - # Internal event to signify a closed websocket - self._closed = False - - # Wrap the WebSocket in the Serializing class - self._wrapped_ws = self._serializer_cls(self._websocket) - - async def send(self, data): - """ - Send data on the wrapped websocket - """ - # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") - await self._wrapped_ws.send(data) - - async def recv(self): - """ - Receive data on the wrapped websocket - """ - return await self._wrapped_ws.recv() - - async def ping(self): - """ - Ping the websocket - """ - return await self._websocket.ping() - - async def close(self): - """ - Close the WebSocketChannel - """ - - self._closed = True - - def is_closed(self): - return self._closed - - -class ChannelManager: - def __init__(self): - self.channels = dict() - self._lock = RLock() # Re-entrant Lock - - async def on_connect(self, websocket: WebSocketType): - """ - Wrap websocket connection into Channel and add to list - - :param websocket: The WebSocket object to attach to the Channel - """ - if hasattr(websocket, "accept"): - try: - await websocket.accept() - except RuntimeError: - # The connection was closed before we could accept it - return - - ws_channel = WebSocketChannel(websocket) - - with self._lock: - self.channels[websocket] = ws_channel - - return ws_channel - - async def on_disconnect(self, websocket: WebSocketType): - """ - Call close on the channel if it's not, and remove from channel list - - :param websocket: The WebSocket objet attached to the Channel - """ - with self._lock: - channel = self.channels.get(websocket) - if channel: - logger.debug(f"Disconnecting channel - {channel}") - - if not channel.is_closed(): - await channel.close() - - del self.channels[websocket] - - async def disconnect_all(self): - """ - Disconnect all Channels - """ - with self._lock: - for websocket, channel in self.channels.items(): - if not channel.is_closed(): - await channel.close() - - self.channels = dict() - - async def broadcast(self, data): - """ - Broadcast data on all Channels - - :param data: The data to send - """ - with self._lock: - for websocket, channel in self.channels.items(): - try: - await channel.send(data) - except RuntimeError: - # Handle cannot send after close cases - await self.on_disconnect(websocket) - - async def send_direct(self, channel, data): - """ - Send data directly through direct_channel only - - :param direct_channel: The WebSocketChannel object to send data through - :param data: The data to send - """ - # We iterate over the channels to get reference to the websocket object - # so we can disconnect incase of failure - await channel.send(data) - - def has_channels(self): - """ - Flag for more than 0 channels - """ - return len(self.channels) > 0 +# import logging +# from threading import RLock +# from typing import Type +# +# from freqtrade.rpc.external_signal.proxy import WebSocketProxy +# from freqtrade.rpc.external_signal.serializer import MsgPackWebSocketSerializer +# from freqtrade.rpc.external_signal.types import WebSocketType +# +# +# logger = logging.getLogger(__name__) +# +# +# class WebSocketChannel: +# """ +# Object to help facilitate managing a websocket connection +# """ +# +# def __init__( +# self, +# websocket: WebSocketType, +# serializer_cls: Type[WebSocketSerializer] = MsgPackWebSocketSerializer +# ): +# # The WebSocket object +# self._websocket = WebSocketProxy(websocket) +# # The Serializing class for the WebSocket object +# self._serializer_cls = serializer_cls +# +# # Internal event to signify a closed websocket +# self._closed = False +# +# # Wrap the WebSocket in the Serializing class +# self._wrapped_ws = self._serializer_cls(self._websocket) +# +# async def send(self, data): +# """ +# Send data on the wrapped websocket +# """ +# # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") +# await self._wrapped_ws.send(data) +# +# async def recv(self): +# """ +# Receive data on the wrapped websocket +# """ +# return await self._wrapped_ws.recv() +# +# async def ping(self): +# """ +# Ping the websocket +# """ +# return await self._websocket.ping() +# +# async def close(self): +# """ +# Close the WebSocketChannel +# """ +# +# self._closed = True +# +# def is_closed(self): +# return self._closed +# +# +# class ChannelManager: +# def __init__(self): +# self.channels = dict() +# self._lock = RLock() # Re-entrant Lock +# +# async def on_connect(self, websocket: WebSocketType): +# """ +# Wrap websocket connection into Channel and add to list +# +# :param websocket: The WebSocket object to attach to the Channel +# """ +# if hasattr(websocket, "accept"): +# try: +# await websocket.accept() +# except RuntimeError: +# # The connection was closed before we could accept it +# return +# +# ws_channel = WebSocketChannel(websocket) +# +# with self._lock: +# self.channels[websocket] = ws_channel +# +# return ws_channel +# +# async def on_disconnect(self, websocket: WebSocketType): +# """ +# Call close on the channel if it's not, and remove from channel list +# +# :param websocket: The WebSocket objet attached to the Channel +# """ +# with self._lock: +# channel = self.channels.get(websocket) +# if channel: +# logger.debug(f"Disconnecting channel - {channel}") +# +# if not channel.is_closed(): +# await channel.close() +# +# del self.channels[websocket] +# +# async def disconnect_all(self): +# """ +# Disconnect all Channels +# """ +# with self._lock: +# for websocket, channel in self.channels.items(): +# if not channel.is_closed(): +# await channel.close() +# +# self.channels = dict() +# +# async def broadcast(self, data): +# """ +# Broadcast data on all Channels +# +# :param data: The data to send +# """ +# with self._lock: +# for websocket, channel in self.channels.items(): +# try: +# await channel.send(data) +# except RuntimeError: +# # Handle cannot send after close cases +# await self.on_disconnect(websocket) +# +# async def send_direct(self, channel, data): +# """ +# Send data directly through direct_channel only +# +# :param direct_channel: The WebSocketChannel object to send data through +# :param data: The data to send +# """ +# # We iterate over the channels to get reference to the websocket object +# # so we can disconnect incase of failure +# await channel.send(data) +# +# def has_channels(self): +# """ +# Flag for more than 0 channels +# """ +# return len(self.channels) > 0 diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py index 2b29cde6f..616ea7801 100644 --- a/freqtrade/rpc/external_signal/controller.py +++ b/freqtrade/rpc/external_signal/controller.py @@ -1,449 +1,449 @@ -""" -This module manages replicate mode communication -""" -import asyncio -import logging -import secrets -import socket -from threading import Thread -from typing import Any, Callable, Coroutine, Dict, Union - -import websockets -from fastapi import Depends -from fastapi import WebSocket as FastAPIWebSocket -from fastapi import WebSocketDisconnect, status -from janus import Queue as ThreadedQueue - -from freqtrade.enums import ExternalSignalModeType, LeaderMessageType, RPCMessageType -from freqtrade.rpc import RPC, RPCHandler -from freqtrade.rpc.external_signal.channel import ChannelManager -from freqtrade.rpc.external_signal.types import MessageType -from freqtrade.rpc.external_signal.utils import is_websocket_alive - - -logger = logging.getLogger(__name__) - - -class ExternalSignalController(RPCHandler): - """ This class handles all websocket communication """ - - def __init__( - self, - rpc: RPC, - config: Dict[str, Any], - api_server: Union[Any, None] = None - ) -> None: - """ - Init the ExternalSignalController class, and init the super class RPCHandler - :param rpc: instance of RPC Helper class - :param config: Configuration object - :param api_server: The ApiServer object - :return: None - """ - super().__init__(rpc, config) - - self.freqtrade = rpc._freqtrade - self.api_server = api_server - - if not self.api_server: - raise RuntimeError("The API server must be enabled for external signals to work") - - self._loop = None - self._running = False - self._thread = None - self._queue = None - - self._main_task = None - self._sub_tasks = None - - self._message_handlers = { - LeaderMessageType.pairlist: self._rpc._handle_pairlist_message, - LeaderMessageType.analyzed_df: self._rpc._handle_analyzed_df_message, - LeaderMessageType.default: self._rpc._handle_default_message - } - - self.channel_manager = ChannelManager() - self.external_signal_config = config.get('external_signal', {}) - - # What the config should look like - # "external_signal": { - # "enabled": true, - # "mode": "follower", - # "leaders": [ - # { - # "url": "ws://localhost:8080/signals/ws", - # "api_token": "test" - # } - # ] - # } - - # "external_signal": { - # "enabled": true, - # "mode": "leader", - # "api_token": "test" - # } - - self.mode = ExternalSignalModeType[ - self.external_signal_config.get('mode', 'leader').lower() - ] - - self.leaders_list = self.external_signal_config.get('leaders', []) - self.push_throttle_secs = self.external_signal_config.get('push_throttle_secs', 0.1) - - self.reply_timeout = self.external_signal_config.get('follower_reply_timeout', 10) - self.ping_timeout = self.external_signal_config.get('follower_ping_timeout', 2) - self.sleep_time = self.external_signal_config.get('follower_sleep_time', 5) - - # Validate external_signal_config here? - - if self.mode == ExternalSignalModeType.follower and len(self.leaders_list) == 0: - raise ValueError("You must specify at least 1 leader in follower mode.") - - # This is only used by the leader, the followers use the tokens specified - # in each of the leaders - # If you do not specify an API key in the config, one will be randomly - # generated and logged on startup - default_api_key = secrets.token_urlsafe(16) - self.secret_api_key = self.external_signal_config.get('api_token', default_api_key) - - self.start() - - def is_leader(self): - """ - Leader flag - """ - return self.enabled() and self.mode == ExternalSignalModeType.leader - - def enabled(self): - """ - Enabled flag - """ - return self.external_signal_config.get('enabled', False) - - def num_leaders(self): - """ - The number of leaders we should be connected to - """ - return len(self.leaders_list) - - def start_threaded_loop(self): - """ - Start the main internal loop in another thread to run coroutines - """ - self._loop = asyncio.new_event_loop() - - if not self._thread: - self._thread = Thread(target=self._loop.run_forever) - self._thread.start() - self._running = True - else: - raise RuntimeError("A loop is already running") - - def submit_coroutine(self, coroutine: Coroutine): - """ - Submit a coroutine to the threaded loop - """ - if not self._running: - raise RuntimeError("Cannot schedule new futures after shutdown") - - if not self._loop or not self._loop.is_running(): - raise RuntimeError("Loop must be started before any function can" - " be submitted") - - return asyncio.run_coroutine_threadsafe(coroutine, self._loop) - - def start(self): - """ - Start the controller main loop - """ - self.start_threaded_loop() - self._main_task = self.submit_coroutine(self.main()) - - async def shutdown(self): - """ - Shutdown all tasks and close up - """ - logger.info("Stopping rpc.externalsignalcontroller") - - # Flip running flag - self._running = False - - # Cancel sub tasks - for task in self._sub_tasks: - task.cancel() - - # Then disconnect all channels - await self.channel_manager.disconnect_all() - - def cleanup(self) -> None: - """ - Cleanup pending module resources. - """ - if self._thread: - if self._loop.is_running(): - self._main_task.cancel() - self._thread.join() - - async def main(self): - """ - Main coro - - Start the loop based on what mode we're in - """ - try: - if self.mode == ExternalSignalModeType.leader: - logger.info("Starting rpc.externalsignalcontroller in Leader mode") - - await self.run_leader_mode() - elif self.mode == ExternalSignalModeType.follower: - logger.info("Starting rpc.externalsignalcontroller in Follower mode") - - await self.run_follower_mode() - - except asyncio.CancelledError: - # We're cancelled - await self.shutdown() - except Exception as e: - # Log the error - logger.error(f"Exception occurred in main task: {e}") - logger.exception(e) - finally: - # This coroutine is the last thing to be ended, so it should stop the loop - self._loop.stop() - - def log_api_token(self): - """ - Log the API token - """ - logger.info("-" * 15) - logger.info(f"API_KEY: {self.secret_api_key}") - logger.info("-" * 15) - - def send_msg(self, msg: MessageType) -> None: - """ - Support RPC calls - """ - if msg["type"] == RPCMessageType.EMIT_DATA: - message = msg.get("message") - if message: - self.send_message(message) - else: - logger.error(f"Message is empty! {msg}") - - def send_message(self, msg: MessageType) -> None: - """ - Broadcast message over all channels if there are any - """ - - if self.channel_manager.has_channels(): - self._send_message(msg) - else: - logger.debug("No listening followers, skipping...") - pass - - def _send_message(self, msg: MessageType): - """ - Add data to the internal queue to be broadcasted. This func will block - if the queue is full. This is meant to be called in the main thread. - """ - if self._queue: - queue = self._queue.sync_q - queue.put(msg) # This will block if the queue is full - else: - logger.warning("Can not send data, leader loop has not started yet!") - - async def send_initial_data(self, channel): - logger.info("Sending initial data through channel") - - data = self._rpc._initial_leader_data() - - for message in data: - await channel.send(message) - - async def _handle_leader_message(self, message: MessageType): - """ - Handle message received from a Leader - """ - type = message.get("data_type", LeaderMessageType.default) - data = message.get("data") - - handler: Callable = self._message_handlers[type] - handler(type, data) - - # ---------------------------------------------------------------------- - - async def run_leader_mode(self): - """ - Main leader coroutine - - This starts all of the leader coros and registers the endpoint on - the ApiServer - """ - self.register_leader_endpoint() - self.log_api_token() - - self._sub_tasks = [ - self._loop.create_task(self._broadcast_queue_data()) - ] - - return await asyncio.gather(*self._sub_tasks) - - async def run_follower_mode(self): - """ - Main follower coroutine - - This starts all of the follower connection coros - """ - - rpc_lock = asyncio.Lock() - - self._sub_tasks = [ - self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) - for leader in self.leaders_list - ] - - return await asyncio.gather(*self._sub_tasks) - - async def _broadcast_queue_data(self): - """ - Loop over queue data and broadcast it - """ - # Instantiate the queue in this coroutine so it's attached to our loop - self._queue = ThreadedQueue() - async_queue = self._queue.async_q - - try: - while self._running: - # Get data from queue - data = await async_queue.get() - - # Broadcast it to everyone - await self.channel_manager.broadcast(data) - - # Sleep - await asyncio.sleep(self.push_throttle_secs) - - except asyncio.CancelledError: - # Silently stop - pass - - async def get_api_token( - self, - websocket: FastAPIWebSocket, - token: Union[str, None] = None - ): - """ - Extract the API key from query param. Must match the - set secret_api_key or the websocket connection will be closed. - """ - if token == self.secret_api_key: - return token - else: - logger.info("Denying websocket request...") - await websocket.close(code=status.WS_1008_POLICY_VIOLATION) - - def register_leader_endpoint(self, path: str = "/signals/ws"): - """ - Attach and start the main leader loop to the ApiServer - - :param path: The endpoint path - """ - if not self.api_server: - raise RuntimeError("The leader needs the ApiServer to be active") - - # The endpoint function for running the main leader loop - @self.api_server.app.websocket(path) - async def leader_endpoint( - websocket: FastAPIWebSocket, - api_key: str = Depends(self.get_api_token) - ): - await self.leader_endpoint_loop(websocket) - - async def leader_endpoint_loop(self, websocket: FastAPIWebSocket): - """ - The WebSocket endpoint served by the ApiServer. This handles connections, - and adding them to the channel manager. - """ - try: - if is_websocket_alive(websocket): - logger.info(f"Follower connected - {websocket.client}") - channel = await self.channel_manager.on_connect(websocket) - - # Send initial data here - # Data is being broadcasted right away as soon as startup, - # we may not have to send initial data at all. Further testing - # required. - await self.send_initial_data(channel) - - # Keep connection open until explicitly closed, and sleep - try: - while not channel.is_closed(): - request = await channel.recv() - logger.info(f"Follower request - {request}") - - except WebSocketDisconnect: - # Handle client disconnects - logger.info(f"Follower disconnected - {websocket.client}") - await self.channel_manager.on_disconnect(websocket) - except Exception as e: - logger.info(f"Follower connection failed - {websocket.client}") - logger.exception(e) - # Handle cases like - - # RuntimeError('Cannot call "send" once a closed message has been sent') - await self.channel_manager.on_disconnect(websocket) - - except Exception: - logger.error(f"Failed to serve - {websocket.client}") - await self.channel_manager.on_disconnect(websocket) - - async def _handle_leader_connection(self, leader, lock): - """ - Given a leader, connect and wait on data. If connection is lost, - it will attempt to reconnect. - """ - try: - url, token = leader["url"], leader["api_token"] - websocket_url = f"{url}?token={token}" - - logger.info(f"Attempting to connect to Leader at: {url}") - while True: - try: - async with websockets.connect(websocket_url) as ws: - channel = await self.channel_manager.on_connect(ws) - logger.info(f"Connection to Leader at {url} successful") - while True: - try: - data = await asyncio.wait_for( - channel.recv(), - timeout=self.reply_timeout - ) - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): - # We haven't received data yet. Check the connection and continue. - try: - # ping - ping = await channel.ping() - await asyncio.wait_for(ping, timeout=self.ping_timeout) - logger.debug(f"Connection to {url} still alive...") - continue - except Exception: - logger.info( - f"Ping error {url} - retrying in {self.sleep_time}s") - asyncio.sleep(self.sleep_time) - break - - async with lock: - # Acquire lock so only 1 coro handling at a time - # as we call the RPC module in the main thread - await self._handle_leader_message(data) - - except (socket.gaierror, ConnectionRefusedError): - logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - continue - except websockets.exceptions.InvalidStatusCode as e: - logger.error(f"Connection Refused - {e}") - await asyncio.sleep(self.sleep_time) - continue - - except asyncio.CancelledError: - pass +# """ +# This module manages replicate mode communication +# """ +# import asyncio +# import logging +# import secrets +# import socket +# from threading import Thread +# from typing import Any, Callable, Coroutine, Dict, Union +# +# import websockets +# from fastapi import Depends +# from fastapi import WebSocket as FastAPIWebSocket +# from fastapi import WebSocketDisconnect, status +# from janus import Queue as ThreadedQueue +# +# from freqtrade.enums import ExternalSignalModeType, LeaderMessageType, RPCMessageType +# from freqtrade.rpc import RPC, RPCHandler +# from freqtrade.rpc.external_signal.channel import ChannelManager +# from freqtrade.rpc.external_signal.types import MessageType +# from freqtrade.rpc.external_signal.utils import is_websocket_alive +# +# +# logger = logging.getLogger(__name__) +# +# +# class ExternalSignalController(RPCHandler): +# """ This class handles all websocket communication """ +# +# def __init__( +# self, +# rpc: RPC, +# config: Dict[str, Any], +# api_server: Union[Any, None] = None +# ) -> None: +# """ +# Init the ExternalSignalController class, and init the super class RPCHandler +# :param rpc: instance of RPC Helper class +# :param config: Configuration object +# :param api_server: The ApiServer object +# :return: None +# """ +# super().__init__(rpc, config) +# +# self.freqtrade = rpc._freqtrade +# self.api_server = api_server +# +# if not self.api_server: +# raise RuntimeError("The API server must be enabled for external signals to work") +# +# self._loop = None +# self._running = False +# self._thread = None +# self._queue = None +# +# self._main_task = None +# self._sub_tasks = None +# +# self._message_handlers = { +# LeaderMessageType.pairlist: self._rpc._handle_pairlist_message, +# LeaderMessageType.analyzed_df: self._rpc._handle_analyzed_df_message, +# LeaderMessageType.default: self._rpc._handle_default_message +# } +# +# self.channel_manager = ChannelManager() +# self.external_signal_config = config.get('external_signal', {}) +# +# # What the config should look like +# # "external_signal": { +# # "enabled": true, +# # "mode": "follower", +# # "leaders": [ +# # { +# # "url": "ws://localhost:8080/signals/ws", +# # "api_token": "test" +# # } +# # ] +# # } +# +# # "external_signal": { +# # "enabled": true, +# # "mode": "leader", +# # "api_token": "test" +# # } +# +# self.mode = ExternalSignalModeType[ +# self.external_signal_config.get('mode', 'leader').lower() +# ] +# +# self.leaders_list = self.external_signal_config.get('leaders', []) +# self.push_throttle_secs = self.external_signal_config.get('push_throttle_secs', 0.1) +# +# self.reply_timeout = self.external_signal_config.get('follower_reply_timeout', 10) +# self.ping_timeout = self.external_signal_config.get('follower_ping_timeout', 2) +# self.sleep_time = self.external_signal_config.get('follower_sleep_time', 5) +# +# # Validate external_signal_config here? +# +# if self.mode == ExternalSignalModeType.follower and len(self.leaders_list) == 0: +# raise ValueError("You must specify at least 1 leader in follower mode.") +# +# # This is only used by the leader, the followers use the tokens specified +# # in each of the leaders +# # If you do not specify an API key in the config, one will be randomly +# # generated and logged on startup +# default_api_key = secrets.token_urlsafe(16) +# self.secret_api_key = self.external_signal_config.get('api_token', default_api_key) +# +# self.start() +# +# def is_leader(self): +# """ +# Leader flag +# """ +# return self.enabled() and self.mode == ExternalSignalModeType.leader +# +# def enabled(self): +# """ +# Enabled flag +# """ +# return self.external_signal_config.get('enabled', False) +# +# def num_leaders(self): +# """ +# The number of leaders we should be connected to +# """ +# return len(self.leaders_list) +# +# def start_threaded_loop(self): +# """ +# Start the main internal loop in another thread to run coroutines +# """ +# self._loop = asyncio.new_event_loop() +# +# if not self._thread: +# self._thread = Thread(target=self._loop.run_forever) +# self._thread.start() +# self._running = True +# else: +# raise RuntimeError("A loop is already running") +# +# def submit_coroutine(self, coroutine: Coroutine): +# """ +# Submit a coroutine to the threaded loop +# """ +# if not self._running: +# raise RuntimeError("Cannot schedule new futures after shutdown") +# +# if not self._loop or not self._loop.is_running(): +# raise RuntimeError("Loop must be started before any function can" +# " be submitted") +# +# return asyncio.run_coroutine_threadsafe(coroutine, self._loop) +# +# def start(self): +# """ +# Start the controller main loop +# """ +# self.start_threaded_loop() +# self._main_task = self.submit_coroutine(self.main()) +# +# async def shutdown(self): +# """ +# Shutdown all tasks and close up +# """ +# logger.info("Stopping rpc.externalsignalcontroller") +# +# # Flip running flag +# self._running = False +# +# # Cancel sub tasks +# for task in self._sub_tasks: +# task.cancel() +# +# # Then disconnect all channels +# await self.channel_manager.disconnect_all() +# +# def cleanup(self) -> None: +# """ +# Cleanup pending module resources. +# """ +# if self._thread: +# if self._loop.is_running(): +# self._main_task.cancel() +# self._thread.join() +# +# async def main(self): +# """ +# Main coro +# +# Start the loop based on what mode we're in +# """ +# try: +# if self.mode == ExternalSignalModeType.leader: +# logger.info("Starting rpc.externalsignalcontroller in Leader mode") +# +# await self.run_leader_mode() +# elif self.mode == ExternalSignalModeType.follower: +# logger.info("Starting rpc.externalsignalcontroller in Follower mode") +# +# await self.run_follower_mode() +# +# except asyncio.CancelledError: +# # We're cancelled +# await self.shutdown() +# except Exception as e: +# # Log the error +# logger.error(f"Exception occurred in main task: {e}") +# logger.exception(e) +# finally: +# # This coroutine is the last thing to be ended, so it should stop the loop +# self._loop.stop() +# +# def log_api_token(self): +# """ +# Log the API token +# """ +# logger.info("-" * 15) +# logger.info(f"API_KEY: {self.secret_api_key}") +# logger.info("-" * 15) +# +# def send_msg(self, msg: MessageType) -> None: +# """ +# Support RPC calls +# """ +# if msg["type"] == RPCMessageType.EMIT_DATA: +# message = msg.get("message") +# if message: +# self.send_message(message) +# else: +# logger.error(f"Message is empty! {msg}") +# +# def send_message(self, msg: MessageType) -> None: +# """ +# Broadcast message over all channels if there are any +# """ +# +# if self.channel_manager.has_channels(): +# self._send_message(msg) +# else: +# logger.debug("No listening followers, skipping...") +# pass +# +# def _send_message(self, msg: MessageType): +# """ +# Add data to the internal queue to be broadcasted. This func will block +# if the queue is full. This is meant to be called in the main thread. +# """ +# if self._queue: +# queue = self._queue.sync_q +# queue.put(msg) # This will block if the queue is full +# else: +# logger.warning("Can not send data, leader loop has not started yet!") +# +# async def send_initial_data(self, channel): +# logger.info("Sending initial data through channel") +# +# data = self._rpc._initial_leader_data() +# +# for message in data: +# await channel.send(message) +# +# async def _handle_leader_message(self, message: MessageType): +# """ +# Handle message received from a Leader +# """ +# type = message.get("data_type", LeaderMessageType.default) +# data = message.get("data") +# +# handler: Callable = self._message_handlers[type] +# handler(type, data) +# +# # ---------------------------------------------------------------------- +# +# async def run_leader_mode(self): +# """ +# Main leader coroutine +# +# This starts all of the leader coros and registers the endpoint on +# the ApiServer +# """ +# self.register_leader_endpoint() +# self.log_api_token() +# +# self._sub_tasks = [ +# self._loop.create_task(self._broadcast_queue_data()) +# ] +# +# return await asyncio.gather(*self._sub_tasks) +# +# async def run_follower_mode(self): +# """ +# Main follower coroutine +# +# This starts all of the follower connection coros +# """ +# +# rpc_lock = asyncio.Lock() +# +# self._sub_tasks = [ +# self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) +# for leader in self.leaders_list +# ] +# +# return await asyncio.gather(*self._sub_tasks) +# +# async def _broadcast_queue_data(self): +# """ +# Loop over queue data and broadcast it +# """ +# # Instantiate the queue in this coroutine so it's attached to our loop +# self._queue = ThreadedQueue() +# async_queue = self._queue.async_q +# +# try: +# while self._running: +# # Get data from queue +# data = await async_queue.get() +# +# # Broadcast it to everyone +# await self.channel_manager.broadcast(data) +# +# # Sleep +# await asyncio.sleep(self.push_throttle_secs) +# +# except asyncio.CancelledError: +# # Silently stop +# pass +# +# async def get_api_token( +# self, +# websocket: FastAPIWebSocket, +# token: Union[str, None] = None +# ): +# """ +# Extract the API key from query param. Must match the +# set secret_api_key or the websocket connection will be closed. +# """ +# if token == self.secret_api_key: +# return token +# else: +# logger.info("Denying websocket request...") +# await websocket.close(code=status.WS_1008_POLICY_VIOLATION) +# +# def register_leader_endpoint(self, path: str = "/signals/ws"): +# """ +# Attach and start the main leader loop to the ApiServer +# +# :param path: The endpoint path +# """ +# if not self.api_server: +# raise RuntimeError("The leader needs the ApiServer to be active") +# +# # The endpoint function for running the main leader loop +# @self.api_server.app.websocket(path) +# async def leader_endpoint( +# websocket: FastAPIWebSocket, +# api_key: str = Depends(self.get_api_token) +# ): +# await self.leader_endpoint_loop(websocket) +# +# async def leader_endpoint_loop(self, websocket: FastAPIWebSocket): +# """ +# The WebSocket endpoint served by the ApiServer. This handles connections, +# and adding them to the channel manager. +# """ +# try: +# if is_websocket_alive(websocket): +# logger.info(f"Follower connected - {websocket.client}") +# channel = await self.channel_manager.on_connect(websocket) +# +# # Send initial data here +# # Data is being broadcasted right away as soon as startup, +# # we may not have to send initial data at all. Further testing +# # required. +# await self.send_initial_data(channel) +# +# # Keep connection open until explicitly closed, and sleep +# try: +# while not channel.is_closed(): +# request = await channel.recv() +# logger.info(f"Follower request - {request}") +# +# except WebSocketDisconnect: +# # Handle client disconnects +# logger.info(f"Follower disconnected - {websocket.client}") +# await self.channel_manager.on_disconnect(websocket) +# except Exception as e: +# logger.info(f"Follower connection failed - {websocket.client}") +# logger.exception(e) +# # Handle cases like - +# # RuntimeError('Cannot call "send" once a closed message has been sent') +# await self.channel_manager.on_disconnect(websocket) +# +# except Exception: +# logger.error(f"Failed to serve - {websocket.client}") +# await self.channel_manager.on_disconnect(websocket) +# +# async def _handle_leader_connection(self, leader, lock): +# """ +# Given a leader, connect and wait on data. If connection is lost, +# it will attempt to reconnect. +# """ +# try: +# url, token = leader["url"], leader["api_token"] +# websocket_url = f"{url}?token={token}" +# +# logger.info(f"Attempting to connect to Leader at: {url}") +# while True: +# try: +# async with websockets.connect(websocket_url) as ws: +# channel = await self.channel_manager.on_connect(ws) +# logger.info(f"Connection to Leader at {url} successful") +# while True: +# try: +# data = await asyncio.wait_for( +# channel.recv(), +# timeout=self.reply_timeout +# ) +# except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): +# # We haven't received data yet. Check the connection and continue. +# try: +# # ping +# ping = await channel.ping() +# await asyncio.wait_for(ping, timeout=self.ping_timeout) +# logger.debug(f"Connection to {url} still alive...") +# continue +# except Exception: +# logger.info( +# f"Ping error {url} - retrying in {self.sleep_time}s") +# asyncio.sleep(self.sleep_time) +# break +# +# async with lock: +# # Acquire lock so only 1 coro handling at a time +# # as we call the RPC module in the main thread +# await self._handle_leader_message(data) +# +# except (socket.gaierror, ConnectionRefusedError): +# logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") +# await asyncio.sleep(self.sleep_time) +# continue +# except websockets.exceptions.InvalidStatusCode as e: +# logger.error(f"Connection Refused - {e}") +# await asyncio.sleep(self.sleep_time) +# continue +# +# except asyncio.CancelledError: +# pass diff --git a/freqtrade/rpc/external_signal/proxy.py b/freqtrade/rpc/external_signal/proxy.py index 36ff4a74e..df2a07da0 100644 --- a/freqtrade/rpc/external_signal/proxy.py +++ b/freqtrade/rpc/external_signal/proxy.py @@ -1,61 +1,61 @@ -from typing import Union - -from fastapi import WebSocket as FastAPIWebSocket -from websockets import WebSocketClientProtocol as WebSocket - -from freqtrade.rpc.external_signal.types import WebSocketType - - -class WebSocketProxy: - """ - WebSocketProxy object to bring the FastAPIWebSocket and websockets.WebSocketClientProtocol - under the same API - """ - - def __init__(self, websocket: WebSocketType): - self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket - - async def send(self, data): - """ - Send data on the wrapped websocket - """ - if isinstance(data, str): - data = data.encode() - - if hasattr(self._websocket, "send_bytes"): - await self._websocket.send_bytes(data) - else: - await self._websocket.send(data) - - async def recv(self): - """ - Receive data on the wrapped websocket - """ - if hasattr(self._websocket, "receive_bytes"): - return await self._websocket.receive_bytes() - else: - return await self._websocket.recv() - - async def ping(self): - """ - Ping the websocket, not supported by FastAPI WebSockets - """ - if hasattr(self._websocket, "ping"): - return await self._websocket.ping() - return False - - async def close(self, code: int = 1000): - """ - Close the websocket connection, only supported by FastAPI WebSockets - """ - if hasattr(self._websocket, "close"): - return await self._websocket.close(code) - pass - - async def accept(self): - """ - Accept the WebSocket connection, only support by FastAPI WebSockets - """ - if hasattr(self._websocket, "accept"): - return await self._websocket.accept() - pass +# from typing import Union +# +# from fastapi import WebSocket as FastAPIWebSocket +# from websockets import WebSocketClientProtocol as WebSocket +# +# from freqtrade.rpc.external_signal.types import WebSocketType +# +# +# class WebSocketProxy: +# """ +# WebSocketProxy object to bring the FastAPIWebSocket and websockets.WebSocketClientProtocol +# under the same API +# """ +# +# def __init__(self, websocket: WebSocketType): +# self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket +# +# async def send(self, data): +# """ +# Send data on the wrapped websocket +# """ +# if isinstance(data, str): +# data = data.encode() +# +# if hasattr(self._websocket, "send_bytes"): +# await self._websocket.send_bytes(data) +# else: +# await self._websocket.send(data) +# +# async def recv(self): +# """ +# Receive data on the wrapped websocket +# """ +# if hasattr(self._websocket, "receive_bytes"): +# return await self._websocket.receive_bytes() +# else: +# return await self._websocket.recv() +# +# async def ping(self): +# """ +# Ping the websocket, not supported by FastAPI WebSockets +# """ +# if hasattr(self._websocket, "ping"): +# return await self._websocket.ping() +# return False +# +# async def close(self, code: int = 1000): +# """ +# Close the websocket connection, only supported by FastAPI WebSockets +# """ +# if hasattr(self._websocket, "close"): +# return await self._websocket.close(code) +# pass +# +# async def accept(self): +# """ +# Accept the WebSocket connection, only support by FastAPI WebSockets +# """ +# if hasattr(self._websocket, "accept"): +# return await self._websocket.accept() +# pass diff --git a/freqtrade/rpc/external_signal/serializer.py b/freqtrade/rpc/external_signal/serializer.py index 2a0f53037..a23469ef4 100644 --- a/freqtrade/rpc/external_signal/serializer.py +++ b/freqtrade/rpc/external_signal/serializer.py @@ -1,65 +1,65 @@ -import json -import logging -from abc import ABC, abstractmethod - -import msgpack -import orjson - -from freqtrade.rpc.external_signal.proxy import WebSocketProxy - - -logger = logging.getLogger(__name__) - - -class WebSocketSerializer(ABC): - def __init__(self, websocket: WebSocketProxy): - self._websocket: WebSocketProxy = websocket - - @abstractmethod - def _serialize(self, data): - raise NotImplementedError() - - @abstractmethod - def _deserialize(self, data): - raise NotImplementedError() - - async def send(self, data: bytes): - await self._websocket.send(self._serialize(data)) - - async def recv(self) -> bytes: - data = await self._websocket.recv() - - return self._deserialize(data) - - async def close(self, code: int = 1000): - await self._websocket.close(code) - -# Going to explore using MsgPack as the serialization, -# as that might be the best method for sending pandas -# dataframes over the wire - - -class JSONWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data): - return json.dumps(data) - - def _deserialize(self, data): - return json.loads(data) - - -class ORJSONWebSocketSerializer(WebSocketSerializer): - ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY - - def _serialize(self, data): - return orjson.dumps(data, option=self.ORJSON_OPTIONS) - - def _deserialize(self, data): - return orjson.loads(data, option=self.ORJSON_OPTIONS) - - -class MsgPackWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data): - return msgpack.packb(data, use_bin_type=True) - - def _deserialize(self, data): - return msgpack.unpackb(data, raw=False) +# import json +# import logging +# from abc import ABC, abstractmethod +# +# import msgpack +# import orjson +# +# from freqtrade.rpc.external_signal.proxy import WebSocketProxy +# +# +# logger = logging.getLogger(__name__) +# +# +# class WebSocketSerializer(ABC): +# def __init__(self, websocket: WebSocketProxy): +# self._websocket: WebSocketProxy = websocket +# +# @abstractmethod +# def _serialize(self, data): +# raise NotImplementedError() +# +# @abstractmethod +# def _deserialize(self, data): +# raise NotImplementedError() +# +# async def send(self, data: bytes): +# await self._websocket.send(self._serialize(data)) +# +# async def recv(self) -> bytes: +# data = await self._websocket.recv() +# +# return self._deserialize(data) +# +# async def close(self, code: int = 1000): +# await self._websocket.close(code) +# +# # Going to explore using MsgPack as the serialization, +# # as that might be the best method for sending pandas +# # dataframes over the wire +# +# +# class JSONWebSocketSerializer(WebSocketSerializer): +# def _serialize(self, data): +# return json.dumps(data) +# +# def _deserialize(self, data): +# return json.loads(data) +# +# +# class ORJSONWebSocketSerializer(WebSocketSerializer): +# ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY +# +# def _serialize(self, data): +# return orjson.dumps(data, option=self.ORJSON_OPTIONS) +# +# def _deserialize(self, data): +# return orjson.loads(data, option=self.ORJSON_OPTIONS) +# +# +# class MsgPackWebSocketSerializer(WebSocketSerializer): +# def _serialize(self, data): +# return msgpack.packb(data, use_bin_type=True) +# +# def _deserialize(self, data): +# return msgpack.unpackb(data, raw=False) diff --git a/freqtrade/rpc/external_signal/types.py b/freqtrade/rpc/external_signal/types.py index 814fe6649..38e43f667 100644 --- a/freqtrade/rpc/external_signal/types.py +++ b/freqtrade/rpc/external_signal/types.py @@ -1,8 +1,8 @@ -from typing import Any, Dict, TypeVar - -from fastapi import WebSocket as FastAPIWebSocket -from websockets import WebSocketClientProtocol as WebSocket - - -WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) -MessageType = Dict[str, Any] +# from typing import Any, Dict, TypeVar +# +# from fastapi import WebSocket as FastAPIWebSocket +# from websockets import WebSocketClientProtocol as WebSocket +# +# +# WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) +# MessageType = Dict[str, Any] diff --git a/freqtrade/rpc/external_signal/utils.py b/freqtrade/rpc/external_signal/utils.py index e5469dce3..72c8d2ef8 100644 --- a/freqtrade/rpc/external_signal/utils.py +++ b/freqtrade/rpc/external_signal/utils.py @@ -1,22 +1,10 @@ -from pandas import DataFrame -from starlette.websockets import WebSocket, WebSocketState - -from freqtrade.enums.signaltype import SignalTagType, SignalType - - -async def is_websocket_alive(ws: WebSocket) -> bool: - if ( - ws.application_state == WebSocketState.CONNECTED and - ws.client_state == WebSocketState.CONNECTED - ): - return True - return False - - -def remove_entry_exit_signals(dataframe: DataFrame): - dataframe[SignalType.ENTER_LONG.value] = 0 - dataframe[SignalType.EXIT_LONG.value] = 0 - dataframe[SignalType.ENTER_SHORT.value] = 0 - dataframe[SignalType.EXIT_SHORT.value] = 0 - dataframe[SignalTagType.ENTER_TAG.value] = None - dataframe[SignalTagType.EXIT_TAG.value] = None +# from starlette.websockets import WebSocket, WebSocketState +# +# +# async def is_websocket_alive(ws: WebSocket) -> bool: +# if ( +# ws.application_state == WebSocketState.CONNECTED and +# ws.client_state == WebSocketState.CONNECTED +# ): +# return True +# return False diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 82d50f33c..3c7558158 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -19,13 +19,12 @@ from freqtrade.configuration.timerange import TimeRange from freqtrade.constants import CANCEL_REASON, DATETIME_PRINT_FORMAT from freqtrade.data.history import load_data from freqtrade.data.metrics import calculate_max_drawdown -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, LeaderMessageType, - SignalDirection, State, TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, State, + TradingMode) from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler -from freqtrade.misc import (decimals_per_coin, json_to_dataframe, remove_entry_exit_signals, - shorten_date) +from freqtrade.misc import decimals_per_coin, shorten_date from freqtrade.persistence import PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -1090,65 +1089,65 @@ class RPC: 'last_process_loc': last_p.astimezone(tzlocal()).strftime(DATETIME_PRINT_FORMAT), 'last_process_ts': int(last_p.timestamp()), } - - # ------------------------------ EXTERNAL SIGNALS ----------------------- - - def _initial_leader_data(self): - # We create a list of Messages to send to the follower on connect - data = [] - - # Send Pairlist data - data.append({ - "data_type": LeaderMessageType.pairlist, - "data": self._freqtrade.pairlists._whitelist - }) - - return data - - def _handle_pairlist_message(self, type, data): - """ - Handles the emitted pairlists from the Leaders - - :param type: The data_type of the data - :param data: The data - """ - pairlist = data - - logger.debug(f"Handling Pairlist message: {pairlist}") - - external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] - external_pairlist.add_pairlist_data(pairlist) - - def _handle_analyzed_df_message(self, type, data): - """ - Handles the analyzed dataframes from the Leaders - - :param type: The data_type of the data - :param data: The data - """ - key, value = data["key"], data["value"] - pair, timeframe, candle_type = key - - # Skip any pairs that we don't have in the pairlist? - # leader_pairlist = self._freqtrade.pairlists._whitelist - # if pair not in leader_pairlist: - # return - - dataframe = json_to_dataframe(value) - - if self._config.get('external_signal', {}).get('remove_signals_analyzed_df', False): - dataframe = remove_entry_exit_signals(dataframe) - - logger.debug(f"Handling analyzed dataframe for {pair}") - logger.debug(dataframe.tail()) - - # Add the dataframe to the dataprovider - dataprovider = self._freqtrade.dataprovider - dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) - - def _handle_default_message(self, type, data): - """ - Default leader message handler, just logs it. We should never have to - run this unless the leader sends us some weird message. - """ - logger.debug(f"Received message from Leader of type {type}: {data}") + # + # # ------------------------------ EXTERNAL SIGNALS ----------------------- + # + # def _initial_leader_data(self): + # # We create a list of Messages to send to the follower on connect + # data = [] + # + # # Send Pairlist data + # data.append({ + # "data_type": LeaderMessageType.pairlist, + # "data": self._freqtrade.pairlists._whitelist + # }) + # + # return data + # + # def _handle_pairlist_message(self, type, data): + # """ + # Handles the emitted pairlists from the Leaders + # + # :param type: The data_type of the data + # :param data: The data + # """ + # pairlist = data + # + # logger.debug(f"Handling Pairlist message: {pairlist}") + # + # external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] + # external_pairlist.add_pairlist_data(pairlist) + # + # def _handle_analyzed_df_message(self, type, data): + # """ + # Handles the analyzed dataframes from the Leaders + # + # :param type: The data_type of the data + # :param data: The data + # """ + # key, value = data["key"], data["value"] + # pair, timeframe, candle_type = key + # + # # Skip any pairs that we don't have in the pairlist? + # # leader_pairlist = self._freqtrade.pairlists._whitelist + # # if pair not in leader_pairlist: + # # return + # + # dataframe = json_to_dataframe(value) + # + # if self._config.get('external_signal', {}).get('remove_signals_analyzed_df', False): + # dataframe = remove_entry_exit_signals(dataframe) + # + # logger.debug(f"Handling analyzed dataframe for {pair}") + # logger.debug(dataframe.tail()) + # + # # Add the dataframe to the dataprovider + # dataprovider = self._freqtrade.dataprovider + # dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) + # + # def _handle_default_message(self, type, data): + # """ + # Default leader message handler, just logs it. We should never have to + # run this unless the leader sends us some weird message. + # """ + # logger.debug(f"Received message from Leader of type {type}: {data}") diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 11e21da6f..c5e93e3b4 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -51,14 +51,14 @@ class RPCManager: # Enable External Signals mode # For this to be enabled, the API server must also be enabled - if config.get('external_signal', {}).get('enabled', False): - logger.info('Enabling RPC.ExternalSignalController') - from freqtrade.rpc.external_signal import ExternalSignalController - external_signals = ExternalSignalController(self._rpc, config, apiserver) - self.registered_modules.append(external_signals) - - # Attach the controller to FreqTrade - freqtrade.external_signal_controller = external_signals + # if config.get('external_signal', {}).get('enabled', False): + # logger.info('Enabling RPC.ExternalSignalController') + # from freqtrade.rpc.external_signal import ExternalSignalController + # external_signals = ExternalSignalController(self._rpc, config, apiserver) + # self.registered_modules.append(external_signals) + # + # # Attach the controller to FreqTrade + # freqtrade.external_signal_controller = external_signals def cleanup(self) -> None: """ Stops all enabled rpc modules """ @@ -78,8 +78,7 @@ class RPCManager: 'status': 'stopping bot' } """ - if msg.get("type") != RPCMessageType.EMIT_DATA: - logger.info('Sending rpc message: %s', msg) + logger.info('Sending rpc message: %s', msg) if 'pair' in msg: msg.update({ 'base_currency': self._rpc._freqtrade.exchange.get_pair_base_currency(msg['pair']) @@ -138,12 +137,3 @@ class RPCManager: 'type': RPCMessageType.STARTUP, 'status': f'Using Protections: \n{prots}' }) - - def emit_data(self, data: Dict[str, Any]): - """ - Send a message via RPC with type RPCMessageType.EMIT_DATA - """ - self.send_msg({ - "type": RPCMessageType.EMIT_DATA, - "message": data - }) diff --git a/scripts/test_ws_client.py b/scripts/test_ws_client.py new file mode 100644 index 000000000..caa495a19 --- /dev/null +++ b/scripts/test_ws_client.py @@ -0,0 +1,58 @@ +import asyncio +import logging +import socket + +import websockets + + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + + +async def _client(): + try: + while True: + try: + url = "ws://localhost:8080/api/v1/message/ws?token=testtoken" + async with websockets.connect(url) as ws: + logger.info("Connection successful") + while True: + try: + data = await asyncio.wait_for( + ws.recv(), + timeout=5 + ) + logger.info(f"Data received - {data}") + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Check the connection and continue. + try: + # ping + ping = await ws.ping() + await asyncio.wait_for(ping, timeout=2) + logger.debug(f"Connection to {url} still alive...") + continue + except Exception: + logger.info( + f"Ping error {url} - retrying in 5s") + asyncio.sleep(2) + break + + except (socket.gaierror, ConnectionRefusedError): + logger.info("Connection Refused - retrying connection in 5s") + await asyncio.sleep(2) + continue + except websockets.exceptions.InvalidStatusCode as e: + logger.error(f"Connection Refused - {e}") + await asyncio.sleep(2) + continue + + except (asyncio.CancelledError, KeyboardInterrupt): + pass + + +def main(): + asyncio.run(_client()) + + +if __name__ == "__main__": + main() From 71846ecbf22188396ab9275b4da8cda4fa345a86 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 29 Aug 2022 21:51:10 +0200 Subject: [PATCH 045/437] Partially revert prior commit, use correct exchange class --- tests/exchange/test_exchange.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 51890de79..800aa5381 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -5023,7 +5023,7 @@ def test_get_liquidation_price1(mocker, default_conf): ) -@pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) +@pytest.mark.parametrize('liquidation_buffer', [0.0, 0.05]) @pytest.mark.parametrize( "is_short,trading_mode,exchange_name,margin_mode,leverage,open_rate,amount,expected_liq", [ (False, 'spot', 'binance', '', 5.0, 10.0, 1.0, None), @@ -5043,17 +5043,15 @@ def test_get_liquidation_price1(mocker, default_conf): (False, 'futures', 'binance', 'isolated', 3, 10, 1.0, 6.723905723905723), (False, 'futures', 'binance', 'isolated', 5, 10, 0.6, 8.063973063973064), # Gateio/okx, short - (True, 'futures', 'gateio', 'isolated', 5, 10, 1.0, 11.89108910891089), - (True, 'futures', 'gateio', 'isolated', 5, 10, 2.0, 11.886138613861386), - (True, 'futures', 'gateio', 'isolated', 3, 10, 1.0, 13.211221122112212), - (True, 'futures', 'gateio', 'isolated', 5, 8, 1.0, 9.514851485148514), + (True, 'futures', 'gateio', 'isolated', 5, 10, 1.0, 11.87413417771621), + (True, 'futures', 'gateio', 'isolated', 5, 10, 2.0, 11.87413417771621), + (True, 'futures', 'gateio', 'isolated', 3, 10, 1.0, 13.193482419684678), + (True, 'futures', 'gateio', 'isolated', 5, 8, 1.0, 9.499307342172967), + (True, 'futures', 'okx', 'isolated', 3, 10, 1.0, 13.193482419684678), # Gateio/okx, long - (False, 'futures', 'gateio', 'isolated', 5.0, 10.0, 1.0, 8.070707070707071), - (False, 'futures', 'gateio', 'isolated', 3.0, 10.0, 1.0, 6.723905723905723), - (True, 'futures', 'okx', 'isolated', 5, 8, 1.0, 9.514851485148514), - (False, 'futures', 'okx', 'isolated', 3.0, 10.0, 1.0, 6.723905723905723), - # (True, 'futures', 'okx', 'isolated', 11.87413417771621), - # (False, 'futures', 'okx', 'isolated', 8.085708510208207), + (False, 'futures', 'gateio', 'isolated', 5.0, 10.0, 1.0, 8.085708510208207), + (False, 'futures', 'gateio', 'isolated', 3.0, 10.0, 1.0, 6.738090425173506), + (False, 'futures', 'okx', 'isolated', 3.0, 10.0, 1.0, 6.738090425173506), ] ) def test_get_liquidation_price( @@ -5126,7 +5124,7 @@ def test_get_liquidation_price( default_conf_usdt['exchange']['name'] = exchange_name default_conf_usdt['margin_mode'] = margin_mode mocker.patch('freqtrade.exchange.Gateio.validate_ordertypes') - exchange = get_patched_exchange(mocker, default_conf_usdt) + exchange = get_patched_exchange(mocker, default_conf_usdt, id=exchange_name) exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(0.01, 0.01)) exchange.name = exchange_name @@ -5137,8 +5135,8 @@ def test_get_liquidation_price( pair='ETH/USDT:USDT', open_rate=open_rate, amount=amount, - stake_amount=(amount * open_rate) / leverage, - wallet_balance=(amount * open_rate) / leverage, + stake_amount=amount * open_rate / leverage, + wallet_balance=amount * open_rate / leverage, # leverage=leverage, is_short=is_short, ) @@ -5147,7 +5145,7 @@ def test_get_liquidation_price( else: buffer_amount = liquidation_buffer * abs(open_rate - expected_liq) expected_liq = expected_liq - buffer_amount if is_short else expected_liq + buffer_amount - assert pytest.approx(expected_liq) == liq + assert isclose(expected_liq, liq) @pytest.mark.parametrize('contract_size,order_amount', [ From 47f7c384fbea381926a3b9aad0c6c99935b5e8d2 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 29 Aug 2022 15:48:29 -0600 Subject: [PATCH 046/437] consumer subscriptions, fix serializer bug --- freqtrade/rpc/api_server/api_ws.py | 11 +++++++- freqtrade/rpc/api_server/ws/__init__.py | 0 freqtrade/rpc/api_server/ws/channel.py | 31 ++++++++++++++++++++--- freqtrade/rpc/api_server/ws/serializer.py | 2 +- scripts/test_ws_client.py | 15 ++++++++--- 5 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 freqtrade/rpc/api_server/ws/__init__.py diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 464ea22b2..405beed79 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -2,6 +2,7 @@ import logging from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect +from freqtrade.enums import RPCMessageType from freqtrade.rpc.api_server.deps import get_channel_manager from freqtrade.rpc.api_server.ws.utils import is_websocket_alive @@ -34,7 +35,15 @@ async def message_endpoint( # be a list of topics to subscribe too. List[str] # Maybe allow the consumer to update the topics subscribed # during runtime? - logger.info(f"Consumer request - {request}") + + # If the request isn't a list then skip it + if not isinstance(request, list): + continue + + # Check if all topics listed are an RPCMessageType + if all([any(x.value == topic for x in RPCMessageType) for topic in request]): + logger.debug(f"{ws.client} subscribed to topics: {request}") + channel.set_subscriptions(request) except WebSocketDisconnect: # Handle client disconnects diff --git a/freqtrade/rpc/api_server/ws/__init__.py b/freqtrade/rpc/api_server/ws/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 486e8657b..f24713a77 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -1,6 +1,6 @@ import logging from threading import RLock -from typing import Type +from typing import List, Type from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy from freqtrade.rpc.api_server.ws.serializer import ORJSONWebSocketSerializer, WebSocketSerializer @@ -25,6 +25,8 @@ class WebSocketChannel: # The Serializing class for the WebSocket object self._serializer_cls = serializer_cls + self._subscriptions: List[str] = [] + # Internal event to signify a closed websocket self._closed = False @@ -57,9 +59,28 @@ class WebSocketChannel: self._closed = True - def is_closed(self): + def is_closed(self) -> bool: + """ + Closed flag + """ return self._closed + def set_subscriptions(self, subscriptions: List[str] = []) -> None: + """ + Set which subscriptions this channel is subscribed to + + :param subscriptions: List of subscriptions, List[str] + """ + self._subscriptions = subscriptions + + def subscribed_to(self, message_type: str) -> bool: + """ + Check if this channel is subscribed to the message_type + + :param message_type: The message type to check + """ + return message_type in self._subscriptions + class ChannelManager: def __init__(self): @@ -120,10 +141,12 @@ class ChannelManager: :param data: The data to send """ with self._lock: - logger.debug(f"Broadcasting data: {data}") + message_type = data.get('type') + logger.debug(f"Broadcasting data: {message_type} - {data}") for websocket, channel in self.channels.items(): try: - await channel.send(data) + if channel.subscribed_to(message_type): + await channel.send(data) except RuntimeError: # Handle cannot send after close cases await self.on_disconnect(websocket) diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index 40cbbfad7..ae2857f0b 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -54,7 +54,7 @@ class ORJSONWebSocketSerializer(WebSocketSerializer): return orjson.dumps(data, option=self.ORJSON_OPTIONS) def _deserialize(self, data): - return orjson.loads(data, option=self.ORJSON_OPTIONS) + return orjson.loads(data) class MsgPackWebSocketSerializer(WebSocketSerializer): diff --git a/scripts/test_ws_client.py b/scripts/test_ws_client.py index caa495a19..2c64ae867 100644 --- a/scripts/test_ws_client.py +++ b/scripts/test_ws_client.py @@ -4,22 +4,31 @@ import socket import websockets +from freqtrade.enums import RPCMessageType +from freqtrade.rpc.api_server.ws.channel import WebSocketChannel + logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) async def _client(): + subscribe_topics = [RPCMessageType.WHITELIST] try: while True: try: url = "ws://localhost:8080/api/v1/message/ws?token=testtoken" async with websockets.connect(url) as ws: + channel = WebSocketChannel(ws) + logger.info("Connection successful") + # Tell the producer we only want these topics + await channel.send(subscribe_topics) + while True: try: data = await asyncio.wait_for( - ws.recv(), + channel.recv(), timeout=5 ) logger.info(f"Data received - {data}") @@ -27,14 +36,14 @@ async def _client(): # We haven't received data yet. Check the connection and continue. try: # ping - ping = await ws.ping() + ping = await channel.ping() await asyncio.wait_for(ping, timeout=2) logger.debug(f"Connection to {url} still alive...") continue except Exception: logger.info( f"Ping error {url} - retrying in 5s") - asyncio.sleep(2) + await asyncio.sleep(2) break except (socket.gaierror, ConnectionRefusedError): From 50e280866757e39dd4d229fd3f5f32e9f9e0ff25 Mon Sep 17 00:00:00 2001 From: th0rntwig <107926911+th0rntwig@users.noreply.github.com> Date: Tue, 30 Aug 2022 12:54:39 +0200 Subject: [PATCH 047/437] Fix bug in DI (#7321) --- freqtrade/freqai/data_kitchen.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 5091073aa..763a07375 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -529,7 +529,6 @@ class FreqaiDataKitchen: "outlier_protection_percentage", 30) outlier_pct = (dropped_pts.sum() / len(dropped_pts)) * 100 if outlier_pct >= outlier_protection_pct: - self.svm_model = None return outlier_pct else: return 0.0 @@ -579,6 +578,7 @@ class FreqaiDataKitchen: f"SVM detected {outlier_pct:.2f}% of the points as outliers. " f"Keeping original dataset." ) + self.svm_model = None return self.data_dictionary["train_features"] = self.data_dictionary["train_features"][ @@ -633,6 +633,8 @@ class FreqaiDataKitchen: from math import cos, sin if predict: + if not self.data['DBSCAN_eps']: + return train_ft_df = self.data_dictionary['train_features'] pred_ft_df = self.data_dictionary['prediction_features'] num_preds = len(pred_ft_df) @@ -702,6 +704,7 @@ class FreqaiDataKitchen: f"DBSCAN detected {outlier_pct:.2f}% of the points as outliers. " f"Keeping original dataset." ) + self.data['DBSCAN_eps'] = 0 return self.data_dictionary['train_features'] = self.data_dictionary['train_features'][ @@ -759,18 +762,10 @@ class FreqaiDataKitchen: 0, ) - outlier_pct = self.get_outlier_percentage(1 - do_predict) - if outlier_pct: - logger.warning( - f"DI detected {outlier_pct:.2f}% of the points as outliers. " - f"Keeping original dataset." - ) - return - if (len(do_predict) - do_predict.sum()) > 0: logger.info( f"DI tossed {len(do_predict) - do_predict.sum()} predictions for " - "being too far from training data" + "being too far from training data." ) self.do_predict += do_predict From d3cb211283ced68d082cfdbdac12f3d2ab90d63b Mon Sep 17 00:00:00 2001 From: th0rntwig Date: Thu, 18 Aug 2022 14:44:49 +0200 Subject: [PATCH 048/437] Add inlier metric computation --- freqtrade/freqai/data_kitchen.py | 74 ++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 763a07375..62e353949 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -723,6 +723,80 @@ class FreqaiDataKitchen: ) return + + def compute_inlier_metric(self) -> None: + """ + + Compute inlier metric from backwards distance distributions. + This metric defines how well features from a timepoint fit + into previous timepoints. + """ + + import scipy.stats as ss + + nmb_previous_points = self.data['InlierMetric_nmb_points'] + weibull_percentile = self.data['InlierMetric_weib_perc'] + + train_ft_df = self.data_dictionary['train_features'] + train_ft_df_reindexed = train_ft_df.reindex( + index=np.flip(train_ft_df.index) + ) + + pairwise = pd.DataFrame( + np.triu( + pairwise_distances(train_ft_df_reindexed, n_jobs=self.thread_count) + ), + columns=train_ft_df_reindexed.index, + index=train_ft_df_reindexed.index + ) + pairwise = pairwise.round(5) + + column_labels = [ + '{}{}'.format('d', i) for i in range(1, nmb_previous_points+1) + ] + distances = pd.DataFrame( + columns=column_labels, index=train_ft_df.index + ) + for index in train_ft_df.index[nmb_previous_points]: + current_row = pairwise.loc[[index]] + current_row_no_zeros = current_row.loc[ + :, (current_row!=0).any(axis=0) + ] + distances.loc[[index]] = current_row_no_zeros.iloc[ + :, :nmb_previous_points + ] + distances = distances.replace([np.inf, -np.inf], np.nan) + drop_index = pd.isnull(distances).any(1) + distances = distances[drop_index==0] + + inliers = pd.DataFrame(index=distances.index) + for key in distances.keys(): + current_distances = distances[key].dropna() + fit_params = ss.weibull_min.fit(current_distances) + cutoff = ss.weibull_min.ppf(weibull_percentile, *fit_params) + is_inlier = np.where( + current_distances<=cutoff, 1, 0 + ) + df_inlier = pd.DataFrame( + {key+'_IsInlier':is_inlier}, index=distances.index + ) + inliers = pd.concat( + [inliers, df_inlier], axis=1 + ) + + self.data_dictionary['train_features'] = pd.DataFrame( + data=inliers.sum(axis=1)/nmb_previous_points, + columns=['inlier_metric'], + index = train_ft_df.index + ) + + percent_outliers = np.round( + 100*(1-self.data_dictionary['iniler_metric'].sum()/ + len(train_ft_df.index)), 2 + ) + logger.info('{percent_outliers}%% of data points were identified as outliers') + + return None def find_features(self, dataframe: DataFrame) -> None: """ From b11742a4c5a7130d7aabc0d20c343372f7911379 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Thu, 18 Aug 2022 19:15:29 +0200 Subject: [PATCH 049/437] integrate inlier metric function --- freqtrade/freqai/data_kitchen.py | 85 ++++++++++++++++++---------- freqtrade/freqai/freqai_interface.py | 36 ++++++++---- 2 files changed, 79 insertions(+), 42 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 62e353949..80919626c 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -723,81 +723,104 @@ class FreqaiDataKitchen: ) return - - def compute_inlier_metric(self) -> None: + + def compute_inlier_metric(self, set_='train') -> None: """ - - Compute inlier metric from backwards distance distributions. - This metric defines how well features from a timepoint fit + + Compute inlier metric from backwards distance distributions. + This metric defines how well features from a timepoint fit into previous timepoints. """ import scipy.stats as ss - - nmb_previous_points = self.data['InlierMetric_nmb_points'] - weibull_percentile = self.data['InlierMetric_weib_perc'] - train_ft_df = self.data_dictionary['train_features'] - train_ft_df_reindexed = train_ft_df.reindex( - index=np.flip(train_ft_df.index) + no_prev_pts = self.freqai_config["feature_parameters"]["inlier_metric_window"] + weib_pct = self.freqai_config["feature_parameters"]["inlier_metric_weibull_cutoff"] + + if set_ == 'train': + compute_df = copy.deepcopy(self.data_dictionary['train_features']) + elif set_ == 'test': + compute_df = copy.deepcopy(self.data_dictionary['test_features']) + else: + compute_df = copy.deepcopy(self.data_dictionary['prediction_features']) + + compute_df_reindexed = compute_df.reindex( + index=np.flip(compute_df.index) ) pairwise = pd.DataFrame( np.triu( - pairwise_distances(train_ft_df_reindexed, n_jobs=self.thread_count) + pairwise_distances(compute_df_reindexed, n_jobs=self.thread_count) ), - columns=train_ft_df_reindexed.index, - index=train_ft_df_reindexed.index + columns=compute_df_reindexed.index, + index=compute_df_reindexed.index ) pairwise = pairwise.round(5) column_labels = [ - '{}{}'.format('d', i) for i in range(1, nmb_previous_points+1) + '{}{}'.format('d', i) for i in range(1, no_prev_pts + 1) ] distances = pd.DataFrame( - columns=column_labels, index=train_ft_df.index + columns=column_labels, index=compute_df.index ) - for index in train_ft_df.index[nmb_previous_points]: + + for index in compute_df.index[no_prev_pts:]: current_row = pairwise.loc[[index]] current_row_no_zeros = current_row.loc[ - :, (current_row!=0).any(axis=0) + :, (current_row != 0).any(axis=0) ] distances.loc[[index]] = current_row_no_zeros.iloc[ - :, :nmb_previous_points + :, :no_prev_pts ] distances = distances.replace([np.inf, -np.inf], np.nan) drop_index = pd.isnull(distances).any(1) - distances = distances[drop_index==0] + distances = distances[drop_index == 0] inliers = pd.DataFrame(index=distances.index) for key in distances.keys(): current_distances = distances[key].dropna() fit_params = ss.weibull_min.fit(current_distances) - cutoff = ss.weibull_min.ppf(weibull_percentile, *fit_params) + cutoff = ss.weibull_min.ppf(weib_pct, *fit_params) is_inlier = np.where( - current_distances<=cutoff, 1, 0 + current_distances <= cutoff, 1, 0 ) df_inlier = pd.DataFrame( - {key+'_IsInlier':is_inlier}, index=distances.index + {key + '_IsInlier': is_inlier}, index=distances.index ) inliers = pd.concat( [inliers, df_inlier], axis=1 ) - self.data_dictionary['train_features'] = pd.DataFrame( - data=inliers.sum(axis=1)/nmb_previous_points, + inlier_metric = pd.DataFrame( + data=inliers.sum(axis=1) / no_prev_pts, columns=['inlier_metric'], - index = train_ft_df.index + index=compute_df.index ) - percent_outliers = np.round( - 100*(1-self.data_dictionary['iniler_metric'].sum()/ - len(train_ft_df.index)), 2 - ) - logger.info('{percent_outliers}%% of data points were identified as outliers') + inlier_metric = 2 * (inlier_metric - inlier_metric.min()) / \ + (inlier_metric.max() - inlier_metric.min()) - 1 + + if set_ in ('train', 'test'): + inlier_metric = inlier_metric.iloc[no_prev_pts:] + compute_df = compute_df.iloc[no_prev_pts:] + self.remove_beginning_points_from_data_dict(set_, no_prev_pts) + self.data_dictionary[f'{set_}_features'] = pd.concat( + [compute_df, inlier_metric], axis=1) + else: + self.data_dictionary['prediction_features'] = pd.concat( + [compute_df, inlier_metric], axis=1) + self.data_dictionary['prediction_features'].fillna(0, inplace=True) return None + def remove_beginning_points_from_data_dict(self, set_='train', no_prev_pts: int = 10): + features = self.data_dictionary[f'{set_}_features'] + weights = self.data_dictionary[f'{set_}_weights'] + labels = self.data_dictionary[f'{set_}_labels'] + self.data_dictionary[f'{set_}_weights'] = weights[no_prev_pts:] + self.data_dictionary[f'{set_}_features'] = features.iloc[no_prev_pts:] + self.data_dictionary[f'{set_}_labels'] = labels.iloc[no_prev_pts:] + def find_features(self, dataframe: DataFrame) -> None: """ Find features in the strategy provided dataframe diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 4106f24e0..e6e019b66 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -66,7 +66,6 @@ class IFreqaiModel(ABC): "data_split_parameters", {}) self.model_training_parameters: Dict[str, Any] = config.get("freqai", {}).get( "model_training_parameters", {}) - self.feature_parameters = config.get("freqai", {}).get("feature_parameters") self.retrain = False self.first = True self.set_full_path() @@ -74,11 +73,14 @@ class IFreqaiModel(ABC): self.dd = FreqaiDataDrawer(Path(self.full_path), self.config, self.follow_mode) self.identifier: str = self.freqai_info.get("identifier", "no_id_provided") self.scanning = False + self.ft_params = self.freqai_info["feature_parameters"] self.keras: bool = self.freqai_info.get("keras", False) - if self.keras and self.freqai_info.get("feature_parameters", {}).get("DI_threshold", 0): - self.freqai_info["feature_parameters"]["DI_threshold"] = 0 + if self.keras and self.ft_params.get("DI_threshold", 0): + self.ft_params["DI_threshold"] = 0 logger.warning("DI threshold is not configured for Keras models yet. Deactivating.") self.CONV_WIDTH = self.freqai_info.get("conv_width", 2) + if self.ft_params.get("inlier_metric_window", 0): + self.CONV_WIDTH = self.ft_params.get("inlier_metric_window", 0) * 2 self.pair_it = 0 self.pair_it_train = 0 self.total_pairs = len(self.config.get("exchange", {}).get("pair_whitelist")) @@ -403,18 +405,20 @@ class IFreqaiModel(ABC): example of how outlier data points are dropped from the dataframe used for training. """ - if self.freqai_info["feature_parameters"].get( + ft_params = self.freqai_info["feature_parameters"] + + if ft_params.get( "principal_component_analysis", False ): dk.principal_component_analysis() - if self.freqai_info["feature_parameters"].get("use_SVM_to_remove_outliers", False): + if ft_params.get("use_SVM_to_remove_outliers", False): dk.use_SVM_to_remove_outliers(predict=False) - if self.freqai_info["feature_parameters"].get("DI_threshold", 0): + if ft_params.get("DI_threshold", 0): dk.data["avg_mean_dist"] = dk.compute_distances() - if self.freqai_info["feature_parameters"].get("use_DBSCAN_to_remove_outliers", False): + if ft_params.get("use_DBSCAN_to_remove_outliers", False): if dk.pair in self.dd.old_DBSCAN_eps: eps = self.dd.old_DBSCAN_eps[dk.pair] else: @@ -422,6 +426,11 @@ class IFreqaiModel(ABC): dk.use_DBSCAN_to_remove_outliers(predict=False, eps=eps) self.dd.old_DBSCAN_eps[dk.pair] = dk.data['DBSCAN_eps'] + if ft_params.get('inlier_metric_window', 0): + dk.compute_inlier_metric(set_='train') + if self.freqai_info["data_split_parameters"]["test_size"] > 0: + dk.compute_inlier_metric(set_='test') + def data_cleaning_predict(self, dk: FreqaiDataKitchen, dataframe: DataFrame) -> None: """ Base data cleaning method for predict. @@ -433,18 +442,23 @@ class IFreqaiModel(ABC): of how the do_predict vector is modified. do_predict is ultimately passed back to strategy for buy signals. """ - if self.freqai_info["feature_parameters"].get( + ft_params = self.freqai_info["feature_parameters"] + + if ft_params.get('inlier_metric_window', 0): + dk.compute_inlier_metric(set_='predict') + + if ft_params.get( "principal_component_analysis", False ): dk.pca_transform(dataframe) - if self.freqai_info["feature_parameters"].get("use_SVM_to_remove_outliers", False): + if ft_params.get("use_SVM_to_remove_outliers", False): dk.use_SVM_to_remove_outliers(predict=True) - if self.freqai_info["feature_parameters"].get("DI_threshold", 0): + if ft_params.get("DI_threshold", 0): dk.check_if_pred_in_training_spaces() - if self.freqai_info["feature_parameters"].get("use_DBSCAN_to_remove_outliers", False): + if ft_params.get("use_DBSCAN_to_remove_outliers", False): dk.use_DBSCAN_to_remove_outliers(predict=True) def model_exists( From a58dd0bbf9347a69fecde43e5735bc1851de3b9b Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 19 Aug 2022 18:35:24 +0200 Subject: [PATCH 050/437] add noise feature, improve docstrings --- freqtrade/freqai/data_kitchen.py | 11 +++++++++++ freqtrade/freqai/freqai_interface.py | 18 +++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 80919626c..0158996c7 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -821,6 +821,17 @@ class FreqaiDataKitchen: self.data_dictionary[f'{set_}_features'] = features.iloc[no_prev_pts:] self.data_dictionary[f'{set_}_labels'] = labels.iloc[no_prev_pts:] + def add_noise_to_training_features(self) -> None: + """ + Add noise to train features to reduce the risk of overfitting. + """ + mu = 0 # no shift + sigma = self.freqai_config["feature_parameters"]["noise_standard_deviation"] + compute_df = self.data_dictionary['train_features'] + noise = np.random.normal(mu, sigma, [compute_df.shape[0], compute_df.shape[1]]) + self.data_dictionary['train_features'] += noise + return + def find_features(self, dataframe: DataFrame) -> None: """ Find features in the strategy provided dataframe diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index e6e019b66..239cb1869 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -399,10 +399,9 @@ class IFreqaiModel(ABC): def data_cleaning_train(self, dk: FreqaiDataKitchen) -> None: """ - Base data cleaning method for train - Any function inside this method should drop training data points from the filtered_dataframe - based on user decided logic. See FreqaiDataKitchen::use_SVM_to_remove_outliers() for an - example of how outlier data points are dropped from the dataframe used for training. + Base data cleaning method for train. + Functions here improve/modify the input data by identifying outliers, + computing additional metrics, adding noise, reducing dimensionality etc. """ ft_params = self.freqai_info["feature_parameters"] @@ -431,16 +430,13 @@ class IFreqaiModel(ABC): if self.freqai_info["data_split_parameters"]["test_size"] > 0: dk.compute_inlier_metric(set_='test') + if self.freqai_info["feature_parameters"].get('noise_standard_deviation', 0): + dk.add_noise_to_training_features() + def data_cleaning_predict(self, dk: FreqaiDataKitchen, dataframe: DataFrame) -> None: """ Base data cleaning method for predict. - These functions each modify dk.do_predict, which is a dataframe with equal length - to the number of candles coming from and returning to the strategy. Inside do_predict, - 1 allows prediction and < 0 signals to the strategy that the model is not confident in - the prediction. - See FreqaiDataKitchen::remove_outliers() for an example - of how the do_predict vector is modified. do_predict is ultimately passed back to strategy - for buy signals. + Functions here are complementary to the functions of data_cleaning_train. """ ft_params = self.freqai_info["feature_parameters"] From 7f52908e87a61ed60c7fe3f2b9b933b6211c60da Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 30 Aug 2022 18:55:58 +0200 Subject: [PATCH 051/437] ensure the lost points are prepended for FreqUI --- freqtrade/freqai/freqai_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 239cb1869..893f960ea 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -587,7 +587,7 @@ class IFreqaiModel(ABC): # # for keras type models, the conv_window needs to be prepended so # # viewing is correct in frequi - if self.freqai_info.get('keras', False): + if self.freqai_info.get('keras', False) or self.ft_params.get('inlier_metric_window', 0): n_lost_points = self.freqai_info.get('conv_width', 2) zeros_df = DataFrame(np.zeros((n_lost_points, len(hist_preds_df.columns))), columns=hist_preds_df.columns) From 418bd26a8097008ccb5ef747cc63ea087fadfea4 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 30 Aug 2022 11:04:16 -0600 Subject: [PATCH 052/437] minor fixes, rework consumer request, update requirements.txt --- freqtrade/enums/__init__.py | 2 +- freqtrade/enums/rpcmessagetype.py | 6 ++++++ freqtrade/rpc/api_server/api_ws.py | 23 +++++++---------------- freqtrade/rpc/api_server/webserver.py | 6 +----- freqtrade/rpc/rpc.py | 14 ++++++++++++-- freqtrade/rpc/rpc_manager.py | 2 +- freqtrade/rpc/telegram.py | 10 +++++++--- requirements-externalsignals.txt | 7 ------- requirements.txt | 5 +++++ scripts/test_ws_client.py | 11 +++++++++-- setup.py | 5 ++++- 11 files changed, 53 insertions(+), 38 deletions(-) delete mode 100644 requirements-externalsignals.txt diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index ffeb8cc12..406d847e6 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -6,7 +6,7 @@ from freqtrade.enums.exittype import ExitType from freqtrade.enums.externalsignal import ExternalSignalModeType, LeaderMessageType, WaitDataPolicy from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues -from freqtrade.enums.rpcmessagetype import RPCMessageType +from freqtrade.enums.rpcmessagetype import RPCMessageType, RPCRequestType from freqtrade.enums.runmode import NON_UTIL_MODES, OPTIMIZE_MODES, TRADING_MODES, RunMode from freqtrade.enums.signaltype import SignalDirection, SignalTagType, SignalType from freqtrade.enums.state import State diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 8e4182b33..6283fb7cc 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -21,9 +21,15 @@ class RPCMessageType(str, Enum): STRATEGY_MSG = 'strategy_msg' WHITELIST = 'whitelist' + ANALYZED_DF = 'analyzed_df' def __repr__(self): return self.value def __str__(self): return self.value + + +# Enum for parsing requests from ws consumers +class RPCRequestType(str, Enum): + SUBSCRIBE = 'subscribe' diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 405beed79..c8d1b70fa 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -2,8 +2,7 @@ import logging from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect -from freqtrade.enums import RPCMessageType -from freqtrade.rpc.api_server.deps import get_channel_manager +from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc_optional from freqtrade.rpc.api_server.ws.utils import is_websocket_alive @@ -16,7 +15,8 @@ router = APIRouter() @router.websocket("/message/ws") async def message_endpoint( ws: WebSocket, - channel_manager=Depends(get_channel_manager) + channel_manager=Depends(get_channel_manager), + rpc=Depends(get_rpc_optional) ): try: if is_websocket_alive(ws): @@ -31,19 +31,10 @@ async def message_endpoint( while not channel.is_closed(): request = await channel.recv() - # This is where we'd parse the request. For now this should only - # be a list of topics to subscribe too. List[str] - # Maybe allow the consumer to update the topics subscribed - # during runtime? - - # If the request isn't a list then skip it - if not isinstance(request, list): - continue - - # Check if all topics listed are an RPCMessageType - if all([any(x.value == topic for x in RPCMessageType) for topic in request]): - logger.debug(f"{ws.client} subscribed to topics: {request}") - channel.set_subscriptions(request) + # Process the request here. Should this be a method of RPC? + if rpc: + logger.info(f"Request: {request}") + rpc._process_consumer_request(request, channel) except WebSocketDisconnect: # Handle client disconnects diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 94cb8cd45..f4af8c8ed 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -63,11 +63,7 @@ class ApiServer(RPCHandler): ApiServer.__initialized = False return ApiServer.__instance - def __init__( - self, - config: Dict[str, Any], - standalone: bool = False, - ) -> None: + def __init__(self, config: Dict[str, Any], standalone: bool = False) -> None: ApiServer._config = config if self.__initialized and (standalone or self._standalone): return diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 3c7558158..f684c7783 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -19,8 +19,8 @@ from freqtrade.configuration.timerange import TimeRange from freqtrade.constants import CANCEL_REASON, DATETIME_PRINT_FORMAT from freqtrade.data.history import load_data from freqtrade.data.metrics import calculate_max_drawdown -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, State, - TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, RPCRequestType, + SignalDirection, State, TradingMode) from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler @@ -1089,6 +1089,16 @@ class RPC: 'last_process_loc': last_p.astimezone(tzlocal()).strftime(DATETIME_PRINT_FORMAT), 'last_process_ts': int(last_p.timestamp()), } + + # We are passed a Channel object, we can only do sync functions on that channel object + def _process_consumer_request(self, request, channel): + # Should we ensure that request is Dict[str, Any]? + type, data = request.get('type'), request.get('data') + + if type == RPCRequestType.SUBSCRIBE: + if all([any(x.value == topic for x in RPCMessageType) for topic in data]): + logger.debug(f"{channel} subscribed to topics: {data}") + channel.set_subscriptions(data) # # # ------------------------------ EXTERNAL SIGNALS ----------------------- # diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index c5e93e3b4..b3cd5604c 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -64,7 +64,7 @@ class RPCManager: """ Stops all enabled rpc modules """ logger.info('Cleaning up rpc modules ...') while self.registered_modules: - mod = self.registered_modules.pop() + mod = self.registered_modules.pop() # popleft to cleanup API server last? logger.info('Cleaning up rpc.%s ...', mod.name) mod.cleanup() del mod diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 8ce2fa2e4..141368769 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -436,9 +436,13 @@ class Telegram(RPCHandler): # Notification disabled return - message = self.compose_message(msg, msg_type) - - self._send_msg(message, disable_notification=(noti == 'silent')) + # Would this be better than adding un-needed if statements to compose_message? + try: + message = self.compose_message(msg, msg_type) + self._send_msg(message, disable_notification=(noti == 'silent')) + except NotImplementedError: + # just skip it + return def _get_sell_emoji(self, msg): """ diff --git a/requirements-externalsignals.txt b/requirements-externalsignals.txt deleted file mode 100644 index 7920b34f6..000000000 --- a/requirements-externalsignals.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Include all requirements to run the bot. --r requirements.txt - -# Required for follower -websockets -msgpack -janus diff --git a/requirements.txt b/requirements.txt index 77925f98b..4d97f500a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,3 +50,8 @@ python-dateutil==2.8.2 #Futures schedule==1.1.0 + +#WS Messages +websockets~=10.3 +msgpack~=1.0.4 +janus==1.0.0 diff --git a/scripts/test_ws_client.py b/scripts/test_ws_client.py index 2c64ae867..872ff3ccf 100644 --- a/scripts/test_ws_client.py +++ b/scripts/test_ws_client.py @@ -1,6 +1,7 @@ import asyncio import logging import socket +from typing import Any import websockets @@ -12,8 +13,14 @@ logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) +def compose_consumer_request(type_: str, data: Any): + return {"type": type_, "data": data} + + async def _client(): - subscribe_topics = [RPCMessageType.WHITELIST] + # Trying to recreate multiple topic issue. Wait until first whitelist message, + # then CTRL-C to get the status message. + topics = [RPCMessageType.WHITELIST, RPCMessageType.STATUS] try: while True: try: @@ -23,7 +30,7 @@ async def _client(): logger.info("Connection successful") # Tell the producer we only want these topics - await channel.send(subscribe_topics) + await channel.send(compose_consumer_request("subscribe", topics)) while True: try: diff --git a/setup.py b/setup.py index 8f04e75f7..c7b1f1c7c 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,10 @@ setup( 'psutil', 'pyjwt', 'aiofiles', - 'schedule' + 'schedule', + 'websockets', + 'msgpack', + 'janus' ], extras_require={ 'dev': all_extra, From 0b8482360f0ec1aea6e61ac08b3746584c03800a Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 30 Aug 2022 20:32:49 +0200 Subject: [PATCH 053/437] add documentation for inlier metric --- docs/freqai.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/freqai.md b/docs/freqai.md index e4a451324..3fc76e9f0 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -115,6 +115,8 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. | `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` | `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False +| `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 +| `inlier_metric_weibull_cutoff` | If the `inlier_metric_window` is set, this value is used to determine the tail cutoff in the weibull distribution fit. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** float. Default: 0.95 | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. @@ -636,6 +638,20 @@ testing; the other points are used for training. The test data is used to evaluate the performance of the model after training. If the test score is high, the model is able to capture the behavior of the data well. If the test score is low, either the model either does not capture the complexity of the data, the test data is significantly different from the train data, or a different model should be used. +### Using the `inlier_metric` + +The `inlier_metric` is a metric aimed at quantifying how different a prediction data point is from the most recent historic data points. + +User can set `inlier_metric_window` to set the look back window. FreqAI will compute the distance between the present prediction point and each of the previous data points (total of `inlier_metric_window` points). + +This function goes one step further - during training, it computes the `inlier_metric` for all training data points and builds weibull distributions for each each lookback point. If one of the distances falls in the tail of the respective weibull distribution, it is considered an "outlier." If the distance to the lookback point is not in the tail, it is considered an "inlier." Inliers receive a value of 1, and outliers receive a value of 0. + +FreqAI adds this `inlier_metric` score to the training features! Thus, your model is trained to recognize how this temporal inlier metric is evolving. + +Users can control the weibull threshold using the `inlier_metric_weibull_cutoff` + +This function does not currently remove outliers from the data set. + ### Controlling the model learning process Model training parameters are unique to the machine learning library selected by the user. FreqAI allows the user to set any parameter for any library using the `model_training_parameters` dictionary in the user configuration file. The example configuration file (found in `config_examples/config_freqai.example.json`) show some of the example parameters associated with `Catboost` and `LightGBM`, but the user can add any parameters available in those libraries. From 7e8e29e42d4c2b0eb058d9408c27ebd220eb9f68 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 30 Aug 2022 20:41:37 +0200 Subject: [PATCH 054/437] use continuous value for inlier_metric --- docs/freqai.md | 9 +++------ freqtrade/freqai/data_kitchen.py | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index 3fc76e9f0..2c6efa3b9 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -116,7 +116,6 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` | `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False | `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 -| `inlier_metric_weibull_cutoff` | If the `inlier_metric_window` is set, this value is used to determine the tail cutoff in the weibull distribution fit. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** float. Default: 0.95 | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. @@ -644,13 +643,11 @@ The `inlier_metric` is a metric aimed at quantifying how different a prediction User can set `inlier_metric_window` to set the look back window. FreqAI will compute the distance between the present prediction point and each of the previous data points (total of `inlier_metric_window` points). -This function goes one step further - during training, it computes the `inlier_metric` for all training data points and builds weibull distributions for each each lookback point. If one of the distances falls in the tail of the respective weibull distribution, it is considered an "outlier." If the distance to the lookback point is not in the tail, it is considered an "inlier." Inliers receive a value of 1, and outliers receive a value of 0. +This function goes one step further - during training, it computes the `inlier_metric` for all training data points and builds weibull distributions for each each lookback point. The cumulative distribution function for the weibull distribution is used to produce a quantile for each of the data points. The quantiles for each lookback point are averaged to create the `inlier_metric`. -FreqAI adds this `inlier_metric` score to the training features! Thus, your model is trained to recognize how this temporal inlier metric is evolving. +FreqAI adds this `inlier_metric` score to the training features! In other words, your model is trained to recognize how this temporal inlier metric is related to the user set labels. -Users can control the weibull threshold using the `inlier_metric_weibull_cutoff` - -This function does not currently remove outliers from the data set. +This function does **not** remove outliers from the data set. ### Controlling the model learning process diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 0158996c7..9d4a69287 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -735,7 +735,6 @@ class FreqaiDataKitchen: import scipy.stats as ss no_prev_pts = self.freqai_config["feature_parameters"]["inlier_metric_window"] - weib_pct = self.freqai_config["feature_parameters"]["inlier_metric_weibull_cutoff"] if set_ == 'train': compute_df = copy.deepcopy(self.data_dictionary['train_features']) @@ -780,12 +779,10 @@ class FreqaiDataKitchen: for key in distances.keys(): current_distances = distances[key].dropna() fit_params = ss.weibull_min.fit(current_distances) - cutoff = ss.weibull_min.ppf(weib_pct, *fit_params) - is_inlier = np.where( - current_distances <= cutoff, 1, 0 - ) + quantiles = ss.weibull_min.cdf(current_distances, *fit_params) + df_inlier = pd.DataFrame( - {key + '_IsInlier': is_inlier}, index=distances.index + {key: quantiles}, index=distances.index ) inliers = pd.concat( [inliers, df_inlier], axis=1 From c9aa09ec89d37d6f8fcea4c9f15c092021a82a93 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 30 Aug 2022 20:46:06 +0200 Subject: [PATCH 055/437] Simplify base fee handling --- freqtrade/freqtradebot.py | 32 ++++++++++------------ tests/test_freqtradebot.py | 56 ++++++++++++++++++++------------------ 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index ea9221213..5393e3d39 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1778,7 +1778,7 @@ class FreqtradeBot(LoggingMixin): self.rpc.send_msg(msg) def apply_fee_conditional(self, trade: Trade, trade_base_currency: str, - amount: float, fee_abs: float) -> float: + amount: float, fee_abs: float) -> Optional[float]: """ Applies the fee to amount (either from Order or from Trades). Can eat into dust if more than the required asset is available. @@ -1791,35 +1791,32 @@ class FreqtradeBot(LoggingMixin): logger.info(f"Fee amount for {trade} was in base currency - " f"Eating Fee {fee_abs} into dust.") elif fee_abs != 0: - real_amount = self.exchange.amount_to_precision(trade.pair, amount - fee_abs) - logger.info(f"Applying fee on amount for {trade} " - f"(from {amount} to {real_amount}).") - return real_amount - return amount + logger.info(f"Applying fee on amount for {trade}, fee={fee_abs}.") + return fee_abs + return None def handle_order_fee(self, trade: Trade, order_obj: Order, order: Dict[str, Any]) -> None: # Try update amount (binance-fix) try: - new_amount = self.get_real_amount(trade, order, order_obj) - if not isclose(safe_value_fallback(order, 'filled', 'amount'), new_amount, - abs_tol=constants.MATH_CLOSE_PREC): - order_obj.ft_fee_base = trade.amount - new_amount + fee_abs = self.get_real_amount(trade, order, order_obj) + if fee_abs is not None: + order_obj.ft_fee_base = fee_abs except DependencyException as exception: logger.warning("Could not update trade amount: %s", exception) - def get_real_amount(self, trade: Trade, order: Dict, order_obj: Order) -> float: + def get_real_amount(self, trade: Trade, order: Dict, order_obj: Order) -> Optional[float]: """ Detect and update trade fee. Calls trade.update_fee() upon correct detection. Returns modified amount if the fee was taken from the destination currency. Necessary for exchanges which charge fees in base currency (e.g. binance) - :return: identical (or new) amount for the trade + :return: Absolute fee to apply for this order or None """ # Init variables order_amount = safe_value_fallback(order, 'filled', 'amount') # Only run for closed orders if trade.fee_updated(order.get('side', '')) or order['status'] == 'open': - return order_amount + return None trade_base_currency = self.exchange.get_pair_base_currency(trade.pair) # use fee from order-dict if possible @@ -1837,12 +1834,12 @@ class FreqtradeBot(LoggingMixin): # Apply fee to amount return self.apply_fee_conditional(trade, trade_base_currency, amount=order_amount, fee_abs=fee_cost) - return order_amount + return None return self.fee_detection_from_trades( trade, order, order_obj, order_amount, order.get('trades', [])) def fee_detection_from_trades(self, trade: Trade, order: Dict, order_obj: Order, - order_amount: float, trades: List) -> float: + order_amount: float, trades: List) -> Optional[float]: """ fee-detection fallback to Trades. Either uses provided trades list or the result of fetch_my_trades to get correct fee. @@ -1853,7 +1850,7 @@ class FreqtradeBot(LoggingMixin): if len(trades) == 0: logger.info("Applying fee on amount for %s failed: myTrade-Dict empty found", trade) - return order_amount + return None fee_currency = None amount = 0 fee_abs = 0.0 @@ -1897,8 +1894,7 @@ class FreqtradeBot(LoggingMixin): if fee_abs != 0: return self.apply_fee_conditional(trade, trade_base_currency, amount=amount, fee_abs=fee_abs) - else: - return amount + return None def get_valid_price(self, custom_price: float, proposed_price: float) -> float: """ diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 138527053..902343c1e 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -1927,8 +1927,7 @@ def test_update_trade_state(mocker, default_conf_usdt, limit_order, is_short, ca mocker.patch('freqtrade.freqtradebot.FreqtradeBot.handle_trade', MagicMock(return_value=True)) mocker.patch('freqtrade.exchange.Exchange.fetch_order', return_value=order) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[]) - mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', - return_value=order['amount']) + mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', return_value=0.0) order_id = order['id'] trade = Trade( @@ -1960,11 +1959,11 @@ def test_update_trade_state(mocker, default_conf_usdt, limit_order, is_short, ca assert trade.amount == order['amount'] trade.open_order_id = order_id - mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', return_value=90.81) - assert trade.amount != 90.81 + mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', return_value=0.01) + assert trade.amount == 30.0 # test amount modified by fee-logic freqtrade.update_trade_state(trade, order_id) - assert trade.amount == 90.81 + assert trade.amount == 29.99 assert trade.open_order_id is None trade.is_open = True @@ -4268,10 +4267,10 @@ def test_get_real_amount_quote(default_conf_usdt, trades_for_order, buy_order_fe caplog.clear() order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') # Amount is reduced by "fee" - assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) == amount - (amount * 0.001) + assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) == (amount * 0.001) assert log_has( 'Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, is_short=False,' - ' leverage=1.0, open_rate=0.24544100, open_since=closed) (from 8.0 to 7.992).', + ' leverage=1.0, open_rate=0.24544100, open_since=closed), fee=0.008.', caplog ) @@ -4296,7 +4295,7 @@ def test_get_real_amount_quote_dust(default_conf_usdt, trades_for_order, buy_ord walletmock.reset_mock() order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') # Amount is kept as is - assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) == amount + assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) is None assert walletmock.call_count == 1 assert log_has_re(r'Fee amount for Trade.* was in base currency ' '- Eating Fee 0.008 into dust', caplog) @@ -4319,7 +4318,7 @@ def test_get_real_amount_no_trade(default_conf_usdt, buy_order_fee, caplog, mock order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') # Amount is reduced by "fee" - assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) == amount + assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) is None assert log_has( 'Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, ' 'is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed) failed: ' @@ -4343,8 +4342,7 @@ def test_get_real_amount_no_trade(default_conf_usdt, buy_order_fee, caplog, mock # from order ({'cost': 0.004, 'currency': 'LTC'}, 0.004, False, ( 'Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, ' - 'is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed) (from' - ' 8.0 to 7.996).' + 'is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed), fee=0.004.' )), # invalid, no currency in from fee dict ({'cost': 0.008, 'currency': None}, 0, True, None), @@ -4376,7 +4374,11 @@ def test_get_real_amount( caplog.clear() order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') - assert freqtrade.get_real_amount(trade, buy_order, order_obj) == amount - fee_reduction_amount + res = freqtrade.get_real_amount(trade, buy_order, order_obj) + if fee_reduction_amount == 0: + assert res is None + else: + assert res == fee_reduction_amount if expected_log: assert log_has(expected_log, caplog) @@ -4422,14 +4424,14 @@ def test_get_real_amount_multi( return_value={'ask': 0.19, 'last': 0.2}) # Amount is reduced by "fee" - expected_amount = amount - (amount * fee_reduction_amount) + expected_amount = amount * fee_reduction_amount order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') assert freqtrade.get_real_amount(trade, buy_order_fee, order_obj) == expected_amount assert log_has( ( 'Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, ' - 'is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed) ' - f'(from 8.0 to {expected_log_amount}).' + 'is_short=False, leverage=1.0, open_rate=0.24544100, open_since=closed), ' + f'fee={expected_amount}.' ), caplog ) @@ -4462,7 +4464,7 @@ def test_get_real_amount_invalid_order(default_conf_usdt, trades_for_order, buy_ order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') # Amount does not change - assert freqtrade.get_real_amount(trade, limit_buy_order_usdt, order_obj) == amount + assert freqtrade.get_real_amount(trade, limit_buy_order_usdt, order_obj) is None def test_get_real_amount_fees_order(default_conf_usdt, market_buy_order_usdt_doublefee, @@ -4485,7 +4487,7 @@ def test_get_real_amount_fees_order(default_conf_usdt, market_buy_order_usdt_dou # Amount does not change assert trade.fee_open == 0.0025 order_obj = Order.parse_from_ccxt_object(market_buy_order_usdt_doublefee, 'LTC/ETH', 'buy') - assert freqtrade.get_real_amount(trade, market_buy_order_usdt_doublefee, order_obj) == 30.0 + assert freqtrade.get_real_amount(trade, market_buy_order_usdt_doublefee, order_obj) is None assert tfo_mock.call_count == 0 # Fetch fees from trades dict if available to get "proper" values assert round(trade.fee_open, 4) == 0.001 @@ -4537,7 +4539,7 @@ def test_get_real_amount_wrong_amount_rounding(default_conf_usdt, trades_for_ord order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') # Amount changes by fee amount. assert pytest.approx(freqtrade.get_real_amount( - trade, limit_buy_order_usdt, order_obj)) == amount - (amount * 0.001) + trade, limit_buy_order_usdt, order_obj)) == (amount * 0.001) def test_get_real_amount_open_trade_usdt(default_conf_usdt, fee, mocker): @@ -4559,7 +4561,7 @@ def test_get_real_amount_open_trade_usdt(default_conf_usdt, fee, mocker): } freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt) order_obj = Order.parse_from_ccxt_object(order, 'LTC/ETH', 'buy') - assert freqtrade.get_real_amount(trade, order, order_obj) == amount + assert freqtrade.get_real_amount(trade, order, order_obj) is None def test_get_real_amount_in_point(default_conf_usdt, buy_order_fee, fee, mocker, caplog): @@ -4616,7 +4618,7 @@ def test_get_real_amount_in_point(default_conf_usdt, buy_order_fee, fee, mocker, order_obj = Order.parse_from_ccxt_object(buy_order_fee, 'LTC/ETH', 'buy') res = freqtrade.get_real_amount(trade, limit_buy_order_usdt, order_obj) - assert res == amount + assert res is None assert trade.fee_open_currency is None assert trade.fee_open_cost is None message = "Not updating buy-fee - rate: None, POINT." @@ -4624,7 +4626,7 @@ def test_get_real_amount_in_point(default_conf_usdt, buy_order_fee, fee, mocker, caplog.clear() freqtrade.config['exchange']['unknown_fee_rate'] = 1 res = freqtrade.get_real_amount(trade, limit_buy_order_usdt, order_obj) - assert res == amount + assert res is None assert trade.fee_open_currency == 'POINT' assert pytest.approx(trade.fee_open_cost) == 0.3046651026 assert trade.fee_open == 0.002 @@ -4633,12 +4635,12 @@ def test_get_real_amount_in_point(default_conf_usdt, buy_order_fee, fee, mocker, @pytest.mark.parametrize('amount,fee_abs,wallet,amount_exp', [ - (8.0, 0.0, 10, 8), - (8.0, 0.0, 0, 8), - (8.0, 0.1, 0, 7.9), - (8.0, 0.1, 10, 8), - (8.0, 0.1, 8.0, 8.0), - (8.0, 0.1, 7.9, 7.9), + (8.0, 0.0, 10, None), + (8.0, 0.0, 0, None), + (8.0, 0.1, 0, 0.1), + (8.0, 0.1, 10, None), + (8.0, 0.1, 8.0, None), + (8.0, 0.1, 7.9, 0.1), ]) def test_apply_fee_conditional(default_conf_usdt, fee, mocker, amount, fee_abs, wallet, amount_exp): From 10e0d538603338d0df0ffc57fa27b93c04647a19 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 30 Aug 2022 20:49:53 +0200 Subject: [PATCH 056/437] Simplify 2 more tests --- tests/test_freqtradebot.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 902343c1e..e6c6e7978 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -1051,8 +1051,6 @@ def test_add_stoploss_on_exchange(mocker, default_conf_usdt, limit_order, is_sho mocker.patch('freqtrade.freqtradebot.FreqtradeBot.handle_trade', MagicMock(return_value=True)) mocker.patch('freqtrade.exchange.Exchange.fetch_order', return_value=order) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[]) - mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', - return_value=order['amount']) stoploss = MagicMock(return_value={'id': 13434334}) mocker.patch('freqtrade.exchange.Binance.stoploss', stoploss) @@ -1875,8 +1873,6 @@ def test_exit_positions(mocker, default_conf_usdt, limit_order, is_short, caplog mocker.patch('freqtrade.exchange.Exchange.fetch_order', return_value=limit_order[entry_side(is_short)]) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[]) - mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', - return_value=limit_order[entry_side(is_short)]['amount']) trade = MagicMock() trade.is_short = is_short @@ -1886,14 +1882,13 @@ def test_exit_positions(mocker, default_conf_usdt, limit_order, is_short, caplog n = freqtrade.exit_positions(trades) assert n == 0 # Test amount not modified by fee-logic - assert not log_has( - 'Applying fee to amount for Trade {} from 30.0 to 90.81'.format(trade), caplog - ) + assert not log_has_re(r'Applying fee to amount for Trade .*', caplog) - mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', return_value=90.81) + gra = mocker.patch('freqtrade.freqtradebot.FreqtradeBot.get_real_amount', return_value=0.0) # test amount modified by fee-logic n = freqtrade.exit_positions(trades) assert n == 0 + assert gra.call_count == 0 @pytest.mark.parametrize("is_short", [False, True]) From 346e73dd75503f9170d6f6759a517d0f421e6fc6 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 30 Aug 2022 19:21:34 -0600 Subject: [PATCH 057/437] client implementation, minor fixes --- config_examples/config_full.example.json | 13 +- freqtrade/constants.py | 26 +- freqtrade/data/dataprovider.py | 10 +- freqtrade/enums/__init__.py | 2 +- freqtrade/enums/externalmessages.py | 7 + freqtrade/enums/externalsignal.py | 18 - freqtrade/freqtradebot.py | 17 +- freqtrade/rpc/api_server/api_ws.py | 2 +- freqtrade/rpc/api_server/webserver.py | 29 +- freqtrade/rpc/api_server/ws/channel.py | 3 - freqtrade/rpc/emc.py | 229 ++++++++++ freqtrade/rpc/external_signal/__init__.py | 5 - freqtrade/rpc/external_signal/channel.py | 145 ------- freqtrade/rpc/external_signal/controller.py | 449 -------------------- freqtrade/rpc/external_signal/proxy.py | 61 --- freqtrade/rpc/external_signal/serializer.py | 65 --- freqtrade/rpc/external_signal/types.py | 8 - freqtrade/rpc/external_signal/utils.py | 10 - freqtrade/rpc/rpc.py | 62 --- freqtrade/rpc/rpc_manager.py | 4 +- freqtrade/strategy/interface.py | 43 +- scripts/test_ws_client.py | 74 ---- 22 files changed, 323 insertions(+), 959 deletions(-) create mode 100644 freqtrade/enums/externalmessages.py delete mode 100644 freqtrade/enums/externalsignal.py create mode 100644 freqtrade/rpc/emc.py delete mode 100644 freqtrade/rpc/external_signal/__init__.py delete mode 100644 freqtrade/rpc/external_signal/channel.py delete mode 100644 freqtrade/rpc/external_signal/controller.py delete mode 100644 freqtrade/rpc/external_signal/proxy.py delete mode 100644 freqtrade/rpc/external_signal/serializer.py delete mode 100644 freqtrade/rpc/external_signal/types.py delete mode 100644 freqtrade/rpc/external_signal/utils.py delete mode 100644 scripts/test_ws_client.py diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index 74457d2b6..ec988687f 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -172,7 +172,18 @@ "jwt_secret_key": "somethingrandom", "CORS_origins": [], "username": "freqtrader", - "password": "SuperSecurePassword" + "password": "SuperSecurePassword", + "ws_token": "a_secret_ws_token", + "enable_message_ws": false + }, + "external_message_consumer": { + "enabled": false, + "producers": [ + { + "url": "ws://some.freqtrade.bot/api/v1/message/ws", + "ws_token": "a_secret_ws_token" + } + ] }, "bot_name": "freqtrade", "db_url": "sqlite:///tradesv3.sqlite", diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 96f8413b0..c7f2acc84 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -61,7 +61,6 @@ USERPATH_FREQAIMODELS = 'freqaimodels' TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw'] -FOLLOWER_MODE_OPTIONS = ['follower', 'leader'] WAIT_DATA_POLICY_OPTIONS = ['none', 'first', 'all'] ENV_VAR_PREFIX = 'FREQTRADE__' @@ -246,7 +245,7 @@ CONF_SCHEMA = { 'exchange': {'$ref': '#/definitions/exchange'}, 'edge': {'$ref': '#/definitions/edge'}, 'freqai': {'$ref': '#/definitions/freqai'}, - 'external_signal': {'$ref': '#/definitions/external_signal'}, + 'external_message_consumer': {'$ref': '#/definitions/external_message_consumer'}, 'experimental': { 'type': 'object', 'properties': { @@ -404,7 +403,8 @@ CONF_SCHEMA = { }, 'username': {'type': 'string'}, 'password': {'type': 'string'}, - 'api_token': {'type': 'string'}, + 'ws_token': {'type': 'string'}, + 'enable_message_ws': {'type': 'boolean', 'default': False}, 'jwt_secret_key': {'type': 'string'}, 'CORS_origins': {'type': 'array', 'items': {'type': 'string'}}, 'verbosity': {'type': 'string', 'enum': ['error', 'info']}, @@ -489,35 +489,31 @@ CONF_SCHEMA = { }, 'required': ['process_throttle_secs', 'allowed_risk'] }, - 'external_signal': { + 'external_message_consumer': { 'type': 'object', 'properties': { 'enabled': {'type': 'boolean', 'default': False}, - 'mode': { - 'type': 'string', - 'enum': FOLLOWER_MODE_OPTIONS - }, - 'api_token': {'type': 'string', 'default': ''}, - 'leaders': { + 'producers': { 'type': 'array', 'items': { 'type': 'object', 'properties': { 'url': {'type': 'string', 'default': ''}, - 'api_token': {'type': 'string', 'default': ''}, + 'ws_token': {'type': 'string', 'default': ''}, } } }, - 'follower_reply_timeout': {'type': 'integer'}, - 'follower_sleep_time': {'type': 'integer'}, - 'follower_ping_timeout': {'type': 'integer'}, + 'reply_timeout': {'type': 'integer'}, + 'sleep_time': {'type': 'integer'}, + 'ping_timeout': {'type': 'integer'}, 'wait_data_policy': { 'type': 'string', 'enum': WAIT_DATA_POLICY_OPTIONS }, + 'wait_data_timeout': {'type': 'integer', 'default': 5}, 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False} }, - 'required': ['mode'] + 'required': ['producers'] }, "freqai": { "type": "object", diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index cd70db9a3..430ee0932 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -48,11 +48,13 @@ class DataProvider: self.__msg_cache = PeriodicCache( maxsize=1000, ttl=timeframe_to_seconds(self._config.get('timeframe', '1h'))) - self._num_sources = len(self._config.get('external_signal', {}).get('leader_list', [])) - self._wait_data_policy = self._config.get('external_signal', {}).get( + self._num_sources = len( + self._config.get('external_message_consumer', {}).get('producers', []) + ) + self._wait_data_policy = self._config.get('external_message_consumer', {}).get( 'wait_data_policy', WaitDataPolicy.all) - self._wait_data_timeout = self._config.get( - 'external_signal', {}).get('wait_data_timeout', 5) + self._wait_data_timeout = self._config.get('external_message_consumer', {}).get( + 'wait_data_timeout', 5) def _set_dataframe_max_index(self, limit_index: int): """ diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index 406d847e6..229d770ce 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -3,7 +3,7 @@ from freqtrade.enums.backteststate import BacktestState from freqtrade.enums.candletype import CandleType from freqtrade.enums.exitchecktuple import ExitCheckTuple from freqtrade.enums.exittype import ExitType -from freqtrade.enums.externalsignal import ExternalSignalModeType, LeaderMessageType, WaitDataPolicy +from freqtrade.enums.externalmessages import WaitDataPolicy from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues from freqtrade.enums.rpcmessagetype import RPCMessageType, RPCRequestType diff --git a/freqtrade/enums/externalmessages.py b/freqtrade/enums/externalmessages.py new file mode 100644 index 000000000..e43899ab5 --- /dev/null +++ b/freqtrade/enums/externalmessages.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class WaitDataPolicy(str, Enum): + none = "none" + one = "one" + all = "all" diff --git a/freqtrade/enums/externalsignal.py b/freqtrade/enums/externalsignal.py deleted file mode 100644 index 05dc604a2..000000000 --- a/freqtrade/enums/externalsignal.py +++ /dev/null @@ -1,18 +0,0 @@ -from enum import Enum - - -class ExternalSignalModeType(str, Enum): - leader = "leader" - follower = "follower" - - -class LeaderMessageType(str, Enum): - default = "default" - pairlist = "pairlist" - analyzed_df = "analyzed_df" - - -class WaitDataPolicy(str, Enum): - none = "none" - one = "one" - all = "all" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index c9caaace6..c0d658c61 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -30,6 +30,7 @@ from freqtrade.plugins.pairlistmanager import PairListManager from freqtrade.plugins.protectionmanager import ProtectionManager from freqtrade.resolvers import ExchangeResolver, StrategyResolver from freqtrade.rpc import RPCManager +from freqtrade.rpc.emc import ExternalMessageConsumer from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper from freqtrade.util import FtPrecise @@ -90,11 +91,17 @@ class FreqtradeBot(LoggingMixin): self.strategy.dp = self.dataprovider # Attach Wallets to strategy instance self.strategy.wallets = self.wallets + # Attach rpc to strategy instance + self.strategy.rpc = self.rpc # Initializing Edge only if enabled self.edge = Edge(self.config, self.exchange, self.strategy) if \ self.config.get('edge', {}).get('enabled', False) else None + # Init ExternalMessageConsumer if enabled + self.emc = ExternalMessageConsumer(self.rpc._rpc, self.config) if \ + self.config.get('external_message_consumer', {}).get('enabled', False) else None + self.active_pair_whitelist = self._refresh_active_whitelist() # Set initial bot state from config @@ -150,6 +157,8 @@ class FreqtradeBot(LoggingMixin): self.check_for_open_trades() self.rpc.cleanup() + if self.emc: + self.emc.shutdown() Trade.commit() self.exchange.close() @@ -192,7 +201,11 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - self.strategy.analyze(self.active_pair_whitelist) + if self.emc: + leader_pairs = self.pairlists._whitelist + self.strategy.analyze_external(self.active_pair_whitelist, leader_pairs) + else: + self.strategy.analyze(self.active_pair_whitelist) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace @@ -255,7 +268,7 @@ class FreqtradeBot(LoggingMixin): self.pairlists.refresh_pairlist() _whitelist = self.pairlists.whitelist - self.rpc.send_msg({'type': RPCMessageType.WHITELIST, 'msg': _whitelist}) + self.rpc.send_msg({'type': RPCMessageType.WHITELIST, 'data': _whitelist}) # Calculating Edge positioning if self.edge: diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index c8d1b70fa..88bae099a 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -26,7 +26,7 @@ async def message_endpoint( # Return a channel ID, pass that instead of ws to the rest of the methods channel = await channel_manager.on_connect(ws) - # Keep connection open until explicitly closed, and sleep + # Keep connection open until explicitly closed, and process requests try: while not channel.is_closed(): request = await channel.recv() diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index f4af8c8ed..e391e66af 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -112,9 +112,6 @@ class ApiServer(RPCHandler): # Cancel the queue task self._background_task.cancel() - # Finally stop the loop - self._loop.call_soon_threadsafe(self._loop.stop) - self._thread.join() @classmethod @@ -127,7 +124,6 @@ class ApiServer(RPCHandler): def send_msg(self, msg: Dict[str, str]) -> None: if self._queue: - logger.info(f"Adding message to queue: {msg}") sync_q = self._queue.sync_q sync_q.put(msg) @@ -155,9 +151,11 @@ class ApiServer(RPCHandler): app.include_router(api_backtest, prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token)], ) - app.include_router(ws_router, prefix="/api/v1", - dependencies=[Depends(get_ws_token)] - ) + if self._config.get('api_server', {}).get('enable_message_ws', False): + logger.info("Enabling Message WebSocket") + app.include_router(ws_router, prefix="/api/v1", + dependencies=[Depends(get_ws_token)] + ) app.include_router(router_login, prefix="/api/v1", tags=["auth"]) # UI Router MUST be last! app.include_router(router_ui, prefix='') @@ -194,17 +192,19 @@ class ApiServer(RPCHandler): try: while True: - logger.debug("Getting queue data...") + logger.debug("Getting queue messages...") # Get data from queue - data = await async_queue.get() - logger.debug(f"Found data: {data}") + message = await async_queue.get() + logger.debug(f"Found message of type: {message.get('type')}") # Broadcast it - await self._channel_manager.broadcast(data) + await self._channel_manager.broadcast(message) # Sleep, make this configurable? await asyncio.sleep(0.1) except asyncio.CancelledError: - # Silently stop - pass + # Disconnect channels and stop the loop on cancel + await self._channel_manager.disconnect_all() + self._loop.stop() + # For testing, shouldn't happen when stable except Exception as e: logger.info(f"Exception happened in background task: {e}") @@ -246,7 +246,8 @@ class ApiServer(RPCHandler): if self._standalone: self._server.run() else: - self.start_message_queue() + if self._config.get('api_server', {}).get('enable_message_ws', False): + self.start_message_queue() self._server.run_in_thread() except Exception: logger.exception("Api server failed to start.") diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index f24713a77..6bc5b9d6b 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -116,8 +116,6 @@ class ChannelManager: with self._lock: channel = self.channels.get(websocket) if channel: - logger.debug(f"Disconnecting channel - {channel}") - if not channel.is_closed(): await channel.close() @@ -142,7 +140,6 @@ class ChannelManager: """ with self._lock: message_type = data.get('type') - logger.debug(f"Broadcasting data: {message_type} - {data}") for websocket, channel in self.channels.items(): try: if channel.subscribed_to(message_type): diff --git a/freqtrade/rpc/emc.py b/freqtrade/rpc/emc.py new file mode 100644 index 000000000..48ad78266 --- /dev/null +++ b/freqtrade/rpc/emc.py @@ -0,0 +1,229 @@ +""" +ExternalMessageConsumer module + +Main purpose is to connect to external bot's message websocket to consume data +from it +""" +import asyncio +import logging +import socket +from threading import Thread +from typing import Any, Dict + +import websockets + +from freqtrade.enums import RPCMessageType, RPCRequestType +from freqtrade.misc import json_to_dataframe, remove_entry_exit_signals +from freqtrade.rpc import RPC +from freqtrade.rpc.api_server.ws.channel import WebSocketChannel + + +logger = logging.getLogger(__name__) + + +class ExternalMessageConsumer: + """ + The main controller class for consuming external messages from + other FreqTrade bot's + """ + + def __init__( + self, + rpc: RPC, + config: Dict[str, Any], + ): + self._rpc = rpc + self._config = config + + self._running = False + self._thread = None + self._loop = None + self._main_task = None + self._sub_tasks = None + + self._emc_config = self._config.get('external_message_consumer', {}) + + self.enabled = self._emc_config.get('enabled', False) + self.producers = self._emc_config.get('producers', []) + + if self.enabled and len(self.producers) < 1: + raise ValueError("You must specify at least 1 Producer to connect to.") + + self.reply_timeout = self._emc_config.get('reply_timeout', 10) + self.ping_timeout = self._emc_config.get('ping_timeout', 2) + self.sleep_time = self._emc_config.get('sleep_time', 5) + + # Setting these explicitly as they probably shouldn't be changed by a user + # Unless we somehow integrate this with the strategy to allow creating + # callbacks for the messages + self.topics = [RPCMessageType.WHITELIST, RPCMessageType.ANALYZED_DF] + + self.start() + + def start(self): + """ + Start the main internal loop in another thread to run coroutines + """ + self._loop = asyncio.new_event_loop() + + if not self._thread: + logger.info("Starting ExternalMessageConsumer") + + self._thread = Thread(target=self._loop.run_forever) + self._thread.start() + self._running = True + else: + raise RuntimeError("A loop is already running") + + self._main_task = asyncio.run_coroutine_threadsafe(self._main(), loop=self._loop) + + def shutdown(self): + """ + Shutdown the loop, thread, and tasks + """ + if self._thread and self._loop: + logger.info("Stopping ExternalMessageConsumer") + + if self._sub_tasks: + # Cancel sub tasks + for task in self._sub_tasks: + task.cancel() + + if self._main_task: + # Cancel the main task + self._main_task.cancel() + + self._thread.join() + + async def _main(self): + """ + The main task coroutine + """ + rpc_lock = asyncio.Lock() + + try: + # Create a connection to each producer + self._sub_tasks = [ + self._loop.create_task(self._handle_producer_connection(producer, rpc_lock)) + for producer in self.producers + ] + + await asyncio.gather(*self._sub_tasks) + except asyncio.CancelledError: + pass + finally: + # Stop the loop once we are done + self._loop.stop() + + async def _handle_producer_connection(self, producer, lock): + """ + Main connection loop for the consumer + """ + try: + while True: + try: + url, token = producer['url'], producer['ws_token'] + ws_url = f"{url}?token={token}" + + async with websockets.connect(ws_url) as ws: + logger.info("Connection successful") + channel = WebSocketChannel(ws) + + # Tell the producer we only want these topics + # Should always be the first thing we send + await channel.send( + self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) + ) + + # Now receive data, if none is within the time limit, ping + while True: + try: + message = await asyncio.wait_for( + channel.recv(), + timeout=5 + ) + + async with lock: + # Handle the data here + # We use a lock because it will call RPC methods + self.handle_producer_message(message) + + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Check the connection and continue. + try: + # ping + ping = await channel.ping() + + await asyncio.wait_for(ping, timeout=self.ping_timeout) + logger.debug(f"Connection to {url} still alive...") + + continue + except Exception: + logger.info( + f"Ping error {url} - retrying in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + + break + except ( + socket.gaierror, + ConnectionRefusedError, + websockets.exceptions.InvalidStatusCode + ) as e: + logger.error(f"Connection Refused - {e} retrying in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + + continue + + except asyncio.CancelledError: + # Exit silently + pass + + def compose_consumer_request(self, type_: str, data: Any) -> Dict[str, Any]: + """ + Create a request for sending to a producer + + :param type_: The RPCRequestType + :param data: The data to send + :returns: Dict[str, Any] + """ + return {'type': type_, 'data': data} + + # How we do things here isn't set in stone. There seems to be some interest + # in figuring out a better way, but we shall do this for now. + def handle_producer_message(self, message: Dict[str, Any]): + """ + Handles external messages from a Producer + """ + # Should we have a default message type? + message_type = message.get('type', RPCMessageType.STATUS) + message_data = message.get('data') + + logger.debug(f"Received message of type {message_type}") + + # Handle Whitelists + if message_type == RPCMessageType.WHITELIST: + pairlist = message_data + + # Add the pairlist data to the ExternalPairlist plugin + external_pairlist = self._rpc._freqtrade.pairlists._pairlist_handlers[0] + external_pairlist.add_pairlist_data(pairlist) + + # Handle analyzed dataframes + elif message_type == RPCMessageType.ANALYZED_DF: + # This shouldn't happen + if message_data is None: + return + + key, value = message_data.get('key'), message_data.get('data') + pair, timeframe, candle_type = key + + # Convert the JSON to a pandas DataFrame + dataframe = json_to_dataframe(value) + + # If set, remove the Entry and Exit signals from the Producer + if self._emc_config.get('remove_entry_exit_signals', False): + dataframe = remove_entry_exit_signals(dataframe) + + # Add the dataframe to the dataprovider + dataprovider = self._rpc._freqtrade.dataprovider + dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) diff --git a/freqtrade/rpc/external_signal/__init__.py b/freqtrade/rpc/external_signal/__init__.py deleted file mode 100644 index decc51551..000000000 --- a/freqtrade/rpc/external_signal/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# # flake8: noqa: F401 -# from freqtrade.rpc.external_signal.controller import ExternalSignalController -# -# -# __all__ = ('ExternalSignalController') diff --git a/freqtrade/rpc/external_signal/channel.py b/freqtrade/rpc/external_signal/channel.py deleted file mode 100644 index 5b278dfed..000000000 --- a/freqtrade/rpc/external_signal/channel.py +++ /dev/null @@ -1,145 +0,0 @@ -# import logging -# from threading import RLock -# from typing import Type -# -# from freqtrade.rpc.external_signal.proxy import WebSocketProxy -# from freqtrade.rpc.external_signal.serializer import MsgPackWebSocketSerializer -# from freqtrade.rpc.external_signal.types import WebSocketType -# -# -# logger = logging.getLogger(__name__) -# -# -# class WebSocketChannel: -# """ -# Object to help facilitate managing a websocket connection -# """ -# -# def __init__( -# self, -# websocket: WebSocketType, -# serializer_cls: Type[WebSocketSerializer] = MsgPackWebSocketSerializer -# ): -# # The WebSocket object -# self._websocket = WebSocketProxy(websocket) -# # The Serializing class for the WebSocket object -# self._serializer_cls = serializer_cls -# -# # Internal event to signify a closed websocket -# self._closed = False -# -# # Wrap the WebSocket in the Serializing class -# self._wrapped_ws = self._serializer_cls(self._websocket) -# -# async def send(self, data): -# """ -# Send data on the wrapped websocket -# """ -# # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") -# await self._wrapped_ws.send(data) -# -# async def recv(self): -# """ -# Receive data on the wrapped websocket -# """ -# return await self._wrapped_ws.recv() -# -# async def ping(self): -# """ -# Ping the websocket -# """ -# return await self._websocket.ping() -# -# async def close(self): -# """ -# Close the WebSocketChannel -# """ -# -# self._closed = True -# -# def is_closed(self): -# return self._closed -# -# -# class ChannelManager: -# def __init__(self): -# self.channels = dict() -# self._lock = RLock() # Re-entrant Lock -# -# async def on_connect(self, websocket: WebSocketType): -# """ -# Wrap websocket connection into Channel and add to list -# -# :param websocket: The WebSocket object to attach to the Channel -# """ -# if hasattr(websocket, "accept"): -# try: -# await websocket.accept() -# except RuntimeError: -# # The connection was closed before we could accept it -# return -# -# ws_channel = WebSocketChannel(websocket) -# -# with self._lock: -# self.channels[websocket] = ws_channel -# -# return ws_channel -# -# async def on_disconnect(self, websocket: WebSocketType): -# """ -# Call close on the channel if it's not, and remove from channel list -# -# :param websocket: The WebSocket objet attached to the Channel -# """ -# with self._lock: -# channel = self.channels.get(websocket) -# if channel: -# logger.debug(f"Disconnecting channel - {channel}") -# -# if not channel.is_closed(): -# await channel.close() -# -# del self.channels[websocket] -# -# async def disconnect_all(self): -# """ -# Disconnect all Channels -# """ -# with self._lock: -# for websocket, channel in self.channels.items(): -# if not channel.is_closed(): -# await channel.close() -# -# self.channels = dict() -# -# async def broadcast(self, data): -# """ -# Broadcast data on all Channels -# -# :param data: The data to send -# """ -# with self._lock: -# for websocket, channel in self.channels.items(): -# try: -# await channel.send(data) -# except RuntimeError: -# # Handle cannot send after close cases -# await self.on_disconnect(websocket) -# -# async def send_direct(self, channel, data): -# """ -# Send data directly through direct_channel only -# -# :param direct_channel: The WebSocketChannel object to send data through -# :param data: The data to send -# """ -# # We iterate over the channels to get reference to the websocket object -# # so we can disconnect incase of failure -# await channel.send(data) -# -# def has_channels(self): -# """ -# Flag for more than 0 channels -# """ -# return len(self.channels) > 0 diff --git a/freqtrade/rpc/external_signal/controller.py b/freqtrade/rpc/external_signal/controller.py deleted file mode 100644 index 616ea7801..000000000 --- a/freqtrade/rpc/external_signal/controller.py +++ /dev/null @@ -1,449 +0,0 @@ -# """ -# This module manages replicate mode communication -# """ -# import asyncio -# import logging -# import secrets -# import socket -# from threading import Thread -# from typing import Any, Callable, Coroutine, Dict, Union -# -# import websockets -# from fastapi import Depends -# from fastapi import WebSocket as FastAPIWebSocket -# from fastapi import WebSocketDisconnect, status -# from janus import Queue as ThreadedQueue -# -# from freqtrade.enums import ExternalSignalModeType, LeaderMessageType, RPCMessageType -# from freqtrade.rpc import RPC, RPCHandler -# from freqtrade.rpc.external_signal.channel import ChannelManager -# from freqtrade.rpc.external_signal.types import MessageType -# from freqtrade.rpc.external_signal.utils import is_websocket_alive -# -# -# logger = logging.getLogger(__name__) -# -# -# class ExternalSignalController(RPCHandler): -# """ This class handles all websocket communication """ -# -# def __init__( -# self, -# rpc: RPC, -# config: Dict[str, Any], -# api_server: Union[Any, None] = None -# ) -> None: -# """ -# Init the ExternalSignalController class, and init the super class RPCHandler -# :param rpc: instance of RPC Helper class -# :param config: Configuration object -# :param api_server: The ApiServer object -# :return: None -# """ -# super().__init__(rpc, config) -# -# self.freqtrade = rpc._freqtrade -# self.api_server = api_server -# -# if not self.api_server: -# raise RuntimeError("The API server must be enabled for external signals to work") -# -# self._loop = None -# self._running = False -# self._thread = None -# self._queue = None -# -# self._main_task = None -# self._sub_tasks = None -# -# self._message_handlers = { -# LeaderMessageType.pairlist: self._rpc._handle_pairlist_message, -# LeaderMessageType.analyzed_df: self._rpc._handle_analyzed_df_message, -# LeaderMessageType.default: self._rpc._handle_default_message -# } -# -# self.channel_manager = ChannelManager() -# self.external_signal_config = config.get('external_signal', {}) -# -# # What the config should look like -# # "external_signal": { -# # "enabled": true, -# # "mode": "follower", -# # "leaders": [ -# # { -# # "url": "ws://localhost:8080/signals/ws", -# # "api_token": "test" -# # } -# # ] -# # } -# -# # "external_signal": { -# # "enabled": true, -# # "mode": "leader", -# # "api_token": "test" -# # } -# -# self.mode = ExternalSignalModeType[ -# self.external_signal_config.get('mode', 'leader').lower() -# ] -# -# self.leaders_list = self.external_signal_config.get('leaders', []) -# self.push_throttle_secs = self.external_signal_config.get('push_throttle_secs', 0.1) -# -# self.reply_timeout = self.external_signal_config.get('follower_reply_timeout', 10) -# self.ping_timeout = self.external_signal_config.get('follower_ping_timeout', 2) -# self.sleep_time = self.external_signal_config.get('follower_sleep_time', 5) -# -# # Validate external_signal_config here? -# -# if self.mode == ExternalSignalModeType.follower and len(self.leaders_list) == 0: -# raise ValueError("You must specify at least 1 leader in follower mode.") -# -# # This is only used by the leader, the followers use the tokens specified -# # in each of the leaders -# # If you do not specify an API key in the config, one will be randomly -# # generated and logged on startup -# default_api_key = secrets.token_urlsafe(16) -# self.secret_api_key = self.external_signal_config.get('api_token', default_api_key) -# -# self.start() -# -# def is_leader(self): -# """ -# Leader flag -# """ -# return self.enabled() and self.mode == ExternalSignalModeType.leader -# -# def enabled(self): -# """ -# Enabled flag -# """ -# return self.external_signal_config.get('enabled', False) -# -# def num_leaders(self): -# """ -# The number of leaders we should be connected to -# """ -# return len(self.leaders_list) -# -# def start_threaded_loop(self): -# """ -# Start the main internal loop in another thread to run coroutines -# """ -# self._loop = asyncio.new_event_loop() -# -# if not self._thread: -# self._thread = Thread(target=self._loop.run_forever) -# self._thread.start() -# self._running = True -# else: -# raise RuntimeError("A loop is already running") -# -# def submit_coroutine(self, coroutine: Coroutine): -# """ -# Submit a coroutine to the threaded loop -# """ -# if not self._running: -# raise RuntimeError("Cannot schedule new futures after shutdown") -# -# if not self._loop or not self._loop.is_running(): -# raise RuntimeError("Loop must be started before any function can" -# " be submitted") -# -# return asyncio.run_coroutine_threadsafe(coroutine, self._loop) -# -# def start(self): -# """ -# Start the controller main loop -# """ -# self.start_threaded_loop() -# self._main_task = self.submit_coroutine(self.main()) -# -# async def shutdown(self): -# """ -# Shutdown all tasks and close up -# """ -# logger.info("Stopping rpc.externalsignalcontroller") -# -# # Flip running flag -# self._running = False -# -# # Cancel sub tasks -# for task in self._sub_tasks: -# task.cancel() -# -# # Then disconnect all channels -# await self.channel_manager.disconnect_all() -# -# def cleanup(self) -> None: -# """ -# Cleanup pending module resources. -# """ -# if self._thread: -# if self._loop.is_running(): -# self._main_task.cancel() -# self._thread.join() -# -# async def main(self): -# """ -# Main coro -# -# Start the loop based on what mode we're in -# """ -# try: -# if self.mode == ExternalSignalModeType.leader: -# logger.info("Starting rpc.externalsignalcontroller in Leader mode") -# -# await self.run_leader_mode() -# elif self.mode == ExternalSignalModeType.follower: -# logger.info("Starting rpc.externalsignalcontroller in Follower mode") -# -# await self.run_follower_mode() -# -# except asyncio.CancelledError: -# # We're cancelled -# await self.shutdown() -# except Exception as e: -# # Log the error -# logger.error(f"Exception occurred in main task: {e}") -# logger.exception(e) -# finally: -# # This coroutine is the last thing to be ended, so it should stop the loop -# self._loop.stop() -# -# def log_api_token(self): -# """ -# Log the API token -# """ -# logger.info("-" * 15) -# logger.info(f"API_KEY: {self.secret_api_key}") -# logger.info("-" * 15) -# -# def send_msg(self, msg: MessageType) -> None: -# """ -# Support RPC calls -# """ -# if msg["type"] == RPCMessageType.EMIT_DATA: -# message = msg.get("message") -# if message: -# self.send_message(message) -# else: -# logger.error(f"Message is empty! {msg}") -# -# def send_message(self, msg: MessageType) -> None: -# """ -# Broadcast message over all channels if there are any -# """ -# -# if self.channel_manager.has_channels(): -# self._send_message(msg) -# else: -# logger.debug("No listening followers, skipping...") -# pass -# -# def _send_message(self, msg: MessageType): -# """ -# Add data to the internal queue to be broadcasted. This func will block -# if the queue is full. This is meant to be called in the main thread. -# """ -# if self._queue: -# queue = self._queue.sync_q -# queue.put(msg) # This will block if the queue is full -# else: -# logger.warning("Can not send data, leader loop has not started yet!") -# -# async def send_initial_data(self, channel): -# logger.info("Sending initial data through channel") -# -# data = self._rpc._initial_leader_data() -# -# for message in data: -# await channel.send(message) -# -# async def _handle_leader_message(self, message: MessageType): -# """ -# Handle message received from a Leader -# """ -# type = message.get("data_type", LeaderMessageType.default) -# data = message.get("data") -# -# handler: Callable = self._message_handlers[type] -# handler(type, data) -# -# # ---------------------------------------------------------------------- -# -# async def run_leader_mode(self): -# """ -# Main leader coroutine -# -# This starts all of the leader coros and registers the endpoint on -# the ApiServer -# """ -# self.register_leader_endpoint() -# self.log_api_token() -# -# self._sub_tasks = [ -# self._loop.create_task(self._broadcast_queue_data()) -# ] -# -# return await asyncio.gather(*self._sub_tasks) -# -# async def run_follower_mode(self): -# """ -# Main follower coroutine -# -# This starts all of the follower connection coros -# """ -# -# rpc_lock = asyncio.Lock() -# -# self._sub_tasks = [ -# self._loop.create_task(self._handle_leader_connection(leader, rpc_lock)) -# for leader in self.leaders_list -# ] -# -# return await asyncio.gather(*self._sub_tasks) -# -# async def _broadcast_queue_data(self): -# """ -# Loop over queue data and broadcast it -# """ -# # Instantiate the queue in this coroutine so it's attached to our loop -# self._queue = ThreadedQueue() -# async_queue = self._queue.async_q -# -# try: -# while self._running: -# # Get data from queue -# data = await async_queue.get() -# -# # Broadcast it to everyone -# await self.channel_manager.broadcast(data) -# -# # Sleep -# await asyncio.sleep(self.push_throttle_secs) -# -# except asyncio.CancelledError: -# # Silently stop -# pass -# -# async def get_api_token( -# self, -# websocket: FastAPIWebSocket, -# token: Union[str, None] = None -# ): -# """ -# Extract the API key from query param. Must match the -# set secret_api_key or the websocket connection will be closed. -# """ -# if token == self.secret_api_key: -# return token -# else: -# logger.info("Denying websocket request...") -# await websocket.close(code=status.WS_1008_POLICY_VIOLATION) -# -# def register_leader_endpoint(self, path: str = "/signals/ws"): -# """ -# Attach and start the main leader loop to the ApiServer -# -# :param path: The endpoint path -# """ -# if not self.api_server: -# raise RuntimeError("The leader needs the ApiServer to be active") -# -# # The endpoint function for running the main leader loop -# @self.api_server.app.websocket(path) -# async def leader_endpoint( -# websocket: FastAPIWebSocket, -# api_key: str = Depends(self.get_api_token) -# ): -# await self.leader_endpoint_loop(websocket) -# -# async def leader_endpoint_loop(self, websocket: FastAPIWebSocket): -# """ -# The WebSocket endpoint served by the ApiServer. This handles connections, -# and adding them to the channel manager. -# """ -# try: -# if is_websocket_alive(websocket): -# logger.info(f"Follower connected - {websocket.client}") -# channel = await self.channel_manager.on_connect(websocket) -# -# # Send initial data here -# # Data is being broadcasted right away as soon as startup, -# # we may not have to send initial data at all. Further testing -# # required. -# await self.send_initial_data(channel) -# -# # Keep connection open until explicitly closed, and sleep -# try: -# while not channel.is_closed(): -# request = await channel.recv() -# logger.info(f"Follower request - {request}") -# -# except WebSocketDisconnect: -# # Handle client disconnects -# logger.info(f"Follower disconnected - {websocket.client}") -# await self.channel_manager.on_disconnect(websocket) -# except Exception as e: -# logger.info(f"Follower connection failed - {websocket.client}") -# logger.exception(e) -# # Handle cases like - -# # RuntimeError('Cannot call "send" once a closed message has been sent') -# await self.channel_manager.on_disconnect(websocket) -# -# except Exception: -# logger.error(f"Failed to serve - {websocket.client}") -# await self.channel_manager.on_disconnect(websocket) -# -# async def _handle_leader_connection(self, leader, lock): -# """ -# Given a leader, connect and wait on data. If connection is lost, -# it will attempt to reconnect. -# """ -# try: -# url, token = leader["url"], leader["api_token"] -# websocket_url = f"{url}?token={token}" -# -# logger.info(f"Attempting to connect to Leader at: {url}") -# while True: -# try: -# async with websockets.connect(websocket_url) as ws: -# channel = await self.channel_manager.on_connect(ws) -# logger.info(f"Connection to Leader at {url} successful") -# while True: -# try: -# data = await asyncio.wait_for( -# channel.recv(), -# timeout=self.reply_timeout -# ) -# except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): -# # We haven't received data yet. Check the connection and continue. -# try: -# # ping -# ping = await channel.ping() -# await asyncio.wait_for(ping, timeout=self.ping_timeout) -# logger.debug(f"Connection to {url} still alive...") -# continue -# except Exception: -# logger.info( -# f"Ping error {url} - retrying in {self.sleep_time}s") -# asyncio.sleep(self.sleep_time) -# break -# -# async with lock: -# # Acquire lock so only 1 coro handling at a time -# # as we call the RPC module in the main thread -# await self._handle_leader_message(data) -# -# except (socket.gaierror, ConnectionRefusedError): -# logger.info(f"Connection Refused - retrying connection in {self.sleep_time}s") -# await asyncio.sleep(self.sleep_time) -# continue -# except websockets.exceptions.InvalidStatusCode as e: -# logger.error(f"Connection Refused - {e}") -# await asyncio.sleep(self.sleep_time) -# continue -# -# except asyncio.CancelledError: -# pass diff --git a/freqtrade/rpc/external_signal/proxy.py b/freqtrade/rpc/external_signal/proxy.py deleted file mode 100644 index df2a07da0..000000000 --- a/freqtrade/rpc/external_signal/proxy.py +++ /dev/null @@ -1,61 +0,0 @@ -# from typing import Union -# -# from fastapi import WebSocket as FastAPIWebSocket -# from websockets import WebSocketClientProtocol as WebSocket -# -# from freqtrade.rpc.external_signal.types import WebSocketType -# -# -# class WebSocketProxy: -# """ -# WebSocketProxy object to bring the FastAPIWebSocket and websockets.WebSocketClientProtocol -# under the same API -# """ -# -# def __init__(self, websocket: WebSocketType): -# self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket -# -# async def send(self, data): -# """ -# Send data on the wrapped websocket -# """ -# if isinstance(data, str): -# data = data.encode() -# -# if hasattr(self._websocket, "send_bytes"): -# await self._websocket.send_bytes(data) -# else: -# await self._websocket.send(data) -# -# async def recv(self): -# """ -# Receive data on the wrapped websocket -# """ -# if hasattr(self._websocket, "receive_bytes"): -# return await self._websocket.receive_bytes() -# else: -# return await self._websocket.recv() -# -# async def ping(self): -# """ -# Ping the websocket, not supported by FastAPI WebSockets -# """ -# if hasattr(self._websocket, "ping"): -# return await self._websocket.ping() -# return False -# -# async def close(self, code: int = 1000): -# """ -# Close the websocket connection, only supported by FastAPI WebSockets -# """ -# if hasattr(self._websocket, "close"): -# return await self._websocket.close(code) -# pass -# -# async def accept(self): -# """ -# Accept the WebSocket connection, only support by FastAPI WebSockets -# """ -# if hasattr(self._websocket, "accept"): -# return await self._websocket.accept() -# pass diff --git a/freqtrade/rpc/external_signal/serializer.py b/freqtrade/rpc/external_signal/serializer.py deleted file mode 100644 index a23469ef4..000000000 --- a/freqtrade/rpc/external_signal/serializer.py +++ /dev/null @@ -1,65 +0,0 @@ -# import json -# import logging -# from abc import ABC, abstractmethod -# -# import msgpack -# import orjson -# -# from freqtrade.rpc.external_signal.proxy import WebSocketProxy -# -# -# logger = logging.getLogger(__name__) -# -# -# class WebSocketSerializer(ABC): -# def __init__(self, websocket: WebSocketProxy): -# self._websocket: WebSocketProxy = websocket -# -# @abstractmethod -# def _serialize(self, data): -# raise NotImplementedError() -# -# @abstractmethod -# def _deserialize(self, data): -# raise NotImplementedError() -# -# async def send(self, data: bytes): -# await self._websocket.send(self._serialize(data)) -# -# async def recv(self) -> bytes: -# data = await self._websocket.recv() -# -# return self._deserialize(data) -# -# async def close(self, code: int = 1000): -# await self._websocket.close(code) -# -# # Going to explore using MsgPack as the serialization, -# # as that might be the best method for sending pandas -# # dataframes over the wire -# -# -# class JSONWebSocketSerializer(WebSocketSerializer): -# def _serialize(self, data): -# return json.dumps(data) -# -# def _deserialize(self, data): -# return json.loads(data) -# -# -# class ORJSONWebSocketSerializer(WebSocketSerializer): -# ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY -# -# def _serialize(self, data): -# return orjson.dumps(data, option=self.ORJSON_OPTIONS) -# -# def _deserialize(self, data): -# return orjson.loads(data, option=self.ORJSON_OPTIONS) -# -# -# class MsgPackWebSocketSerializer(WebSocketSerializer): -# def _serialize(self, data): -# return msgpack.packb(data, use_bin_type=True) -# -# def _deserialize(self, data): -# return msgpack.unpackb(data, raw=False) diff --git a/freqtrade/rpc/external_signal/types.py b/freqtrade/rpc/external_signal/types.py deleted file mode 100644 index 38e43f667..000000000 --- a/freqtrade/rpc/external_signal/types.py +++ /dev/null @@ -1,8 +0,0 @@ -# from typing import Any, Dict, TypeVar -# -# from fastapi import WebSocket as FastAPIWebSocket -# from websockets import WebSocketClientProtocol as WebSocket -# -# -# WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) -# MessageType = Dict[str, Any] diff --git a/freqtrade/rpc/external_signal/utils.py b/freqtrade/rpc/external_signal/utils.py deleted file mode 100644 index 72c8d2ef8..000000000 --- a/freqtrade/rpc/external_signal/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -# from starlette.websockets import WebSocket, WebSocketState -# -# -# async def is_websocket_alive(ws: WebSocket) -> bool: -# if ( -# ws.application_state == WebSocketState.CONNECTED and -# ws.client_state == WebSocketState.CONNECTED -# ): -# return True -# return False diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index f684c7783..a41d08d55 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1099,65 +1099,3 @@ class RPC: if all([any(x.value == topic for x in RPCMessageType) for topic in data]): logger.debug(f"{channel} subscribed to topics: {data}") channel.set_subscriptions(data) - # - # # ------------------------------ EXTERNAL SIGNALS ----------------------- - # - # def _initial_leader_data(self): - # # We create a list of Messages to send to the follower on connect - # data = [] - # - # # Send Pairlist data - # data.append({ - # "data_type": LeaderMessageType.pairlist, - # "data": self._freqtrade.pairlists._whitelist - # }) - # - # return data - # - # def _handle_pairlist_message(self, type, data): - # """ - # Handles the emitted pairlists from the Leaders - # - # :param type: The data_type of the data - # :param data: The data - # """ - # pairlist = data - # - # logger.debug(f"Handling Pairlist message: {pairlist}") - # - # external_pairlist = self._freqtrade.pairlists._pairlist_handlers[0] - # external_pairlist.add_pairlist_data(pairlist) - # - # def _handle_analyzed_df_message(self, type, data): - # """ - # Handles the analyzed dataframes from the Leaders - # - # :param type: The data_type of the data - # :param data: The data - # """ - # key, value = data["key"], data["value"] - # pair, timeframe, candle_type = key - # - # # Skip any pairs that we don't have in the pairlist? - # # leader_pairlist = self._freqtrade.pairlists._whitelist - # # if pair not in leader_pairlist: - # # return - # - # dataframe = json_to_dataframe(value) - # - # if self._config.get('external_signal', {}).get('remove_signals_analyzed_df', False): - # dataframe = remove_entry_exit_signals(dataframe) - # - # logger.debug(f"Handling analyzed dataframe for {pair}") - # logger.debug(dataframe.tail()) - # - # # Add the dataframe to the dataprovider - # dataprovider = self._freqtrade.dataprovider - # dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) - # - # def _handle_default_message(self, type, data): - # """ - # Default leader message handler, just logs it. We should never have to - # run this unless the leader sends us some weird message. - # """ - # logger.debug(f"Received message from Leader of type {type}: {data}") diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index b3cd5604c..3488a6e3c 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -78,7 +78,9 @@ class RPCManager: 'status': 'stopping bot' } """ - logger.info('Sending rpc message: %s', msg) + # Removed actually showing the message because the logs would be + # completely spammed of the json dataframe + logger.info('Sending rpc message of type: %s', msg.get('type')) if 'pair' in msg: msg.update({ 'base_currency': self._rpc._freqtrade.exchange.get_pair_base_currency(msg['pair']) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 22a10b4d3..7120928ff 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -5,19 +5,21 @@ This module defines the interface to apply for strategies import logging from abc import ABC, abstractmethod from datetime import datetime, timedelta, timezone -from typing import Callable, Dict, List, Optional, Tuple, Union +from typing import Dict, List, Optional, Tuple, Union import arrow from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, SignalTagType, - SignalType, TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, SignalDirection, + SignalTagType, SignalType, TradingMode) from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds +from freqtrade.misc import dataframe_to_json, remove_entry_exit_signals from freqtrade.persistence import Order, PairLocks, Trade +from freqtrade.rpc import RPCManager from freqtrade.strategy.hyper import HyperStrategyMixin from freqtrade.strategy.informative_decorator import (InformativeData, PopulateIndicators, _create_and_merge_informative_pair, @@ -111,6 +113,7 @@ class IStrategy(ABC, HyperStrategyMixin): # and wallets - access to the current balance. dp: DataProvider wallets: Optional[Wallets] = None + rpc: RPCManager # Filled from configuration stake_currency: str # container variable for strategy source code @@ -702,8 +705,7 @@ class IStrategy(ABC, HyperStrategyMixin): self, dataframe: DataFrame, metadata: dict, - external_data: bool = False, - finish_callback: Optional[Callable] = None, + external_data: bool = False ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame @@ -729,17 +731,20 @@ class IStrategy(ABC, HyperStrategyMixin): candle_type = self.config.get('candle_type_def', CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) - if finish_callback: - finish_callback(pair, dataframe, self.timeframe, candle_type) + if not external_data: + self.rpc.send_msg( + { + 'type': RPCMessageType.ANALYZED_DF, + 'data': { + 'key': (pair, self.timeframe, candle_type), + 'value': dataframe_to_json(dataframe) + } + } + ) else: logger.debug("Skipping TA Analysis for already analyzed candle") - dataframe[SignalType.ENTER_LONG.value] = 0 - dataframe[SignalType.EXIT_LONG.value] = 0 - dataframe[SignalType.ENTER_SHORT.value] = 0 - dataframe[SignalType.EXIT_SHORT.value] = 0 - dataframe[SignalTagType.ENTER_TAG.value] = None - dataframe[SignalTagType.EXIT_TAG.value] = None + dataframe = remove_entry_exit_signals(dataframe) logger.debug("Loop Analysis Launched") @@ -748,8 +753,7 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze_pair( self, pair: str, - external_data: bool = False, - finish_callback: Optional[Callable] = None, + external_data: bool = False ) -> None: """ Fetch data for this pair from dataprovider and analyze. @@ -773,7 +777,7 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = strategy_safe_wrapper( self._analyze_ticker_internal, message="" - )(dataframe, {'pair': pair}, external_data, finish_callback) + )(dataframe, {'pair': pair}, external_data) self.assert_df(dataframe, df_len, df_close, df_date) except StrategyError as error: @@ -786,15 +790,14 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze( self, - pairs: List[str], - finish_callback: Optional[Callable] = None + pairs: List[str] ) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze """ for pair in pairs: - self.analyze_pair(pair, finish_callback=finish_callback) + self.analyze_pair(pair) def analyze_external(self, pairs: List[str], leader_pairs: List[str]) -> None: """ @@ -808,10 +811,10 @@ class IStrategy(ABC, HyperStrategyMixin): # them normally. # List order is not preserved when doing this! # We use ^ instead of - for symmetric difference - # What do we do with these? extra_pairs = list(set(pairs) ^ set(leader_pairs)) # These would be the pairs that we have trades in, which means # we would have to analyze them normally + # Eventually maybe request data from the Leader if we don't have it? for pair in leader_pairs: # Analyze the pairs, but get the dataframe from the external data diff --git a/scripts/test_ws_client.py b/scripts/test_ws_client.py deleted file mode 100644 index 872ff3ccf..000000000 --- a/scripts/test_ws_client.py +++ /dev/null @@ -1,74 +0,0 @@ -import asyncio -import logging -import socket -from typing import Any - -import websockets - -from freqtrade.enums import RPCMessageType -from freqtrade.rpc.api_server.ws.channel import WebSocketChannel - - -logging.basicConfig(level=logging.DEBUG) -logger = logging.getLogger(__name__) - - -def compose_consumer_request(type_: str, data: Any): - return {"type": type_, "data": data} - - -async def _client(): - # Trying to recreate multiple topic issue. Wait until first whitelist message, - # then CTRL-C to get the status message. - topics = [RPCMessageType.WHITELIST, RPCMessageType.STATUS] - try: - while True: - try: - url = "ws://localhost:8080/api/v1/message/ws?token=testtoken" - async with websockets.connect(url) as ws: - channel = WebSocketChannel(ws) - - logger.info("Connection successful") - # Tell the producer we only want these topics - await channel.send(compose_consumer_request("subscribe", topics)) - - while True: - try: - data = await asyncio.wait_for( - channel.recv(), - timeout=5 - ) - logger.info(f"Data received - {data}") - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): - # We haven't received data yet. Check the connection and continue. - try: - # ping - ping = await channel.ping() - await asyncio.wait_for(ping, timeout=2) - logger.debug(f"Connection to {url} still alive...") - continue - except Exception: - logger.info( - f"Ping error {url} - retrying in 5s") - await asyncio.sleep(2) - break - - except (socket.gaierror, ConnectionRefusedError): - logger.info("Connection Refused - retrying connection in 5s") - await asyncio.sleep(2) - continue - except websockets.exceptions.InvalidStatusCode as e: - logger.error(f"Connection Refused - {e}") - await asyncio.sleep(2) - continue - - except (asyncio.CancelledError, KeyboardInterrupt): - pass - - -def main(): - asyncio.run(_client()) - - -if __name__ == "__main__": - main() From ddc45ce2ebe57c670a6419a724cc10b7b127e7ad Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 30 Aug 2022 19:30:14 -0600 Subject: [PATCH 058/437] message handling fix, data waiting fix --- freqtrade/data/dataprovider.py | 5 ++++- freqtrade/rpc/emc.py | 25 +++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 430ee0932..2d473683c 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -168,7 +168,10 @@ class DataProvider: timeout_str = f"for {timeout} seconds" if timeout > 0 else "indefinitely" logger.debug(f"Waiting for external data on {pair} for {timeout_str}") - pair_event.wait(timeout=timeout) + if timeout > 0: + pair_event.wait(timeout=timeout) + else: + pair_event.wait() def add_pairlisthandler(self, pairlists) -> None: """ diff --git a/freqtrade/rpc/emc.py b/freqtrade/rpc/emc.py index 48ad78266..ee4d9e6b8 100644 --- a/freqtrade/rpc/emc.py +++ b/freqtrade/rpc/emc.py @@ -164,6 +164,9 @@ class ExternalMessageConsumer: await asyncio.sleep(self.sleep_time) break + except Exception as e: + logger.exception(e) + continue except ( socket.gaierror, ConnectionRefusedError, @@ -214,16 +217,18 @@ class ExternalMessageConsumer: if message_data is None: return - key, value = message_data.get('key'), message_data.get('data') - pair, timeframe, candle_type = key + key, value = message_data.get('key'), message_data.get('value') - # Convert the JSON to a pandas DataFrame - dataframe = json_to_dataframe(value) + if key and value: + pair, timeframe, candle_type = key - # If set, remove the Entry and Exit signals from the Producer - if self._emc_config.get('remove_entry_exit_signals', False): - dataframe = remove_entry_exit_signals(dataframe) + # Convert the JSON to a pandas DataFrame + dataframe = json_to_dataframe(value) - # Add the dataframe to the dataprovider - dataprovider = self._rpc._freqtrade.dataprovider - dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) + # If set, remove the Entry and Exit signals from the Producer + if self._emc_config.get('remove_entry_exit_signals', False): + dataframe = remove_entry_exit_signals(dataframe) + + # Add the dataframe to the dataprovider + dataprovider = self._rpc._freqtrade.dataprovider + dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) From 115a901773c63cb4d207e6039e9bed05f260ef7f Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 30 Aug 2022 19:34:43 -0600 Subject: [PATCH 059/437] minor fix for conditional in handle func --- freqtrade/rpc/emc.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/rpc/emc.py b/freqtrade/rpc/emc.py index ee4d9e6b8..42061079a 100644 --- a/freqtrade/rpc/emc.py +++ b/freqtrade/rpc/emc.py @@ -201,6 +201,10 @@ class ExternalMessageConsumer: message_type = message.get('type', RPCMessageType.STATUS) message_data = message.get('data') + # We shouldn't get empty messages + if message_data is None: + return + logger.debug(f"Received message of type {message_type}") # Handle Whitelists @@ -213,10 +217,6 @@ class ExternalMessageConsumer: # Handle analyzed dataframes elif message_type == RPCMessageType.ANALYZED_DF: - # This shouldn't happen - if message_data is None: - return - key, value = message_data.get('key'), message_data.get('value') if key and value: From 4aec2db14dadb7e2fec6a6d883a6a7f3e48dd311 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 31 Aug 2022 08:18:28 +0000 Subject: [PATCH 060/437] Remove isClose from tests in favor of pytest.approx --- tests/data/test_btanalysis.py | 5 ++- tests/exchange/test_exchange.py | 45 ++++++++++++------------- tests/leverage/test_interest.py | 6 ++-- tests/strategy/test_strategy_helpers.py | 4 +-- tests/test_persistence.py | 7 ++-- 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/tests/data/test_btanalysis.py b/tests/data/test_btanalysis.py index 977140ebb..72084d067 100644 --- a/tests/data/test_btanalysis.py +++ b/tests/data/test_btanalysis.py @@ -1,4 +1,3 @@ -from math import isclose from pathlib import Path from unittest.mock import MagicMock @@ -269,7 +268,7 @@ def test_create_cum_profit(testdatadir): "cum_profits", timeframe="5m") assert "cum_profits" in cum_profits.columns assert cum_profits.iloc[0]['cum_profits'] == 0 - assert isclose(cum_profits.iloc[-1]['cum_profits'], 8.723007518796964e-06) + assert pytest.approx(cum_profits.iloc[-1]['cum_profits']) == 8.723007518796964e-06 def test_create_cum_profit1(testdatadir): @@ -287,7 +286,7 @@ def test_create_cum_profit1(testdatadir): "cum_profits", timeframe="5m") assert "cum_profits" in cum_profits.columns assert cum_profits.iloc[0]['cum_profits'] == 0 - assert isclose(cum_profits.iloc[-1]['cum_profits'], 8.723007518796964e-06) + assert pytest.approx(cum_profits.iloc[-1]['cum_profits']) == 8.723007518796964e-06 with pytest.raises(ValueError, match='Trade dataframe empty.'): create_cum_profit(df.set_index('date'), bt_data[bt_data["pair"] == 'NOTAPAIR'], diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 800aa5381..5456b3098 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -2,7 +2,6 @@ import copy import logging from copy import deepcopy from datetime import datetime, timedelta, timezone -from math import isclose from random import randint from unittest.mock import MagicMock, Mock, PropertyMock, patch @@ -407,10 +406,10 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: # min result = exchange.get_min_pair_stake_amount('ETH/BTC', 1, stoploss) expected_result = 2 * (1 + 0.05) / (1 - abs(stoploss)) - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 1, stoploss, 3.0) - assert isclose(result, expected_result / 3) + assert pytest.approx(result) == expected_result / 3 # max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 10000 @@ -426,10 +425,10 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: ) result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss) expected_result = 2 * 2 * (1 + 0.05) / (1 - abs(stoploss)) - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss, 5.0) - assert isclose(result, expected_result / 5) + assert pytest.approx(result) == expected_result / 5 # max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 20000 @@ -445,10 +444,10 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: ) result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss) expected_result = max(2, 2 * 2) * (1 + 0.05) / (1 - abs(stoploss)) - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss, 10) - assert isclose(result, expected_result / 10) + assert pytest.approx(result) == expected_result / 10 # min amount and cost are set (amount is minial) markets["ETH/BTC"]["limits"] = { @@ -461,20 +460,20 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: ) result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss) expected_result = max(8, 2 * 2) * (1 + 0.05) / (1 - abs(stoploss)) - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, stoploss, 7.0) - assert isclose(result, expected_result / 7.0) + assert pytest.approx(result) == expected_result / 7.0 # Max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 1000 result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -0.4) expected_result = max(8, 2 * 2) * 1.5 - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -0.4, 8.0) - assert isclose(result, expected_result / 8.0) + assert pytest.approx(result) == expected_result / 8.0 # Max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 1000 @@ -482,10 +481,10 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: # Really big stoploss result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -1) expected_result = max(8, 2 * 2) * 1.5 - assert isclose(result, expected_result) + assert pytest.approx(result) == expected_result # With Leverage result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -1, 12.0) - assert isclose(result, expected_result / 12) + assert pytest.approx(result) == expected_result / 12 # Max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 1000 @@ -501,7 +500,7 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: # Contract size 0.01 result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -1) - assert isclose(result, expected_result * 0.01) + assert pytest.approx(result) == expected_result * 0.01 # Max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 10 @@ -513,7 +512,7 @@ def test__get_stake_amount_limit(mocker, default_conf) -> None: ) # With Leverage, Contract size 10 result = exchange.get_min_pair_stake_amount('ETH/BTC', 2, -1, 12.0) - assert isclose(result, (expected_result / 12) * 10.0) + assert pytest.approx(result) == (expected_result / 12) * 10.0 # Max result = exchange.get_max_pair_stake_amount('ETH/BTC', 2) assert result == 10000 @@ -3239,7 +3238,7 @@ def test_get_trades_for_order(default_conf, mocker, exchange_name, trading_mode, orders = exchange.get_trades_for_order(order_id, 'ETH/USDT:USDT', since) assert len(orders) == 1 assert orders[0]['price'] == 165 - assert isclose(orders[0]['amount'], amount) + assert pytest.approx(orders[0]['amount']) == amount assert api_mock.fetch_my_trades.call_count == 1 # since argument should be assert isinstance(api_mock.fetch_my_trades.call_args[0][1], int) @@ -3776,8 +3775,8 @@ def test__get_funding_fees_from_exchange(default_conf, mocker, exchange_name): since=unix_time ) - assert (isclose(expected_fees, fees_from_datetime)) - assert (isclose(expected_fees, fees_from_unix_time)) + assert pytest.approx(expected_fees) == fees_from_datetime + assert pytest.approx(expected_fees) == fees_from_unix_time ccxt_exceptionhandlers( mocker, @@ -4514,7 +4513,7 @@ def test_liquidation_price( default_conf['liquidation_buffer'] = 0.0 exchange = get_patched_exchange(mocker, default_conf, id=exchange_name) exchange.get_maintenance_ratio_and_amt = MagicMock(return_value=(mm_ratio, maintenance_amt)) - assert isclose(round(exchange.get_liquidation_price( + assert pytest.approx(round(exchange.get_liquidation_price( pair='DOGE/USDT', open_rate=open_rate, is_short=is_short, @@ -4523,7 +4522,7 @@ def test_liquidation_price( upnl_ex_1=upnl_ex_1, amount=amount, stake_amount=open_rate * amount, - ), 2), expected) + ), 2)) == expected def test_get_max_pair_stake_amount( @@ -4868,8 +4867,8 @@ def test_get_max_leverage_futures(default_conf, mocker, leverage_tiers): assert exchange.get_max_leverage("BNB/BUSD", 1.0) == 20.0 assert exchange.get_max_leverage("BNB/USDT", 100.0) == 75.0 assert exchange.get_max_leverage("BTC/USDT", 170.30) == 125.0 - assert isclose(exchange.get_max_leverage("BNB/BUSD", 99999.9), 5.000005) - assert isclose(exchange.get_max_leverage("BNB/USDT", 1500), 33.333333333333333) + assert pytest.approx(exchange.get_max_leverage("BNB/BUSD", 99999.9)) == 5.000005 + assert pytest.approx(exchange.get_max_leverage("BNB/USDT", 1500)) == 33.333333333333333 assert exchange.get_max_leverage("BTC/USDT", 300000000) == 2.0 assert exchange.get_max_leverage("BTC/USDT", 600000000) == 1.0 # Last tier @@ -5145,7 +5144,7 @@ def test_get_liquidation_price( else: buffer_amount = liquidation_buffer * abs(open_rate - expected_liq) expected_liq = expected_liq - buffer_amount if is_short else expected_liq + buffer_amount - assert isclose(expected_liq, liq) + assert pytest.approx(expected_liq) == liq @pytest.mark.parametrize('contract_size,order_amount', [ diff --git a/tests/leverage/test_interest.py b/tests/leverage/test_interest.py index 7bdf4c2f0..64e99b6b4 100644 --- a/tests/leverage/test_interest.py +++ b/tests/leverage/test_interest.py @@ -1,5 +1,3 @@ -from math import isclose - import pytest from freqtrade.leverage import interest @@ -30,9 +28,9 @@ twentyfive_hours = FtPrecise(25.0) def test_interest(exchange, interest_rate, hours, expected): borrowed = FtPrecise(60.0) - assert isclose(interest( + assert pytest.approx(float(interest( exchange_name=exchange, borrowed=borrowed, rate=FtPrecise(interest_rate), hours=hours - ), expected) + ))) == expected diff --git a/tests/strategy/test_strategy_helpers.py b/tests/strategy/test_strategy_helpers.py index 244fd3919..a7c2da26a 100644 --- a/tests/strategy/test_strategy_helpers.py +++ b/tests/strategy/test_strategy_helpers.py @@ -1,5 +1,3 @@ -from math import isclose - import numpy as np import pandas as pd import pytest @@ -165,7 +163,7 @@ def test_stoploss_from_open(): or (side == 'short' and expected_stop_price < current_price)): assert stoploss == 0 else: - assert isclose(stop_price, expected_stop_price, rel_tol=0.00001) + assert pytest.approx(stop_price) == expected_stop_price def test_stoploss_from_absolute(): diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 2460fde68..f16c8b054 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -1,7 +1,6 @@ # pragma pylint: disable=missing-docstring, C0103 import logging from datetime import datetime, timedelta, timezone -from math import isclose from pathlib import Path from types import FunctionType from unittest.mock import MagicMock @@ -630,9 +629,9 @@ def test_calc_open_close_trade_price( trade.open_rate = 2.0 trade.close_rate = 2.2 trade.recalc_open_trade_value() - assert isclose(trade._calc_open_trade_value(trade.amount, trade.open_rate), open_value) - assert isclose(trade.calc_close_trade_value(trade.close_rate), close_value) - assert isclose(trade.calc_profit(trade.close_rate), round(profit, 8)) + assert pytest.approx(trade._calc_open_trade_value(trade.amount, trade.open_rate)) == open_value + assert pytest.approx(trade.calc_close_trade_value(trade.close_rate)) == close_value + assert pytest.approx(trade.calc_profit(trade.close_rate)) == round(profit, 8) assert pytest.approx(trade.calc_profit_ratio(trade.close_rate)) == profit_ratio From 7ba4fda5d7c4f472bb61bf03fe91e7f2b1564762 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 31 Aug 2022 10:26:47 +0000 Subject: [PATCH 061/437] Implement PR feedback --- freqtrade/freqai/utils.py | 12 ++++-------- tests/freqai/test_freqai_backtesting.py | 6 ------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/freqtrade/freqai/utils.py b/freqtrade/freqai/utils.py index d56702049..6081b6ce5 100644 --- a/freqtrade/freqai/utils.py +++ b/freqtrade/freqai/utils.py @@ -22,21 +22,17 @@ def download_all_data_for_training(dp: DataProvider, config: dict) -> None: :param dp: DataProvider instance attached to the strategy """ - if dp._exchange is not None: - markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) - or config.get('include_inactive')] - else: - # This should not occur: + if dp._exchange is None: raise OperationalException('No exchange object found.') + markets = [p for p, m in dp._exchange.markets.items() if market_is_active(m) + or config.get('include_inactive')] all_pairs = dynamic_expand_pairlist(config, markets) timerange = get_required_data_timerange(config) new_pairs_days = int((timerange.stopts - timerange.startts) / 86400) - if not dp._exchange: - # Not realistic - this is only called in live mode. - raise OperationalException("Dataprovider did not have an exchange attached.") + refresh_backtest_ohlcv_data( dp._exchange, pairs=all_pairs, diff --git a/tests/freqai/test_freqai_backtesting.py b/tests/freqai/test_freqai_backtesting.py index c8a51edb0..ea127fa99 100644 --- a/tests/freqai/test_freqai_backtesting.py +++ b/tests/freqai/test_freqai_backtesting.py @@ -48,10 +48,4 @@ def test_freqai_backtest_load_data(freqai_conf, mocker, caplog): assert log_has_re('Increasing startup_candle_count for freqai to.*', caplog) - # del freqai_conf['freqai']['startup_candles'] - # backtesting = Backtesting(freqai_conf) - # with pytest.raises(OperationalException, - # match=r'FreqAI backtesting module.*startup_candles in config.'): - # backtesting.load_bt_data() - Backtesting.cleanup() From 13ccd940d5e9d9bacedb896cbe4859217f487dde Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 31 Aug 2022 10:26:58 +0000 Subject: [PATCH 062/437] Remove startup_candle_count from freqai sample config to avoid confusion --- config_examples/config_freqai.example.json | 8 +++++--- freqtrade/templates/FreqaiHybridExampleStrategy.py | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index 7112fc225..13c7a94ea 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -9,7 +9,6 @@ "dry_run": true, "timeframe": "3m", "dry_run_wallet": 1000, - "startup_candle_count": 20, "cancel_open_orders_on_exit": true, "unfilledtimeout": { "entry": 10, @@ -76,7 +75,10 @@ "principal_component_analysis": false, "use_SVM_to_remove_outliers": true, "indicator_max_period_candles": 20, - "indicator_periods_candles": [10, 20] + "indicator_periods_candles": [ + 10, + 20 + ] }, "data_split_parameters": { "test_size": 0.33, @@ -92,4 +94,4 @@ "internals": { "process_throttle_secs": 5 } -} +} \ No newline at end of file diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index 0a91455f5..5d1e149dd 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -45,7 +45,6 @@ class FreqaiExampleHybridStrategy(IStrategy): "weight_factor": 0.9, "principal_component_analysis": false, "use_SVM_to_remove_outliers": true, - "indicator_max_period_candles": 20, "indicator_periods_candles": [10, 20] }, "data_split_parameters": { From 57ff6f8ac592678c5399e83e75656c66076bd863 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 31 Aug 2022 10:28:31 +0000 Subject: [PATCH 063/437] Init timerange object properly --- freqtrade/freqai/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/freqai/utils.py b/freqtrade/freqai/utils.py index 6081b6ce5..6a70f050f 100644 --- a/freqtrade/freqai/utils.py +++ b/freqtrade/freqai/utils.py @@ -55,7 +55,6 @@ def get_required_data_timerange( for auto data-download in FreqAI """ time = datetime.now(tz=timezone.utc).timestamp() - data_load_timerange = TimeRange() timeframes = config["freqai"]["feature_parameters"].get("include_timeframes") @@ -75,12 +74,13 @@ def get_required_data_timerange( additional_seconds = max_period * max_tf_seconds - data_load_timerange.startts = int( + startts = int( time - config["freqai"].get("train_period_days", 0) * 86400 - additional_seconds ) - data_load_timerange.stopts = int(time) + stopts = int(time) + data_load_timerange = TimeRange('date', 'date', startts, stopts) return data_load_timerange From df51da22ee699e9a362d980747dba28e578d6c47 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 31 Aug 2022 11:23:48 -0300 Subject: [PATCH 064/437] refactoring freqai backtesting --- freqtrade/freqai/data_kitchen.py | 37 ++++++++++- freqtrade/freqai/freqai_interface.py | 98 ++++++++++++++++++++++++---- 2 files changed, 119 insertions(+), 16 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 763a07375..80b795b8e 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -1,6 +1,7 @@ import copy import datetime import logging +import os import shutil from pathlib import Path from typing import Any, Dict, List, Tuple @@ -780,9 +781,10 @@ class FreqaiDataKitchen: weights = np.exp(-np.arange(num_weights) / (wfactor * num_weights))[::-1] return weights - def append_predictions(self, predictions: DataFrame, do_predict: npt.ArrayLike) -> None: + def get_predictions_to_append(self, predictions: DataFrame, + do_predict: npt.ArrayLike) -> DataFrame: """ - Append backtest prediction from current backtest period to all previous periods + Get backtest prediction from current backtest period """ append_df = DataFrame() @@ -797,12 +799,19 @@ class FreqaiDataKitchen: if self.freqai_config["feature_parameters"].get("DI_threshold", 0) > 0: append_df["DI_values"] = self.DI_values + return append_df + + def append_predictions(self, append_df: DataFrame) -> None: + """ + Append backtest prediction from current backtest period to all previous periods + """ + if self.full_df.empty: self.full_df = append_df else: self.full_df = pd.concat([self.full_df, append_df], axis=0) - return + return append_df def fill_predictions(self, dataframe): """ @@ -1089,3 +1098,25 @@ class FreqaiDataKitchen: if self.unique_classes: for label in self.unique_classes: self.unique_class_list += list(self.unique_classes[label]) + + def save_backtesting_prediction( + self, file_name: str, root_folder: str, append_df: DataFrame + ) -> None: + + """ + Save prediction dataframe from backtesting to h5 file format + :param file_name: h5 file name + :param root_folder: folder to save h5 file + """ + os.makedirs(root_folder, exist_ok=True) + append_df.to_hdf(file_name, key='append_df', mode='w') + + def get_backtesting_prediction(self, prediction_file_name: str) -> DataFrame: + """ + Retrive from disk the prediction dataframe + :param prediction_file_name: prediction file full path + :return: + :Dataframe: Backtesting prediction from current backtesting period + """ + append_df = pd.read_hdf(prediction_file_name) + return append_df diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 4106f24e0..d396113e8 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -224,28 +224,50 @@ class IFreqaiModel(ABC): "trains" ) + trained_timestamp_int = int(trained_timestamp.stopts) dk.data_path = Path( dk.full_path / - f"sub-train-{metadata['pair'].split('/')[0]}_{int(trained_timestamp.stopts)}" + f"sub-train-{metadata['pair'].split('/')[0]}_{trained_timestamp_int}" ) - if not self.model_exists( - metadata["pair"], dk, trained_timestamp=int(trained_timestamp.stopts) + + if self.backtest_prediction_exists( + metadata["pair"], dk, trained_timestamp=trained_timestamp_int ): - dk.find_features(dataframe_train) - self.model = self.train(dataframe_train, metadata["pair"], dk) - self.dd.pair_dict[metadata["pair"]]["trained_timestamp"] = int( - trained_timestamp.stopts) - dk.set_new_model_names(metadata["pair"], trained_timestamp) - self.dd.save_data(self.model, metadata["pair"], dk) + prediction_filename, _ = self.get_backtesting_prediction_file_name( + metadata["pair"], + dk, + trained_timestamp=int(trained_timestamp.stopts)) + + append_df = dk.get_backtesting_prediction(prediction_filename) + dk.append_predictions(append_df) else: - self.model = self.dd.load_data(metadata["pair"], dk) + if not self.model_exists( + metadata["pair"], dk, trained_timestamp=trained_timestamp_int + ): + dk.find_features(dataframe_train) + self.model = self.train(dataframe_train, metadata["pair"], dk) + self.dd.pair_dict[metadata["pair"]]["trained_timestamp"] = int( + trained_timestamp.stopts) + dk.set_new_model_names(metadata["pair"], trained_timestamp) + self.dd.save_data(self.model, metadata["pair"], dk) + else: + self.model = self.dd.load_data(metadata["pair"], dk) - self.check_if_feature_list_matches_strategy(dataframe_train, dk) + self.check_if_feature_list_matches_strategy(dataframe_train, dk) - pred_df, do_preds = self.predict(dataframe_backtest, dk) + pred_df, do_preds = self.predict(dataframe_backtest, dk) + append_df = dk.get_predictions_to_append(pred_df, do_preds) + dk.append_predictions(append_df) - dk.append_predictions(pred_df, do_preds) + prediction_file_name, root_prediction = self.get_backtesting_prediction_file_name( + metadata["pair"], + dk, + trained_timestamp_int) + + dk.save_backtesting_prediction(prediction_file_name, + root_prediction, + append_df) dk.fill_predictions(dataframe) @@ -643,6 +665,56 @@ class IFreqaiModel(ABC): self.train_time = 0 return + def backtest_prediction_exists( + self, + pair: str, + dk: FreqaiDataKitchen, + trained_timestamp: int, + scanning: bool = False, + ) -> bool: + """ + Given a pair and path, check if a backtesting prediction already exists + :param pair: pair e.g. BTC/USD + :param path: path to prediction + :return: + :boolean: whether the prediction file exists or not. + """ + if not self.live: + prediction_file_name, _ = self.get_backtesting_prediction_file_name( + pair, dk, trained_timestamp + ) + path_to_predictionfile = Path(prediction_file_name) + + file_exists = path_to_predictionfile.is_file() + if file_exists and not scanning: + logger.info("Found backtesting prediction file at %s", prediction_file_name) + elif not scanning: + logger.info( + "Could not find backtesting prediction file at %s", prediction_file_name + ) + return file_exists + else: + return False + + def get_backtesting_prediction_file_name( + self, pair: str, dk: FreqaiDataKitchen, trained_timestamp: int + ): + """ + Given a pair, path and a trained timestamp, + returns the path and name of the predictions file + :param pair: pair e.g. BTC/USD + :param dk: FreqaiDataKitchen + :trained_timestamp: current backtesting timestamp period + :return: + :str: prediction file name + :str: prediction root path + """ + coin, _ = pair.split("/") + prediction_base_filename = f"{coin.lower()}_{trained_timestamp}" + root_prediction = f'{dk.full_path}/backtesting_predictions' + prediction_file_name = f"{root_prediction}/{prediction_base_filename}_predictions.h5" + return prediction_file_name, root_prediction + # Following methods which are overridden by user made prediction models. # See freqai/prediction_models/CatboostPredictionModel.py for an example. From 510cf4f30507ed4763d13e12a41e12ceb59a6748 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 31 Aug 2022 10:40:26 -0600 Subject: [PATCH 065/437] remove data waiting, remove explicit analyzing of external df --- freqtrade/data/dataprovider.py | 107 +++++++++---------- freqtrade/enums/__init__.py | 1 - freqtrade/enums/externalmessages.py | 7 -- freqtrade/freqtradebot.py | 16 ++- freqtrade/rpc/api_server/api_ws.py | 37 +++++-- freqtrade/rpc/emc.py | 153 +++++++++++++++------------- freqtrade/rpc/rpc.py | 14 +-- freqtrade/strategy/interface.py | 54 ++-------- 8 files changed, 182 insertions(+), 207 deletions(-) delete mode 100644 freqtrade/enums/externalmessages.py diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 2d473683c..9376c0b33 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -7,7 +7,6 @@ Common Interface for bot and strategy to access data. import logging from collections import deque from datetime import datetime, timezone -from threading import Event from typing import Any, Dict, List, Optional, Tuple from pandas import DataFrame @@ -15,9 +14,11 @@ from pandas import DataFrame from freqtrade.configuration import TimeRange from freqtrade.constants import ListPairsWithTimeframes, PairWithTimeframe from freqtrade.data.history import load_pair_history -from freqtrade.enums import CandleType, RunMode, WaitDataPolicy +from freqtrade.enums import CandleType, RPCMessageType, RunMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange, timeframe_to_seconds +from freqtrade.misc import dataframe_to_json +from freqtrade.rpc import RPCManager from freqtrade.util import PeriodicCache @@ -33,16 +34,18 @@ class DataProvider: self, config: dict, exchange: Optional[Exchange], + rpc: Optional[RPCManager] = None, pairlists=None ) -> None: self._config = config self._exchange = exchange self._pairlists = pairlists + self.__rpc = rpc self.__cached_pairs: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} self.__slice_index: Optional[int] = None self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {} self.__external_pairs_df: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} - self.__external_pairs_event: Dict[PairWithTimeframe, Tuple[int, Event]] = {} + self.__producer_pairs: List[str] = [] self._msg_queue: deque = deque() self.__msg_cache = PeriodicCache( @@ -51,10 +54,7 @@ class DataProvider: self._num_sources = len( self._config.get('external_message_consumer', {}).get('producers', []) ) - self._wait_data_policy = self._config.get('external_message_consumer', {}).get( - 'wait_data_policy', WaitDataPolicy.all) - self._wait_data_timeout = self._config.get('external_message_consumer', {}).get( - 'wait_data_timeout', 5) + self.external_data_enabled = self._num_sources > 0 def _set_dataframe_max_index(self, limit_index: int): """ @@ -83,6 +83,46 @@ class DataProvider: self.__cached_pairs[pair_key] = ( dataframe, datetime.now(timezone.utc)) + # For multiple producers we will want to merge the pairlists instead of overwriting + def set_producer_pairs(self, pairlist: List[str]): + """ + Set the pairs received to later be used. + This only supports 1 Producer right now. + + :param pairlist: List of pairs + """ + self.__producer_pairs = pairlist.copy() + + def get_producer_pairs(self) -> List[str]: + """ + Get the pairs cached from the producer + + :returns: List of pairs + """ + return self.__producer_pairs + + def emit_df( + self, + pair_key: PairWithTimeframe, + dataframe: DataFrame + ) -> None: + """ + Send this dataframe as an ANALYZED_DF message to RPC + + :param pair_key: PairWithTimeframe tuple + :param data: Tuple containing the DataFrame and the datetime it was cached + """ + if self.__rpc: + self.__rpc.send_msg( + { + 'type': RPCMessageType.ANALYZED_DF, + 'data': { + 'key': pair_key, + 'value': dataframe_to_json(dataframe) + } + } + ) + def add_external_df( self, pair: str, @@ -101,7 +141,6 @@ class DataProvider: # For multiple leaders, if the data already exists, we'd merge self.__external_pairs_df[pair_key] = (dataframe, datetime.now(timezone.utc)) - self._set_data_event(pair_key) def get_external_df( self, @@ -120,59 +159,11 @@ class DataProvider: pair_key = (pair, timeframe, candle_type) if pair_key not in self.__external_pairs_df: - self._wait_on_data(pair_key) - - if pair_key not in self.__external_pairs_df: - return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) return self.__external_pairs_df[pair_key] - def _set_data_event(self, key: PairWithTimeframe): - """ - Depending on the WaitDataPolicy, if an event exists for this PairWithTimeframe - then set the event to release main thread from waiting. - - :param key: PairWithTimeframe - """ - pair_event = self.__external_pairs_event.get(key) - - if pair_event: - num_concat, event = pair_event - self.__external_pairs_event[key] = (num_concat + 1, event) - - if self._wait_data_policy == WaitDataPolicy.one: - logger.debug("Setting Data as policy is One") - event.set() - elif self._wait_data_policy == WaitDataPolicy.all and num_concat == self._num_sources: - logger.debug("Setting Data as policy is all, and is complete") - event.set() - - del self.__external_pairs_event[key] - - def _wait_on_data(self, key: PairWithTimeframe): - """ - Depending on the WaitDataPolicy, we will create and wait on an event until - set that determines the full amount of data is available - - :param key: PairWithTimeframe - """ - if self._wait_data_policy is not WaitDataPolicy.none: - pair, timeframe, candle_type = key - - pair_event = Event() - self.__external_pairs_event[key] = (0, pair_event) - - timeout = self._wait_data_timeout \ - if self._wait_data_policy is not WaitDataPolicy.all else 0 - - timeout_str = f"for {timeout} seconds" if timeout > 0 else "indefinitely" - logger.debug(f"Waiting for external data on {pair} for {timeout_str}") - - if timeout > 0: - pair_event.wait(timeout=timeout) - else: - pair_event.wait() - def add_pairlisthandler(self, pairlists) -> None: """ Allow adding pairlisthandler after initialization diff --git a/freqtrade/enums/__init__.py b/freqtrade/enums/__init__.py index 229d770ce..d32e04e17 100644 --- a/freqtrade/enums/__init__.py +++ b/freqtrade/enums/__init__.py @@ -3,7 +3,6 @@ from freqtrade.enums.backteststate import BacktestState from freqtrade.enums.candletype import CandleType from freqtrade.enums.exitchecktuple import ExitCheckTuple from freqtrade.enums.exittype import ExitType -from freqtrade.enums.externalmessages import WaitDataPolicy from freqtrade.enums.marginmode import MarginMode from freqtrade.enums.ordertypevalue import OrderTypeValues from freqtrade.enums.rpcmessagetype import RPCMessageType, RPCRequestType diff --git a/freqtrade/enums/externalmessages.py b/freqtrade/enums/externalmessages.py deleted file mode 100644 index e43899ab5..000000000 --- a/freqtrade/enums/externalmessages.py +++ /dev/null @@ -1,7 +0,0 @@ -from enum import Enum - - -class WaitDataPolicy(str, Enum): - none = "none" - one = "one" - all = "all" diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index c0d658c61..f7b7ad80b 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -85,21 +85,19 @@ class FreqtradeBot(LoggingMixin): # Keep this at the end of this initialization method. self.rpc: RPCManager = RPCManager(self) - self.dataprovider = DataProvider(self.config, self.exchange, self.pairlists) + self.dataprovider = DataProvider(self.config, self.exchange, self.rpc, self.pairlists) # Attach Dataprovider to strategy instance self.strategy.dp = self.dataprovider # Attach Wallets to strategy instance self.strategy.wallets = self.wallets - # Attach rpc to strategy instance - self.strategy.rpc = self.rpc # Initializing Edge only if enabled self.edge = Edge(self.config, self.exchange, self.strategy) if \ self.config.get('edge', {}).get('enabled', False) else None # Init ExternalMessageConsumer if enabled - self.emc = ExternalMessageConsumer(self.rpc._rpc, self.config) if \ + self.emc = ExternalMessageConsumer(self.config, self.dataprovider) if \ self.config.get('external_message_consumer', {}).get('enabled', False) else None self.active_pair_whitelist = self._refresh_active_whitelist() @@ -201,11 +199,11 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - if self.emc: - leader_pairs = self.pairlists._whitelist - self.strategy.analyze_external(self.active_pair_whitelist, leader_pairs) - else: - self.strategy.analyze(self.active_pair_whitelist) + # This just means we won't broadcast dataframes if we're listening to a producer + # Doesn't necessarily NEED to be this way, as maybe we'd like to broadcast + # even if we are using external dataframes in the future. + self.strategy.analyze(self.active_pair_whitelist, + external_data=self.dataprovider.external_data_enabled) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 88bae099a..d7c7239d1 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -1,22 +1,48 @@ import logging +from typing import Any, Dict from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect -from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc_optional +from freqtrade.enums import RPCMessageType, RPCRequestType +from freqtrade.rpc.api_server.deps import get_channel_manager +from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws.utils import is_websocket_alive +# from typing import Any, Dict + + logger = logging.getLogger(__name__) # Private router, protected by API Key authentication router = APIRouter() +# We are passed a Channel object, we can only do sync functions on that channel object +def _process_consumer_request(request: Dict[str, Any], channel: WebSocketChannel): + type, data = request.get('type'), request.get('data') + + # If the request is empty, do nothing + if not data: + return + + # If we have a request of type SUBSCRIBE, set the topics in this channel + if type == RPCRequestType.SUBSCRIBE: + if isinstance(data, list): + logger.error(f"Improper request from channel: {channel} - {request}") + return + + # If all topics passed are a valid RPCMessageType, set subscriptions on channel + if all([any(x.value == topic for x in RPCMessageType) for topic in data]): + + logger.debug(f"{channel} subscribed to topics: {data}") + channel.set_subscriptions(data) + + @router.websocket("/message/ws") async def message_endpoint( ws: WebSocket, - channel_manager=Depends(get_channel_manager), - rpc=Depends(get_rpc_optional) + channel_manager=Depends(get_channel_manager) ): try: if is_websocket_alive(ws): @@ -32,9 +58,8 @@ async def message_endpoint( request = await channel.recv() # Process the request here. Should this be a method of RPC? - if rpc: - logger.info(f"Request: {request}") - rpc._process_consumer_request(request, channel) + logger.info(f"Request: {request}") + _process_consumer_request(request, channel) except WebSocketDisconnect: # Handle client disconnects diff --git a/freqtrade/rpc/emc.py b/freqtrade/rpc/emc.py index 42061079a..3d78bc257 100644 --- a/freqtrade/rpc/emc.py +++ b/freqtrade/rpc/emc.py @@ -12,9 +12,9 @@ from typing import Any, Dict import websockets +from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.misc import json_to_dataframe, remove_entry_exit_signals -from freqtrade.rpc import RPC from freqtrade.rpc.api_server.ws.channel import WebSocketChannel @@ -29,11 +29,11 @@ class ExternalMessageConsumer: def __init__( self, - rpc: RPC, config: Dict[str, Any], + dataprovider: DataProvider ): - self._rpc = rpc self._config = config + self._dp = dataprovider self._running = False self._thread = None @@ -99,12 +99,12 @@ class ExternalMessageConsumer: """ The main task coroutine """ - rpc_lock = asyncio.Lock() + lock = asyncio.Lock() try: # Create a connection to each producer self._sub_tasks = [ - self._loop.create_task(self._handle_producer_connection(producer, rpc_lock)) + self._loop.create_task(self._handle_producer_connection(producer, lock)) for producer in self.producers ] @@ -115,73 +115,90 @@ class ExternalMessageConsumer: # Stop the loop once we are done self._loop.stop() - async def _handle_producer_connection(self, producer, lock): + async def _handle_producer_connection(self, producer: Dict[str, Any], lock: asyncio.Lock): """ Main connection loop for the consumer + + :param producer: Dictionary containing producer info: {'url': '', 'ws_token': ''} + :param lock: An asyncio Lock """ try: - while True: - try: - url, token = producer['url'], producer['ws_token'] - ws_url = f"{url}?token={token}" - - async with websockets.connect(ws_url) as ws: - logger.info("Connection successful") - channel = WebSocketChannel(ws) - - # Tell the producer we only want these topics - # Should always be the first thing we send - await channel.send( - self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) - ) - - # Now receive data, if none is within the time limit, ping - while True: - try: - message = await asyncio.wait_for( - channel.recv(), - timeout=5 - ) - - async with lock: - # Handle the data here - # We use a lock because it will call RPC methods - self.handle_producer_message(message) - - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): - # We haven't received data yet. Check the connection and continue. - try: - # ping - ping = await channel.ping() - - await asyncio.wait_for(ping, timeout=self.ping_timeout) - logger.debug(f"Connection to {url} still alive...") - - continue - except Exception: - logger.info( - f"Ping error {url} - retrying in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - - break - except Exception as e: - logger.exception(e) - continue - except ( - socket.gaierror, - ConnectionRefusedError, - websockets.exceptions.InvalidStatusCode - ) as e: - logger.error(f"Connection Refused - {e} retrying in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - - continue - + await self._create_connection(producer, lock) except asyncio.CancelledError: # Exit silently pass - def compose_consumer_request(self, type_: str, data: Any) -> Dict[str, Any]: + async def _create_connection(self, producer: Dict[str, Any], lock: asyncio.Lock): + """ + Actually creates and handles the websocket connection, pinging on timeout + and handling connection errors. + + :param producer: Dictionary containing producer info: {'url': '', 'ws_token': ''} + :param lock: An asyncio Lock + """ + while self._running: + try: + url, token = producer['url'], producer['ws_token'] + ws_url = f"{url}?token={token}" + + # This will raise InvalidURI if the url is bad + async with websockets.connect(ws_url) as ws: + logger.info("Connection successful") + channel = WebSocketChannel(ws) + + # Tell the producer we only want these topics + # Should always be the first thing we send + await channel.send( + self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) + ) + + # Now receive data, if none is within the time limit, ping + while True: + try: + message = await asyncio.wait_for( + channel.recv(), + timeout=self.reply_timeout + ) + + async with lock: + # Handle the message + self.handle_producer_message(message) + + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Check the connection and continue. + try: + # ping + ping = await channel.ping() + + await asyncio.wait_for(ping, timeout=self.ping_timeout) + logger.debug(f"Connection to {url} still alive...") + + continue + except Exception: + logger.info( + f"Ping error {url} - retrying in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + + break + except Exception as e: + logger.exception(e) + continue + except ( + socket.gaierror, + ConnectionRefusedError, + websockets.exceptions.InvalidStatusCode + ) as e: + logger.error(f"Connection Refused - {e} retrying in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + + continue + + # Catch invalid ws_url, and break the loop + except websockets.exceptions.InvalidURI as e: + logger.error(f"{ws_url} is an invalid WebSocket URL - {e}") + break + + def compose_consumer_request(self, type_: RPCRequestType, data: Any) -> Dict[str, Any]: """ Create a request for sending to a producer @@ -211,9 +228,8 @@ class ExternalMessageConsumer: if message_type == RPCMessageType.WHITELIST: pairlist = message_data - # Add the pairlist data to the ExternalPairlist plugin - external_pairlist = self._rpc._freqtrade.pairlists._pairlist_handlers[0] - external_pairlist.add_pairlist_data(pairlist) + # Add the pairlist data to the DataProvider + self._dp.set_producer_pairs(pairlist) # Handle analyzed dataframes elif message_type == RPCMessageType.ANALYZED_DF: @@ -230,5 +246,4 @@ class ExternalMessageConsumer: dataframe = remove_entry_exit_signals(dataframe) # Add the dataframe to the dataprovider - dataprovider = self._rpc._freqtrade.dataprovider - dataprovider.add_external_df(pair, timeframe, dataframe, candle_type) + self._dp.add_external_df(pair, timeframe, dataframe, candle_type) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index a41d08d55..ed7f13a96 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -19,8 +19,8 @@ from freqtrade.configuration.timerange import TimeRange from freqtrade.constants import CANCEL_REASON, DATETIME_PRINT_FORMAT from freqtrade.data.history import load_data from freqtrade.data.metrics import calculate_max_drawdown -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, RPCRequestType, - SignalDirection, State, TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, State, + TradingMode) from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler @@ -1089,13 +1089,3 @@ class RPC: 'last_process_loc': last_p.astimezone(tzlocal()).strftime(DATETIME_PRINT_FORMAT), 'last_process_ts': int(last_p.timestamp()), } - - # We are passed a Channel object, we can only do sync functions on that channel object - def _process_consumer_request(self, request, channel): - # Should we ensure that request is Dict[str, Any]? - type, data = request.get('type'), request.get('data') - - if type == RPCRequestType.SUBSCRIBE: - if all([any(x.value == topic for x in RPCMessageType) for topic in data]): - logger.debug(f"{channel} subscribed to topics: {data}") - channel.set_subscriptions(data) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 7120928ff..a06b6506e 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -12,14 +12,13 @@ from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RPCMessageType, SignalDirection, - SignalTagType, SignalType, TradingMode) +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, SignalTagType, + SignalType, TradingMode) from freqtrade.enums.runmode import RunMode from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds -from freqtrade.misc import dataframe_to_json, remove_entry_exit_signals +from freqtrade.misc import remove_entry_exit_signals from freqtrade.persistence import Order, PairLocks, Trade -from freqtrade.rpc import RPCManager from freqtrade.strategy.hyper import HyperStrategyMixin from freqtrade.strategy.informative_decorator import (InformativeData, PopulateIndicators, _create_and_merge_informative_pair, @@ -113,7 +112,6 @@ class IStrategy(ABC, HyperStrategyMixin): # and wallets - access to the current balance. dp: DataProvider wallets: Optional[Wallets] = None - rpc: RPCManager # Filled from configuration stake_currency: str # container variable for strategy source code @@ -731,16 +729,8 @@ class IStrategy(ABC, HyperStrategyMixin): candle_type = self.config.get('candle_type_def', CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) - if not external_data: - self.rpc.send_msg( - { - 'type': RPCMessageType.ANALYZED_DF, - 'data': { - 'key': (pair, self.timeframe, candle_type), - 'value': dataframe_to_json(dataframe) - } - } - ) + if populate_indicators: + self.dp.emit_df((pair, self.timeframe, candle_type), dataframe) else: logger.debug("Skipping TA Analysis for already analyzed candle") @@ -763,10 +753,7 @@ class IStrategy(ABC, HyperStrategyMixin): """ candle_type = self.config.get('candle_type_def', CandleType.SPOT) - if not external_data: - dataframe = self.dp.ohlcv(pair, self.timeframe, candle_type) - else: - dataframe, _ = self.dp.get_external_df(pair, self.timeframe, candle_type) + dataframe = self.dp.ohlcv(pair, self.timeframe, candle_type) if not isinstance(dataframe, DataFrame) or dataframe.empty: logger.warning('Empty candle (OHLCV) data for pair %s', pair) @@ -790,38 +777,15 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze( self, - pairs: List[str] + pairs: List[str], + external_data: bool = False ) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze """ for pair in pairs: - self.analyze_pair(pair) - - def analyze_external(self, pairs: List[str], leader_pairs: List[str]) -> None: - """ - Analyze the pre-populated dataframes from the Leader - - :param pairs: The active pair whitelist - :param leader_pairs: The list of pairs from the Leaders - """ - - # Get the extra pairs not listed in Leader pairs, and process - # them normally. - # List order is not preserved when doing this! - # We use ^ instead of - for symmetric difference - extra_pairs = list(set(pairs) ^ set(leader_pairs)) - # These would be the pairs that we have trades in, which means - # we would have to analyze them normally - # Eventually maybe request data from the Leader if we don't have it? - - for pair in leader_pairs: - # Analyze the pairs, but get the dataframe from the external data - self.analyze_pair(pair, external_data=True) - - for pair in extra_pairs: - self.analyze_pair(pair) + self.analyze_pair(pair, external_data) @ staticmethod def preserve_df(dataframe: DataFrame) -> Tuple[int, float, datetime]: From 865b34cd6f91972cb252fff97d7d3ca1248976bd Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 31 Aug 2022 11:43:02 -0600 Subject: [PATCH 066/437] add producer names --- freqtrade/constants.py | 1 + freqtrade/data/dataprovider.py | 36 ++++++++++++------- freqtrade/freqtradebot.py | 7 ++-- .../{emc.py => external_message_consumer.py} | 10 +++--- freqtrade/strategy/interface.py | 21 +++++------ tests/rpc/test_rpc_telegram.py | 7 ++-- 6 files changed, 46 insertions(+), 36 deletions(-) rename freqtrade/rpc/{emc.py => external_message_consumer.py} (95%) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index c7f2acc84..2e580acf5 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -498,6 +498,7 @@ CONF_SCHEMA = { 'items': { 'type': 'object', 'properties': { + 'name': {'type': 'string'}, 'url': {'type': 'string', 'default': ''}, 'ws_token': {'type': 'string', 'default': ''}, } diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 9376c0b33..947387f75 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -34,8 +34,8 @@ class DataProvider: self, config: dict, exchange: Optional[Exchange], - rpc: Optional[RPCManager] = None, - pairlists=None + pairlists=None, + rpc: Optional[RPCManager] = None ) -> None: self._config = config self._exchange = exchange @@ -44,8 +44,9 @@ class DataProvider: self.__cached_pairs: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} self.__slice_index: Optional[int] = None self.__cached_pairs_backtesting: Dict[PairWithTimeframe, DataFrame] = {} - self.__external_pairs_df: Dict[PairWithTimeframe, Tuple[DataFrame, datetime]] = {} - self.__producer_pairs: List[str] = [] + self.__producer_pairs_df: Dict[str, + Dict[PairWithTimeframe, Tuple[DataFrame, datetime]]] = {} + self.__producer_pairs: Dict[str, List[str]] = {} self._msg_queue: deque = deque() self.__msg_cache = PeriodicCache( @@ -84,22 +85,22 @@ class DataProvider: dataframe, datetime.now(timezone.utc)) # For multiple producers we will want to merge the pairlists instead of overwriting - def set_producer_pairs(self, pairlist: List[str]): + def set_producer_pairs(self, pairlist: List[str], producer_name: str = "default"): """ Set the pairs received to later be used. This only supports 1 Producer right now. :param pairlist: List of pairs """ - self.__producer_pairs = pairlist.copy() + self.__producer_pairs[producer_name] = pairlist.copy() - def get_producer_pairs(self) -> List[str]: + def get_producer_pairs(self, producer_name: str = "default") -> List[str]: """ Get the pairs cached from the producer :returns: List of pairs """ - return self.__producer_pairs + return self.__producer_pairs.get(producer_name, []) def emit_df( self, @@ -129,6 +130,7 @@ class DataProvider: timeframe: str, dataframe: DataFrame, candle_type: CandleType, + producer_name: str = "default" ) -> None: """ Add the pair data to this class from an external source. @@ -139,15 +141,19 @@ class DataProvider: """ pair_key = (pair, timeframe, candle_type) + if producer_name not in self.__producer_pairs_df: + self.__producer_pairs_df[producer_name] = {} + # For multiple leaders, if the data already exists, we'd merge - self.__external_pairs_df[pair_key] = (dataframe, datetime.now(timezone.utc)) + self.__producer_pairs_df[producer_name][pair_key] = (dataframe, datetime.now(timezone.utc)) def get_external_df( self, pair: str, timeframe: str, - candle_type: CandleType - ) -> DataFrame: + candle_type: CandleType, + producer_name: str = "default" + ) -> Tuple[DataFrame, datetime]: """ Get the pair data from the external sources. Will wait if the policy is set to, and data is not available. @@ -158,11 +164,15 @@ class DataProvider: """ pair_key = (pair, timeframe, candle_type) - if pair_key not in self.__external_pairs_df: + if producer_name not in self.__producer_pairs_df: # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) - return self.__external_pairs_df[pair_key] + if pair_key not in self.__producer_pairs_df: + # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) + return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + + return self.__producer_pairs_df[producer_name][pair_key] def add_pairlisthandler(self, pairlists) -> None: """ diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index f7b7ad80b..19c77d403 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -30,7 +30,7 @@ from freqtrade.plugins.pairlistmanager import PairListManager from freqtrade.plugins.protectionmanager import ProtectionManager from freqtrade.resolvers import ExchangeResolver, StrategyResolver from freqtrade.rpc import RPCManager -from freqtrade.rpc.emc import ExternalMessageConsumer +from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer from freqtrade.strategy.interface import IStrategy from freqtrade.strategy.strategy_wrapper import strategy_safe_wrapper from freqtrade.util import FtPrecise @@ -85,7 +85,7 @@ class FreqtradeBot(LoggingMixin): # Keep this at the end of this initialization method. self.rpc: RPCManager = RPCManager(self) - self.dataprovider = DataProvider(self.config, self.exchange, self.rpc, self.pairlists) + self.dataprovider = DataProvider(self.config, self.exchange, self.pairlists, self.rpc) # Attach Dataprovider to strategy instance self.strategy.dp = self.dataprovider @@ -202,8 +202,9 @@ class FreqtradeBot(LoggingMixin): # This just means we won't broadcast dataframes if we're listening to a producer # Doesn't necessarily NEED to be this way, as maybe we'd like to broadcast # even if we are using external dataframes in the future. + self.strategy.analyze(self.active_pair_whitelist, - external_data=self.dataprovider.external_data_enabled) + emit_df=self.dataprovider.external_data_enabled) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace diff --git a/freqtrade/rpc/emc.py b/freqtrade/rpc/external_message_consumer.py similarity index 95% rename from freqtrade/rpc/emc.py rename to freqtrade/rpc/external_message_consumer.py index 3d78bc257..ae72089b5 100644 --- a/freqtrade/rpc/emc.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -162,7 +162,7 @@ class ExternalMessageConsumer: async with lock: # Handle the message - self.handle_producer_message(message) + self.handle_producer_message(producer, message) except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): # We haven't received data yet. Check the connection and continue. @@ -210,10 +210,11 @@ class ExternalMessageConsumer: # How we do things here isn't set in stone. There seems to be some interest # in figuring out a better way, but we shall do this for now. - def handle_producer_message(self, message: Dict[str, Any]): + def handle_producer_message(self, producer: Dict[str, Any], message: Dict[str, Any]): """ Handles external messages from a Producer """ + producer_name = producer.get('name', 'default') # Should we have a default message type? message_type = message.get('type', RPCMessageType.STATUS) message_data = message.get('data') @@ -229,7 +230,7 @@ class ExternalMessageConsumer: pairlist = message_data # Add the pairlist data to the DataProvider - self._dp.set_producer_pairs(pairlist) + self._dp.set_producer_pairs(pairlist, producer_name=producer_name) # Handle analyzed dataframes elif message_type == RPCMessageType.ANALYZED_DF: @@ -246,4 +247,5 @@ class ExternalMessageConsumer: dataframe = remove_entry_exit_signals(dataframe) # Add the dataframe to the dataprovider - self._dp.add_external_df(pair, timeframe, dataframe, candle_type) + self._dp.add_external_df(pair, timeframe, dataframe, + candle_type, producer_name=producer_name) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index a06b6506e..34e475ed7 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -682,8 +682,7 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze_ticker( self, dataframe: DataFrame, - metadata: dict, - populate_indicators: bool = True + metadata: dict ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame @@ -693,8 +692,7 @@ class IStrategy(ABC, HyperStrategyMixin): :return: DataFrame of candle (OHLCV) data with indicator data and signals added """ logger.debug("TA Analysis Launched") - if populate_indicators: - dataframe = self.advise_indicators(dataframe, metadata) + dataframe = self.advise_indicators(dataframe, metadata) dataframe = self.advise_entry(dataframe, metadata) dataframe = self.advise_exit(dataframe, metadata) return dataframe @@ -703,7 +701,7 @@ class IStrategy(ABC, HyperStrategyMixin): self, dataframe: DataFrame, metadata: dict, - external_data: bool = False + emit_df: bool = False ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame @@ -720,16 +718,15 @@ class IStrategy(ABC, HyperStrategyMixin): if (not self.process_only_new_candles or self._last_candle_seen_per_pair.get(pair, None) != dataframe.iloc[-1]['date']): - populate_indicators = not external_data # Defs that only make change on new candle data. - dataframe = self.analyze_ticker(dataframe, metadata, populate_indicators) + dataframe = self.analyze_ticker(dataframe, metadata) self._last_candle_seen_per_pair[pair] = dataframe.iloc[-1]['date'] candle_type = self.config.get('candle_type_def', CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) - if populate_indicators: + if emit_df: self.dp.emit_df((pair, self.timeframe, candle_type), dataframe) else: @@ -743,7 +740,7 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze_pair( self, pair: str, - external_data: bool = False + emit_df: bool = False ) -> None: """ Fetch data for this pair from dataprovider and analyze. @@ -764,7 +761,7 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = strategy_safe_wrapper( self._analyze_ticker_internal, message="" - )(dataframe, {'pair': pair}, external_data) + )(dataframe, {'pair': pair}, emit_df) self.assert_df(dataframe, df_len, df_close, df_date) except StrategyError as error: @@ -778,14 +775,14 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze( self, pairs: List[str], - external_data: bool = False + emit_df: bool = False ) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze """ for pair in pairs: - self.analyze_pair(pair, external_data) + self.analyze_pair(pair, emit_df) @ staticmethod def preserve_df(dataframe: DataFrame) -> Tuple[int, float, datetime]: diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index a30115bd9..c7ae7cb74 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -2138,10 +2138,9 @@ def test_send_msg_strategy_msg_notification(default_conf, mocker) -> None: def test_send_msg_unknown_type(default_conf, mocker) -> None: telegram, _, _ = get_telegram_testobject(mocker, default_conf) - with pytest.raises(NotImplementedError, match=r'Unknown message type: None'): - telegram.send_msg({ - 'type': None, - }) + telegram.send_msg({ + 'type': None, + }) @pytest.mark.parametrize('message_type,enter,enter_signal,leverage', [ From 6e8abf8674b143fcee50e38c8ecb44081f31d347 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 31 Aug 2022 11:58:58 -0600 Subject: [PATCH 067/437] add producer name to required fields in config --- freqtrade/constants.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 2e580acf5..6bacaf961 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -501,17 +501,13 @@ CONF_SCHEMA = { 'name': {'type': 'string'}, 'url': {'type': 'string', 'default': ''}, 'ws_token': {'type': 'string', 'default': ''}, - } + }, + 'required': ['name', 'url', 'ws_token'] } }, 'reply_timeout': {'type': 'integer'}, 'sleep_time': {'type': 'integer'}, 'ping_timeout': {'type': 'integer'}, - 'wait_data_policy': { - 'type': 'string', - 'enum': WAIT_DATA_POLICY_OPTIONS - }, - 'wait_data_timeout': {'type': 'integer', 'default': 5}, 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False} }, 'required': ['producers'] From c72a2c26c7c3be0f9da2582886cd8bcca87efb5b Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 31 Aug 2022 12:06:24 -0600 Subject: [PATCH 068/437] remove external pairlist --- .../plugins/pairlist/ExternalPairList.py | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 freqtrade/plugins/pairlist/ExternalPairList.py diff --git a/freqtrade/plugins/pairlist/ExternalPairList.py b/freqtrade/plugins/pairlist/ExternalPairList.py deleted file mode 100644 index 27a328060..000000000 --- a/freqtrade/plugins/pairlist/ExternalPairList.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -External Pair List provider - -Provides pair list from Leader data -""" -import logging -from typing import Any, Dict, List - -from freqtrade.plugins.pairlist.IPairList import IPairList - - -logger = logging.getLogger(__name__) - - -class ExternalPairList(IPairList): - """ - PairList plugin for use with external signal follower mode. - Will use pairs given from leader data. - - Usage: - "pairlists": [ - { - "method": "ExternalPairList", - "number_assets": 5, # We can limit the amount of pairs to use from leader - } - ], - """ - - def __init__(self, exchange, pairlistmanager, - config: Dict[str, Any], pairlistconfig: Dict[str, Any], - pairlist_pos: int) -> None: - super().__init__(exchange, pairlistmanager, config, pairlistconfig, pairlist_pos) - - # Not sure how to enforce ExternalPairList as the only PairList - - self._num_assets = self._pairlistconfig.get('number_assets') - - self._leader_pairs: List[str] = [] - - def _clamped_pairlist(self): - """ - Return the self._leader_pairs pairlist limited to the maximum set num_assets - or the length of it. - """ - length = len(self._leader_pairs) - if self._num_assets: - return self._leader_pairs[:min(length, self._num_assets)] - else: - return self._leader_pairs - - @property - def needstickers(self) -> bool: - """ - Boolean property defining if tickers are necessary. - If no Pairlist requires tickers, an empty Dict is passed - as tickers argument to filter_pairlist - """ - return False - - def short_desc(self) -> str: - """ - Short whitelist method description - used for startup-messages - -> Please overwrite in subclasses - """ - return f"{self.name}" - - def add_pairlist_data(self, pairlist: List[str]): - """ - Add pairs from Leader - - :param pairlist: List of pairs - """ - - # If some pairs were removed on Leader, remove them here - for pair in self._leader_pairs: - if pair not in pairlist: - logger.debug(f"Leader removed pair: {pair}") - self._leader_pairs.remove(pair) - - # Only add new pairs - seen = set(self._leader_pairs) - for pair in pairlist: - if pair in seen: - continue - self._leader_pairs.append(pair) - - def gen_pairlist(self, tickers: Dict) -> List[str]: - """ - Generate the pairlist - :param tickers: Tickers (from exchange.get_tickers()). May be cached. - :return: List of pairs - """ - return self._clamped_pairlist() - - def filter_pairlist(self, pairlist: List[str], tickers: Dict) -> List[str]: - """ - Filters and sorts pairlist and returns the whitelist again. - Called on each bot iteration - please use internal caching if necessary - :param pairlist: pairlist to filter or sort - :param tickers: Tickers (from exchange.get_tickers()). May be cached. - :return: new whitelist - """ - return self._clamped_pairlist() From 7bed0450d2c6ae90dd00d98a51b18701be6c4874 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 31 Aug 2022 15:36:29 -0300 Subject: [PATCH 069/437] pr review - refactoring backtesting freqai --- freqtrade/freqai/data_kitchen.py | 19 ++++++++++++++----- freqtrade/freqai/freqai_interface.py | 12 ++++++------ tests/freqai/test_freqai_interface.py | 8 ++++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 80b795b8e..8dc94e9ec 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -1,7 +1,6 @@ import copy import datetime import logging -import os import shutil from pathlib import Path from typing import Any, Dict, List, Tuple @@ -1108,15 +1107,25 @@ class FreqaiDataKitchen: :param file_name: h5 file name :param root_folder: folder to save h5 file """ - os.makedirs(root_folder, exist_ok=True) - append_df.to_hdf(file_name, key='append_df', mode='w') + backtesting_root = Path( + self.full_path + / root_folder + ) + if not backtesting_root.is_dir(): + backtesting_root.mkdir(parents=True, exist_ok=True) - def get_backtesting_prediction(self, prediction_file_name: str) -> DataFrame: + full_file_path = Path(self.full_path / root_folder / file_name) + append_df.to_hdf(full_file_path, key='append_df', mode='w') + + def get_backtesting_prediction( + self, root_prediction: str, prediction_file_name: str + ) -> DataFrame: """ Retrive from disk the prediction dataframe :param prediction_file_name: prediction file full path :return: :Dataframe: Backtesting prediction from current backtesting period """ - append_df = pd.read_hdf(prediction_file_name) + prediction_path = Path(self.full_path / root_prediction / prediction_file_name) + append_df = pd.read_hdf(prediction_path) return append_df diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index d396113e8..ad64588a7 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -234,12 +234,12 @@ class IFreqaiModel(ABC): if self.backtest_prediction_exists( metadata["pair"], dk, trained_timestamp=trained_timestamp_int ): - prediction_filename, _ = self.get_backtesting_prediction_file_name( + prediction_filename, root_prediction = self.get_backtesting_prediction_file_name( metadata["pair"], dk, trained_timestamp=int(trained_timestamp.stopts)) - append_df = dk.get_backtesting_prediction(prediction_filename) + append_df = dk.get_backtesting_prediction(root_prediction, prediction_filename) dk.append_predictions(append_df) else: if not self.model_exists( @@ -680,10 +680,10 @@ class IFreqaiModel(ABC): :boolean: whether the prediction file exists or not. """ if not self.live: - prediction_file_name, _ = self.get_backtesting_prediction_file_name( + prediction_file_name, root_prediction = self.get_backtesting_prediction_file_name( pair, dk, trained_timestamp ) - path_to_predictionfile = Path(prediction_file_name) + path_to_predictionfile = Path(dk.full_path / root_prediction / prediction_file_name) file_exists = path_to_predictionfile.is_file() if file_exists and not scanning: @@ -711,8 +711,8 @@ class IFreqaiModel(ABC): """ coin, _ = pair.split("/") prediction_base_filename = f"{coin.lower()}_{trained_timestamp}" - root_prediction = f'{dk.full_path}/backtesting_predictions' - prediction_file_name = f"{root_prediction}/{prediction_base_filename}_predictions.h5" + root_prediction = 'backtesting_predictions' + prediction_file_name = f"{prediction_base_filename}_predictions.h5" return prediction_file_name, root_prediction # Following methods which are overridden by user made prediction models. diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 792ffc467..09f5d27ff 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -192,7 +192,7 @@ def test_start_backtesting(mocker, freqai_conf): freqai.start_backtesting(df, metadata, freqai.dk) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] - assert len(model_folders) == 5 + assert len(model_folders) == 6 shutil.rmtree(Path(freqai.dk.full_path)) @@ -217,7 +217,7 @@ def test_start_backtesting_subdaily_backtest_period(mocker, freqai_conf): metadata = {"pair": "LTC/BTC"} freqai.start_backtesting(df, metadata, freqai.dk) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] - assert len(model_folders) == 8 + assert len(model_folders) == 9 shutil.rmtree(Path(freqai.dk.full_path)) @@ -242,7 +242,7 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): freqai.start_backtesting(df, metadata, freqai.dk) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] - assert len(model_folders) == 5 + assert len(model_folders) == 6 # without deleting the exiting folder structure, re-run @@ -263,7 +263,7 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): freqai.start_backtesting(df, metadata, freqai.dk) assert log_has_re( - "Found model at ", + "Found backtesting prediction ", caplog, ) From 57e9078727fe03ca682fee3ee38ff1c8c93a29b1 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 31 Aug 2022 14:44:52 -0600 Subject: [PATCH 070/437] update example config --- config_examples/config_full.example.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index ec988687f..d0efa5bb6 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -180,10 +180,15 @@ "enabled": false, "producers": [ { + "name": "default", "url": "ws://some.freqtrade.bot/api/v1/message/ws", "ws_token": "a_secret_ws_token" } - ] + ], + "reply_timeout": 10, + "ping_timeout": 5, + "sleep_time": 5, + "remove_entry_exit_signals": false }, "bot_name": "freqtrade", "db_url": "sqlite:///tradesv3.sqlite", From ba2eb7cf0f9f517f526a44b3efc792674911a5da Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 1 Sep 2022 06:35:24 +0200 Subject: [PATCH 071/437] Fix BNB fee bug when selling thanks @epigramx, for reporting and for the detailed data. --- freqtrade/freqtradebot.py | 16 +++++++++++----- tests/test_freqtradebot.py | 8 +++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 5393e3d39..37bc6dfed 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -1778,7 +1778,7 @@ class FreqtradeBot(LoggingMixin): self.rpc.send_msg(msg) def apply_fee_conditional(self, trade: Trade, trade_base_currency: str, - amount: float, fee_abs: float) -> Optional[float]: + amount: float, fee_abs: float, order_obj: Order) -> Optional[float]: """ Applies the fee to amount (either from Order or from Trades). Can eat into dust if more than the required asset is available. @@ -1786,7 +1786,12 @@ class FreqtradeBot(LoggingMixin): never in base currency. """ self.wallets.update() - if fee_abs != 0 and self.wallets.get_free(trade_base_currency) >= amount: + amount_ = amount + if order_obj.ft_order_side == trade.exit_side or order_obj.ft_order_side == 'stoploss': + # check against remaining amount! + amount_ = trade.amount - amount + + if fee_abs != 0 and self.wallets.get_free(trade_base_currency) >= amount_: # Eat into dust if we own more than base currency logger.info(f"Fee amount for {trade} was in base currency - " f"Eating Fee {fee_abs} into dust.") @@ -1833,7 +1838,8 @@ class FreqtradeBot(LoggingMixin): if trade_base_currency == fee_currency: # Apply fee to amount return self.apply_fee_conditional(trade, trade_base_currency, - amount=order_amount, fee_abs=fee_cost) + amount=order_amount, fee_abs=fee_cost, + order_obj=order_obj) return None return self.fee_detection_from_trades( trade, order, order_obj, order_amount, order.get('trades', [])) @@ -1892,8 +1898,8 @@ class FreqtradeBot(LoggingMixin): raise DependencyException("Half bought? Amounts don't match") if fee_abs != 0: - return self.apply_fee_conditional(trade, trade_base_currency, - amount=amount, fee_abs=fee_abs) + return self.apply_fee_conditional( + trade, trade_base_currency, amount=amount, fee_abs=fee_abs, order_obj=order_obj) return None def get_valid_price(self, custom_price: float, proposed_price: float) -> float: diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index e6c6e7978..aff0504b3 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -4650,11 +4650,17 @@ def test_apply_fee_conditional(default_conf_usdt, fee, mocker, fee_close=fee.return_value, open_order_id="123456" ) + order = Order( + ft_order_side='buy', + order_id='100', + ft_pair=trade.pair, + ft_is_open=True, + ) freqtrade = get_patched_freqtradebot(mocker, default_conf_usdt) walletmock.reset_mock() # Amount is kept as is - assert freqtrade.apply_fee_conditional(trade, 'LTC', amount, fee_abs) == amount_exp + assert freqtrade.apply_fee_conditional(trade, 'LTC', amount, fee_abs, order) == amount_exp assert walletmock.call_count == 1 From f3c73189d55be454845a4e9cc7d8b084a2b0853c Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 1 Sep 2022 06:49:51 +0200 Subject: [PATCH 072/437] Remove pointless default on wallet_balance argument --- freqtrade/exchange/exchange.py | 2 +- tests/exchange/test_exchange.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 9d08d3d19..c3dca43a8 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2600,7 +2600,7 @@ class Exchange: is_short: bool, amount: float, # Absolute value of position size stake_amount: float, - wallet_balance: float = 0.0, + wallet_balance: float, mm_ex_1: float = 0.0, # (Binance) Cross only upnl_ex_1: float = 0.0, # (Binance) Cross only ) -> Optional[float]: diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 5456b3098..3352019a9 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4985,6 +4985,7 @@ def test_get_liquidation_price1(mocker, default_conf): is_short=False, amount=0.8, stake_amount=18.884 * 0.8, + wallet_balance=18.884 * 0.8, ) assert liq_price == 17.47 @@ -4996,6 +4997,7 @@ def test_get_liquidation_price1(mocker, default_conf): is_short=False, amount=0.8, stake_amount=18.884 * 0.8, + wallet_balance=18.884 * 0.8, ) assert liq_price == 17.540699999999998 @@ -5007,6 +5009,7 @@ def test_get_liquidation_price1(mocker, default_conf): is_short=False, amount=0.8, stake_amount=18.884 * 0.8, + wallet_balance=18.884 * 0.8, ) assert liq_price is None default_conf['trading_mode'] = 'margin' @@ -5019,6 +5022,7 @@ def test_get_liquidation_price1(mocker, default_conf): is_short=False, amount=0.8, stake_amount=18.884 * 0.8, + wallet_balance=18.884 * 0.8, ) From d6e115178a117e6f22f648b1d0def25b90eec471 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Thu, 1 Sep 2022 07:09:23 -0300 Subject: [PATCH 073/437] refactoring freqai backtesting - remove duplicate code --- freqtrade/freqai/data_kitchen.py | 32 ++++++-------- freqtrade/freqai/freqai_interface.py | 62 ++++++---------------------- 2 files changed, 24 insertions(+), 70 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 361d9872d..f88e20223 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -69,6 +69,8 @@ class FreqaiDataKitchen: self.label_list: List = [] self.training_features_list: List = [] self.model_filename: str = "" + self.backtesting_results_path = Path() + self.backtesting_prediction_folder: str = "backtesting_predictions" self.live = live self.pair = pair @@ -808,8 +810,6 @@ class FreqaiDataKitchen: else: self.full_df = pd.concat([self.full_df, append_df], axis=0) - return append_df - def fill_predictions(self, dataframe): """ Back fill values to before the backtesting range so that the dataframe matches size @@ -1070,33 +1070,25 @@ class FreqaiDataKitchen: self.unique_class_list += list(self.unique_classes[label]) def save_backtesting_prediction( - self, file_name: str, root_folder: str, append_df: DataFrame + self, append_df: DataFrame ) -> None: """ Save prediction dataframe from backtesting to h5 file format - :param file_name: h5 file name - :param root_folder: folder to save h5 file + :param append_df: dataframe for backtesting period """ - backtesting_root = Path( - self.full_path - / root_folder - ) - if not backtesting_root.is_dir(): - backtesting_root.mkdir(parents=True, exist_ok=True) + full_predictions_folder = Path(self.full_path / self.backtesting_prediction_folder) + if not full_predictions_folder.is_dir(): + full_predictions_folder.mkdir(parents=True, exist_ok=True) - full_file_path = Path(self.full_path / root_folder / file_name) - append_df.to_hdf(full_file_path, key='append_df', mode='w') + append_df.to_hdf(self.backtesting_results_path, key='append_df', mode='w') def get_backtesting_prediction( - self, root_prediction: str, prediction_file_name: str + self ) -> DataFrame: + """ - Retrive from disk the prediction dataframe - :param prediction_file_name: prediction file full path - :return: - :Dataframe: Backtesting prediction from current backtesting period + Get prediction dataframe from h5 file format """ - prediction_path = Path(self.full_path / root_prediction / prediction_file_name) - append_df = pd.read_hdf(prediction_path) + append_df = pd.read_hdf(self.backtesting_results_path) return append_df diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 2297811b4..0a63e36ea 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -231,15 +231,11 @@ class IFreqaiModel(ABC): f"sub-train-{metadata['pair'].split('/')[0]}_{trained_timestamp_int}" ) - if self.backtest_prediction_exists( - metadata["pair"], dk, trained_timestamp=trained_timestamp_int - ): - prediction_filename, root_prediction = self.get_backtesting_prediction_file_name( - metadata["pair"], - dk, - trained_timestamp=int(trained_timestamp.stopts)) + coin, _ = metadata["pair"].split("/") + dk.model_filename = f"cb_{coin.lower()}_{trained_timestamp_int}" - append_df = dk.get_backtesting_prediction(root_prediction, prediction_filename) + if self.backtest_prediction_exists(dk): + append_df = dk.get_backtesting_prediction() dk.append_predictions(append_df) else: if not self.model_exists( @@ -259,15 +255,7 @@ class IFreqaiModel(ABC): pred_df, do_preds = self.predict(dataframe_backtest, dk) append_df = dk.get_predictions_to_append(pred_df, do_preds) dk.append_predictions(append_df) - - prediction_file_name, root_prediction = self.get_backtesting_prediction_file_name( - metadata["pair"], - dk, - trained_timestamp_int) - - dk.save_backtesting_prediction(prediction_file_name, - root_prediction, - append_df) + dk.save_backtesting_prediction(append_df) dk.fill_predictions(dataframe) @@ -478,11 +466,6 @@ class IFreqaiModel(ABC): :return: :boolean: whether the model file exists or not. """ - coin, _ = pair.split("/") - - if not self.live: - dk.model_filename = model_filename = f"cb_{coin.lower()}_{trained_timestamp}" - path_to_modelfile = Path(dk.data_path / f"{model_filename}_model.joblib") file_exists = path_to_modelfile.is_file() if file_exists and not scanning: @@ -661,23 +644,21 @@ class IFreqaiModel(ABC): def backtest_prediction_exists( self, - pair: str, dk: FreqaiDataKitchen, - trained_timestamp: int, scanning: bool = False, ) -> bool: """ - Given a pair and path, check if a backtesting prediction already exists - :param pair: pair e.g. BTC/USD - :param path: path to prediction + Check if a backtesting prediction already exists + :param dk: FreqaiDataKitchen :return: :boolean: whether the prediction file exists or not. """ if not self.live: - prediction_file_name, root_prediction = self.get_backtesting_prediction_file_name( - pair, dk, trained_timestamp - ) - path_to_predictionfile = Path(dk.full_path / root_prediction / prediction_file_name) + prediction_file_name = dk.model_filename + path_to_predictionfile = Path(dk.full_path / + dk.backtesting_prediction_folder / + f"{prediction_file_name}_prediction.h5") + dk.backtesting_results_path = path_to_predictionfile file_exists = path_to_predictionfile.is_file() if file_exists and not scanning: @@ -690,25 +671,6 @@ class IFreqaiModel(ABC): else: return False - def get_backtesting_prediction_file_name( - self, pair: str, dk: FreqaiDataKitchen, trained_timestamp: int - ): - """ - Given a pair, path and a trained timestamp, - returns the path and name of the predictions file - :param pair: pair e.g. BTC/USD - :param dk: FreqaiDataKitchen - :trained_timestamp: current backtesting timestamp period - :return: - :str: prediction file name - :str: prediction root path - """ - coin, _ = pair.split("/") - prediction_base_filename = f"{coin.lower()}_{trained_timestamp}" - root_prediction = 'backtesting_predictions' - prediction_file_name = f"{prediction_base_filename}_predictions.h5" - return prediction_file_name, root_prediction - # Following methods which are overridden by user made prediction models. # See freqai/prediction_models/CatboostPredictionModel.py for an example. From 61d5fc0e0836aa880ce00bf60981027a0bce7f40 Mon Sep 17 00:00:00 2001 From: epigramx Date: Thu, 1 Sep 2022 17:22:34 +0300 Subject: [PATCH 074/437] Make the recommendation for Binance/Kucoin blacklisting more accurate. Now that a recent bug regarding selling BNB is fixed, it should be safe to trade it, but with a warning that the user may have to manually maintain extra BNB. Also the old text implied those features are always unabled so this texts makes it clear those fee-related features can be also disabled. I'm not sure if it's still true that an "eaten by fees" position becomes unsellable but I left that as it is. --- docs/exchanges.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/exchanges.md b/docs/exchanges.md index 407a67d70..b55eaac74 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -61,8 +61,8 @@ Binance supports [time_in_force](configuration.md#understand-order_time_in_force ### Binance Blacklist -For Binance, please add `"BNB/"` to your blacklist to avoid issues. -Accounts having BNB accounts use this to pay for fees - if your first trade happens to be on `BNB`, further trades will consume this position and make the initial BNB trade unsellable as the expected amount is not there anymore. +For Binance, it is suggested to add `"BNB/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `BNB` on the account or, unless you're willing to disable using `BNB` for fees. +Binance accounts may use `BNB` for fees, and if a trade happens to be on `BNB`, further trades may consume this position and make the initial BNB trade unsellable as the expected amount is not there anymore. ### Binance Futures @@ -205,8 +205,8 @@ Kucoin supports [time_in_force](configuration.md#understand-order_time_in_force) ### Kucoin Blacklists -For Kucoin, please add `"KCS/"` to your blacklist to avoid issues. -Accounts having KCS accounts use this to pay for fees - if your first trade happens to be on `KCS`, further trades will consume this position and make the initial KCS trade unsellable as the expected amount is not there anymore. +For Kucoin, it is suggested to add `"KCS/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or, unless you're willing to disable using `KCS` for fees. +Kucoin accounts may use `KCS` for fees, and if a trade happens to be on `KCS`, further trades may consume this position and make the initial `KCS` trade unsellable as the expected amount is not there anymore. ## Huobi From 11fbfd3402996db93870b5d4beadc2b0840bc37c Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 1 Sep 2022 19:39:20 +0200 Subject: [PATCH 075/437] Remove unnecessary assignment --- freqtrade/persistence/trade_model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 23997f835..1f14f110e 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -648,7 +648,6 @@ class LocalTrade(): """ self.close_rate = rate self.close_date = self.close_date or datetime.utcnow() - self.close_profit_abs = self.calc_profit(rate) + self.realized_profit self.is_open = False self.exit_order_status = 'closed' self.open_order_id = None From 3f8400df10abd51f814b566a2c17ea5423963f34 Mon Sep 17 00:00:00 2001 From: th0rntwig Date: Thu, 1 Sep 2022 21:51:33 +0200 Subject: [PATCH 076/437] Normalise PCA space --- freqtrade/freqai/data_kitchen.py | 64 ++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index f38c69fae..2a3d00cc5 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -287,19 +287,26 @@ class FreqaiDataKitchen: :returns: :data_dictionary: updated dictionary with standardized values. """ + + df_train_features = data_dictionary["train_features"] # standardize the data by training stats - train_max = data_dictionary["train_features"].max() - train_min = data_dictionary["train_features"].min() - data_dictionary["train_features"] = ( - 2 * (data_dictionary["train_features"] - train_min) / (train_max - train_min) - 1 + train_max = df_train_features.max() + train_min = df_train_features.min() + df_train_features = ( + 2 * (df_train_features - train_min) / (train_max - train_min) - 1 ) data_dictionary["test_features"] = ( 2 * (data_dictionary["test_features"] - train_min) / (train_max - train_min) - 1 ) for item in train_max.keys(): - self.data[item + "_max"] = train_max[item] - self.data[item + "_min"] = train_min[item] + if not [col for col in df_train_features.columns if col.startwith('PC')]: + self.data[item + "_max"] = train_max[item] + self.data[item + "_min"] = train_min[item] + else: + # if PCA is enabled and has transformed the training features + self.data[item + "_pca_max"] = train_max[item] + self.data[item + "_pca_min"] = train_min[item] for item in data_dictionary["train_labels"].keys(): if data_dictionary["train_labels"][item].dtype == object: @@ -320,8 +327,14 @@ class FreqaiDataKitchen: - 1 ) - self.data[f"{item}_max"] = train_labels_max # .to_dict() - self.data[f"{item}_min"] = train_labels_min # .to_dict() + if not [col for col in df_train_features.columns if col.startwith('PC')]: + self.data[f"{item}_max"] = train_labels_max # .to_dict() + self.data[f"{item}_min"] = train_labels_min # .to_dict() + else: + # if PCA is enabled and has transformed the training features + self.data[f"{item}_pca_max"] = train_labels_max # .to_dict() + self.data[f"{item}_pca_min"] = train_labels_min # .to_dict() + return data_dictionary def normalize_data_from_metadata(self, df: DataFrame) -> DataFrame: @@ -331,11 +344,17 @@ class FreqaiDataKitchen: :param df: Dataframe to be standardized """ + if not [col for col in df.columns if col.startwith('PC')]: + id_str = '' + else: + # if PCA is enabled + id_str = '_pca' + for item in df.keys(): df[item] = ( 2 - * (df[item] - self.data[f"{item}_min"]) - / (self.data[f"{item}_max"] - self.data[f"{item}_min"]) + * (df[item] - self.data[f"{item}{id_str}_min"]) + / (self.data[f"{item}{id_str}_max"] - self.data[f"{item}{id_str}_min"]) - 1 ) @@ -450,22 +469,23 @@ class FreqaiDataKitchen: from sklearn.decomposition import PCA # avoid importing if we dont need it - n_components = self.data_dictionary["train_features"].shape[1] - pca = PCA(n_components=n_components) + pca = PCA(0.999) pca = pca.fit(self.data_dictionary["train_features"]) - n_keep_components = np.argmin(pca.explained_variance_ratio_.cumsum() < 0.999) - pca2 = PCA(n_components=n_keep_components) + n_keep_components = pca.n_components_ self.data["n_kept_components"] = n_keep_components - pca2 = pca2.fit(self.data_dictionary["train_features"]) + n_components = self.data_dictionary["train_features"].shape[1] logger.info("reduced feature dimension by %s", n_components - n_keep_components) - logger.info("explained variance %f", np.sum(pca2.explained_variance_ratio_)) - train_components = pca2.transform(self.data_dictionary["train_features"]) + logger.info("explained variance %f", np.sum(pca.explained_variance_ratio_)) + train_components = pca.transform(self.data_dictionary["train_features"]) self.data_dictionary["train_features"] = pd.DataFrame( data=train_components, columns=["PC" + str(i) for i in range(0, n_keep_components)], index=self.data_dictionary["train_features"].index, ) + # normalsing transformed training features + self.data_dictionary["train_features"] = self.normalize_data( + self.data_dictionary["train_features"]) # keeping a copy of the non-transformed features so we can check for errors during # model load from disk @@ -473,15 +493,18 @@ class FreqaiDataKitchen: self.training_features_list = self.data_dictionary["train_features"].columns if self.freqai_config.get('data_split_parameters', {}).get('test_size', 0.1) != 0: - test_components = pca2.transform(self.data_dictionary["test_features"]) + test_components = pca.transform(self.data_dictionary["test_features"]) self.data_dictionary["test_features"] = pd.DataFrame( data=test_components, columns=["PC" + str(i) for i in range(0, n_keep_components)], index=self.data_dictionary["test_features"].index, ) + # normalise transformed test feature to transformed training features + self.data_dictionary["test_features"] = self.normalize_data_from_metadata( + self.data_dictionary["test_features"]) self.data["n_kept_components"] = n_keep_components - self.pca = pca2 + self.pca = pca logger.info(f"PCA reduced total features from {n_components} to {n_keep_components}") @@ -502,6 +525,9 @@ class FreqaiDataKitchen: columns=["PC" + str(i) for i in range(0, self.data["n_kept_components"])], index=filtered_dataframe.index, ) + # normalise transformed predictions to transformed training features + self.data_dictionary["prediction_features"] = self.normalize_data_from_metadata( + self.data_dictionary["prediction_features"]) def compute_distances(self) -> float: """ From 11b2bc269ed1e4851f9cb51331b21a3faefe68a5 Mon Sep 17 00:00:00 2001 From: th0rntwig Date: Thu, 1 Sep 2022 22:37:32 +0200 Subject: [PATCH 077/437] Added missing s --- freqtrade/freqai/data_kitchen.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 2a3d00cc5..69ce5272d 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -300,7 +300,7 @@ class FreqaiDataKitchen: ) for item in train_max.keys(): - if not [col for col in df_train_features.columns if col.startwith('PC')]: + if not [col for col in df_train_features.columns if col.startswith('PC')]: self.data[item + "_max"] = train_max[item] self.data[item + "_min"] = train_min[item] else: @@ -327,7 +327,7 @@ class FreqaiDataKitchen: - 1 ) - if not [col for col in df_train_features.columns if col.startwith('PC')]: + if not [col for col in df_train_features.columns if col.startswith('PC')]: self.data[f"{item}_max"] = train_labels_max # .to_dict() self.data[f"{item}_min"] = train_labels_min # .to_dict() else: @@ -344,7 +344,7 @@ class FreqaiDataKitchen: :param df: Dataframe to be standardized """ - if not [col for col in df.columns if col.startwith('PC')]: + if not [col for col in df.columns if col.startswith('PC')]: id_str = '' else: # if PCA is enabled From 00f35f48707a600fb13fd723d376502fd1e4ddd8 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 1 Sep 2022 20:06:36 -0600 Subject: [PATCH 078/437] remove old constant, add initial_data requesting, minor changes --- freqtrade/constants.py | 3 - freqtrade/data/dataprovider.py | 1 - freqtrade/enums/rpcmessagetype.py | 1 + freqtrade/freqtradebot.py | 10 +-- freqtrade/rpc/api_server/api_ws.py | 39 +++++++++--- freqtrade/rpc/api_server/webserver.py | 8 +-- freqtrade/rpc/external_message_consumer.py | 73 +++++++++++++++------- freqtrade/rpc/rpc.py | 51 ++++++++++++--- freqtrade/rpc/rpc_manager.py | 2 + freqtrade/strategy/interface.py | 4 +- 10 files changed, 136 insertions(+), 56 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 6bacaf961..63222f2ff 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -61,8 +61,6 @@ USERPATH_FREQAIMODELS = 'freqaimodels' TELEGRAM_SETTING_OPTIONS = ['on', 'off', 'silent'] WEBHOOK_FORMAT_OPTIONS = ['form', 'json', 'raw'] -WAIT_DATA_POLICY_OPTIONS = ['none', 'first', 'all'] - ENV_VAR_PREFIX = 'FREQTRADE__' NON_OPEN_EXCHANGE_STATES = ('cancelled', 'canceled', 'closed', 'expired') @@ -404,7 +402,6 @@ CONF_SCHEMA = { 'username': {'type': 'string'}, 'password': {'type': 'string'}, 'ws_token': {'type': 'string'}, - 'enable_message_ws': {'type': 'boolean', 'default': False}, 'jwt_secret_key': {'type': 'string'}, 'CORS_origins': {'type': 'array', 'items': {'type': 'string'}}, 'verbosity': {'type': 'string', 'enum': ['error', 'info']}, diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 947387f75..90302f88e 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -144,7 +144,6 @@ class DataProvider: if producer_name not in self.__producer_pairs_df: self.__producer_pairs_df[producer_name] = {} - # For multiple leaders, if the data already exists, we'd merge self.__producer_pairs_df[producer_name][pair_key] = (dataframe, datetime.now(timezone.utc)) def get_external_df( diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 6283fb7cc..c213826ae 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -33,3 +33,4 @@ class RPCMessageType(str, Enum): # Enum for parsing requests from ws consumers class RPCRequestType(str, Enum): SUBSCRIBE = 'subscribe' + INITIAL_DATA = 'initial_data' diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 19c77d403..888994ffb 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -203,8 +203,7 @@ class FreqtradeBot(LoggingMixin): # Doesn't necessarily NEED to be this way, as maybe we'd like to broadcast # even if we are using external dataframes in the future. - self.strategy.analyze(self.active_pair_whitelist, - emit_df=self.dataprovider.external_data_enabled) + self.strategy.analyze(self.active_pair_whitelist) with self._exit_lock: # Check for exchange cancelations, timeouts and user requested replace @@ -264,11 +263,10 @@ class FreqtradeBot(LoggingMixin): pairs that have open trades. """ # Refresh whitelist + _prev_whitelist = self.pairlists.whitelist self.pairlists.refresh_pairlist() _whitelist = self.pairlists.whitelist - self.rpc.send_msg({'type': RPCMessageType.WHITELIST, 'data': _whitelist}) - # Calculating Edge positioning if self.edge: self.edge.calculate(_whitelist) @@ -279,6 +277,10 @@ class FreqtradeBot(LoggingMixin): # It ensures that candle (OHLCV) data are downloaded for open trades as well _whitelist.extend([trade.pair for trade in trades if trade.pair not in _whitelist]) + # Called last to include the included pairs + if _prev_whitelist != _whitelist: + self.rpc.send_msg({'type': RPCMessageType.WHITELIST, 'data': _whitelist}) + return _whitelist def get_free_open_trades(self) -> int: diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index d7c7239d1..52507106d 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -4,9 +4,10 @@ from typing import Any, Dict from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect from freqtrade.enums import RPCMessageType, RPCRequestType -from freqtrade.rpc.api_server.deps import get_channel_manager +from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws.utils import is_websocket_alive +from freqtrade.rpc.rpc import RPC # from typing import Any, Dict @@ -18,17 +19,20 @@ logger = logging.getLogger(__name__) router = APIRouter() -# We are passed a Channel object, we can only do sync functions on that channel object -def _process_consumer_request(request: Dict[str, Any], channel: WebSocketChannel): +async def _process_consumer_request( + request: Dict[str, Any], + channel: WebSocketChannel, + rpc: RPC +): type, data = request.get('type'), request.get('data') - # If the request is empty, do nothing - if not data: - return - # If we have a request of type SUBSCRIBE, set the topics in this channel if type == RPCRequestType.SUBSCRIBE: - if isinstance(data, list): + # If the request is empty, do nothing + if not data: + return + + if not isinstance(data, list): logger.error(f"Improper request from channel: {channel} - {request}") return @@ -38,11 +42,26 @@ def _process_consumer_request(request: Dict[str, Any], channel: WebSocketChannel logger.debug(f"{channel} subscribed to topics: {data}") channel.set_subscriptions(data) + elif type == RPCRequestType.INITIAL_DATA: + # Acquire the data + initial_data = rpc._ws_initial_data() + + # We now loop over it sending it in pieces + whitelist_data, analyzed_df = initial_data.get('whitelist'), initial_data.get('analyzed_df') + + if whitelist_data: + await channel.send({"type": RPCMessageType.WHITELIST, "data": whitelist_data}) + + if analyzed_df: + for pair, message in analyzed_df.items(): + await channel.send({"type": RPCMessageType.ANALYZED_DF, "data": message}) + @router.websocket("/message/ws") async def message_endpoint( ws: WebSocket, - channel_manager=Depends(get_channel_manager) + rpc: RPC = Depends(get_rpc), + channel_manager=Depends(get_channel_manager), ): try: if is_websocket_alive(ws): @@ -59,7 +78,7 @@ async def message_endpoint( # Process the request here. Should this be a method of RPC? logger.info(f"Request: {request}") - _process_consumer_request(request, channel) + await _process_consumer_request(request, channel, rpc) except WebSocketDisconnect: # Handle client disconnects diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index e391e66af..150c83890 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -151,11 +151,9 @@ class ApiServer(RPCHandler): app.include_router(api_backtest, prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token)], ) - if self._config.get('api_server', {}).get('enable_message_ws', False): - logger.info("Enabling Message WebSocket") - app.include_router(ws_router, prefix="/api/v1", - dependencies=[Depends(get_ws_token)] - ) + app.include_router(ws_router, prefix="/api/v1", + dependencies=[Depends(get_ws_token)] + ) app.include_router(router_login, prefix="/api/v1", tags=["auth"]) # UI Router MUST be last! app.include_router(router_ui, prefix='') diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index ae72089b5..4544afc29 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,7 +8,7 @@ import asyncio import logging import socket from threading import Thread -from typing import Any, Dict +from typing import Any, Dict, Optional import websockets @@ -58,6 +58,11 @@ class ExternalMessageConsumer: # callbacks for the messages self.topics = [RPCMessageType.WHITELIST, RPCMessageType.ANALYZED_DF] + self._message_handlers = { + RPCMessageType.WHITELIST: self._consume_whitelist_message, + RPCMessageType.ANALYZED_DF: self._consume_analyzed_df_message, + } + self.start() def start(self): @@ -152,6 +157,11 @@ class ExternalMessageConsumer: self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) ) + # Now request the initial data from this Producer + await channel.send( + self.compose_consumer_request(RPCRequestType.INITIAL_DATA) + ) + # Now receive data, if none is within the time limit, ping while True: try: @@ -198,7 +208,11 @@ class ExternalMessageConsumer: logger.error(f"{ws_url} is an invalid WebSocket URL - {e}") break - def compose_consumer_request(self, type_: RPCRequestType, data: Any) -> Dict[str, Any]: + def compose_consumer_request( + self, + type_: RPCRequestType, + data: Optional[Any] = None + ) -> Dict[str, Any]: """ Create a request for sending to a producer @@ -208,8 +222,6 @@ class ExternalMessageConsumer: """ return {'type': type_, 'data': data} - # How we do things here isn't set in stone. There seems to be some interest - # in figuring out a better way, but we shall do this for now. def handle_producer_message(self, producer: Dict[str, Any], message: Dict[str, Any]): """ Handles external messages from a Producer @@ -225,27 +237,44 @@ class ExternalMessageConsumer: logger.debug(f"Received message of type {message_type}") - # Handle Whitelists - if message_type == RPCMessageType.WHITELIST: - pairlist = message_data + message_handler = self._message_handlers.get(message_type) - # Add the pairlist data to the DataProvider - self._dp.set_producer_pairs(pairlist, producer_name=producer_name) + if not message_handler: + logger.info(f"Received unhandled message: {message_data}, ignoring...") + return - # Handle analyzed dataframes - elif message_type == RPCMessageType.ANALYZED_DF: - key, value = message_data.get('key'), message_data.get('value') + message_handler(producer_name, message_data) - if key and value: - pair, timeframe, candle_type = key + def _consume_whitelist_message(self, producer_name: str, message_data: Any): + # We expect List[str] + if not isinstance(message_data, list): + return - # Convert the JSON to a pandas DataFrame - dataframe = json_to_dataframe(value) + # Add the pairlist data to the DataProvider + self._dp.set_producer_pairs(message_data, producer_name=producer_name) - # If set, remove the Entry and Exit signals from the Producer - if self._emc_config.get('remove_entry_exit_signals', False): - dataframe = remove_entry_exit_signals(dataframe) + logger.debug(f"Consumed message from {producer_name} of type RPCMessageType.WHITELIST") - # Add the dataframe to the dataprovider - self._dp.add_external_df(pair, timeframe, dataframe, - candle_type, producer_name=producer_name) + def _consume_analyzed_df_message(self, producer_name: str, message_data: Any): + # We expect a Dict[str, Any] + if not isinstance(message_data, dict): + return + + key, value = message_data.get('key'), message_data.get('value') + + if key and value: + pair, timeframe, candle_type = key + + # Convert the JSON to a pandas DataFrame + dataframe = json_to_dataframe(value) + + # If set, remove the Entry and Exit signals from the Producer + if self._emc_config.get('remove_entry_exit_signals', False): + dataframe = remove_entry_exit_signals(dataframe) + + # Add the dataframe to the dataprovider + self._dp.add_external_df(pair, timeframe, dataframe, + candle_type, producer_name=producer_name) + + logger.debug( + f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index ed7f13a96..c4752c570 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -24,7 +24,7 @@ from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirecti from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler -from freqtrade.misc import decimals_per_coin, shorten_date +from freqtrade.misc import dataframe_to_json, decimals_per_coin, shorten_date from freqtrade.persistence import PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -1035,16 +1035,51 @@ class RPC: def _rpc_analysed_dataframe(self, pair: str, timeframe: str, limit: Optional[int]) -> Dict[str, Any]: + """ Analyzed dataframe in Dict form """ - _data, last_analyzed = self._freqtrade.dataprovider.get_analyzed_dataframe( - pair, timeframe) - _data = _data.copy() - if limit: - _data = _data.iloc[-limit:] + _data, last_analyzed = self.__rpc_analysed_dataframe_raw(pair, timeframe, limit) return self._convert_dataframe_to_dict(self._freqtrade.config['strategy'], pair, timeframe, _data, last_analyzed) - @staticmethod + def __rpc_analysed_dataframe_raw(self, pair: str, timeframe: str, + limit: Optional[int]) -> Tuple[DataFrame, datetime]: + """ Get the dataframe and last analyze from the dataprovider """ + _data, last_analyzed = self._freqtrade.dataprovider.get_analyzed_dataframe( + pair, timeframe) + _data = _data.copy() + + if limit: + _data = _data.iloc[-limit:] + return _data, last_analyzed + + def _ws_all_analysed_dataframes( + self, + pairlist: List[str], + limit: Optional[int] + ) -> Dict[str, Any]: + """ Get the analysed dataframes of each pair in the pairlist """ + timeframe = self._freqtrade.config['timeframe'] + candle_type = self._freqtrade.config.get('candle_type_def', CandleType.SPOT) + _data = {} + + for pair in pairlist: + dataframe, last_analyzed = self.__rpc_analysed_dataframe_raw(pair, timeframe, limit) + _data[pair] = { + "key": (pair, timeframe, candle_type), + "value": dataframe_to_json(dataframe) + } + + return _data + + def _ws_initial_data(self): + """ Websocket friendly initial data, whitelists and all analyzed dataframes """ + whitelist = self._freqtrade.active_pair_whitelist + # We only get the last 500 candles, should we remove the limit? + analyzed_df = self._ws_all_analysed_dataframes(whitelist, 500) + + return {"whitelist": whitelist, "analyzed_df": analyzed_df} + + @ staticmethod def _rpc_analysed_history_full(config, pair: str, timeframe: str, timerange: str, exchange) -> Dict[str, Any]: timerange_parsed = TimeRange.parse_timerange(timerange) @@ -1075,7 +1110,7 @@ class RPC: self._freqtrade.strategy.plot_config['subplots'] = {} return self._freqtrade.strategy.plot_config - @staticmethod + @ staticmethod def _rpc_sysinfo() -> Dict[str, Any]: return { "cpu_pct": psutil.cpu_percent(interval=1, percpu=True), diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 3488a6e3c..d6374566c 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -81,6 +81,8 @@ class RPCManager: # Removed actually showing the message because the logs would be # completely spammed of the json dataframe logger.info('Sending rpc message of type: %s', msg.get('type')) + # Log actual message in debug? + # logger.debug(msg) if 'pair' in msg: msg.update({ 'base_currency': self._rpc._freqtrade.exchange.get_pair_base_currency(msg['pair']) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 34e475ed7..7fcae870a 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -725,9 +725,7 @@ class IStrategy(ABC, HyperStrategyMixin): candle_type = self.config.get('candle_type_def', CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) - - if emit_df: - self.dp.emit_df((pair, self.timeframe, candle_type), dataframe) + self.dp.emit_df((pair, self.timeframe, candle_type), dataframe) else: logger.debug("Skipping TA Analysis for already analyzed candle") From b53791fef20990d2a46b9dbf6795fb8cfc490c2f Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Sep 2022 07:11:20 +0200 Subject: [PATCH 079/437] Futures volumepairlist to account for contract size --- freqtrade/plugins/pairlist/VolumePairList.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/freqtrade/plugins/pairlist/VolumePairList.py b/freqtrade/plugins/pairlist/VolumePairList.py index 8138a5fb6..d7cc6e5ec 100644 --- a/freqtrade/plugins/pairlist/VolumePairList.py +++ b/freqtrade/plugins/pairlist/VolumePairList.py @@ -186,6 +186,7 @@ class VolumePairList(IPairList): needed_pairs, since_ms=since_ms, cache=False ) for i, p in enumerate(filtered_tickers): + contract_size = self._exchange.markets[p['symbol']].get('contractSize', 1.0) or 1.0 pair_candles = candles[ (p['symbol'], self._lookback_timeframe, self._def_candletype) ] if ( @@ -199,6 +200,7 @@ class VolumePairList(IPairList): pair_candles['quoteVolume'] = ( pair_candles['volume'] * pair_candles['typical_price'] + * contract_size ) else: # Exchange ohlcv data is in quote volume already. From dccde88c83c4e8dfa7c8b70a6c4a7f9459ce177c Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 1 Sep 2022 23:15:03 -0600 Subject: [PATCH 080/437] fix dataframe serializing --- freqtrade/data/dataprovider.py | 3 +- freqtrade/misc.py | 3 +- freqtrade/rpc/api_server/ws/channel.py | 4 +-- freqtrade/rpc/api_server/ws/serializer.py | 37 +++++++++++++++------- freqtrade/rpc/external_message_consumer.py | 9 +++--- freqtrade/rpc/rpc.py | 7 ++-- 6 files changed, 37 insertions(+), 26 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 90302f88e..ef3067f38 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -17,7 +17,6 @@ from freqtrade.data.history import load_pair_history from freqtrade.enums import CandleType, RPCMessageType, RunMode from freqtrade.exceptions import ExchangeError, OperationalException from freqtrade.exchange import Exchange, timeframe_to_seconds -from freqtrade.misc import dataframe_to_json from freqtrade.rpc import RPCManager from freqtrade.util import PeriodicCache @@ -119,7 +118,7 @@ class DataProvider: 'type': RPCMessageType.ANALYZED_DF, 'data': { 'key': pair_key, - 'value': dataframe_to_json(dataframe) + 'value': dataframe } } ) diff --git a/freqtrade/misc.py b/freqtrade/misc.py index ceace4ed8..6a93b6f26 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -269,7 +269,8 @@ def json_to_dataframe(data: str) -> pandas.DataFrame: :returns: A pandas DataFrame from the JSON string """ dataframe = pandas.read_json(data) - dataframe['date'] = pandas.to_datetime(dataframe['date'], unit='ms', utc=True) + if 'date' in dataframe.columns: + dataframe['date'] = pandas.to_datetime(dataframe['date'], unit='ms', utc=True) return dataframe diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 6bc5b9d6b..b47fe7550 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -3,7 +3,7 @@ from threading import RLock from typing import List, Type from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy -from freqtrade.rpc.api_server.ws.serializer import ORJSONWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.api_server.ws.serializer import RapidJSONWebSocketSerializer, WebSocketSerializer from freqtrade.rpc.api_server.ws.types import WebSocketType @@ -18,7 +18,7 @@ class WebSocketChannel: def __init__( self, websocket: WebSocketType, - serializer_cls: Type[WebSocketSerializer] = ORJSONWebSocketSerializer + serializer_cls: Type[WebSocketSerializer] = RapidJSONWebSocketSerializer ): # The WebSocket object self._websocket = WebSocketProxy(websocket) diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index ae2857f0b..c11ca9a99 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -3,8 +3,10 @@ import logging from abc import ABC, abstractmethod import msgpack -import orjson +import rapidjson +from pandas import DataFrame +from freqtrade.misc import dataframe_to_json, json_to_dataframe from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy @@ -34,27 +36,23 @@ class WebSocketSerializer(ABC): async def close(self, code: int = 1000): await self._websocket.close(code) -# Going to explore using MsgPack as the serialization, -# as that might be the best method for sending pandas -# dataframes over the wire - class JSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data): - return json.dumps(data) + return json.dumps(data, default=_json_default) def _deserialize(self, data): - return json.loads(data) + return json.loads(data, object_hook=_json_object_hook) -class ORJSONWebSocketSerializer(WebSocketSerializer): - ORJSON_OPTIONS = orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY +# ORJSON does not support .loads(object_hook=x) parameter, so we must use RapidJSON +class RapidJSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data): - return orjson.dumps(data, option=self.ORJSON_OPTIONS) + return rapidjson.dumps(data, default=_json_default) def _deserialize(self, data): - return orjson.loads(data) + return rapidjson.loads(data, object_hook=_json_object_hook) class MsgPackWebSocketSerializer(WebSocketSerializer): @@ -63,3 +61,20 @@ class MsgPackWebSocketSerializer(WebSocketSerializer): def _deserialize(self, data): return msgpack.unpackb(data, raw=False) + + +# Support serializing pandas DataFrames +def _json_default(z): + if isinstance(z, DataFrame): + return { + '__type__': 'dataframe', + '__value__': dataframe_to_json(z) + } + raise TypeError + + +# Support deserializing JSON to pandas DataFrames +def _json_object_hook(z): + if z.get('__type__') == 'dataframe': + return json_to_dataframe(z.get('__value__')) + return z diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 4544afc29..4c7f6570d 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -10,11 +10,12 @@ import socket from threading import Thread from typing import Any, Dict, Optional +import pandas import websockets from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import RPCMessageType, RPCRequestType -from freqtrade.misc import json_to_dataframe, remove_entry_exit_signals +from freqtrade.misc import remove_entry_exit_signals from freqtrade.rpc.api_server.ws.channel import WebSocketChannel @@ -262,11 +263,9 @@ class ExternalMessageConsumer: key, value = message_data.get('key'), message_data.get('value') - if key and value: + if key and isinstance(value, pandas.DataFrame): pair, timeframe, candle_type = key - - # Convert the JSON to a pandas DataFrame - dataframe = json_to_dataframe(value) + dataframe = value # If set, remove the Entry and Exit signals from the Producer if self._emc_config.get('remove_entry_exit_signals', False): diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index c4752c570..96b43f36b 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -24,7 +24,7 @@ from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirecti from freqtrade.exceptions import ExchangeError, PricingError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_msecs from freqtrade.loggers import bufferHandler -from freqtrade.misc import dataframe_to_json, decimals_per_coin, shorten_date +from freqtrade.misc import decimals_per_coin, shorten_date from freqtrade.persistence import PairLocks, Trade from freqtrade.persistence.models import PairLock from freqtrade.plugins.pairlist.pairlist_helpers import expand_pairlist @@ -1064,10 +1064,7 @@ class RPC: for pair in pairlist: dataframe, last_analyzed = self.__rpc_analysed_dataframe_raw(pair, timeframe, limit) - _data[pair] = { - "key": (pair, timeframe, candle_type), - "value": dataframe_to_json(dataframe) - } + _data[pair] = {"key": (pair, timeframe, candle_type), "value": dataframe} return _data From eb4cd6ba82b8d348b02a37d65c1567f0678f056d Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 1 Sep 2022 23:52:13 -0600 Subject: [PATCH 081/437] split initial data into separate requests --- freqtrade/enums/rpcmessagetype.py | 4 +++- freqtrade/rpc/api_server/api_ws.py | 22 +++++++++---------- freqtrade/rpc/external_message_consumer.py | 25 +++++++++++++--------- freqtrade/rpc/rpc.py | 11 +++++----- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index c213826ae..929f6d083 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -33,4 +33,6 @@ class RPCMessageType(str, Enum): # Enum for parsing requests from ws consumers class RPCRequestType(str, Enum): SUBSCRIBE = 'subscribe' - INITIAL_DATA = 'initial_data' + + WHITELIST = 'whitelist' + ANALYZED_DF = 'analyzed_df' diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 52507106d..cf5b6cde0 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -33,7 +33,7 @@ async def _process_consumer_request( return if not isinstance(data, list): - logger.error(f"Improper request from channel: {channel} - {request}") + logger.error(f"Improper subscribe request from channel: {channel} - {request}") return # If all topics passed are a valid RPCMessageType, set subscriptions on channel @@ -42,19 +42,19 @@ async def _process_consumer_request( logger.debug(f"{channel} subscribed to topics: {data}") channel.set_subscriptions(data) - elif type == RPCRequestType.INITIAL_DATA: - # Acquire the data - initial_data = rpc._ws_initial_data() + elif type == RPCRequestType.WHITELIST: + # They requested the whitelist + whitelist = rpc._ws_request_whitelist() - # We now loop over it sending it in pieces - whitelist_data, analyzed_df = initial_data.get('whitelist'), initial_data.get('analyzed_df') + await channel.send({"type": RPCMessageType.WHITELIST, "data": whitelist}) - if whitelist_data: - await channel.send({"type": RPCMessageType.WHITELIST, "data": whitelist_data}) + elif type == RPCRequestType.ANALYZED_DF: + # They requested the full historical analyzed dataframes + analyzed_df = rpc._ws_request_analyzed_df() - if analyzed_df: - for pair, message in analyzed_df.items(): - await channel.send({"type": RPCMessageType.ANALYZED_DF, "data": message}) + # For every dataframe, send as a separate message + for _, message in analyzed_df.items(): + await channel.send({"type": RPCMessageType.ANALYZED_DF, "data": message}) @router.websocket("/message/ws") diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 4c7f6570d..c925624f8 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -158,10 +158,12 @@ class ExternalMessageConsumer: self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) ) - # Now request the initial data from this Producer - await channel.send( - self.compose_consumer_request(RPCRequestType.INITIAL_DATA) - ) + # Now request the initial data from this Producer for every topic + # we've subscribed to + for topic in self.topics: + # without .upper() we get KeyError + request_type = RPCRequestType[topic.upper()] + await channel.send(self.compose_consumer_request(request_type)) # Now receive data, if none is within the time limit, ping while True: @@ -191,9 +193,12 @@ class ExternalMessageConsumer: await asyncio.sleep(self.sleep_time) break - except Exception as e: - logger.exception(e) - continue + + # Catch invalid ws_url, and break the loop + except websockets.exceptions.InvalidURI as e: + logger.error(f"{ws_url} is an invalid WebSocket URL - {e}") + break + except ( socket.gaierror, ConnectionRefusedError, @@ -204,9 +209,9 @@ class ExternalMessageConsumer: continue - # Catch invalid ws_url, and break the loop - except websockets.exceptions.InvalidURI as e: - logger.error(f"{ws_url} is an invalid WebSocket URL - {e}") + except Exception as e: + # An unforseen error has occurred, log and stop + logger.exception(e) break def compose_consumer_request( diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 96b43f36b..378677e44 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1068,13 +1068,14 @@ class RPC: return _data - def _ws_initial_data(self): - """ Websocket friendly initial data, whitelists and all analyzed dataframes """ + def _ws_request_analyzed_df(self): + """ Historical Analyzed Dataframes for WebSocket """ whitelist = self._freqtrade.active_pair_whitelist - # We only get the last 500 candles, should we remove the limit? - analyzed_df = self._ws_all_analysed_dataframes(whitelist, 500) + return self._ws_all_analysed_dataframes(whitelist, 500) - return {"whitelist": whitelist, "analyzed_df": analyzed_df} + def _ws_request_whitelist(self): + """ Whitelist data for WebSocket """ + return self._freqtrade.active_pair_whitelist @ staticmethod def _rpc_analysed_history_full(config, pair: str, timeframe: str, From 5b0b802f311f0999412482a1722e87afe306892d Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 2 Sep 2022 00:05:36 -0600 Subject: [PATCH 082/437] hybrid json ws serializer --- freqtrade/rpc/api_server/ws/channel.py | 5 +++-- freqtrade/rpc/api_server/ws/serializer.py | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index b47fe7550..8891d3296 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -3,7 +3,8 @@ from threading import RLock from typing import List, Type from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy -from freqtrade.rpc.api_server.ws.serializer import RapidJSONWebSocketSerializer, WebSocketSerializer +from freqtrade.rpc.api_server.ws.serializer import (HybridJSONWebSocketSerializer, + WebSocketSerializer) from freqtrade.rpc.api_server.ws.types import WebSocketType @@ -18,7 +19,7 @@ class WebSocketChannel: def __init__( self, websocket: WebSocketType, - serializer_cls: Type[WebSocketSerializer] = RapidJSONWebSocketSerializer + serializer_cls: Type[WebSocketSerializer] = HybridJSONWebSocketSerializer ): # The WebSocket object self._websocket = WebSocketProxy(websocket) diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index c11ca9a99..109708cc9 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -3,6 +3,7 @@ import logging from abc import ABC, abstractmethod import msgpack +import orjson import rapidjson from pandas import DataFrame @@ -55,6 +56,14 @@ class RapidJSONWebSocketSerializer(WebSocketSerializer): return rapidjson.loads(data, object_hook=_json_object_hook) +class HybridJSONWebSocketSerializer(WebSocketSerializer): + def _serialize(self, data): + return orjson.dumps(data, default=_json_default) + + def _deserialize(self, data): + return rapidjson.loads(data, object_hook=_json_object_hook) + + class MsgPackWebSocketSerializer(WebSocketSerializer): def _serialize(self, data): return msgpack.packb(data, use_bin_type=True) From a948e51389108d7b827d4ad4551fd861b88bdb71 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Sep 2022 19:56:12 +0200 Subject: [PATCH 083/437] Update futures docs to define pair namings #7334, #7136, ... --- docs/leverage.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/leverage.md b/docs/leverage.md index 491e6eda0..429aff86c 100644 --- a/docs/leverage.md +++ b/docs/leverage.md @@ -13,7 +13,7 @@ Please only use advanced trading modes when you know how freqtrade (and your strategy) works. Also, never risk more than what you can afford to lose. -Please read the [strategy migration guide](strategy_migration.md#strategy-migration-between-v2-and-v3) to migrate your strategy from a freqtrade v2 strategy, to v3 strategy that can short and trade futures. +If you already have an existing strategy, please read the [strategy migration guide](strategy_migration.md#strategy-migration-between-v2-and-v3) to migrate your strategy from a freqtrade v2 strategy, to strategy of version 3 which can short and trade futures. ## Shorting @@ -62,6 +62,13 @@ You will also have to pick a "margin mode" (explanation below) - with freqtrade "margin_mode": "isolated" ``` +##### Pair namings + +Freqtrade follows the [ccxt naming conventions for futures](https://docs.ccxt.com/en/latest/manual.html?#perpetual-swap-perpetual-future). +A futures pair will therefore have the naming of `base/quote:settle` (e.g. `ETH/USDT:USDT`). + +Binance is currently still an exception to this naming scheme, where pairs are named `ETH/USDT` also for futures markets, but will be aligned as soon as CCXT is ready. + ### Margin mode On top of `trading_mode` - you will also have to configure your `margin_mode`. From b26126cb57300cefb51222ddf185a4f929bdbba8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Sep 2022 20:08:38 +0200 Subject: [PATCH 084/437] Don't use ticker['symbol'] but use "pair" instead closes #7262 --- docs/exchanges.md | 4 ++-- freqtrade/plugins/pairlist/PrecisionFilter.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/exchanges.md b/docs/exchanges.md index b55eaac74..b5470f65a 100644 --- a/docs/exchanges.md +++ b/docs/exchanges.md @@ -61,7 +61,7 @@ Binance supports [time_in_force](configuration.md#understand-order_time_in_force ### Binance Blacklist -For Binance, it is suggested to add `"BNB/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `BNB` on the account or, unless you're willing to disable using `BNB` for fees. +For Binance, it is suggested to add `"BNB/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `BNB` on the account or unless you're willing to disable using `BNB` for fees. Binance accounts may use `BNB` for fees, and if a trade happens to be on `BNB`, further trades may consume this position and make the initial BNB trade unsellable as the expected amount is not there anymore. ### Binance Futures @@ -205,7 +205,7 @@ Kucoin supports [time_in_force](configuration.md#understand-order_time_in_force) ### Kucoin Blacklists -For Kucoin, it is suggested to add `"KCS/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or, unless you're willing to disable using `KCS` for fees. +For Kucoin, it is suggested to add `"KCS/"` to your blacklist to avoid issues, unless you are willing to maintain enough extra `KCS` on the account or unless you're willing to disable using `KCS` for fees. Kucoin accounts may use `KCS` for fees, and if a trade happens to be on `KCS`, further trades may consume this position and make the initial `KCS` trade unsellable as the expected amount is not there anymore. ## Huobi diff --git a/freqtrade/plugins/pairlist/PrecisionFilter.py b/freqtrade/plugins/pairlist/PrecisionFilter.py index dcd153d8e..61150f03d 100644 --- a/freqtrade/plugins/pairlist/PrecisionFilter.py +++ b/freqtrade/plugins/pairlist/PrecisionFilter.py @@ -52,7 +52,7 @@ class PrecisionFilter(IPairList): :return: True if the pair can stay, false if it should be removed """ if ticker.get('last', None) is None: - self.log_once(f"Removed {ticker['symbol']} from whitelist, because " + self.log_once(f"Removed {pair} from whitelist, because " "ticker['last'] is empty (Usually no trade in the last 24h).", logger.info) return False @@ -62,10 +62,10 @@ class PrecisionFilter(IPairList): sp = self._exchange.price_to_precision(pair, stop_price) stop_gap_price = self._exchange.price_to_precision(pair, stop_price * 0.99) - logger.debug(f"{ticker['symbol']} - {sp} : {stop_gap_price}") + logger.debug(f"{pair} - {sp} : {stop_gap_price}") if sp <= stop_gap_price: - self.log_once(f"Removed {ticker['symbol']} from whitelist, because " + self.log_once(f"Removed {pair} from whitelist, because " f"stop price {sp} would be <= stop limit {stop_gap_price}", logger.info) return False From cf917ad2f5b983f11ca1032a7f3f9b4742c88ca0 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 2 Sep 2022 15:05:16 -0600 Subject: [PATCH 085/437] initial candle request limit, better error reporting, split up _handle_producer_connection --- freqtrade/constants.py | 8 +- freqtrade/rpc/api_server/api_ws.py | 27 ++++-- freqtrade/rpc/api_server/ws/channel.py | 14 ++- freqtrade/rpc/api_server/ws/proxy.py | 10 +- freqtrade/rpc/external_message_consumer.py | 106 ++++++++++++++------- freqtrade/rpc/rpc.py | 4 +- 6 files changed, 119 insertions(+), 50 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 63222f2ff..352e48148 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -505,7 +505,13 @@ CONF_SCHEMA = { 'reply_timeout': {'type': 'integer'}, 'sleep_time': {'type': 'integer'}, 'ping_timeout': {'type': 'integer'}, - 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False} + 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False}, + 'initial_candle_limit': { + 'type': 'integer', + 'minimum': 100, + 'maximum': 1500, + 'default': 500 + } }, 'required': ['producers'] }, diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index cf5b6cde0..95cfd031a 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -26,6 +26,8 @@ async def _process_consumer_request( ): type, data = request.get('type'), request.get('data') + logger.debug(f"Request of type {type} from {channel}") + # If we have a request of type SUBSCRIBE, set the topics in this channel if type == RPCRequestType.SUBSCRIBE: # If the request is empty, do nothing @@ -49,8 +51,16 @@ async def _process_consumer_request( await channel.send({"type": RPCMessageType.WHITELIST, "data": whitelist}) elif type == RPCRequestType.ANALYZED_DF: + limit = None + + if data: + # Limit the amount of candles per dataframe to 'limit' or 1500 + limit = max(data.get('limit', 500), 1500) + # They requested the full historical analyzed dataframes - analyzed_df = rpc._ws_request_analyzed_df() + analyzed_df = rpc._ws_request_analyzed_df(limit) + + logger.debug(f"ANALYZED_DF RESULT: {analyzed_df}") # For every dataframe, send as a separate message for _, message in analyzed_df.items(): @@ -65,32 +75,33 @@ async def message_endpoint( ): try: if is_websocket_alive(ws): - logger.info(f"Consumer connected - {ws.client}") - # TODO: # Return a channel ID, pass that instead of ws to the rest of the methods channel = await channel_manager.on_connect(ws) + logger.info(f"Consumer connected - {channel}") + # Keep connection open until explicitly closed, and process requests try: while not channel.is_closed(): request = await channel.recv() - # Process the request here. Should this be a method of RPC? - logger.info(f"Request: {request}") + # Process the request here await _process_consumer_request(request, channel, rpc) except WebSocketDisconnect: # Handle client disconnects - logger.info(f"Consumer disconnected - {ws.client}") + logger.info(f"Consumer disconnected - {channel}") await channel_manager.on_disconnect(ws) except Exception as e: - logger.info(f"Consumer connection failed - {ws.client}") + logger.info(f"Consumer connection failed - {channel}") logger.exception(e) # Handle cases like - # RuntimeError('Cannot call "send" once a closed message has been sent') await channel_manager.on_disconnect(ws) - except Exception: + except Exception as e: logger.error(f"Failed to serve - {ws.client}") + # Log tracebacks to keep track of what errors are happening + logger.exception(e) await channel_manager.on_disconnect(ws) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 8891d3296..1f0cd9c7a 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -1,6 +1,7 @@ import logging from threading import RLock -from typing import List, Type +from typing import List, Optional, Type +from uuid import uuid4 from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy from freqtrade.rpc.api_server.ws.serializer import (HybridJSONWebSocketSerializer, @@ -19,8 +20,12 @@ class WebSocketChannel: def __init__( self, websocket: WebSocketType, + channel_id: Optional[str] = None, serializer_cls: Type[WebSocketSerializer] = HybridJSONWebSocketSerializer ): + + self.channel_id = channel_id if channel_id else uuid4().hex[:8] + # The WebSocket object self._websocket = WebSocketProxy(websocket) # The Serializing class for the WebSocket object @@ -34,6 +39,13 @@ class WebSocketChannel: # Wrap the WebSocket in the Serializing class self._wrapped_ws = self._serializer_cls(self._websocket) + def __repr__(self): + return f"WebSocketChannel({self.channel_id}, {self.remote_addr})" + + @property + def remote_addr(self): + return self._websocket.remote_addr + async def send(self, data): """ Send data on the wrapped websocket diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index 6acc1d363..73d1481b9 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Any, Tuple, Union from fastapi import WebSocket as FastAPIWebSocket from websockets import WebSocketClientProtocol as WebSocket @@ -15,6 +15,14 @@ class WebSocketProxy: def __init__(self, websocket: WebSocketType): self._websocket: Union[FastAPIWebSocket, WebSocket] = websocket + @property + def remote_addr(self) -> Tuple[Any, ...]: + if hasattr(self._websocket, "remote_address"): + return self._websocket.remote_address + elif hasattr(self._websocket, "client"): + return tuple(self._websocket.client) + return ("unknown", 0) + async def send(self, data): """ Send data on the wrapped websocket diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index c925624f8..3b39b02c8 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,7 +8,7 @@ import asyncio import logging import socket from threading import Thread -from typing import Any, Dict, Optional +from typing import Any, Dict, List, Optional import pandas import websockets @@ -54,11 +54,25 @@ class ExternalMessageConsumer: self.ping_timeout = self._emc_config.get('ping_timeout', 2) self.sleep_time = self._emc_config.get('sleep_time', 5) + self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 500) + # Setting these explicitly as they probably shouldn't be changed by a user # Unless we somehow integrate this with the strategy to allow creating # callbacks for the messages self.topics = [RPCMessageType.WHITELIST, RPCMessageType.ANALYZED_DF] + # Allow setting data for each initial request + self._initial_requests: List[Dict[str, Any]] = [ + { + "type": RPCRequestType.WHITELIST, + "data": None + }, + { + "type": RPCRequestType.ANALYZED_DF, + "data": {"limit": self.initial_candle_limit} + } + ] + self._message_handlers = { RPCMessageType.WHITELIST: self._consume_whitelist_message, RPCMessageType.ANALYZED_DF: self._consume_analyzed_df_message, @@ -145,12 +159,14 @@ class ExternalMessageConsumer: while self._running: try: url, token = producer['url'], producer['ws_token'] + name = producer["name"] ws_url = f"{url}?token={token}" # This will raise InvalidURI if the url is bad async with websockets.connect(ws_url) as ws: - logger.info("Connection successful") - channel = WebSocketChannel(ws) + channel = WebSocketChannel(ws, channel_id=name) + + logger.info(f"Producer connection success - {channel}") # Tell the producer we only want these topics # Should always be the first thing we send @@ -158,41 +174,16 @@ class ExternalMessageConsumer: self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) ) - # Now request the initial data from this Producer for every topic - # we've subscribed to - for topic in self.topics: - # without .upper() we get KeyError - request_type = RPCRequestType[topic.upper()] - await channel.send(self.compose_consumer_request(request_type)) + # Now request the initial data from this Producer + for request in self._initial_requests: + request_type = request.get('type', 'none') # Default to string + request_data = request.get('data') + await channel.send( + self.compose_consumer_request(request_type, request_data) + ) # Now receive data, if none is within the time limit, ping - while True: - try: - message = await asyncio.wait_for( - channel.recv(), - timeout=self.reply_timeout - ) - - async with lock: - # Handle the message - self.handle_producer_message(producer, message) - - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): - # We haven't received data yet. Check the connection and continue. - try: - # ping - ping = await channel.ping() - - await asyncio.wait_for(ping, timeout=self.ping_timeout) - logger.debug(f"Connection to {url} still alive...") - - continue - except Exception: - logger.info( - f"Ping error {url} - retrying in {self.sleep_time}s") - await asyncio.sleep(self.sleep_time) - - break + await self._receive_messages(channel, producer, lock) # Catch invalid ws_url, and break the loop except websockets.exceptions.InvalidURI as e: @@ -214,6 +205,47 @@ class ExternalMessageConsumer: logger.exception(e) break + async def _receive_messages( + self, + channel: WebSocketChannel, + producer: Dict[str, Any], + lock: asyncio.Lock + ): + """ + Loop to handle receiving messages from a Producer + + :param channel: The WebSocketChannel object for the WebSocket + :param producer: Dictionary containing producer info + :param lock: An asyncio Lock + """ + while True: + try: + message = await asyncio.wait_for( + channel.recv(), + timeout=self.reply_timeout + ) + + async with lock: + # Handle the message + self.handle_producer_message(producer, message) + + except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + # We haven't received data yet. Check the connection and continue. + try: + # ping + ping = await channel.ping() + + await asyncio.wait_for(ping, timeout=self.ping_timeout) + logger.debug(f"Connection to {channel} still alive...") + + continue + except Exception: + logger.info( + f"Ping error {channel} - retrying in {self.sleep_time}s") + await asyncio.sleep(self.sleep_time) + + break + def compose_consumer_request( self, type_: RPCRequestType, @@ -241,7 +273,7 @@ class ExternalMessageConsumer: if message_data is None: return - logger.debug(f"Received message of type {message_type}") + logger.debug(f"Received message of type {message_type} from `{producer_name}`") message_handler = self._message_handlers.get(message_type) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 378677e44..7b29665eb 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1068,10 +1068,10 @@ class RPC: return _data - def _ws_request_analyzed_df(self): + def _ws_request_analyzed_df(self, limit: Optional[int]): """ Historical Analyzed Dataframes for WebSocket """ whitelist = self._freqtrade.active_pair_whitelist - return self._ws_all_analysed_dataframes(whitelist, 500) + return self._ws_all_analysed_dataframes(whitelist, limit) def _ws_request_whitelist(self): """ Whitelist data for WebSocket """ From 05cbcf834ce8cec8b858c89725cc5086bad7c970 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 2 Sep 2022 16:01:33 -0600 Subject: [PATCH 086/437] minor logging changes --- freqtrade/rpc/external_message_consumer.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 3b39b02c8..d3b82cadf 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -54,6 +54,7 @@ class ExternalMessageConsumer: self.ping_timeout = self._emc_config.get('ping_timeout', 2) self.sleep_time = self._emc_config.get('sleep_time', 5) + # The amount of candles per dataframe on the initial request self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 500) # Setting these explicitly as they probably shouldn't be changed by a user @@ -73,6 +74,7 @@ class ExternalMessageConsumer: } ] + # Specify which function to use for which RPCMessageType self._message_handlers = { RPCMessageType.WHITELIST: self._consume_whitelist_message, RPCMessageType.ANALYZED_DF: self._consume_analyzed_df_message, @@ -139,7 +141,7 @@ class ExternalMessageConsumer: """ Main connection loop for the consumer - :param producer: Dictionary containing producer info: {'url': '', 'ws_token': ''} + :param producer: Dictionary containing producer info :param lock: An asyncio Lock """ try: @@ -153,7 +155,7 @@ class ExternalMessageConsumer: Actually creates and handles the websocket connection, pinging on timeout and handling connection errors. - :param producer: Dictionary containing producer info: {'url': '', 'ws_token': ''} + :param producer: Dictionary containing producer info :param lock: An asyncio Lock """ while self._running: @@ -176,10 +178,8 @@ class ExternalMessageConsumer: # Now request the initial data from this Producer for request in self._initial_requests: - request_type = request.get('type', 'none') # Default to string - request_data = request.get('data') await channel.send( - self.compose_consumer_request(request_type, request_data) + self.compose_consumer_request(request['type'], request['data']) ) # Now receive data, if none is within the time limit, ping @@ -218,7 +218,7 @@ class ExternalMessageConsumer: :param producer: Dictionary containing producer info :param lock: An asyncio Lock """ - while True: + while self._running: try: message = await asyncio.wait_for( channel.recv(), @@ -273,7 +273,7 @@ class ExternalMessageConsumer: if message_data is None: return - logger.debug(f"Received message of type {message_type} from `{producer_name}`") + logger.info(f"Received message of type {message_type} from `{producer_name}`") message_handler = self._message_handlers.get(message_type) From af5460cebf2b17ea440f1d7f037a7b8c88681d6a Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Fri, 2 Sep 2022 22:01:53 -0300 Subject: [PATCH 087/437] Add option to keep models only in memory for backtest --- config_examples/config_freqai.example.json | 3 ++- docs/freqai.md | 1 + freqtrade/freqai/freqai_interface.py | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index 13c7a94ea..846d37a82 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -56,6 +56,7 @@ "purge_old_models": true, "train_period_days": 15, "backtest_period_days": 7, + "backtest_save_model": true, "live_retrain_hours": 0, "identifier": "uniqe-id", "feature_parameters": { @@ -94,4 +95,4 @@ "internals": { "process_throttle_secs": 5 } -} \ No newline at end of file +} diff --git a/docs/freqai.md b/docs/freqai.md index 482a56d2b..6ee124b9b 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -93,6 +93,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `purge_old_models` | Delete obsolete models (otherwise, all historic models will remain on disk).
**Datatype:** Boolean. Default: `False`. | `train_period_days` | **Required.**
Number of days to use for the training data (width of the sliding window).
**Datatype:** Positive integer. | `backtest_period_days` | **Required.**
Number of days to inference from the trained model before sliding the window defined above, and retraining the model. This can be fractional days, but beware that the user-provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest.
**Datatype:** Float. +| `backtest_save_model` | Saves models to disk when running backtesting.
**Datatype:** Boolean. Default: `True`. | `identifier` | **Required.**
A unique name for the current model. This can be reused to reload pre-trained models/data.
**Datatype:** String. | `live_retrain_hours` | Frequency of retraining during dry/live runs.
Default set to 0, which means the model will retrain as often as possible.
**Datatype:** Float > 0. | `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old.
Defaults set to 0, which means models never expire.
**Datatype:** Positive integer. diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 0a63e36ea..9c7ef05a7 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -71,6 +71,7 @@ class IFreqaiModel(ABC): self.first = True self.set_full_path() self.follow_mode: bool = self.freqai_info.get("follow_mode", False) + self.backtest_save_model: bool = self.freqai_info.get("backtest_save_model", True) self.dd = FreqaiDataDrawer(Path(self.full_path), self.config, self.follow_mode) self.identifier: str = self.freqai_info.get("identifier", "no_id_provided") self.scanning = False @@ -246,7 +247,8 @@ class IFreqaiModel(ABC): self.dd.pair_dict[metadata["pair"]]["trained_timestamp"] = int( trained_timestamp.stopts) dk.set_new_model_names(metadata["pair"], trained_timestamp) - self.dd.save_data(self.model, metadata["pair"], dk) + if self.backtest_save_model: + self.dd.save_data(self.model, metadata["pair"], dk) else: self.model = self.dd.load_data(metadata["pair"], dk) From 966de1961180e39061277ffef00fdf78f1d86bdf Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 08:16:33 +0200 Subject: [PATCH 088/437] Improve test resiliance by properly setting Order object --- tests/plugins/test_protections.py | 2 ++ tests/test_persistence.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/plugins/test_protections.py b/tests/plugins/test_protections.py index acfe124a8..820eced20 100644 --- a/tests/plugins/test_protections.py +++ b/tests/plugins/test_protections.py @@ -37,6 +37,7 @@ def generate_mock_trade(pair: str, fee: float, is_open: bool, trade.orders.append(Order( ft_order_side=trade.entry_side, order_id=f'{pair}-{trade.entry_side}-{trade.open_date}', + ft_is_open=False, ft_pair=pair, amount=trade.amount, filled=trade.amount, @@ -51,6 +52,7 @@ def generate_mock_trade(pair: str, fee: float, is_open: bool, trade.orders.append(Order( ft_order_side=trade.exit_side, order_id=f'{pair}-{trade.exit_side}-{trade.close_date}', + ft_is_open=False, ft_pair=pair, amount=trade.amount, filled=trade.amount, diff --git a/tests/test_persistence.py b/tests/test_persistence.py index f16c8b054..3ce8a0a2c 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -654,6 +654,7 @@ def test_trade_close(fee): trade.orders.append(Order( ft_order_side=trade.entry_side, order_id=f'{trade.pair}-{trade.entry_side}-{trade.open_date}', + ft_is_open=False, ft_pair=trade.pair, amount=trade.amount, filled=trade.amount, @@ -667,6 +668,7 @@ def test_trade_close(fee): trade.orders.append(Order( ft_order_side=trade.exit_side, order_id=f'{trade.pair}-{trade.exit_side}-{trade.open_date}', + ft_is_open=False, ft_pair=trade.pair, amount=trade.amount, filled=trade.amount, From be192fae910612b745c9b062788d54903bf1c95c Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 10:53:51 +0200 Subject: [PATCH 089/437] Test should use proper Order objects --- tests/test_persistence.py | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 3ce8a0a2c..23ccc67f3 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -581,25 +581,25 @@ def test_update_market_order(market_buy_order_usdt, market_sell_order_usdt, fee, @pytest.mark.parametrize( 'exchange,is_short,lev,open_value,close_value,profit,profit_ratio,trading_mode,funding_fees', [ ("binance", False, 1, 60.15, 65.835, 5.685, 0.09451371, spot, 0.0), - ("binance", True, 1, 59.850, 66.1663784375, -6.3163784375, -0.1055368, margin, 0.0), + ("binance", True, 1, 65.835, 60.151253125, 5.68374687, 0.08633321, margin, 0.0), ("binance", False, 3, 60.15, 65.83416667, 5.68416667, 0.28349958, margin, 0.0), - ("binance", True, 3, 59.85, 66.1663784375, -6.3163784375, -0.31661044, margin, 0.0), + ("binance", True, 3, 65.835, 60.151253125, 5.68374687, 0.25899963, margin, 0.0), ("kraken", False, 1, 60.15, 65.835, 5.685, 0.09451371, spot, 0.0), - ("kraken", True, 1, 59.850, 66.231165, -6.381165, -0.1066192, margin, 0.0), + ("kraken", True, 1, 65.835, 60.21015, 5.62485, 0.0854386, margin, 0.0), ("kraken", False, 3, 60.15, 65.795, 5.645, 0.28154613, margin, 0.0), - ("kraken", True, 3, 59.850, 66.231165, -6.381165, -0.3198578, margin, 0.0), + ("kraken", True, 3, 65.835, 60.21015, 5.62485, 0.25631579, margin, 0.0), ("binance", False, 1, 60.15, 65.835, 5.685, 0.09451371, futures, 0.0), ("binance", False, 1, 60.15, 66.835, 6.685, 0.11113881, futures, 1.0), - ("binance", True, 1, 59.85, 66.165, -6.315, -0.10551378, futures, 0.0), - ("binance", True, 1, 59.85, 67.165, -7.315, -0.12222222, futures, -1.0), + ("binance", True, 1, 65.835, 60.15, 5.685, 0.08635224, futures, 0.0), + ("binance", True, 1, 65.835, 61.15, 4.685, 0.07116276, futures, -1.0), + ("binance", True, 3, 65.835, 59.15, 6.685, 0.3046252, futures, 1.0), ("binance", False, 3, 60.15, 64.835, 4.685, 0.23366583, futures, -1.0), - ("binance", True, 3, 59.85, 65.165, -5.315, -0.26641604, futures, 1.0), ]) @pytest.mark.usefixtures("init_persistence") def test_calc_open_close_trade_price( - limit_buy_order_usdt, limit_sell_order_usdt, fee, exchange, is_short, lev, + limit_order, fee, exchange, is_short, lev, open_value, close_value, profit, profit_ratio, trading_mode, funding_fees ): trade: Trade = Trade( @@ -617,22 +617,24 @@ def test_calc_open_close_trade_price( trading_mode=trading_mode, funding_fees=funding_fees ) - + entry_order = limit_order[trade.entry_side] + exit_order = limit_order[trade.exit_side] trade.open_order_id = f'something-{is_short}-{lev}-{exchange}' - oobj = Order.parse_from_ccxt_object(limit_buy_order_usdt, 'ADA/USDT', 'buy') + oobj = Order.parse_from_ccxt_object(entry_order, 'ADA/USDT', trade.entry_side) + trade.orders.append(oobj) trade.update_trade(oobj) - oobj = Order.parse_from_ccxt_object(limit_sell_order_usdt, 'ADA/USDT', 'sell') + oobj = Order.parse_from_ccxt_object(exit_order, 'ADA/USDT', trade.exit_side) + trade.orders.append(oobj) trade.update_trade(oobj) - trade.open_rate = 2.0 - trade.close_rate = 2.2 - trade.recalc_open_trade_value() + assert trade.is_open is False + assert pytest.approx(trade._calc_open_trade_value(trade.amount, trade.open_rate)) == open_value assert pytest.approx(trade.calc_close_trade_value(trade.close_rate)) == close_value - assert pytest.approx(trade.calc_profit(trade.close_rate)) == round(profit, 8) - assert pytest.approx(trade.calc_profit_ratio(trade.close_rate)) == profit_ratio + assert pytest.approx(trade.close_profit_abs) == profit + assert pytest.approx(trade.close_profit) == profit_ratio @pytest.mark.usefixtures("init_persistence") From 599c1c79fb8170a7ea4bf9d250a4a3db0a3234ba Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 3 Sep 2022 14:00:01 +0200 Subject: [PATCH 090/437] reorganized backtest utilities, test new functionality, improve/update doc --- config_examples/config_freqai.example.json | 2 - docs/freqai.md | 32 +++++++------ freqtrade/freqai/data_kitchen.py | 27 ++++++++++- freqtrade/freqai/freqai_interface.py | 50 +++++--------------- freqtrade/templates/FreqaiExampleStrategy.py | 2 +- tests/freqai/test_freqai_interface.py | 9 +++- 6 files changed, 63 insertions(+), 59 deletions(-) diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index 846d37a82..12eb30128 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -56,7 +56,6 @@ "purge_old_models": true, "train_period_days": 15, "backtest_period_days": 7, - "backtest_save_model": true, "live_retrain_hours": 0, "identifier": "uniqe-id", "feature_parameters": { @@ -75,7 +74,6 @@ "weight_factor": 0.9, "principal_component_analysis": false, "use_SVM_to_remove_outliers": true, - "indicator_max_period_candles": 20, "indicator_periods_candles": [ 10, 20 diff --git a/docs/freqai.md b/docs/freqai.md index 6ee124b9b..3646362c3 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -89,11 +89,10 @@ Mandatory parameters are marked as **Required**, which means that they are requi |------------|-------------| | | **General configuration parameters** | `freqai` | **Required.**
The parent dictionary containing all the parameters for controlling FreqAI.
**Datatype:** Dictionary. -| `startup_candles` | Number of candles needed for *backtesting only* to ensure all indicators are non NaNs at the start of the first train period.
**Datatype:** Positive integer. | `purge_old_models` | Delete obsolete models (otherwise, all historic models will remain on disk).
**Datatype:** Boolean. Default: `False`. | `train_period_days` | **Required.**
Number of days to use for the training data (width of the sliding window).
**Datatype:** Positive integer. | `backtest_period_days` | **Required.**
Number of days to inference from the trained model before sliding the window defined above, and retraining the model. This can be fractional days, but beware that the user-provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest.
**Datatype:** Float. -| `backtest_save_model` | Saves models to disk when running backtesting.
**Datatype:** Boolean. Default: `True`. +| `save_backtest_models` | Backtesting operates most efficiently by saving the prediction data and reusing them directly for subsequent runs (when users wish to tune entry/exit parameters). If a user wishes to save models to disk when running backtesting, they should activate `save_backtest_models`. A user may wish to do this if they plan to use the same model files for starting a dry/live instance with the same `identifier`.
**Datatype:** Boolean. Default: `False`. | `identifier` | **Required.**
A unique name for the current model. This can be reused to reload pre-trained models/data.
**Datatype:** String. | `live_retrain_hours` | Frequency of retraining during dry/live runs.
Default set to 0, which means the model will retrain as often as possible.
**Datatype:** Float > 0. | `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old.
Defaults set to 0, which means models never expire.
**Datatype:** Positive integer. @@ -280,6 +279,17 @@ The FreqAI strategy requires the user to include the following lines of code in Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](#feature-engineering)) and labels ([more information](#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. +### Setting the `startup_candle_count` +Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md/#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). + +!!! Note + Typically it is best for users to be safe and multiply their expected `startup_candle_count` by 2. There are instances where the talib functions actually require more data than just the passed `period`. Anecdotally, multiplying the `startup_candle_count` by 2 always leads to a fully NaN free training dataset. Look out for this log message to confirm that your data is clean: + + ``` + 2022-08-31 15:14:04 - freqtrade.freqai.data_kitchen - INFO - dropped 0 training points due to NaNs in populated dataset 4319. + ``` + + ## Creating a dynamic target The `&*_std/mean` return values describe the statistical fit of the user defined label *during the most recent training*. This value allows the user to know the rarity of a given prediction. For example, `templates/FreqaiExampleStrategy.py`, creates a `target_roi` which is based on filtering out predictions that are below a given z-score of 1.25. @@ -505,7 +515,7 @@ and if a full `live_retrain_hours` has elapsed since the end of the loaded model The FreqAI backtesting module can be executed with the following command: ```bash -freqtrade backtesting --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 +freqtrade backtesting --strategy FreqaiExampleStrategy --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 ``` Backtesting mode requires the user to have the data pre-downloaded (unlike in dry/live mode where FreqAI automatically downloads the necessary data). The user should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the user-set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration). @@ -532,20 +542,14 @@ the user is asking FreqAI to use a training period of 30 days and backtest on th This means that if the user sets `--timerange 20210501-20210701`, FreqAI will train have trained 8 separate models at the end of `--timerange` (because the full range comprises 8 weeks). After the training of the model, FreqAI will backtest the subsequent 7 days. The "sliding window" then moves one week forward (emulating FreqAI retraining once per week in live mode) and the new model uses the previous 30 days (including the 7 days used for backtesting by the previous model) to train. This is repeated until the end of `--timerange`. -In live mode, the required training data is automatically computed and downloaded. However, in backtesting mode, -the user must manually enter the required number of `startup_candles` in the config. This value -is used to increase the data to FreqAI, which should be sufficient to enable all indicators -to be NaN free at the beginning of the first training. This is done by identifying the -longest timeframe (`4h` in presented example config) and the longest indicator period (`20` days in presented example config) -and adding this to the `train_period_days`. The units need to be in the base candle time frame: -`startup_candles` = ( 4 hours * 20 max period * 60 minutes/hour + 30 day train_period_days * 1440 minutes per day ) / 5 min (base time frame) = 9360. - -!!! Note - In dry/live mode, this is all precomputed and handled automatically. Thus, `startup_candle` has no influence on dry/live mode. - !!! Note Although fractional `backtest_period_days` is allowed, the user should be aware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, if the user wants to set a `--timerange` of 10 days, and asks for a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. Because of this, a true backtest of FreqAI adaptive training would take a *very* long time. The best way to fully test a model is to run it dry and let it constantly train. In this case, backtesting would take the exact same amount of time as a dry run. +### Downloading data for backtesting +Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download/#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by taking subtracting `train_period_days` and the `startup_candle_count` ([details](#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. + +As an example, if we wish to backtest the `--timerange` above of `20210501-20210701`, and we use the example config which sets `train_period_days` to 15. The startup candle count is 40 on a maximum `include_timeframes` of 1h. We would need 20210501 - 15 days - 40 * 1h / 24 hours = 20210414 (16.7 days earlier than the start of the desired training timerange). + ### Defining model expirations During dry/live mode, FreqAI trains each coin pair sequentially (on separate threads/GPU from the main Freqtrade bot). This means that there is always an age discrepancy between models. If a user is training on 50 pairs, and each pair requires 5 minutes to train, the oldest model will be over 4 hours old. This may be undesirable if the characteristic time scale (the trade duration target) for a strategy is less than 4 hours. The user can decide to only make trade entries if the model is less than diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index f88e20223..13af1e0d2 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -70,7 +70,7 @@ class FreqaiDataKitchen: self.training_features_list: List = [] self.model_filename: str = "" self.backtesting_results_path = Path() - self.backtesting_prediction_folder: str = "backtesting_predictions" + self.backtest_predictions_folder: str = "backtesting_predictions" self.live = live self.pair = pair @@ -1077,7 +1077,7 @@ class FreqaiDataKitchen: Save prediction dataframe from backtesting to h5 file format :param append_df: dataframe for backtesting period """ - full_predictions_folder = Path(self.full_path / self.backtesting_prediction_folder) + full_predictions_folder = Path(self.full_path / self.backtest_predictions_folder) if not full_predictions_folder.is_dir(): full_predictions_folder.mkdir(parents=True, exist_ok=True) @@ -1092,3 +1092,26 @@ class FreqaiDataKitchen: """ append_df = pd.read_hdf(self.backtesting_results_path) return append_df + + def check_if_backtest_prediction_exists( + self + ) -> bool: + """ + Check if a backtesting prediction already exists + :param dk: FreqaiDataKitchen + :return: + :boolean: whether the prediction file exists or not. + """ + path_to_predictionfile = Path(self.full_path / + self.backtest_predictions_folder / + f"{self.model_filename}_prediction.h5") + self.backtesting_results_path = path_to_predictionfile + + file_exists = path_to_predictionfile.is_file() + if file_exists: + logger.info(f"Found backtesting prediction file at {path_to_predictionfile}") + else: + logger.info( + f"Could not find backtesting prediction file at {path_to_predictionfile}" + ) + return file_exists diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 9c7ef05a7..399568c7d 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -71,7 +71,9 @@ class IFreqaiModel(ABC): self.first = True self.set_full_path() self.follow_mode: bool = self.freqai_info.get("follow_mode", False) - self.backtest_save_model: bool = self.freqai_info.get("backtest_save_model", True) + self.save_backtest_models: bool = self.freqai_info.get("save_backtest_models", False) + if self.save_backtest_models: + logger.info('Backtesting module configured to save all models.') self.dd = FreqaiDataDrawer(Path(self.full_path), self.config, self.follow_mode) self.identifier: str = self.freqai_info.get("identifier", "no_id_provided") self.scanning = False @@ -125,10 +127,9 @@ class IFreqaiModel(ABC): elif not self.follow_mode: self.dk = FreqaiDataKitchen(self.config, self.live, metadata["pair"]) logger.info(f"Training {len(self.dk.training_timeranges)} timeranges") - with self.analysis_lock: - dataframe = self.dk.use_strategy_to_populate_indicators( - strategy, prediction_dataframe=dataframe, pair=metadata["pair"] - ) + dataframe = self.dk.use_strategy_to_populate_indicators( + strategy, prediction_dataframe=dataframe, pair=metadata["pair"] + ) dk = self.start_backtesting(dataframe, metadata, self.dk) dataframe = dk.remove_features_from_df(dk.return_dataframe) @@ -232,10 +233,9 @@ class IFreqaiModel(ABC): f"sub-train-{metadata['pair'].split('/')[0]}_{trained_timestamp_int}" ) - coin, _ = metadata["pair"].split("/") - dk.model_filename = f"cb_{coin.lower()}_{trained_timestamp_int}" + dk.set_new_model_names(metadata["pair"], trained_timestamp) - if self.backtest_prediction_exists(dk): + if dk.check_if_backtest_prediction_exists(): append_df = dk.get_backtesting_prediction() dk.append_predictions(append_df) else: @@ -246,8 +246,9 @@ class IFreqaiModel(ABC): self.model = self.train(dataframe_train, metadata["pair"], dk) self.dd.pair_dict[metadata["pair"]]["trained_timestamp"] = int( trained_timestamp.stopts) - dk.set_new_model_names(metadata["pair"], trained_timestamp) - if self.backtest_save_model: + + if self.save_backtest_models: + logger.info('Saving backtest model to disk.') self.dd.save_data(self.model, metadata["pair"], dk) else: self.model = self.dd.load_data(metadata["pair"], dk) @@ -644,35 +645,6 @@ class IFreqaiModel(ABC): self.train_time = 0 return - def backtest_prediction_exists( - self, - dk: FreqaiDataKitchen, - scanning: bool = False, - ) -> bool: - """ - Check if a backtesting prediction already exists - :param dk: FreqaiDataKitchen - :return: - :boolean: whether the prediction file exists or not. - """ - if not self.live: - prediction_file_name = dk.model_filename - path_to_predictionfile = Path(dk.full_path / - dk.backtesting_prediction_folder / - f"{prediction_file_name}_prediction.h5") - dk.backtesting_results_path = path_to_predictionfile - - file_exists = path_to_predictionfile.is_file() - if file_exists and not scanning: - logger.info("Found backtesting prediction file at %s", prediction_file_name) - elif not scanning: - logger.info( - "Could not find backtesting prediction file at %s", prediction_file_name - ) - return file_exists - else: - return False - # Following methods which are overridden by user made prediction models. # See freqai/prediction_models/CatboostPredictionModel.py for an example. diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index aa584bfbc..0e822a028 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -44,7 +44,7 @@ class FreqaiExampleStrategy(IStrategy): stoploss = -0.05 use_exit_signal = True # this is the maximum period fed to talib (timeframe independent) - startup_candle_count: int = 20 + startup_candle_count: int = 40 can_short = False linear_roi_offset = DecimalParameter( diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 09f5d27ff..5441b3c24 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -174,6 +174,7 @@ def test_train_model_in_series_LightGBMClassifier(mocker, freqai_conf): def test_start_backtesting(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180130"}) + freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) strategy.dp = DataProvider(freqai_conf, exchange) @@ -200,6 +201,7 @@ def test_start_backtesting(mocker, freqai_conf): def test_start_backtesting_subdaily_backtest_period(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180124"}) freqai_conf.get("freqai", {}).update({"backtest_period_days": 0.5}) + freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) strategy.dp = DataProvider(freqai_conf, exchange) @@ -224,6 +226,7 @@ def test_start_backtesting_subdaily_backtest_period(mocker, freqai_conf): def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): freqai_conf.update({"timerange": "20180120-20180130"}) + freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) strategy.dp = DataProvider(freqai_conf, exchange) @@ -263,10 +266,14 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): freqai.start_backtesting(df, metadata, freqai.dk) assert log_has_re( - "Found backtesting prediction ", + "Found backtesting prediction file ", caplog, ) + path = (freqai.dd.full_path / freqai.dk.backtest_predictions_folder) + prediction_files = [x for x in path.iterdir() if x.is_file()] + assert len(prediction_files) == 5 + shutil.rmtree(Path(freqai.dk.full_path)) From 80b5f035aba23f382363dc81499477977cea1e27 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 15:01:28 +0200 Subject: [PATCH 091/437] Remove typo in log message --- freqtrade/freqai/freqai_interface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 6b4ac183a..0bd88c64f 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -613,8 +613,8 @@ class IFreqaiModel(ABC): logger.info( f'Total time spent inferencing pairlist {self.inference_time:.2f} seconds') if self.inference_time > 0.25 * self.base_tf_seconds: - logger.warning('Inference took over 25/% of the candle time. Reduce pairlist to' - ' avoid blinding open trades and degrading performance.') + logger.warning("Inference took over 25% of the candle time. Reduce pairlist to" + " avoid blinding open trades and degrading performance.") self.pair_it = 0 self.inference_time = 0 return From df50b1928d6d58b130d1d2b40dcaad334800bcc3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Sep 2022 06:51:30 +0200 Subject: [PATCH 092/437] Fix funding fee calculation for backtesting --- freqtrade/optimize/backtesting.py | 2 +- freqtrade/persistence/trade_model.py | 34 +++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 77bf3d8ad..8f6b6b332 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -686,7 +686,7 @@ class Backtesting: self.futures_data[trade.pair], amount=trade.amount, is_short=trade.is_short, - open_date=trade.open_date_utc, + open_date=trade.date_last_filled_utc, close_date=exit_candle_time, ) diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 1f14f110e..9c9c7f381 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -65,6 +65,8 @@ class Order(_DECL_BASE): order_filled_date = Column(DateTime, nullable=True) order_update_date = Column(DateTime, nullable=True) + funding_fee = Column(Float, nullable=True) + ft_fee_base = Column(Float, nullable=True) @property @@ -72,6 +74,13 @@ class Order(_DECL_BASE): """ Order-date with UTC timezoneinfo""" return self.order_date.replace(tzinfo=timezone.utc) + @property + def order_filled_utc(self) -> Optional[datetime]: + """ last order-date with UTC timezoneinfo""" + return ( + self.order_filled_date.replace(tzinfo=timezone.utc) if self.order_filled_date else None + ) + @property def safe_price(self) -> float: return self.average or self.price @@ -179,6 +188,10 @@ class Order(_DECL_BASE): self.remaining = 0 self.status = 'closed' self.ft_is_open = False + # Assign funding fees to Order. + # Assumes backtesting will use date_last_filled_utc to calculate future funding fees. + self.funding_fee = trade.funding_fees + if (self.ft_order_side == trade.entry_side): trade.open_rate = self.price trade.recalc_trade_from_orders() @@ -346,6 +359,12 @@ class LocalTrade(): else: return self.amount + @property + def date_last_filled_utc(self): + """ Date of the last filled order""" + return max([self.open_date_utc, + max(o.order_filled_utc for o in self.orders if o.filled and not o.ft_is_open)]) + @property def open_date_utc(self): return self.open_date.replace(tzinfo=timezone.utc) @@ -843,10 +862,14 @@ class LocalTrade(): close_profit = 0.0 close_profit_abs = 0.0 profit = None - for o in self.orders: + # Reset funding fees + self.funding_fees = 0.0 + funding_fees = 0.0 + ordercount = len(self.orders) - 1 + for i, o in enumerate(self.orders): if o.ft_is_open or not o.filled: continue - + funding_fees += (o.funding_fee or 0.0) tmp_amount = FtPrecise(o.safe_amount_after_fee) tmp_price = FtPrecise(o.safe_price) @@ -861,7 +884,11 @@ class LocalTrade(): avg_price = current_stake / current_amount if is_exit: - # Process partial exits + # Process exits + if i == ordercount and is_closing: + # Apply funding fees only to the last order + self.funding_fees = funding_fees + exit_rate = o.safe_price exit_amount = o.safe_amount_after_fee profit = self.calc_profit(rate=exit_rate, amount=exit_amount, @@ -871,6 +898,7 @@ class LocalTrade(): exit_rate, amount=exit_amount, open_rate=avg_price) else: total_stake = total_stake + self._calc_open_trade_value(tmp_amount, price) + self.funding_fees = funding_fees if close_profit: self.close_profit = close_profit From 0c6a02687a49b48c433ec841200911b21efc8f24 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 2 Sep 2022 20:55:13 +0200 Subject: [PATCH 093/437] Don't calculate funding fees if we're not going to use them. --- freqtrade/freqtradebot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 37bc6dfed..95b42155f 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -726,10 +726,11 @@ class FreqtradeBot(LoggingMixin): fee = self.exchange.get_fee(symbol=pair, taker_or_maker='maker') base_currency = self.exchange.get_pair_base_currency(pair) open_date = datetime.now(timezone.utc) - funding_fees = self.exchange.get_funding_fees( - pair=pair, amount=amount, is_short=is_short, open_date=open_date) + # This is a new trade if trade is None: + funding_fees = self.exchange.get_funding_fees( + pair=pair, amount=amount, is_short=is_short, open_date=open_date) trade = Trade( pair=pair, base_currency=base_currency, From 0f483ee31f043ceafaa7a5c19eaa77ade2e1d323 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 10:06:23 +0200 Subject: [PATCH 094/437] Use "since last order" approach for live as well. --- freqtrade/freqtradebot.py | 4 ++-- freqtrade/persistence/trade_model.py | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 95b42155f..5323a5fc0 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -281,7 +281,7 @@ class FreqtradeBot(LoggingMixin): pair=trade.pair, amount=trade.amount, is_short=trade.is_short, - open_date=trade.open_date_utc + open_date=trade.date_last_filled_utc ) trade.funding_fees = funding_fees else: @@ -1485,7 +1485,7 @@ class FreqtradeBot(LoggingMixin): pair=trade.pair, amount=trade.amount, is_short=trade.is_short, - open_date=trade.open_date_utc, + open_date=trade.date_last_filled_utc, ) exit_type = 'exit' exit_reason = exit_tag or exit_check.exit_reason diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 9c9c7f381..c2a87daaa 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -128,6 +128,10 @@ class Order(_DECL_BASE): self.ft_is_open = True if self.status in NON_OPEN_EXCHANGE_STATES: self.ft_is_open = False + if self.trade: + # Assign funding fee up to this point + # (represents the funding fee since the last order) + self.funding_fee = self.trade.funding_fees if (order.get('filled', 0.0) or 0.0) > 0: self.order_filled_date = datetime.now(timezone.utc) self.order_update_date = datetime.now(timezone.utc) @@ -360,10 +364,12 @@ class LocalTrade(): return self.amount @property - def date_last_filled_utc(self): + def date_last_filled_utc(self) -> datetime: """ Date of the last filled order""" - return max([self.open_date_utc, - max(o.order_filled_utc for o in self.orders if o.filled and not o.ft_is_open)]) + orders = self.select_filled_orders() + if not orders: + return self.open_date_utc + return max([self.open_date_utc, max(o.order_filled_utc for o in orders)]) @property def open_date_utc(self): From b95b3d8391f4df3bb3510173711349d7356a08ec Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 15:09:50 +0200 Subject: [PATCH 095/437] Update test to actually test funding fee appliance --- tests/test_persistence.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_persistence.py b/tests/test_persistence.py index 23ccc67f3..cdca3bc4d 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -615,21 +615,25 @@ def test_calc_open_close_trade_price( is_short=is_short, leverage=lev, trading_mode=trading_mode, - funding_fees=funding_fees ) entry_order = limit_order[trade.entry_side] exit_order = limit_order[trade.exit_side] trade.open_order_id = f'something-{is_short}-{lev}-{exchange}' oobj = Order.parse_from_ccxt_object(entry_order, 'ADA/USDT', trade.entry_side) - trade.orders.append(oobj) + oobj.trade = trade + oobj.update_from_ccxt_object(entry_order) trade.update_trade(oobj) + trade.funding_fees = funding_fees + oobj = Order.parse_from_ccxt_object(exit_order, 'ADA/USDT', trade.exit_side) - trade.orders.append(oobj) + oobj.trade = trade + oobj.update_from_ccxt_object(exit_order) trade.update_trade(oobj) assert trade.is_open is False + assert trade.funding_fees == funding_fees assert pytest.approx(trade._calc_open_trade_value(trade.amount, trade.open_rate)) == open_value assert pytest.approx(trade.calc_close_trade_value(trade.close_rate)) == close_value From ed4cc18cddaaff7bdb95738ee4a3d5093530b0e0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 15:18:09 +0200 Subject: [PATCH 096/437] Migration to check order funding fee --- freqtrade/persistence/migrations.py | 10 ++++++---- freqtrade/persistence/trade_model.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 1131c88b4..1f1330ba7 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -212,17 +212,18 @@ def migrate_orders_table(engine, table_back_name: str, cols_order: List): ft_fee_base = get_column_def(cols_order, 'ft_fee_base', 'null') average = get_column_def(cols_order, 'average', 'null') stop_price = get_column_def(cols_order, 'stop_price', 'null') + funding_fee = get_column_def(cols_order, 'funding_fee', '0.0') # sqlite does not support literals for booleans with engine.begin() as connection: connection.execute(text(f""" insert into orders (id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id, status, symbol, order_type, side, price, amount, filled, average, remaining, cost, - stop_price, order_date, order_filled_date, order_update_date, ft_fee_base) + stop_price, order_date, order_filled_date, order_update_date, ft_fee_base, funding_fee) select id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id, status, symbol, order_type, side, price, amount, filled, {average} average, remaining, cost, {stop_price} stop_price, order_date, order_filled_date, - order_update_date, {ft_fee_base} ft_fee_base + order_update_date, {ft_fee_base} ft_fee_base {funding_fee} funding_fee from {table_back_name} """)) @@ -307,9 +308,10 @@ def check_migrate(engine, decl_base, previous_tables) -> None: # Check if migration necessary # Migrates both trades and orders table! # if ('orders' not in previous_tables - # or not has_column(cols_orders, 'stop_price')): + # or not has_column(cols_orders, 'funding_fee')): migrating = False - if not has_column(cols_trades, 'contract_size'): + if not has_column(cols_orders, 'funding_fee'): + # if not has_column(cols_trades, 'contract_size'): migrating = True logger.info(f"Running database migration for trades - " f"backup: {table_back_name}, {order_table_bak_name}") diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index c2a87daaa..6127c502d 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -892,7 +892,7 @@ class LocalTrade(): if is_exit: # Process exits if i == ordercount and is_closing: - # Apply funding fees only to the last order + # Apply funding fees only to the last closing order self.funding_fees = funding_fees exit_rate = o.safe_price From c9be66b5b639f151abb1d9a5e76267d752eddb3b Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 3 Sep 2022 15:52:29 +0200 Subject: [PATCH 097/437] increase test coverage for dk, improve function naming, extra cleaning --- freqtrade/freqai/data_kitchen.py | 30 ++++++----- freqtrade/freqai/freqai_interface.py | 10 ++-- tests/freqai/conftest.py | 32 +++++++++++ tests/freqai/test_freqai_datakitchen.py | 72 ++++++++++++++++++++++++- tests/freqai/test_freqai_interface.py | 34 ++++++------ 5 files changed, 143 insertions(+), 35 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 9d4a69287..fce9e8480 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -1,7 +1,7 @@ import copy -import datetime import logging import shutil +from datetime import datetime, timezone from pathlib import Path from typing import Any, Dict, List, Tuple @@ -345,7 +345,7 @@ class FreqaiDataKitchen: def denormalize_labels_from_metadata(self, df: DataFrame) -> DataFrame: """ - Normalize a set of data using the mean and standard deviation from + Denormalize a set of data using the mean and standard deviation from the associated training data. :param df: Dataframe of predictions to be denormalized """ @@ -384,7 +384,7 @@ class FreqaiDataKitchen: config_timerange = TimeRange.parse_timerange(self.config["timerange"]) if config_timerange.stopts == 0: config_timerange.stopts = int( - datetime.datetime.now(tz=datetime.timezone.utc).timestamp() + datetime.now(tz=timezone.utc).timestamp() ) timerange_train = copy.deepcopy(full_timerange) timerange_backtest = copy.deepcopy(full_timerange) @@ -401,8 +401,8 @@ class FreqaiDataKitchen: timerange_train.stopts = timerange_train.startts + train_period_days first = False - start = datetime.datetime.utcfromtimestamp(timerange_train.startts) - stop = datetime.datetime.utcfromtimestamp(timerange_train.stopts) + start = datetime.utcfromtimestamp(timerange_train.startts) + stop = datetime.utcfromtimestamp(timerange_train.stopts) tr_training_list.append(start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d")) tr_training_list_timerange.append(copy.deepcopy(timerange_train)) @@ -415,8 +415,8 @@ class FreqaiDataKitchen: if timerange_backtest.stopts > config_timerange.stopts: timerange_backtest.stopts = config_timerange.stopts - start = datetime.datetime.utcfromtimestamp(timerange_backtest.startts) - stop = datetime.datetime.utcfromtimestamp(timerange_backtest.stopts) + start = datetime.utcfromtimestamp(timerange_backtest.startts) + stop = datetime.utcfromtimestamp(timerange_backtest.stopts) tr_backtesting_list.append(start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d")) tr_backtesting_list_timerange.append(copy.deepcopy(timerange_backtest)) @@ -436,8 +436,8 @@ class FreqaiDataKitchen: it is sliced down to just the present training period. """ - start = datetime.datetime.fromtimestamp(timerange.startts, tz=datetime.timezone.utc) - stop = datetime.datetime.fromtimestamp(timerange.stopts, tz=datetime.timezone.utc) + start = datetime.fromtimestamp(timerange.startts, tz=timezone.utc) + stop = datetime.fromtimestamp(timerange.stopts, tz=timezone.utc) df = df.loc[df["date"] >= start, :] df = df.loc[df["date"] <= stop, :] @@ -808,6 +808,8 @@ class FreqaiDataKitchen: [compute_df, inlier_metric], axis=1) self.data_dictionary['prediction_features'].fillna(0, inplace=True) + logger.info('Inlier metric computed and added to features.') + return None def remove_beginning_points_from_data_dict(self, set_='train', no_prev_pts: int = 10): @@ -948,14 +950,14 @@ class FreqaiDataKitchen: "Please indicate the end date of your desired backtesting. " "timerange.") # backtest_timerange.stopts = int( - # datetime.datetime.now(tz=datetime.timezone.utc).timestamp() + # datetime.now(tz=timezone.utc).timestamp() # ) backtest_timerange.startts = ( backtest_timerange.startts - backtest_period_days * SECONDS_IN_DAY ) - start = datetime.datetime.utcfromtimestamp(backtest_timerange.startts) - stop = datetime.datetime.utcfromtimestamp(backtest_timerange.stopts) + start = datetime.utcfromtimestamp(backtest_timerange.startts) + stop = datetime.utcfromtimestamp(backtest_timerange.stopts) full_timerange = start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d") self.full_path = Path( @@ -981,7 +983,7 @@ class FreqaiDataKitchen: :return: bool = If the model is expired or not. """ - time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() + time = datetime.now(tz=timezone.utc).timestamp() elapsed_time = (time - trained_timestamp) / 3600 # hours max_time = self.freqai_config.get("expiration_hours", 0) if max_time > 0: @@ -993,7 +995,7 @@ class FreqaiDataKitchen: self, trained_timestamp: int ) -> Tuple[bool, TimeRange, TimeRange]: - time = datetime.datetime.now(tz=datetime.timezone.utc).timestamp() + time = datetime.now(tz=timezone.utc).timestamp() trained_timerange = TimeRange() data_load_timerange = TimeRange() diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 893f960ea..fd0554248 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -1,10 +1,10 @@ # import contextlib -import datetime import logging import shutil import threading import time from abc import ABC, abstractmethod +from datetime import datetime from pathlib import Path from threading import Lock from typing import Any, Dict, Tuple @@ -174,7 +174,7 @@ class IFreqaiModel(ABC): if retrain: self.train_timer('start') - self.train_model_in_series( + self.extract_data_and_train_model( new_trained_timerange, pair, strategy, dk, data_load_timerange ) self.train_timer('stop') @@ -214,10 +214,10 @@ class IFreqaiModel(ABC): dataframe_backtest = dk.slice_dataframe(tr_backtest, dataframe) trained_timestamp = tr_train - tr_train_startts_str = datetime.datetime.utcfromtimestamp(tr_train.startts).strftime( + tr_train_startts_str = datetime.utcfromtimestamp(tr_train.startts).strftime( "%Y-%m-%d %H:%M:%S" ) - tr_train_stopts_str = datetime.datetime.utcfromtimestamp(tr_train.stopts).strftime( + tr_train_stopts_str = datetime.utcfromtimestamp(tr_train.stopts).strftime( "%Y-%m-%d %H:%M:%S" ) logger.info( @@ -495,7 +495,7 @@ class IFreqaiModel(ABC): Path(self.full_path, Path(self.config["config_files"][0]).name), ) - def train_model_in_series( + def extract_data_and_train_model( self, new_trained_timerange: TimeRange, pair: str, diff --git a/tests/freqai/conftest.py b/tests/freqai/conftest.py index dd148da77..6528347e8 100644 --- a/tests/freqai/conftest.py +++ b/tests/freqai/conftest.py @@ -82,6 +82,38 @@ def get_patched_freqaimodel(mocker, freqaiconf): return freqaimodel +def make_unfiltered_dataframe(mocker, freqai_conf): + freqai_conf.update({"timerange": "20180110-20180130"}) + + strategy = get_patched_freqai_strategy(mocker, freqai_conf) + exchange = get_patched_exchange(mocker, freqai_conf) + strategy.dp = DataProvider(freqai_conf, exchange) + strategy.freqai_info = freqai_conf.get("freqai", {}) + freqai = strategy.freqai + freqai.live = True + freqai.dk = FreqaiDataKitchen(freqai_conf) + freqai.dk.pair = "ADA/BTC" + timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(timerange, freqai.dk) + + freqai.dd.pair_dict = MagicMock() + + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + new_timerange = TimeRange.parse_timerange("20180120-20180130") + + corr_dataframes, base_dataframes = freqai.dd.get_base_and_corr_dataframes( + data_load_timerange, freqai.dk.pair, freqai.dk + ) + + unfiltered_dataframe = freqai.dk.use_strategy_to_populate_indicators( + strategy, corr_dataframes, base_dataframes, freqai.dk.pair + ) + + unfiltered_dataframe = freqai.dk.slice_dataframe(new_timerange, unfiltered_dataframe) + + return freqai, unfiltered_dataframe + + def make_data_dictionary(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) diff --git a/tests/freqai/test_freqai_datakitchen.py b/tests/freqai/test_freqai_datakitchen.py index 9ef955695..2204e94c6 100644 --- a/tests/freqai/test_freqai_datakitchen.py +++ b/tests/freqai/test_freqai_datakitchen.py @@ -6,7 +6,8 @@ import pytest from freqtrade.exceptions import OperationalException from tests.conftest import log_has_re -from tests.freqai.conftest import get_patched_data_kitchen, make_data_dictionary +from tests.freqai.conftest import (get_patched_data_kitchen, make_data_dictionary, + make_unfiltered_dataframe) @pytest.mark.parametrize( @@ -94,3 +95,72 @@ def test_use_SVM_to_remove_outliers_and_outlier_protection(mocker, freqai_conf, "SVM detected 8.46%", caplog, ) + + +def test_compute_inlier_metric(mocker, freqai_conf, caplog): + freqai = make_data_dictionary(mocker, freqai_conf) + freqai_conf['freqai']['feature_parameters'].update({"inlier_metric_window": 10}) + freqai.dk.compute_inlier_metric(set_='train') + assert log_has_re( + "Inlier metric computed and added to features.", + caplog, + ) + + +def test_add_noise_to_training_features(mocker, freqai_conf): + freqai = make_data_dictionary(mocker, freqai_conf) + freqai_conf['freqai']['feature_parameters'].update({"noise_standard_deviation": 0.1}) + freqai.dk.add_noise_to_training_features() + + +def test_remove_beginning_points_from_data_dict(mocker, freqai_conf): + freqai = make_data_dictionary(mocker, freqai_conf) + freqai.dk.remove_beginning_points_from_data_dict(set_='train') + + +def test_principal_component_analysis(mocker, freqai_conf, caplog): + freqai = make_data_dictionary(mocker, freqai_conf) + freqai.dk.principal_component_analysis() + assert log_has_re( + "reduced feature dimension by", + caplog, + ) + + +def test_normalize_data(mocker, freqai_conf): + freqai = make_data_dictionary(mocker, freqai_conf) + data_dict = freqai.dk.data_dictionary + freqai.dk.normalize_data(data_dict) + assert len(freqai.dk.data) == 56 + + +def test_filter_features(mocker, freqai_conf): + freqai, unfiltered_dataframe = make_unfiltered_dataframe(mocker, freqai_conf) + freqai.dk.find_features(unfiltered_dataframe) + + filtered_df, labels = freqai.dk.filter_features( + unfiltered_dataframe, + freqai.dk.training_features_list, + freqai.dk.label_list, + training_filter=True, + ) + + assert len(filtered_df.columns) == 26 + + +def test_make_train_test_datasets(mocker, freqai_conf): + freqai, unfiltered_dataframe = make_unfiltered_dataframe(mocker, freqai_conf) + freqai.dk.find_features(unfiltered_dataframe) + + features_filtered, labels_filtered = freqai.dk.filter_features( + unfiltered_dataframe, + freqai.dk.training_features_list, + freqai.dk.label_list, + training_filter=True, + ) + + data_dictionary = freqai.dk.make_train_test_datasets(features_filtered, labels_filtered) + + assert data_dictionary + assert len(data_dictionary) == 7 + assert len(data_dictionary['train_features'].index) == 1916 diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 792ffc467..927af2a02 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -17,7 +17,7 @@ def is_arm() -> bool: return "arm" in machine or "aarch64" in machine -def test_train_model_in_series_LightGBM(mocker, freqai_conf): +def test_extract_data_and_train_model_LightGBM(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) @@ -35,7 +35,8 @@ def test_train_model_in_series_LightGBM(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() @@ -45,7 +46,7 @@ def test_train_model_in_series_LightGBM(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_train_model_in_series_LightGBMMultiModel(mocker, freqai_conf): +def test_extract_data_and_train_model_LightGBMMultiModel(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"strategy": "freqai_test_multimodel_strat"}) freqai_conf.update({"freqaimodel": "LightGBMRegressorMultiTarget"}) @@ -64,7 +65,8 @@ def test_train_model_in_series_LightGBMMultiModel(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert len(freqai.dk.label_list) == 2 assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() @@ -77,7 +79,7 @@ def test_train_model_in_series_LightGBMMultiModel(mocker, freqai_conf): @pytest.mark.skipif(is_arm(), reason="no ARM for Catboost ...") -def test_train_model_in_series_Catboost(mocker, freqai_conf): +def test_extract_data_and_train_model_Catboost(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "CatboostRegressor"}) # freqai_conf.get('freqai', {}).update( @@ -98,8 +100,8 @@ def test_train_model_in_series_Catboost(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", + strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() @@ -110,7 +112,7 @@ def test_train_model_in_series_Catboost(mocker, freqai_conf): @pytest.mark.skipif(is_arm(), reason="no ARM for Catboost ...") -def test_train_model_in_series_CatboostClassifier(mocker, freqai_conf): +def test_extract_data_and_train_model_CatboostClassifier(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "CatboostClassifier"}) freqai_conf.update({"strategy": "freqai_test_classifier"}) @@ -130,8 +132,8 @@ def test_train_model_in_series_CatboostClassifier(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", + strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() @@ -141,7 +143,7 @@ def test_train_model_in_series_CatboostClassifier(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_train_model_in_series_LightGBMClassifier(mocker, freqai_conf): +def test_extract_data_and_train_model_LightGBMClassifier(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "LightGBMClassifier"}) freqai_conf.update({"strategy": "freqai_test_classifier"}) @@ -161,8 +163,8 @@ def test_train_model_in_series_LightGBMClassifier(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", + strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() @@ -289,7 +291,8 @@ def test_follow_mode(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() @@ -338,7 +341,8 @@ def test_principal_component_analysis(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_pca_object.pkl") From fa8d5b9834ab1ba872e5ca2397e24ed3df9968a7 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 3 Sep 2022 16:05:18 +0200 Subject: [PATCH 098/437] add documentation for noise_standard_deviation` --- docs/freqai.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/freqai.md b/docs/freqai.md index 2c6efa3b9..d504c93d6 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -116,6 +116,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` | `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False | `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 +| `noise_standard_deviation` | If > 0, FreqAI adds noise to the training features. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. Value should be kept relative to the normalized space between -1 and 1). In other words, since data is always normalized between -1 and 1 in FreqAI, the user can expect a `noise_standard_deviation: 0.05` to see 32% of data randomly increased/decreased by more than 2.5%. Good for preventing overfitting.
**Datatype:** int. Default: 0 | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. From c21808ff9830b8f0e98b93fdc1e998b4ee37b4c0 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 3 Sep 2022 16:54:30 +0200 Subject: [PATCH 099/437] remove metadata redundancy, fix pca bug --- freqtrade/freqai/data_kitchen.py | 55 +++++++++++++++----------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 69ce5272d..ff8f72490 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -288,25 +288,20 @@ class FreqaiDataKitchen: :data_dictionary: updated dictionary with standardized values. """ - df_train_features = data_dictionary["train_features"] + df = data_dictionary["train_features"] # standardize the data by training stats - train_max = df_train_features.max() - train_min = df_train_features.min() - df_train_features = ( - 2 * (df_train_features - train_min) / (train_max - train_min) - 1 + train_max = df.max() + train_min = df.min() + df = ( + 2 * (df - train_min) / (train_max - train_min) - 1 ) data_dictionary["test_features"] = ( 2 * (data_dictionary["test_features"] - train_min) / (train_max - train_min) - 1 ) for item in train_max.keys(): - if not [col for col in df_train_features.columns if col.startswith('PC')]: - self.data[item + "_max"] = train_max[item] - self.data[item + "_min"] = train_min[item] - else: - # if PCA is enabled and has transformed the training features - self.data[item + "_pca_max"] = train_max[item] - self.data[item + "_pca_min"] = train_min[item] + self.data[item + "_max"] = train_max[item] + self.data[item + "_min"] = train_min[item] for item in data_dictionary["train_labels"].keys(): if data_dictionary["train_labels"][item].dtype == object: @@ -327,16 +322,24 @@ class FreqaiDataKitchen: - 1 ) - if not [col for col in df_train_features.columns if col.startswith('PC')]: - self.data[f"{item}_max"] = train_labels_max # .to_dict() - self.data[f"{item}_min"] = train_labels_min # .to_dict() - else: - # if PCA is enabled and has transformed the training features - self.data[f"{item}_pca_max"] = train_labels_max # .to_dict() - self.data[f"{item}_pca_min"] = train_labels_min # .to_dict() - + self.data[f"{item}_max"] = train_labels_max + self.data[f"{item}_min"] = train_labels_min return data_dictionary + def normalize_single_dataframe(self, df: DataFrame) -> DataFrame: + + train_max = df.max() + train_min = df.min() + df = ( + 2 * (df - train_min) / (train_max - train_min) - 1 + ) + + for item in train_max.keys(): + self.data[item + "_max"] = train_max[item] + self.data[item + "_min"] = train_min[item] + + return df + def normalize_data_from_metadata(self, df: DataFrame) -> DataFrame: """ Normalize a set of data using the mean and standard deviation from @@ -344,17 +347,11 @@ class FreqaiDataKitchen: :param df: Dataframe to be standardized """ - if not [col for col in df.columns if col.startswith('PC')]: - id_str = '' - else: - # if PCA is enabled - id_str = '_pca' - for item in df.keys(): df[item] = ( 2 - * (df[item] - self.data[f"{item}{id_str}_min"]) - / (self.data[f"{item}{id_str}_max"] - self.data[f"{item}{id_str}_min"]) + * (df[item] - self.data[f"{item}_min"]) + / (self.data[f"{item}_max"] - self.data[f"{item}_min"]) - 1 ) @@ -484,7 +481,7 @@ class FreqaiDataKitchen: index=self.data_dictionary["train_features"].index, ) # normalsing transformed training features - self.data_dictionary["train_features"] = self.normalize_data( + self.data_dictionary["train_features"] = self.normalize_single_dataframe( self.data_dictionary["train_features"]) # keeping a copy of the non-transformed features so we can check for errors during From 5cfb4154ebce933997cd45b0e1d3c57876271e5f Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 3 Sep 2022 19:48:30 +0200 Subject: [PATCH 100/437] revert all changes in normalize_data() --- freqtrade/freqai/data_kitchen.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index ff8f72490..3335503d3 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -288,12 +288,11 @@ class FreqaiDataKitchen: :data_dictionary: updated dictionary with standardized values. """ - df = data_dictionary["train_features"] # standardize the data by training stats - train_max = df.max() - train_min = df.min() - df = ( - 2 * (df - train_min) / (train_max - train_min) - 1 + train_max = data_dictionary["train_features"].max() + train_min = data_dictionary["train_features"].min() + data_dictionary["train_features"] = ( + 2 * (data_dictionary["train_features"] - train_min) / (train_max - train_min) - 1 ) data_dictionary["test_features"] = ( 2 * (data_dictionary["test_features"] - train_min) / (train_max - train_min) - 1 @@ -322,8 +321,8 @@ class FreqaiDataKitchen: - 1 ) - self.data[f"{item}_max"] = train_labels_max - self.data[f"{item}_min"] = train_labels_min + self.data[f"{item}_max"] = train_labels_max + self.data[f"{item}_min"] = train_labels_min return data_dictionary def normalize_single_dataframe(self, df: DataFrame) -> DataFrame: From 16573b19e3d478b3a5625a81d2504823dee4cdf8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 3 Sep 2022 19:34:38 +0200 Subject: [PATCH 101/437] Fix migration syntax error --- freqtrade/persistence/migrations.py | 4 ++-- freqtrade/persistence/trade_model.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/freqtrade/persistence/migrations.py b/freqtrade/persistence/migrations.py index 1f1330ba7..a54c5570f 100644 --- a/freqtrade/persistence/migrations.py +++ b/freqtrade/persistence/migrations.py @@ -223,7 +223,7 @@ def migrate_orders_table(engine, table_back_name: str, cols_order: List): select id, ft_trade_id, ft_order_side, ft_pair, ft_is_open, order_id, status, symbol, order_type, side, price, amount, filled, {average} average, remaining, cost, {stop_price} stop_price, order_date, order_filled_date, - order_update_date, {ft_fee_base} ft_fee_base {funding_fee} funding_fee + order_update_date, {ft_fee_base} ft_fee_base, {funding_fee} funding_fee from {table_back_name} """)) @@ -310,8 +310,8 @@ def check_migrate(engine, decl_base, previous_tables) -> None: # if ('orders' not in previous_tables # or not has_column(cols_orders, 'funding_fee')): migrating = False - if not has_column(cols_orders, 'funding_fee'): # if not has_column(cols_trades, 'contract_size'): + if not has_column(cols_orders, 'funding_fee'): migrating = True logger.info(f"Running database migration for trades - " f"backup: {table_back_name}, {order_table_bak_name}") diff --git a/freqtrade/persistence/trade_model.py b/freqtrade/persistence/trade_model.py index 6127c502d..ea60796a4 100644 --- a/freqtrade/persistence/trade_model.py +++ b/freqtrade/persistence/trade_model.py @@ -369,7 +369,8 @@ class LocalTrade(): orders = self.select_filled_orders() if not orders: return self.open_date_utc - return max([self.open_date_utc, max(o.order_filled_utc for o in orders)]) + return max([self.open_date_utc, + max(o.order_filled_utc for o in orders if o.order_filled_utc)]) @property def open_date_utc(self): From dae3b3d86adde0f6c7065ce1d083d9ceac62e5ef Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 3 Sep 2022 13:24:14 -0600 Subject: [PATCH 102/437] support shutting down freqai --- freqtrade/freqai/freqai_interface.py | 37 +++++++++++++++++++--------- freqtrade/freqtradebot.py | 2 ++ freqtrade/strategy/interface.py | 10 ++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index eac5cba07..a9c21fb65 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -7,7 +7,7 @@ import time from abc import ABC, abstractmethod from pathlib import Path from threading import Lock -from typing import Any, Dict, Tuple +from typing import Any, Dict, List, Tuple import numpy as np import pandas as pd @@ -27,13 +27,6 @@ pd.options.mode.chained_assignment = None logger = logging.getLogger(__name__) -def threaded(fn): - def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() - - return wrapper - - class IFreqaiModel(ABC): """ Class containing all tools for training and prediction in the strategy. @@ -94,6 +87,9 @@ class IFreqaiModel(ABC): self.begin_time_train: float = 0 self.base_tf_seconds = timeframe_to_seconds(self.config['timeframe']) + self._threads: List[threading.Thread] = [] + self._stop_event = threading.Event() + def assert_config(self, config: Dict[str, Any]) -> None: if not config.get("freqai", {}): @@ -147,15 +143,34 @@ class IFreqaiModel(ABC): self.model = None self.dk = None - @threaded - def start_scanning(self, strategy: IStrategy) -> None: + def shutdown(self): + """ + Cleans up threads on Shutdown, set stop event. Join threads to wait + for current training iteration. + """ + logger.info("Stopping FreqAI") + self._stop_event.set() + + logger.info("Waiting on Training iteration") + for _thread in self._threads: + _thread.join() + + def start_scanning(self, *args, **kwargs) -> None: + """ + Start `self._start_scanning` in a separate thread + """ + _thread = threading.Thread(target=self._start_scanning, args=args, kwargs=kwargs) + self._threads.append(_thread) + _thread.start() + + def _start_scanning(self, strategy: IStrategy) -> None: """ Function designed to constantly scan pairs for retraining on a separate thread (intracandle) to improve model youth. This function is agnostic to data preparation/collection/storage, it simply trains on what ever data is available in the self.dd. :param strategy: IStrategy = The user defined strategy class """ - while 1: + while not self._stop_event.is_set(): time.sleep(1) for pair in self.config.get("exchange", {}).get("pair_whitelist"): diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 37bc6dfed..883417219 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -148,6 +148,8 @@ class FreqtradeBot(LoggingMixin): self.check_for_open_trades() + self.strategy.ft_bot_cleanup() + self.rpc.cleanup() Trade.commit() self.exchange.close() diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index c7ea95bda..562a16b18 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -168,6 +168,10 @@ class IStrategy(ABC, HyperStrategyMixin): raise OperationalException( 'freqAI is not enabled. ' 'Please enable it in your config to use this strategy.') + + def cleanup(self, *args, **kwargs): + pass + self.freqai = DummyClass() # type: ignore def ft_bot_start(self, **kwargs) -> None: @@ -181,6 +185,12 @@ class IStrategy(ABC, HyperStrategyMixin): self.ft_load_hyper_params(self.config.get('runmode') == RunMode.HYPEROPT) + def ft_bot_cleanup(self) -> None: + """ + Clean up FreqAI and child threads + """ + self.freqai.shutdown() + @abstractmethod def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ From 3b5e5fc57b7a11402c76f13bddede071bd9eaf9e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 3 Sep 2022 14:10:23 -0600 Subject: [PATCH 103/437] fix method name in dummy class --- freqtrade/strategy/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 562a16b18..70cc7fdb3 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -169,7 +169,7 @@ class IStrategy(ABC, HyperStrategyMixin): 'freqAI is not enabled. ' 'Please enable it in your config to use this strategy.') - def cleanup(self, *args, **kwargs): + def shutdown(self, *args, **kwargs): pass self.freqai = DummyClass() # type: ignore From ec76214d023a6c53ffab0af8d43bc5b72b1d66af Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sun, 4 Sep 2022 15:56:07 +0200 Subject: [PATCH 104/437] backup historical predictions pickle and load the backup in case of corruption --- freqtrade/freqai/data_drawer.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index b6a1a15d7..9eeabef8f 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -76,6 +76,8 @@ class FreqaiDataDrawer: self.full_path / f"follower_dictionary-{self.follower_name}.json" ) self.historic_predictions_path = Path(self.full_path / "historic_predictions.pkl") + self.historic_predictions_bkp_path = Path( + self.full_path / "historic_predictions.backup.pkl") self.pair_dictionary_path = Path(self.full_path / "pair_dictionary.json") self.follow_mode = follow_mode if follow_mode: @@ -118,13 +120,21 @@ class FreqaiDataDrawer: """ exists = self.historic_predictions_path.is_file() if exists: - with open(self.historic_predictions_path, "rb") as fp: - self.historic_predictions = cloudpickle.load(fp) - logger.info( - f"Found existing historic predictions at {self.full_path}, but beware " - "that statistics may be inaccurate if the bot has been offline for " - "an extended period of time." - ) + try: + with open(self.historic_predictions_path, "rb") as fp: + self.historic_predictions = cloudpickle.load(fp) + logger.info( + f"Found existing historic predictions at {self.full_path}, but beware " + "that statistics may be inaccurate if the bot has been offline for " + "an extended period of time." + ) + except EOFError: + logger.warning( + 'Historical prediction file was corrupted. Trying to load backup file.') + with open(self.historic_predictions_bkp_path, "rb") as fp: + self.historic_predictions = cloudpickle.load(fp) + logger.warning('FreqAI successfully loaded the backup historical predictions file.') + elif not self.follow_mode: logger.info("Could not find existing historic_predictions, starting from scratch") else: @@ -142,6 +152,9 @@ class FreqaiDataDrawer: with open(self.historic_predictions_path, "wb") as fp: cloudpickle.dump(self.historic_predictions, fp, protocol=cloudpickle.DEFAULT_PROTOCOL) + # create a backup + shutil.copy(self.historic_predictions_path, self.historic_predictions_bkp_path) + def save_drawer_to_disk(self): """ Save data drawer full of all pair model metadata in present model folder. From 160186885404b4b15be4251a80b4ac054d930954 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 4 Sep 2022 09:42:43 -0600 Subject: [PATCH 105/437] dataprovider fix, updated config example --- config_examples/config_full.example.json | 3 +-- freqtrade/data/dataprovider.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index d0efa5bb6..2ebad4924 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -173,8 +173,7 @@ "CORS_origins": [], "username": "freqtrader", "password": "SuperSecurePassword", - "ws_token": "a_secret_ws_token", - "enable_message_ws": false + "ws_token": "a_secret_ws_token" }, "external_message_consumer": { "enabled": false, diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index ef3067f38..af0f2a70a 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -166,7 +166,7 @@ class DataProvider: # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) - if pair_key not in self.__producer_pairs_df: + if pair_key not in self.__producer_pairs_df[producer_name]: # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) From 07f806a314ec6e963a33b79782e8b658782b235d Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 4 Sep 2022 10:22:10 -0600 Subject: [PATCH 106/437] minor improvements, fixes, old config+constant removal --- .gitignore | 2 -- config_examples/config_full.example.json | 5 +++- freqtrade/constants.py | 3 +- freqtrade/data/dataprovider.py | 33 +++++++++++++++------- freqtrade/freqtradebot.py | 4 --- freqtrade/rpc/api_server/api_auth.py | 1 + freqtrade/rpc/api_server/api_ws.py | 15 +++++++--- freqtrade/rpc/api_server/webserver.py | 5 ++-- freqtrade/rpc/external_message_consumer.py | 6 ++-- freqtrade/strategy/interface.py | 15 ++++------ 10 files changed, 51 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 6a47a7f81..e400c01f5 100644 --- a/.gitignore +++ b/.gitignore @@ -113,5 +113,3 @@ target/ !config_examples/config_full.example.json !config_examples/config_kraken.example.json !config_examples/config_freqai.example.json -!config_examples/config_leader.example.json -!config_examples/config_follower.example.json diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index 2ebad4924..99d695406 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -175,12 +175,15 @@ "password": "SuperSecurePassword", "ws_token": "a_secret_ws_token" }, + // The ExternalMessageConsumer config should only be enabled on an instance + // that listens to outside data from another instance. This should not be enabled + // in your producer of data. "external_message_consumer": { "enabled": false, "producers": [ { "name": "default", - "url": "ws://some.freqtrade.bot/api/v1/message/ws", + "url": "ws://localhost:8081/api/v1/message/ws", "ws_token": "a_secret_ws_token" } ], diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 352e48148..bc00d7cfc 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -33,8 +33,7 @@ HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss', AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList', 'AgeFilter', 'OffsetFilter', 'PerformanceFilter', 'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter', - 'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter', - 'ExternalPairList'] + 'ShuffleFilter', 'SpreadFilter', 'VolatilityFilter'] AVAILABLE_PROTECTIONS = ['CooldownPeriod', 'LowProfitPairs', 'MaxDrawdown', 'StoplossGuard'] AVAILABLE_DATAHANDLERS = ['json', 'jsongz', 'hdf5'] BACKTEST_BREAKDOWNS = ['day', 'week', 'month'] diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index af0f2a70a..32152f2f5 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -48,8 +48,11 @@ class DataProvider: self.__producer_pairs: Dict[str, List[str]] = {} self._msg_queue: deque = deque() + self._default_candle_type = self._config.get('candle_type_def', CandleType.SPOT) + self._default_timeframe = self._config.get('timeframe', '1h') + self.__msg_cache = PeriodicCache( - maxsize=1000, ttl=timeframe_to_seconds(self._config.get('timeframe', '1h'))) + maxsize=1000, ttl=timeframe_to_seconds(self._default_timeframe)) self._num_sources = len( self._config.get('external_message_consumer', {}).get('producers', []) @@ -84,7 +87,7 @@ class DataProvider: dataframe, datetime.now(timezone.utc)) # For multiple producers we will want to merge the pairlists instead of overwriting - def set_producer_pairs(self, pairlist: List[str], producer_name: str = "default"): + def _set_producer_pairs(self, pairlist: List[str], producer_name: str = "default"): """ Set the pairs received to later be used. This only supports 1 Producer right now. @@ -101,7 +104,7 @@ class DataProvider: """ return self.__producer_pairs.get(producer_name, []) - def emit_df( + def _emit_df( self, pair_key: PairWithTimeframe, dataframe: DataFrame @@ -123,12 +126,12 @@ class DataProvider: } ) - def add_external_df( + def _add_external_df( self, pair: str, - timeframe: str, dataframe: DataFrame, - candle_type: CandleType, + timeframe: Optional[str] = None, + candle_type: Optional[CandleType] = None, producer_name: str = "default" ) -> None: """ @@ -138,18 +141,22 @@ class DataProvider: :param timeframe: Timeframe to get data for :param candle_type: Any of the enum CandleType (must match trading mode!) """ - pair_key = (pair, timeframe, candle_type) + _timeframe = self._default_timeframe if not timeframe else timeframe + _candle_type = self._default_candle_type if not candle_type else candle_type + + pair_key = (pair, _timeframe, _candle_type) if producer_name not in self.__producer_pairs_df: self.__producer_pairs_df[producer_name] = {} self.__producer_pairs_df[producer_name][pair_key] = (dataframe, datetime.now(timezone.utc)) + logger.debug(f"External DataFrame for {pair_key} from {producer_name} added.") def get_external_df( self, pair: str, - timeframe: str, - candle_type: CandleType, + timeframe: Optional[str] = None, + candle_type: Optional[CandleType] = None, producer_name: str = "default" ) -> Tuple[DataFrame, datetime]: """ @@ -160,16 +167,22 @@ class DataProvider: :param timeframe: Timeframe to get data for :param candle_type: Any of the enum CandleType (must match trading mode!) """ - pair_key = (pair, timeframe, candle_type) + _timeframe = self._default_timeframe if not timeframe else timeframe + _candle_type = self._default_candle_type if not candle_type else candle_type + pair_key = (pair, _timeframe, _candle_type) + + # If we have no data from this Producer yet if producer_name not in self.__producer_pairs_df: # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + # If we do have data from that Producer, but no data on this pair_key if pair_key not in self.__producer_pairs_df[producer_name]: # We don't have this data yet, return empty DataFrame and datetime (01-01-1970) return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) + # We have it, return this data return self.__producer_pairs_df[producer_name][pair_key] def add_pairlisthandler(self, pairlists) -> None: diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 888994ffb..ce01fc872 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -199,10 +199,6 @@ class FreqtradeBot(LoggingMixin): strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)() - # This just means we won't broadcast dataframes if we're listening to a producer - # Doesn't necessarily NEED to be this way, as maybe we'd like to broadcast - # even if we are using external dataframes in the future. - self.strategy.analyze(self.active_pair_whitelist) with self._exit_lock: diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index fd90918e1..6655dbf86 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -50,6 +50,7 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access"): # This should be reimplemented to better realign with the existing tools provided # by FastAPI regarding API Tokens +# https://github.com/tiangolo/fastapi/blob/master/fastapi/security/api_key.py async def get_ws_token( ws: WebSocket, token: Union[str, None] = None, diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 95cfd031a..d11d1acfe 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -2,23 +2,30 @@ import logging from typing import Any, Dict from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect +# fastapi does not make this available through it, so import directly from starlette +from starlette.websockets import WebSocketState from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel -from freqtrade.rpc.api_server.ws.utils import is_websocket_alive from freqtrade.rpc.rpc import RPC -# from typing import Any, Dict - - logger = logging.getLogger(__name__) # Private router, protected by API Key authentication router = APIRouter() +async def is_websocket_alive(ws: WebSocket) -> bool: + if ( + ws.application_state == WebSocketState.CONNECTED and + ws.client_state == WebSocketState.CONNECTED + ): + return True + return False + + async def _process_consumer_request( request: Dict[str, Any], channel: WebSocketChannel, diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 150c83890..ad93e77a7 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -205,7 +205,7 @@ class ApiServer(RPCHandler): # For testing, shouldn't happen when stable except Exception as e: - logger.info(f"Exception happened in background task: {e}") + logger.exception(f"Exception happened in background task: {e}") def start_api(self): """ @@ -244,8 +244,7 @@ class ApiServer(RPCHandler): if self._standalone: self._server.run() else: - if self._config.get('api_server', {}).get('enable_message_ws', False): - self.start_message_queue() + self.start_message_queue() self._server.run_in_thread() except Exception: logger.exception("Api server failed to start.") diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index d3b82cadf..7f2ac01fb 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -289,7 +289,7 @@ class ExternalMessageConsumer: return # Add the pairlist data to the DataProvider - self._dp.set_producer_pairs(message_data, producer_name=producer_name) + self._dp._set_producer_pairs(message_data, producer_name=producer_name) logger.debug(f"Consumed message from {producer_name} of type RPCMessageType.WHITELIST") @@ -309,8 +309,8 @@ class ExternalMessageConsumer: dataframe = remove_entry_exit_signals(dataframe) # Add the dataframe to the dataprovider - self._dp.add_external_df(pair, timeframe, dataframe, - candle_type, producer_name=producer_name) + self._dp._add_external_df(pair, dataframe, timeframe, + candle_type, producer_name=producer_name) logger.debug( f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 7fcae870a..73948a37a 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -700,8 +700,7 @@ class IStrategy(ABC, HyperStrategyMixin): def _analyze_ticker_internal( self, dataframe: DataFrame, - metadata: dict, - emit_df: bool = False + metadata: dict ) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame @@ -725,7 +724,7 @@ class IStrategy(ABC, HyperStrategyMixin): candle_type = self.config.get('candle_type_def', CandleType.SPOT) self.dp._set_cached_df(pair, self.timeframe, dataframe, candle_type=candle_type) - self.dp.emit_df((pair, self.timeframe, candle_type), dataframe) + self.dp._emit_df((pair, self.timeframe, candle_type), dataframe) else: logger.debug("Skipping TA Analysis for already analyzed candle") @@ -737,8 +736,7 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze_pair( self, - pair: str, - emit_df: bool = False + pair: str ) -> None: """ Fetch data for this pair from dataprovider and analyze. @@ -759,7 +757,7 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = strategy_safe_wrapper( self._analyze_ticker_internal, message="" - )(dataframe, {'pair': pair}, emit_df) + )(dataframe, {'pair': pair}) self.assert_df(dataframe, df_len, df_close, df_date) except StrategyError as error: @@ -772,15 +770,14 @@ class IStrategy(ABC, HyperStrategyMixin): def analyze( self, - pairs: List[str], - emit_df: bool = False + pairs: List[str] ) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze """ for pair in pairs: - self.analyze_pair(pair, emit_df) + self.analyze_pair(pair) @ staticmethod def preserve_df(dataframe: DataFrame) -> Tuple[int, float, datetime]: From 8a08f8ff8d1d53a13bd7ba47a2fd09426aa9cacf Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 4 Sep 2022 10:27:34 -0600 Subject: [PATCH 107/437] revert rpc manager --- freqtrade/rpc/rpc_manager.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index d6374566c..3ba2f9d4d 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -49,17 +49,6 @@ class RPCManager: apiserver.add_rpc_handler(self._rpc) self.registered_modules.append(apiserver) - # Enable External Signals mode - # For this to be enabled, the API server must also be enabled - # if config.get('external_signal', {}).get('enabled', False): - # logger.info('Enabling RPC.ExternalSignalController') - # from freqtrade.rpc.external_signal import ExternalSignalController - # external_signals = ExternalSignalController(self._rpc, config, apiserver) - # self.registered_modules.append(external_signals) - # - # # Attach the controller to FreqTrade - # freqtrade.external_signal_controller = external_signals - def cleanup(self) -> None: """ Stops all enabled rpc modules """ logger.info('Cleaning up rpc modules ...') @@ -78,11 +67,8 @@ class RPCManager: 'status': 'stopping bot' } """ - # Removed actually showing the message because the logs would be - # completely spammed of the json dataframe - logger.info('Sending rpc message of type: %s', msg.get('type')) - # Log actual message in debug? - # logger.debug(msg) + if msg.get('type') is not RPCMessageType.ANALYZED_DF: + logger.info('Sending rpc message: %s', msg) if 'pair' in msg: msg.update({ 'base_currency': self._rpc._freqtrade.exchange.get_pair_base_currency(msg['pair']) From d43ed186fcc375f9087b059a00d2fb3b5ec6fdfe Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Sun, 4 Sep 2022 16:55:47 -0300 Subject: [PATCH 108/437] fix issue with freqai backtesting at slice dataframe --- freqtrade/freqai/data_kitchen.py | 15 +++++++++++++++ freqtrade/freqai/freqai_interface.py | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 7595942fe..d525ae4ac 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -458,6 +458,21 @@ class FreqaiDataKitchen: return df + def slice_dataframe_backtesting(self, timerange: TimeRange, df: DataFrame) -> DataFrame: + """ + Given a full dataframe, extract the user desired window + :param tr: timerange string that we wish to extract from df + :param df: Dataframe containing all candles to run the entire backtest. Here + it is sliced down to just the present training period. + """ + + start = datetime.datetime.fromtimestamp(timerange.startts, tz=datetime.timezone.utc) + stop = datetime.datetime.fromtimestamp(timerange.stopts, tz=datetime.timezone.utc) + df = df.loc[df["date"] >= start, :] + df = df.loc[df["date"] < stop, :] + + return df + def principal_component_analysis(self) -> None: """ Performs Principal Component Analysis on the data for dimensionality reduction diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index a9c21fb65..b17f8c9ab 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -225,8 +225,8 @@ class IFreqaiModel(ABC): train_it += 1 total_trains = len(dk.backtesting_timeranges) self.training_timerange = tr_train - dataframe_train = dk.slice_dataframe(tr_train, dataframe) - dataframe_backtest = dk.slice_dataframe(tr_backtest, dataframe) + dataframe_train = dk.slice_dataframe_backtesting(tr_train, dataframe) + dataframe_backtest = dk.slice_dataframe_backtesting(tr_backtest, dataframe) trained_timestamp = tr_train tr_train_startts_str = datetime.datetime.utcfromtimestamp(tr_train.startts).strftime( From 78d01810ed1dd3ecee954b914e9066267d5e969a Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 5 Sep 2022 00:07:05 +0200 Subject: [PATCH 109/437] reduce code redundancy, ensure live always gets the latest data --- freqtrade/freqai/data_kitchen.py | 18 ++---------------- freqtrade/freqai/freqai_interface.py | 4 ++-- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index d525ae4ac..828734520 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -454,22 +454,8 @@ class FreqaiDataKitchen: start = datetime.datetime.fromtimestamp(timerange.startts, tz=datetime.timezone.utc) stop = datetime.datetime.fromtimestamp(timerange.stopts, tz=datetime.timezone.utc) df = df.loc[df["date"] >= start, :] - df = df.loc[df["date"] <= stop, :] - - return df - - def slice_dataframe_backtesting(self, timerange: TimeRange, df: DataFrame) -> DataFrame: - """ - Given a full dataframe, extract the user desired window - :param tr: timerange string that we wish to extract from df - :param df: Dataframe containing all candles to run the entire backtest. Here - it is sliced down to just the present training period. - """ - - start = datetime.datetime.fromtimestamp(timerange.startts, tz=datetime.timezone.utc) - stop = datetime.datetime.fromtimestamp(timerange.stopts, tz=datetime.timezone.utc) - df = df.loc[df["date"] >= start, :] - df = df.loc[df["date"] < stop, :] + if not self.live: + df = df.loc[df["date"] < stop, :] return df diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index b17f8c9ab..a9c21fb65 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -225,8 +225,8 @@ class IFreqaiModel(ABC): train_it += 1 total_trains = len(dk.backtesting_timeranges) self.training_timerange = tr_train - dataframe_train = dk.slice_dataframe_backtesting(tr_train, dataframe) - dataframe_backtest = dk.slice_dataframe_backtesting(tr_backtest, dataframe) + dataframe_train = dk.slice_dataframe(tr_train, dataframe) + dataframe_backtest = dk.slice_dataframe(tr_backtest, dataframe) trained_timestamp = tr_train tr_train_startts_str = datetime.datetime.utcfromtimestamp(tr_train.startts).strftime( From c8a9ac900c2bdec9620c6d2745ee78a3d78cfbdc Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 5 Sep 2022 00:52:26 +0200 Subject: [PATCH 110/437] fix broken CI --- tests/freqai/test_freqai_datakitchen.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/freqai/test_freqai_datakitchen.py b/tests/freqai/test_freqai_datakitchen.py index 9ef955695..44c721515 100644 --- a/tests/freqai/test_freqai_datakitchen.py +++ b/tests/freqai/test_freqai_datakitchen.py @@ -74,7 +74,7 @@ def test_use_DBSCAN_to_remove_outliers(mocker, freqai_conf, caplog): # freqai_conf['freqai']['feature_parameters'].update({"outlier_protection_percentage": 1}) freqai.dk.use_DBSCAN_to_remove_outliers(predict=False) assert log_has_re( - "DBSCAN found eps of 2.42.", + "DBSCAN found eps of 2.36.", caplog, ) @@ -83,7 +83,7 @@ def test_compute_distances(mocker, freqai_conf): freqai = make_data_dictionary(mocker, freqai_conf) freqai_conf['freqai']['feature_parameters'].update({"DI_threshold": 1}) avg_mean_dist = freqai.dk.compute_distances() - assert round(avg_mean_dist, 2) == 2.56 + assert round(avg_mean_dist, 2) == 2.54 def test_use_SVM_to_remove_outliers_and_outlier_protection(mocker, freqai_conf, caplog): @@ -91,6 +91,6 @@ def test_use_SVM_to_remove_outliers_and_outlier_protection(mocker, freqai_conf, freqai_conf['freqai']['feature_parameters'].update({"outlier_protection_percentage": 0.1}) freqai.dk.use_SVM_to_remove_outliers(predict=False) assert log_has_re( - "SVM detected 8.46%", + "SVM detected 8.09%", caplog, ) From a035a69a61e344fa5b7a7a01e2f01cfad46de7af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:09:53 +0000 Subject: [PATCH 111/437] Bump arrow from 1.2.2 to 1.2.3 Bumps [arrow](https://github.com/arrow-py/arrow) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/arrow-py/arrow/releases) - [Changelog](https://github.com/arrow-py/arrow/blob/master/CHANGELOG.rst) - [Commits](https://github.com/arrow-py/arrow/compare/1.2.2...1.2.3) --- updated-dependencies: - dependency-name: arrow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..99139f92b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ cryptography==37.0.4 aiohttp==3.8.1 SQLAlchemy==1.4.40 python-telegram-bot==13.13 -arrow==1.2.2 +arrow==1.2.3 cachetools==4.2.2 requests==2.28.1 urllib3==1.26.12 From 7cc8ac0a3429f0fd40c2be30974457f32259d744 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:10:02 +0000 Subject: [PATCH 112/437] Bump psutil from 5.9.1 to 5.9.2 Bumps [psutil](https://github.com/giampaolo/psutil) from 5.9.1 to 5.9.2. - [Release notes](https://github.com/giampaolo/psutil/releases) - [Changelog](https://github.com/giampaolo/psutil/blob/master/HISTORY.rst) - [Commits](https://github.com/giampaolo/psutil/compare/release-5.9.1...release-5.9.2) --- updated-dependencies: - dependency-name: psutil dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..240eb0057 100644 --- a/requirements.txt +++ b/requirements.txt @@ -38,7 +38,7 @@ fastapi==0.81.0 uvicorn==0.18.3 pyjwt==2.4.0 aiofiles==0.8.0 -psutil==5.9.1 +psutil==5.9.2 # Support for colorized terminal output colorama==0.4.5 From af7e4d7bf0a5ce6f47e7a46d6f55dd814a43e22d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:10:11 +0000 Subject: [PATCH 113/437] Bump pytest from 7.1.2 to 7.1.3 Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 26df7115c..40ca4e154 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -10,7 +10,7 @@ flake8==5.0.4 flake8-tidy-imports==4.8.0 mypy==0.971 pre-commit==2.20.0 -pytest==7.1.2 +pytest==7.1.3 pytest-asyncio==0.19.0 pytest-cov==3.0.0 pytest-mock==3.8.2 From 3d038568457a7cfadfc0765ecc1e2ca5867f04e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:10:31 +0000 Subject: [PATCH 114/437] Bump ccxt from 1.92.84 to 1.93.3 Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.92.84 to 1.93.3. - [Release notes](https://github.com/ccxt/ccxt/releases) - [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg) - [Commits](https://github.com/ccxt/ccxt/compare/1.92.84...1.93.3) --- updated-dependencies: - dependency-name: ccxt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..d70eebdd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.23.2 pandas==1.4.3 pandas-ta==0.3.14b -ccxt==1.92.84 +ccxt==1.93.3 # Pin cryptography for now due to rust build errors with piwheels cryptography==37.0.4 aiohttp==3.8.1 From 90fbb794712cce946ae65caeacafa0f8724ae691 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:10:44 +0000 Subject: [PATCH 115/437] Bump prompt-toolkit from 3.0.30 to 3.0.31 Bumps [prompt-toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) from 3.0.30 to 3.0.31. - [Release notes](https://github.com/prompt-toolkit/python-prompt-toolkit/releases) - [Changelog](https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/CHANGELOG) - [Commits](https://github.com/prompt-toolkit/python-prompt-toolkit/compare/3.0.30...3.0.31) --- updated-dependencies: - dependency-name: prompt-toolkit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..ff1eabe38 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,7 +44,7 @@ psutil==5.9.1 colorama==0.4.5 # Building config files interactively questionary==1.10.0 -prompt-toolkit==3.0.30 +prompt-toolkit==3.0.31 # Extensions to datetime library python-dateutil==2.8.2 From 6f6afca0277de0ffeab2d104fb4b1068446dafc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:10:53 +0000 Subject: [PATCH 116/437] Bump fastapi from 0.81.0 to 0.82.0 Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.81.0 to 0.82.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.81.0...0.82.0) --- updated-dependencies: - dependency-name: fastapi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..2ddf3fbd9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,7 @@ orjson==3.8.0 sdnotify==0.3.2 # API Server -fastapi==0.81.0 +fastapi==0.82.0 uvicorn==0.18.3 pyjwt==2.4.0 aiofiles==0.8.0 From f5500350f9364fd619415e56cd9d43eb42911f78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:11:24 +0000 Subject: [PATCH 117/437] Bump pandas from 1.4.3 to 1.4.4 Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.4.3 to 1.4.4. - [Release notes](https://github.com/pandas-dev/pandas/releases) - [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md) - [Commits](https://github.com/pandas-dev/pandas/compare/v1.4.3...v1.4.4) --- updated-dependencies: - dependency-name: pandas dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..6bd828059 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ numpy==1.23.2 -pandas==1.4.3 +pandas==1.4.4 pandas-ta==0.3.14b ccxt==1.92.84 From 48dc1f2d88bf82f5721aba621b6768cc953f6ca9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:11:29 +0000 Subject: [PATCH 118/437] Bump pycoingecko from 2.2.0 to 3.0.0 Bumps [pycoingecko](https://github.com/man-c/pycoingecko) from 2.2.0 to 3.0.0. - [Release notes](https://github.com/man-c/pycoingecko/releases) - [Changelog](https://github.com/man-c/pycoingecko/blob/master/CHANGELOG.md) - [Commits](https://github.com/man-c/pycoingecko/compare/2.2.0...3.0.0) --- updated-dependencies: - dependency-name: pycoingecko dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cbd5e31ba..20796bd26 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ jsonschema==4.14.0 TA-Lib==0.4.24 technical==1.3.0 tabulate==0.8.10 -pycoingecko==2.2.0 +pycoingecko==3.0.0 jinja2==3.1.2 tables==3.7.0 blosc==1.10.6 From 9f5642fd972affbf12f16859e391a3f243bc45ad Mon Sep 17 00:00:00 2001 From: Italo <45588475+italodamato@users.noreply.github.com> Date: Mon, 5 Sep 2022 18:12:19 +0200 Subject: [PATCH 119/437] fix hyperopt df preprocessing --- freqtrade/optimize/hyperopt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index fea2a672f..4c8613a7a 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -423,7 +423,7 @@ class Hyperopt: # Trim startup period from analyzed dataframe to get correct dates for output. processed = trim_dataframes(preprocessed, self.timerange, self.backtesting.required_startup) self.min_date, self.max_date = get_timerange(processed) - return processed + return preprocessed def prepare_hyperopt_data(self) -> None: HyperoptStateContainer.set_state(HyperoptState.DATALOAD) From 949f618d42530d4c4ca3e6a06eba5b99443a8bd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 16:30:43 +0000 Subject: [PATCH 120/437] Bump python-telegram-bot from 13.13 to 13.14 Bumps [python-telegram-bot](https://github.com/python-telegram-bot/python-telegram-bot) from 13.13 to 13.14. - [Release notes](https://github.com/python-telegram-bot/python-telegram-bot/releases) - [Changelog](https://github.com/python-telegram-bot/python-telegram-bot/blob/v13.14/CHANGES.rst) - [Commits](https://github.com/python-telegram-bot/python-telegram-bot/compare/v13.13...v13.14) --- updated-dependencies: - dependency-name: python-telegram-bot dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c7d55ba78..3cb321b2b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ ccxt==1.93.3 cryptography==37.0.4 aiohttp==3.8.1 SQLAlchemy==1.4.40 -python-telegram-bot==13.13 +python-telegram-bot==13.14 arrow==1.2.3 cachetools==4.2.2 requests==2.28.1 From 4628bfa580c49d8f80bf1372b66c95f6557b683c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 17:30:55 +0000 Subject: [PATCH 121/437] Bump jsonschema from 4.14.0 to 4.15.0 Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.14.0 to 4.15.0. - [Release notes](https://github.com/python-jsonschema/jsonschema/releases) - [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst) - [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.14.0...v4.15.0) --- updated-dependencies: - dependency-name: jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8b994cb88..fdbe6ac28 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ arrow==1.2.3 cachetools==4.2.2 requests==2.28.1 urllib3==1.26.12 -jsonschema==4.14.0 +jsonschema==4.15.0 TA-Lib==0.4.24 technical==1.3.0 tabulate==0.8.10 From 36e5c18fa600a3dbf3c58f6e2e7ee149a5b71ede Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 5 Sep 2022 20:54:03 +0200 Subject: [PATCH 122/437] Don't raise exception when a message is not implemented in telegram --- freqtrade/rpc/telegram.py | 12 +++++++----- tests/rpc/test_rpc_telegram.py | 10 +++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 8c988d570..4a759f6ec 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -6,6 +6,7 @@ This module manage Telegram communication import json import logging import re +from copy import deepcopy from dataclasses import dataclass from datetime import date, datetime, timedelta from functools import partial @@ -374,7 +375,7 @@ class Telegram(RPCHandler): message += f"\n*Duration:* `{msg['duration']} ({msg['duration_min']:.1f} min)`" return message - def compose_message(self, msg: Dict[str, Any], msg_type: RPCMessageType) -> str: + def compose_message(self, msg: Dict[str, Any], msg_type: RPCMessageType) -> Optional[str]: if msg_type in [RPCMessageType.ENTRY, RPCMessageType.ENTRY_FILL]: message = self._format_entry_msg(msg) @@ -411,7 +412,8 @@ class Telegram(RPCHandler): elif msg_type == RPCMessageType.STRATEGY_MSG: message = f"{msg['msg']}" else: - raise NotImplementedError(f"Unknown message type: {msg_type}") + logger.debug("Unknown message type: %s", msg_type) + return None return message def send_msg(self, msg: Dict[str, Any]) -> None: @@ -438,9 +440,9 @@ class Telegram(RPCHandler): # Notification disabled return - message = self.compose_message(msg, msg_type) - - self._send_msg(message, disable_notification=(noti == 'silent')) + message = self.compose_message(deepcopy(msg), msg_type) + if message: + self._send_msg(message, disable_notification=(noti == 'silent')) def _get_sell_emoji(self, msg): """ diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index cde7025a7..f2e490dff 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -2138,11 +2138,11 @@ def test_send_msg_strategy_msg_notification(default_conf, mocker) -> None: def test_send_msg_unknown_type(default_conf, mocker) -> None: - telegram, _, _ = get_telegram_testobject(mocker, default_conf) - with pytest.raises(NotImplementedError, match=r'Unknown message type: None'): - telegram.send_msg({ - 'type': None, - }) + telegram, _, msg_mock = get_telegram_testobject(mocker, default_conf) + telegram.send_msg({ + 'type': None, + }) + msg_mock.call_count == 0 @pytest.mark.parametrize('message_type,enter,enter_signal,leverage', [ From 689b193240a77dc2e9619583a9bef3c9c7f07b56 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 5 Sep 2022 20:57:42 +0200 Subject: [PATCH 123/437] improve clarity on data download requirements --- docs/freqai.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index 3646362c3..d04d2fa6b 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -280,7 +280,7 @@ The FreqAI strategy requires the user to include the following lines of code in Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](#feature-engineering)) and labels ([more information](#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. ### Setting the `startup_candle_count` -Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md/#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). +Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). !!! Note Typically it is best for users to be safe and multiply their expected `startup_candle_count` by 2. There are instances where the talib functions actually require more data than just the passed `period`. Anecdotally, multiplying the `startup_candle_count` by 2 always leads to a fully NaN free training dataset. Look out for this log message to confirm that your data is clean: @@ -515,10 +515,11 @@ and if a full `live_retrain_hours` has elapsed since the end of the loaded model The FreqAI backtesting module can be executed with the following command: ```bash -freqtrade backtesting --strategy FreqaiExampleStrategy --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 +freqtrade download-data --config config_examples/config_freqai.example.json --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates -t 3m 15m 1h --timerange 20210315-20210701 +freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 ``` -Backtesting mode requires the user to have the data pre-downloaded (unlike in dry/live mode where FreqAI automatically downloads the necessary data). The user should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the user-set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration). +Backtesting mode requires the user to have the data [pre-downloaded](#downloading-data-for-backtesting) (unlike in dry/live mode where FreqAI automatically downloads the necessary data). The user should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the user-set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration). If this command has never been executed with the existing config file, it will train a new model for each pair, for each backtesting window within the expanded `--timerange`. @@ -546,7 +547,7 @@ FreqAI will train have trained 8 separate models at the end of `--timerange` (be Although fractional `backtest_period_days` is allowed, the user should be aware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, if the user wants to set a `--timerange` of 10 days, and asks for a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. Because of this, a true backtest of FreqAI adaptive training would take a *very* long time. The best way to fully test a model is to run it dry and let it constantly train. In this case, backtesting would take the exact same amount of time as a dry run. ### Downloading data for backtesting -Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download/#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by taking subtracting `train_period_days` and the `startup_candle_count` ([details](#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. +Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download.md#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by moving the start date of the timerange backwards by `train_period_days` and the `startup_candle_count` ([details](#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. As an example, if we wish to backtest the `--timerange` above of `20210501-20210701`, and we use the example config which sets `train_period_days` to 15. The startup candle count is 40 on a maximum `include_timeframes` of 1h. We would need 20210501 - 15 days - 40 * 1h / 24 hours = 20210414 (16.7 days earlier than the start of the desired training timerange). From 9fb3517adc9b6d078fe3fc00d7393a79fcddae15 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 5 Sep 2022 21:08:01 +0200 Subject: [PATCH 124/437] Fix non-resolvable freqai test this test could never succeed in UI's as the name was constantly changing. --- tests/freqai/test_freqai_datakitchen.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/tests/freqai/test_freqai_datakitchen.py b/tests/freqai/test_freqai_datakitchen.py index 44c721515..908223c20 100644 --- a/tests/freqai/test_freqai_datakitchen.py +++ b/tests/freqai/test_freqai_datakitchen.py @@ -1,5 +1,5 @@ -import datetime import shutil +from datetime import datetime, timedelta, timezone from pathlib import Path import pytest @@ -56,16 +56,13 @@ def test_split_timerange( shutil.rmtree(Path(dk.full_path)) -@pytest.mark.parametrize( - "timestamp, expected", - [ - (datetime.datetime.now(tz=datetime.timezone.utc).timestamp() - 7200, True), - (datetime.datetime.now(tz=datetime.timezone.utc).timestamp(), False), - ], -) -def test_check_if_model_expired(mocker, freqai_conf, timestamp, expected): +def test_check_if_model_expired(mocker, freqai_conf): + dk = get_patched_data_kitchen(mocker, freqai_conf) - assert dk.check_if_model_expired(timestamp) == expected + now = datetime.now(tz=timezone.utc).timestamp() + assert dk.check_if_model_expired(now) is False + now = (datetime.now(tz=timezone.utc) - timedelta(hours=2)).timestamp() + assert dk.check_if_model_expired(now) is True shutil.rmtree(Path(dk.full_path)) From 8f261d8edff162e26ad42876b2a4ce88beb08d45 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 5 Sep 2022 13:47:17 -0600 Subject: [PATCH 125/437] change from bytes to text in websocket, remove old logs --- freqtrade/rpc/api_server/api_ws.py | 2 -- freqtrade/rpc/api_server/ws/channel.py | 3 --- freqtrade/rpc/api_server/ws/proxy.py | 15 +++++++++------ freqtrade/rpc/api_server/ws/serializer.py | 2 ++ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index d11d1acfe..aaa526401 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -67,8 +67,6 @@ async def _process_consumer_request( # They requested the full historical analyzed dataframes analyzed_df = rpc._ws_request_analyzed_df(limit) - logger.debug(f"ANALYZED_DF RESULT: {analyzed_df}") - # For every dataframe, send as a separate message for _, message in analyzed_df.items(): await channel.send({"type": RPCMessageType.ANALYZED_DF, "data": message}) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 1f0cd9c7a..952b3b9f5 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -50,7 +50,6 @@ class WebSocketChannel: """ Send data on the wrapped websocket """ - # logger.info(f"Serialized Send - {self._wrapped_ws._serialize(data)}") await self._wrapped_ws.send(data) async def recv(self): @@ -168,8 +167,6 @@ class ChannelManager: :param direct_channel: The WebSocketChannel object to send data through :param data: The data to send """ - # We iterate over the channels to get reference to the websocket object - # so we can disconnect incase of failure await channel.send(data) def has_channels(self): diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index 73d1481b9..ea977a228 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -27,11 +27,14 @@ class WebSocketProxy: """ Send data on the wrapped websocket """ - if isinstance(data, str): - data = data.encode() - if hasattr(self._websocket, "send_bytes"): - await self._websocket.send_bytes(data) + if not isinstance(data, str): + # We use HybridJSONWebSocketSerializer, which when serialized returns + # bytes because of ORJSON, so we explicitly decode into a string + data = str(data, "utf-8") + + if hasattr(self._websocket, "send_text"): + await self._websocket.send_text(data) else: await self._websocket.send(data) @@ -39,8 +42,8 @@ class WebSocketProxy: """ Receive data on the wrapped websocket """ - if hasattr(self._websocket, "receive_bytes"): - return await self._websocket.receive_bytes() + if hasattr(self._websocket, "receive_text"): + return await self._websocket.receive_text() else: return await self._websocket.recv() diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index 109708cc9..8ff617f45 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -58,9 +58,11 @@ class RapidJSONWebSocketSerializer(WebSocketSerializer): class HybridJSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data): + # ORJSON returns bytes return orjson.dumps(data, default=_json_default) def _deserialize(self, data): + # RapidJSON expects strings return rapidjson.loads(data, object_hook=_json_object_hook) From 1ea703d527b341322a64d0f8e2327117a2bca7a8 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Mon, 5 Sep 2022 22:20:38 +0200 Subject: [PATCH 126/437] remove download-data command --- docs/freqai.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/freqai.md b/docs/freqai.md index d04d2fa6b..303c2f151 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -515,7 +515,6 @@ and if a full `live_retrain_hours` has elapsed since the end of the loaded model The FreqAI backtesting module can be executed with the following command: ```bash -freqtrade download-data --config config_examples/config_freqai.example.json --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates -t 3m 15m 1h --timerange 20210315-20210701 freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 ``` From 5b826150dff2c2d0f04b4a93ab802a5ce8b50c63 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Mon, 5 Sep 2022 17:43:28 -0300 Subject: [PATCH 127/437] fix hyperopt - freqai --- freqtrade/freqai/data_drawer.py | 29 +++++++++++++++++++++++----- freqtrade/freqai/freqai_interface.py | 7 +++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index 9eeabef8f..a1ecb7654 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -93,6 +93,16 @@ class FreqaiDataDrawer: "model_filename": "", "trained_timestamp": 0, "priority": 1, "first": True, "data_path": "", "extras": {}} + def __getstate__(self): + """ + Return state values to be pickled. + It's necessary to allow serialization in hyperopt + """ + return ({ + "pair_dict": self.pair_dict, + "pair_dictionary_path": self.pair_dictionary_path + }) + def load_drawer_from_disk(self): """ Locate and load a previously saved data drawer full of all pair model metadata in @@ -155,14 +165,23 @@ class FreqaiDataDrawer: # create a backup shutil.copy(self.historic_predictions_path, self.historic_predictions_bkp_path) - def save_drawer_to_disk(self): + def save_drawer_to_disk(self, live=False): """ Save data drawer full of all pair model metadata in present model folder. """ - with self.save_lock: + if live: + with self.save_lock: + with open(self.pair_dictionary_path, 'w') as fp: + rapidjson.dump( + self.pair_dict, fp, default=self.np_encoder, + number_mode=rapidjson.NM_NATIVE + ) + else: + # save_lock it's not working with hyperopt with open(self.pair_dictionary_path, 'w') as fp: - rapidjson.dump(self.pair_dict, fp, default=self.np_encoder, - number_mode=rapidjson.NM_NATIVE) + rapidjson.dump( + self.pair_dict, fp, default=self.np_encoder, + number_mode=rapidjson.NM_NATIVE) def save_follower_dict_to_disk(self): """ @@ -437,7 +456,7 @@ class FreqaiDataDrawer: self.model_dictionary[coin] = model self.pair_dict[coin]["model_filename"] = dk.model_filename self.pair_dict[coin]["data_path"] = str(dk.data_path) - self.save_drawer_to_disk() + self.save_drawer_to_disk(dk.live) return diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index a9c21fb65..9a05e8383 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -90,6 +90,13 @@ class IFreqaiModel(ABC): self._threads: List[threading.Thread] = [] self._stop_event = threading.Event() + def __getstate__(self): + """ + Return state values to be pickled. + It's necessary to allow serialization in hyperopt + """ + return ({"dd": self.dd}) + def assert_config(self, config: Dict[str, Any]) -> None: if not config.get("freqai", {}): From 2c8e5b191bf84580684bf3a372121cef2e13d8f8 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Mon, 5 Sep 2022 17:43:55 -0300 Subject: [PATCH 128/437] fix hyperopt - freqai --- freqtrade/freqai/data_drawer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index a1ecb7654..dff6b5942 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -174,8 +174,7 @@ class FreqaiDataDrawer: with open(self.pair_dictionary_path, 'w') as fp: rapidjson.dump( self.pair_dict, fp, default=self.np_encoder, - number_mode=rapidjson.NM_NATIVE - ) + number_mode=rapidjson.NM_NATIVE) else: # save_lock it's not working with hyperopt with open(self.pair_dictionary_path, 'w') as fp: From b949ea301c5828612f094c1c5040a67adcd3a47e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 5 Sep 2022 19:29:07 -0600 Subject: [PATCH 129/437] fix failed apiserver tests --- freqtrade/rpc/api_server/webserver.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index ad93e77a7..6ad3f143e 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -114,6 +114,10 @@ class ApiServer(RPCHandler): self._thread.join() + self._thread = None + self._loop = None + self._background_task = None + @classmethod def shutdown(cls): cls.__initialized = False @@ -169,15 +173,15 @@ class ApiServer(RPCHandler): app.add_exception_handler(RPCException, self.handle_rpc_exception) def start_message_queue(self): + if self._thread: + return + # Create a new loop, as it'll be just for the background thread self._loop = asyncio.new_event_loop() # Start the thread - if not self._thread: - self._thread = Thread(target=self._loop.run_forever) - self._thread.start() - else: - raise RuntimeError("Threaded loop is already running") + self._thread = Thread(target=self._loop.run_forever) + self._thread.start() # Finally, submit the coro to the thread self._background_task = asyncio.run_coroutine_threadsafe( From a0d774fdc4e3be40e4ca138782f38f0db37a88fb Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 5 Sep 2022 20:23:00 -0600 Subject: [PATCH 130/437] change default initial candle limit to 1500 --- freqtrade/constants.py | 3 +-- freqtrade/rpc/external_message_consumer.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 03030d930..2279acc13 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -508,9 +508,8 @@ CONF_SCHEMA = { 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False}, 'initial_candle_limit': { 'type': 'integer', - 'minimum': 100, 'maximum': 1500, - 'default': 500 + 'default': 1500 } }, 'required': ['producers'] diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 7f2ac01fb..f0b177647 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -55,7 +55,7 @@ class ExternalMessageConsumer: self.sleep_time = self._emc_config.get('sleep_time', 5) # The amount of candles per dataframe on the initial request - self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 500) + self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 1500) # Setting these explicitly as they probably shouldn't be changed by a user # Unless we somehow integrate this with the strategy to allow creating From 4dec19de9f9ca55565c7972c62eb65afa33d1f48 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Sep 2022 06:52:50 +0200 Subject: [PATCH 131/437] Add comment to explain why we use the non-trimmed DF --- freqtrade/optimize/hyperopt.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 4c8613a7a..3becf857f 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -421,8 +421,9 @@ class Hyperopt: preprocessed = self.backtesting.strategy.advise_all_indicators(data) # Trim startup period from analyzed dataframe to get correct dates for output. - processed = trim_dataframes(preprocessed, self.timerange, self.backtesting.required_startup) - self.min_date, self.max_date = get_timerange(processed) + trimmed = trim_dataframes(preprocessed, self.timerange, self.backtesting.required_startup) + self.min_date, self.max_date = get_timerange(trimmed) + # Real trimming will happen as part of backtesting. return preprocessed def prepare_hyperopt_data(self) -> None: From d526dfb171a25b99059f21f23c40965ef7ab3837 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Sep 2022 07:03:31 +0200 Subject: [PATCH 132/437] Revert some more changes in rpc_manager --- freqtrade/rpc/rpc_manager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/freqtrade/rpc/rpc_manager.py b/freqtrade/rpc/rpc_manager.py index 3ba2f9d4d..fa2178b1a 100644 --- a/freqtrade/rpc/rpc_manager.py +++ b/freqtrade/rpc/rpc_manager.py @@ -20,7 +20,6 @@ class RPCManager: def __init__(self, freqtrade) -> None: """ Initializes all enabled rpc modules """ self.registered_modules: List[RPCHandler] = [] - self._freqtrade = freqtrade self._rpc = RPC(freqtrade) config = freqtrade.config # Enable telegram @@ -53,7 +52,7 @@ class RPCManager: """ Stops all enabled rpc modules """ logger.info('Cleaning up rpc modules ...') while self.registered_modules: - mod = self.registered_modules.pop() # popleft to cleanup API server last? + mod = self.registered_modules.pop() logger.info('Cleaning up rpc.%s ...', mod.name) mod.cleanup() del mod From 38f14349e9a70e582e0e1e2acecbbf18ab921385 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 5 Sep 2022 23:25:25 -0600 Subject: [PATCH 133/437] move bytes decoding to serializer --- freqtrade/rpc/api_server/ws/proxy.py | 6 ------ freqtrade/rpc/api_server/ws/serializer.py | 7 +++---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index ea977a228..e43ce6441 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -27,12 +27,6 @@ class WebSocketProxy: """ Send data on the wrapped websocket """ - - if not isinstance(data, str): - # We use HybridJSONWebSocketSerializer, which when serialized returns - # bytes because of ORJSON, so we explicitly decode into a string - data = str(data, "utf-8") - if hasattr(self._websocket, "send_text"): await self._websocket.send_text(data) else: diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index 8ff617f45..c0c24bb28 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -57,11 +57,10 @@ class RapidJSONWebSocketSerializer(WebSocketSerializer): class HybridJSONWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data): - # ORJSON returns bytes - return orjson.dumps(data, default=_json_default) + def _serialize(self, data) -> str: + return str(orjson.dumps(data, default=_json_default), "utf-8") - def _deserialize(self, data): + def _deserialize(self, data: str): # RapidJSON expects strings return rapidjson.loads(data, object_hook=_json_object_hook) From 8597b52e345abca6111869bb5da71c01ce7d4107 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Sep 2022 16:29:24 +0200 Subject: [PATCH 134/437] Slightly update docs to link to full sample --- docs/strategy-customization.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index a452b8f05..2b6e1fb2f 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -824,6 +824,8 @@ Options: - Merge the dataframe without lookahead bias - Forward-fill (optional) +For a full sample, please refer to the [complete data provider example](#complete-data-provider-sample) below. + All columns of the informative dataframe will be available on the returning dataframe in a renamed fashion: !!! Example "Column renaming" From 4b28d0495f46337700686f1b430827336285511a Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 6 Sep 2022 19:46:58 +0200 Subject: [PATCH 135/437] fix timestamping, move imports, add words to doc --- docs/freqai.md | 2 +- freqtrade/freqai/data_kitchen.py | 26 ++++++++++++-------------- freqtrade/freqai/freqai_interface.py | 15 +++++++-------- tests/freqai/conftest.py | 12 +++++------- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index d504c93d6..a8379106a 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -116,7 +116,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` | `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False | `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 -| `noise_standard_deviation` | If > 0, FreqAI adds noise to the training features. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. Value should be kept relative to the normalized space between -1 and 1). In other words, since data is always normalized between -1 and 1 in FreqAI, the user can expect a `noise_standard_deviation: 0.05` to see 32% of data randomly increased/decreased by more than 2.5%. Good for preventing overfitting.
**Datatype:** int. Default: 0 +| `noise_standard_deviation` | If > 0, FreqAI adds noise to the training features. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. Value should be kept relative to the normalized space between -1 and 1). In other words, since data is always normalized between -1 and 1 in FreqAI, the user can expect a `noise_standard_deviation: 0.05` to see 32% of data randomly increased/decreased by more than 2.5% (i.e. the percent of data falling within the first standard deviation). Good for preventing overfitting.
**Datatype:** int. Default: 0 | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index fce9e8480..8ef2d6aea 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -2,12 +2,14 @@ import copy import logging import shutil from datetime import datetime, timezone +from math import cos, sin from pathlib import Path from typing import Any, Dict, List, Tuple import numpy as np import numpy.typing as npt import pandas as pd +import scipy.stats as stats from pandas import DataFrame from sklearn import linear_model from sklearn.cluster import DBSCAN @@ -401,8 +403,8 @@ class FreqaiDataKitchen: timerange_train.stopts = timerange_train.startts + train_period_days first = False - start = datetime.utcfromtimestamp(timerange_train.startts) - stop = datetime.utcfromtimestamp(timerange_train.stopts) + start = datetime.fromtimestamp(timerange_train.startts, tz=timezone.utc) + stop = datetime.fromtimestamp(timerange_train.stopts, tz=timezone.utc) tr_training_list.append(start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d")) tr_training_list_timerange.append(copy.deepcopy(timerange_train)) @@ -415,8 +417,8 @@ class FreqaiDataKitchen: if timerange_backtest.stopts > config_timerange.stopts: timerange_backtest.stopts = config_timerange.stopts - start = datetime.utcfromtimestamp(timerange_backtest.startts) - stop = datetime.utcfromtimestamp(timerange_backtest.stopts) + start = datetime.fromtimestamp(timerange_backtest.startts, tz=timezone.utc) + stop = datetime.fromtimestamp(timerange_backtest.stopts, tz=timezone.utc) tr_backtesting_list.append(start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d")) tr_backtesting_list_timerange.append(copy.deepcopy(timerange_backtest)) @@ -630,8 +632,6 @@ class FreqaiDataKitchen: is an outlier. """ - from math import cos, sin - if predict: if not self.data['DBSCAN_eps']: return @@ -732,8 +732,6 @@ class FreqaiDataKitchen: into previous timepoints. """ - import scipy.stats as ss - no_prev_pts = self.freqai_config["feature_parameters"]["inlier_metric_window"] if set_ == 'train': @@ -778,8 +776,8 @@ class FreqaiDataKitchen: inliers = pd.DataFrame(index=distances.index) for key in distances.keys(): current_distances = distances[key].dropna() - fit_params = ss.weibull_min.fit(current_distances) - quantiles = ss.weibull_min.cdf(current_distances, *fit_params) + fit_params = stats.weibull_min.fit(current_distances) + quantiles = stats.weibull_min.cdf(current_distances, *fit_params) df_inlier = pd.DataFrame( {key: quantiles}, index=distances.index @@ -794,8 +792,8 @@ class FreqaiDataKitchen: index=compute_df.index ) - inlier_metric = 2 * (inlier_metric - inlier_metric.min()) / \ - (inlier_metric.max() - inlier_metric.min()) - 1 + inlier_metric = (2 * (inlier_metric - inlier_metric.min()) / + (inlier_metric.max() - inlier_metric.min()) - 1) if set_ in ('train', 'test'): inlier_metric = inlier_metric.iloc[no_prev_pts:] @@ -956,8 +954,8 @@ class FreqaiDataKitchen: backtest_timerange.startts = ( backtest_timerange.startts - backtest_period_days * SECONDS_IN_DAY ) - start = datetime.utcfromtimestamp(backtest_timerange.startts) - stop = datetime.utcfromtimestamp(backtest_timerange.stopts) + start = datetime.fromtimestamp(backtest_timerange.startts, tz=timezone.utc) + stop = datetime.fromtimestamp(backtest_timerange.stopts, tz=timezone.utc) full_timerange = start.strftime("%Y%m%d") + "-" + stop.strftime("%Y%m%d") self.full_path = Path( diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index fd0554248..9b3e853ef 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -1,10 +1,9 @@ -# import contextlib import logging import shutil import threading import time from abc import ABC, abstractmethod -from datetime import datetime +from datetime import datetime, timezone from pathlib import Path from threading import Lock from typing import Any, Dict, Tuple @@ -214,12 +213,12 @@ class IFreqaiModel(ABC): dataframe_backtest = dk.slice_dataframe(tr_backtest, dataframe) trained_timestamp = tr_train - tr_train_startts_str = datetime.utcfromtimestamp(tr_train.startts).strftime( - "%Y-%m-%d %H:%M:%S" - ) - tr_train_stopts_str = datetime.utcfromtimestamp(tr_train.stopts).strftime( - "%Y-%m-%d %H:%M:%S" - ) + tr_train_startts_str = datetime.fromtimestamp( + tr_train.startts, + tz=timezone.utc).strftime("%Y-%m-%d %H:%M:%S") + tr_train_stopts_str = datetime.fromtimestamp( + tr_train.stopts, + tz=timezone.utc).strftime("%Y-%m-%d %H:%M:%S") logger.info( f"Training {metadata['pair']}, {self.pair_it}/{self.total_pairs} pairs" f" from {tr_train_startts_str} to {tr_train_stopts_str}, {train_it}/{total_trains} " diff --git a/tests/freqai/conftest.py b/tests/freqai/conftest.py index 6528347e8..ffdc52ebc 100644 --- a/tests/freqai/conftest.py +++ b/tests/freqai/conftest.py @@ -93,12 +93,11 @@ def make_unfiltered_dataframe(mocker, freqai_conf): freqai.live = True freqai.dk = FreqaiDataKitchen(freqai_conf) freqai.dk.pair = "ADA/BTC" - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(data_load_timerange, freqai.dk) freqai.dd.pair_dict = MagicMock() - - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + new_timerange = TimeRange.parse_timerange("20180120-20180130") corr_dataframes, base_dataframes = freqai.dd.get_base_and_corr_dataframes( @@ -125,12 +124,11 @@ def make_data_dictionary(mocker, freqai_conf): freqai.live = True freqai.dk = FreqaiDataKitchen(freqai_conf) freqai.dk.pair = "ADA/BTC" - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(data_load_timerange, freqai.dk) freqai.dd.pair_dict = MagicMock() - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") corr_dataframes, base_dataframes = freqai.dd.get_base_and_corr_dataframes( From f2f811a2feed0a8ff427d638ac773d6aea670eaa Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Sep 2022 19:55:18 +0200 Subject: [PATCH 136/437] Fix telegram bug with open partial exit orders --- freqtrade/rpc/rpc.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 11311f671..05599074c 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -261,11 +261,15 @@ class RPC: profit_str += f" ({fiat_profit:.2f})" fiat_profit_sum = fiat_profit if isnan(fiat_profit_sum) \ else fiat_profit_sum + fiat_profit + open_order = (trade.select_order_by_order_id( + trade.open_order_id) if trade.open_order_id else None) + detail_trade = [ f'{trade.id} {direction_str}', - trade.pair + ('*' if (trade.open_order_id is not None - and trade.close_rate_requested is None) else '') - + ('**' if (trade.close_rate_requested is not None) else ''), + trade.pair + ('*' if (open_order + and open_order.ft_order_side == trade.entry_side) else '') + + ('**' if (open_order and + open_order.ft_order_side == trade.exit_side is not None) else ''), shorten_date(arrow.get(trade.open_date).humanize(only_distance=True)), profit_str ] From e83c9b276dab1659da3ea245792fe858b43ed054 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 6 Sep 2022 19:56:52 +0200 Subject: [PATCH 137/437] fix whitespace --- freqtrade/freqai/data_kitchen.py | 2 +- tests/freqai/conftest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 8ef2d6aea..471634c85 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -9,7 +9,7 @@ from typing import Any, Dict, List, Tuple import numpy as np import numpy.typing as npt import pandas as pd -import scipy.stats as stats +from scipy import stats from pandas import DataFrame from sklearn import linear_model from sklearn.cluster import DBSCAN diff --git a/tests/freqai/conftest.py b/tests/freqai/conftest.py index ffdc52ebc..2bd744455 100644 --- a/tests/freqai/conftest.py +++ b/tests/freqai/conftest.py @@ -97,7 +97,7 @@ def make_unfiltered_dataframe(mocker, freqai_conf): freqai.dd.load_all_pair_histories(data_load_timerange, freqai.dk) freqai.dd.pair_dict = MagicMock() - + new_timerange = TimeRange.parse_timerange("20180120-20180130") corr_dataframes, base_dataframes = freqai.dd.get_base_and_corr_dataframes( From 90ec336c70e02e0ae8156a768bf69b4ac0fa55b5 Mon Sep 17 00:00:00 2001 From: th0rntwig <107926911+th0rntwig@users.noreply.github.com> Date: Tue, 6 Sep 2022 19:58:25 +0200 Subject: [PATCH 138/437] Update+correct descriptions and figure (#7323) --- docs/assets/freqai_weight-factor.jpg | Bin 195825 -> 189828 bytes docs/freqai.md | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/assets/freqai_weight-factor.jpg b/docs/assets/freqai_weight-factor.jpg index 4f8b23e1849588058fa8a55d5adf67466ca90c86..c7580787de79862f2af2539eb904682050614a53 100644 GIT binary patch literal 189828 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

atyK_sD60U=mK;s}+C5jk3N@uK`3!!+T-9Td z!~O42!3g8oyR;L%l-TO3QaE-5(X6K@O4_n9G#ZdEuq1*rIE|!baR{V9>K4D-*vp_@ zwJlW5@I}SxWa(Nw!~So!M>qQn-|+;9Iy>{pu>{o!|0xNq(@6J_k;53T-B8n~nRyMZEZlPzaiXLjJBZ-gxa92+=lTI}nR9yid*#Jd27ft^`6$^4E>~ zy+3rOYvG)!m?i7UhWAm;mNE|3w_|~L5p|*QEriMj5+x2`iYeJ0Rynte-?Fhm>Kri_ zl2&R0qTk8d7RQV>`kKjFtCXL|6)oEBg2}SBOmsJ}-J!@G*+A3M}H5(DLwPom4*&*fLgT8K|z z;2a!EuP+{q((>^b77L!L57abj`ARoYn>Jskrn97G$#}hT-2>4Ez4?;22GM-O-v7Jz z!1v)AzZgj~-`+rSohv^ObF4>0n->cfB68~IjnN?mOAg}-hVM(By+C*?stY-ThnJ6d zM0gTBP_=i$jJa;UdyE>Ui^G&ES#iQ)ca)9jq1#Kc(gcpQ)_7Czrg<-JPp!JqsIbHD z$A8NBapPr5r!>ry*T2PW=(e$vz|XD^pGylAVOi4JrXJ23Ds#(_GYcmRpCX5`WX_)kGs%^bGgCI!mSUgaQaHmKMA?Gr;^&M#9Y5N5R;iZ5sQ2Y z#RCk>P^IlQM8kB)L#3N`I9#%;KTEi@%}ydF+TLx;>K!O4Y`82|u($TswR*%-sm~+` zQyti^COHn`hk6#eX<1H{%c-p_dM&DT>Q%XEZ^BHi}%0#Nrh4 z#Pty{SB4HYf5132So%ZKdP!I(>$!RwZKW-Bs*ir6%AI_K%mG!W!HRAmIhwU#?cJsd zpD2m2))kH9mltskMW+Un?>vZM1=5y}UV43}Kz;9a%%EpjuJ4=}(W@mRlO^}jnA&*3 zNSYv93hTT3I3Us6^7S9v))k@tq+22TW%6m#)}B~h1cGbDR)0{;!_%>^Rxzc|*tvEN zG)FPhHuaaG#G)IJ?#5gIp=W)GmZIq#Hd=zruv&d^-7DRpggBuw8uSrQv`k-6P1X+R z>in;%8q_eUG{J6hl`nm-spqctGYU>v%BK3+N>>ky@?D?=F|-JN?jL!mpFrBKPma0m zN&?|Qb#jN|Ql$cic9yUo#BWVxX90aoXF;tsi?Y%o4zX931-Dqglz0!B+0gVbbjBYV zrlv?tojD_RH;yXr5TJUAPWOWGD6^VF2*p{^=~pfcE~We}!;-~_Q<<~D`{8gIv$*O5 zlraxE>J_{MHP*OEYrQ6Rm2*;FCiCKi`-Y8;U@aaXG{xjoBv|b6z;oCPc@=^w_|+2i zFh!I@9wjGMT;itf3Wc=%c*;`#2`GGXt=5k%d}{*Nk% zY;Hb~(>BNeKd>MBs{tomQe$w}j7;zs=gR@Tx{odI2}NcCLWUne0-TpbMlDmL@pcs@ z!JpCOE;S0a4&F}a2K3q7O`weP z+JCW+MJmb?{@xC%%Im1~@tP;~jUalK{r*Q)S}S#mmG>#1!KS3e{IPsDQ3LPbj14{o z*R2UEom<#+x)oGX)vkSN?`C%R*t}2h-o3>!Og#2ARFC%IHn`77wczGX(RpQ3?5v;L zZ8=m}xcq&mCr0Ch@$#eYK)?AXj+sx$;)A8I5VTb1!rq@!s30flo~qfRm86-8#aOGW z#%9rE2mOJ$IK1wST4XuZ!j1F_B>k`S%f^i=qgCRNFfi||%bZ!KDsx3%kyF@0l^2KU4o4s1c zfunMzq9IxL6d+_-fjCne#ID-Z!mHf-?KfZ=Z3O#{1`xkr91v{|@Pd<|#HeJZFHa~( z;^I;efiG(NQIVDMEU|0 zSOhx500Vz{$v4$&CBSP6WwKt29uQaQ*soPkO&wIW+e%1lRnJb1>EZ%t8x3ZrKknb!KT3FNAWMUissmiqTkn^&T@>9ObYw-#aI1iJ6t!If0iiC z?s)O+=6D?wCE8_Mb$`P#wyogonAmX=XK~Ux0!mGk6Z zO(9~!ylMNCGlGE5dKuW%-VvM?TE=OIPZ6R=AE+JMdQ|f^L6X?NsiKVUU_%{YUESuA z%=w7wTkE858fO8+#9tF{h!1KdfZFL^3C{5Jcc6`hsD~95NSu1Kwtyk(?H*cOgnd%z$Wa;XjyQt`>p4qR`}wQYVtCBlrwVpA zE!|(T-4AU(*v>!_w;)=KuS-xjerQdI-!1AGVbEzD`$3L@--jg^zO8Z}_zaYDhQ~&F zX^xtFL70uSZ0R=5E)B|ev8Q3$uo}h8=K!B6BGr9R0GXgD#D-bm-zd%rBCQw{F7<<< z(?CV^$ovfO@5o28#dd`}ML7LBd52`l7pk}KvdJm@$8WwSO|5V=>y4$u+p;gy z=kmp^x;(ommg=^k_TYFD9w~7iiEbU+0UU{|z^CUo$_{;h49qYW0lj&H894Ux7km2!R)tAAMQ#3Nxio%-yQmVJs_lU7o8a3pv^z`RIr3EbPtYgPOL{2$fG-pO@VRwG}Mjnl__vZyg7 z&3*K7zh-DlM#PxoE}$I1vugPor)yW6Cu{pqR+3=R*-zn7XL?c5jrP=PWAE@d+R*06 z^B;@`dI}o)7*e8u3YTfd?#n!RX?`CCF&k4jTPYR_Z}YcSiA|fssR_h3%lm`v0OPjB zOZ^1^{9$T$_fv=>(&})Qa$4)WAWWjH(v^NTaGIypsZJ}Gi~qetOc zhQHWl_1KBUGA;&Sv?ZsFMX$HHURBhaS0T5R}kS1_KN#GT#`rbluPdQdv%k)Im zr#_)iv4&>>!hf+l7d(9Jnfjm7N5GsuV7#_1`}KUhO;Al z8rTgT#UcA23cTjs+muKwFp@fk7&G!N;1FP71tA9MzP-uM@J{RVwlyfR9pWm123LMs z6Qh5Mbw(w=P)g3M2->}~X(e+-Yn9*edo9cc@=DGhFHEg%N*Gn_?}9}DmzqI$IL7h& zaBTrU!e*wSfu{V2PS(PCF!1|a z%u+64RknqpdyV!Zx)TnKNi^;8o0y6jp$YwzvqM?>e_Cz|IWvp=2{&aDRcNhG^w?rJ>l>|=I5GCPnW7s@MhlU5C|q-QFRDIFAdy+H~=oUO;lsXrC-7#l>; zUY?wH=sf2=_yA8prV>}&wGmeXDWP<>?kFlQWixla`r~JJmY7G=yQ4Tp?7y?i^Vfr{ zgN)Nh-ZT7n$ywItyQPstU)OLdk;Dgo`@70(iytYT4=x&oHkt)BOes}ug2f` zX%fI;ttlYbinu<1ynD&MTnaage>%JO_8JY&*UGBJilW%Bb`REV9c8G^vS>YBNd=_% z?La8D)O1(%v|^?ex4O8J*H!QfbQ=@)gu@7s4oP;v+tIsbRTJLOnF8{m${|?eKDN*; zN&(ad)-FUD1h4Ic?*#!0RHLG!EbVP(an`-k`l-?s(Y>mzhrewCp? z^=6j)jFo3UU|U|zW)@-0oEsuMY~8W`*;xndJbXE%bSKG5U;q;p&xNEL=@$MR3ci;n z4~g4?%@ys6J;tE2T+E}A*D|D`gS+{EQ2M&Nt+>nPx0f&SBO}Y@&f0sxQg!<2(a-WV zzvSbJP<~QR3jS04BZh6PUAh)i(3t$|+W7&jG(b6Dd&`#+Mg0_#S^pGBhEm>oBS2L0 zC?D81>{>$Q1)Q!$OyQGUhlriqVrcy3KAS-Xog+M?j1wSzwBmGkqe$&6Ne8j}kz?_d zaZRlz(yLY)R}fWsgY$*OU~8bMxrMKes;nqq^w$t%+R4yGZd;4#`b0TmzQPGU z_sXglhjfSUA#B=bZq-#2C_r!dpzD>-T~^%@F=1gn`ha7vQNL%ruPPTM8ToL?2-cD$ zvix3^(|GXya1aE3ete|Sa??*IDTg!#3p&@P@Q<*h_lZb=T4qyvO+V!XC=!jD3>&<4 zU7j|_Z%!CtcRmN`On(1n@DIR1e!x-}s7e6?ehL)>etIf^E4u;iDPZ-Tq<=oM-m8db zHOV1_nT`B!2*?Hdg|yPbYn7gBT8vrT+KK*3@G{&@=jv<@v$CIb0J?5+ZVFjI=EH7x zKWS)kul(4-<=HOtLglQu}Uw1!geRj{}Pc8RX zTuz?sSmO_02X`H2gEyPr_m08GdP3t69`yCR{DMN~UikQb%=7o{z$$x&n zdAhpBTp~srPNMR6#P5(&YVmB-Wz{4)P9S}GCsw@0TxHuFB|4F&%`SvT=VWVHfJl}lVMH+PQZ@ynR~X1sf2 zEh<|OYgd}Cn-9D!Wc6A5{6y$rjfOqu_tFRTXd@L!+C_-y2FQ*XQx#EBFnDPvljBa%`{2c>qggdY1`vHO&FjhsU z{FP;xEj6^F6J7r6P6@46d-vfJrtOFFE2wrY5}Xo_eiT1rtuK3t@9j%DW|ufBm-pzD z1X93_*+NWc$ZBb%O(AG0>G22vwe8E&av0f|9@1Q z!(m#vhg|18@iUD-#>IuG?H0$59Is7=ZrDGVFjb^2If^n*4%4QFQEK7*_Wil;x_IBW zb`sRr9RXr?wD$k8_m)v@bzR$NS_-tq+TspH3dOy6fg;5z5Fog_7q}-b7qClZJdP66OX=}Mavg&;x%N?fC5@I0p`*aASN_y%%&d6v&7(hj4XVs1mzpbfh zga=()gX@wmtfL+kXc;abbgeq4uB+(m>$jPszooVV1Vrv|qdrYJ+g#hyATb`-yFE30VvQMm zU8Kj9tGS%VK&QrMaq0{=Lx*(XNli8IRek&`)T_%90wjsHHuw+*fXT_^2ZY4LsF&S4 z^UuF@x${l#%q6{#v{>7o!JKDX-5y%%N>PnfDNi|6ubmBGz!C!}BDPe7&ENNATk@k~ zg(u|{F8~pC)4>ZUctW8msWJqSlI}gd24qXa{e%9=L1<L@4quszV)9I$n6l??Zp~DbR7em`ub`!`OobceNJg!3!6nfKk0Ajzx``7q z(2tm*%7(!Fz>p(Dy>k9+b6xIC^dYc(lTdDcmrj_J(dLp;M7%(go4}3Id|RbAkLngj z<+UM`a@h>`dw2bH?)Edre@~1*tsUh=li6e7Fd2N{I?$`HRhX?9!1B!0-vFIjJkz6w z_aWZ}OCpM>2Eo1V@?$Uq+dROlUx93aDwA@7?3RIN5CBQ4%Yu~&75}{n4Ua=O$7Q`b zU4z!6>a83{!_!Jo2|YVcr15#1-oiGlFlL8J3yb4*O2A=HmzzRH&204+cNV4%{=C<) z71zqik9Ij{dY&>>Q-?eeV8xm6rwoQ7wZ`iXPar-Gntg^K zVhVY4Y^wa}vp|T(T_NN#-~s|_$XTJsnyKJEPwfl5(MhJ#b7*=6O60_@PmEm^=bdIX zGjsT^Z4hjqpYvO2x#*uF!vE@)f^HUL)0u@|`V}v=_s0`Oc29 z*)0|l(c0?*{y}yBcd4+qW{_GU1+#qy!T`XN3jFMWk1eBj(=T7Z$<1JrcKCjw$9_&V zT#tnG9n3kd;KQi_)Gt{hVgw&s>g{9M5$+UEHg1*RNk*d@J`$t?&+cnF@thi=;=DV+ z(`8PRxL=K&g+#A0rpw%i>7$ItW*RYz8x~$lDi-jM#tZ#N%;@L-CZv;Cz7sIf5&WlG zS{SGn?E#NYInxZAn%OoP0#JA4Lgzr8l5vfT*O?&!5nm%JA?rVWb*}x*FaTrgv7LpR zeL}03)b;&if_Eyxz!S4A3*;K0=SpdlkHOq134+n;)}_KkolU(drHDX|n7?it&Q;$d zi8o93jgBOwgXSJUv~18UCJiS%8B_@&7uq&Cf^dIRzpqsW05?_Yh7V7lYtu|8;fW_n zUO_~RNN_^4yEf1Hox-EP^j|$tJjr6d?W+$gi-5Ti!v<@GOYT#lgao@<#u}!{wcEPy z^7LN`IgIMrnrt-GE3>8L88RL6;C3kYzF#x{4nCbGR!u_S!m*oerLQs%`EfJ5epT36 z+atk=C(-wiHC}m^?VzonGMj2n6LRR0+j|xle~y2(gg6Fab~*`H1+$E_97xu_Z@v9f!+~o|Luk6>UQ<@K0))X+hWHQHpoU_SYTy2tnC<++bq-8I zki~_}g@o@7hN-14AkJHGoiaJC$eseo%Edf@Y&6N8QQb2z_1-u&WrH1&0Jx2rj#y81 zRrxh8+@?&alnE$=_uuIK8d7pAFPXaoVDGyUnF24UXHfY#3CRSn)a@DvyWAhw)P>} zIZi<>_MNdd)uK^22B^zFFgw)Df+{Z;WFBQ1EJnTYr8f-Pf-|`FpK484YZgoZ2BRfT zl`&WGLu{^g?x(G0x=p4WfzxHw)@<_q!5&;bYOtjX8M|GL6M% zU+%eN4`GdzXAlo3_4hZoLzB*m-vhHnOCMx5%f-m0y@ll&q0f}7fcySbSb!7z0c?l* zjJhD2=2s<^qD{9BL5x&A>~&Pjg0SRANM zl7{+@glpiuT`V9+b}x3WK=7pI;ECt4wv~AHyejI85vtG8j^Lxz3J*7Q=G0iJj{6e0 zr#GcKlkDIvvyG^w=yToo5r~-bB#bvTT>q6C%bu=`TwxjV47iqqE9qYJIZeJLu$%uXGbl@ zOk9DSKo|xY(&x6O;&!GjD~ks4Pk*M)PLiShd`}=prq0tPKuTR@G#(%YsO|HWG$b(PauMKKH#8~D{Ph>?mP`tnKU5ce|C zB&NahVs;}iKj*g1k_#k+ulPAd9>JSlk&6HDnG3LPr|Iz}V3R~&<70n3p4#v?3@-^Q zV??Nt^KYD%CpT>wz$gtpP|@T~c;NknZ3ugVmo)1_{bvNzrWa!&Y2 zgfkzUYXi?q-v_#56z`#Xc2|0)hjmY#bxr*6?6j60PCSQFm?Qp^C2BPv8tPa5S&87+ zLtCFn$^c*;rEC$QxZ5n!_f@rp>VN^@+MBpER@OQ_boY%VW<13C0raD^wA3-^BNM?t zaYVBUS7PI+%E(55X}>;SE*vc+?2GsX9J=8owxa_Lq^+*70dg%TKu$5O)5Kh?q?k7a zuN*S&a#GJxjS5{4TUJIiYbk=%QT<>$8Xb?B1@ZrK-%Kg6NF|zRA5J$FDJ+I_a2pg-9 zEh^;CJ3|lY-*$lIrh(4h-!B{M?c_tIssSd8T1EIC|>+vz=kFzhE|k*}Q)_q@tAKgxdflfnDC6dj%ST7b&rN#62-l8I)r~Lr_Jl;Mua)XrZwHk0n8! z6}1DR$~8+dl|rv7$4rZb`UIqbCTH780(-|HH6IYwj{UUnej5NS0|K{pFp>W#gRe{Y z*Whytdsau~$;!^$k2L`9Q75k9KRNF-|7A9~I`;rkX;|^owLj6ioXl_i6b>MqVc`wn zIJ56ox^$&c_ZDLY;sKuf{iG7( zOq)9093snpwHsPs2*yBqG^HMujOqSk6wlmfx6+$)2}zO#GS|I6jK{WyIoZL7G-TP2=Sl zscE}p6y0LyZnDTgHsDcqp$V1#d!Tc_Xrl}q)z_7@Y}^BXX9Vnd;O9@~DZjd3sZ3wy zgw*~pPPtKg9ldU=86Qd++~ht@92=%%a3!ZzeXTZ#f7La?tPF&=fl$#R2?jkd*Tc6< z0i7i4AoEvC4lQMBBRGQgjG3=#$qd}L)#ITyI^($#(1mhthl(V(59lOi*i~%_WyEJM zv>(}wyYAz06_K^g%Ia4MgSv=HEiFbyk zvn7WPCbN+Et<-I1>p~`5fvM_V&H&p3To6#Rj5Ph6_oPl~xl@M8Bm!8(05cKDZMTxn zTfB>45uBnTrJ^oP0gBcYp7%~{rCsvAaDW@Z$DB*(&1dm7C4^ozO9D8n+8hijZC&Mo zo~E7IjeCtxp7EDG0^%7N`_$d-CVE$@8WUXxDH`#)yiL{xFDijNG{#3){bxj~F=mxn zgeGIqjL!$x&HwV*FVVD)@Y1xbPoXqJZpA(Hn?KK4V%7`zp``>#3R}!Vb)^X0YGcC1 zNsB*78~gSU&i&Ihn0|Ou`0Coq>lVeXYcLiILN)euOc=(@?6)!pW|w@W<>lC&SlivK zGgk4<-5yX|&OH7$2Q=nGfb_4=n?R_Mr*{r!9w2P-XUE^OvumQC#avy?e3wCj7PIT9 zYqirprm{KCkmXSnf+`FxCyd>nDJ?3CJ;RV5`+Z?egI3Av{sGnQ$aOA|16EQ2NAMQ{ zC>xS~xAcvZ`hgihv7yT9D(;uP?^!kUB93>ZYPQJvu}5Qa;>8)~aIOcnB#tozKAP=I z5$~SH-i&K@->-w0|Y{smo5tQ-Muzr5t@Bea)4$g+$2~37q@CUiM7!tS^+Wd zB*3SDn1f{v0YIF%aCM2%zmVDwDR}G^?%+5vuzy&(8CX&hAe#G;dD~A6+l}bsK0~&G zv)7(yxeIKi!sus!a8^lBNS8$90Yn*YZ~e8|OiLU+W1%A7%FyBugAGQ=Y;mrOK1BBM z3sB&CsOSggQf=FhvWlO19`%PXUzfgYvohr3s!+!~VOUFx$)Z(b1u(j7^Im6QI=7aM zEA>;(KVoQMgOADnH>&`x4`$)5D4>a}M}qvDs0WNwv_du53S+Ve)Esm^`&jkOE#x&B z@U2-iDe9^NWnR(^=;+~1V!spQIH-_vl_J8U)%uHj{6@@rRl57PH0G|zby)-v*?`|& z33Gh18oCu#2^7$#P$}1&l5li?S=P`oRO9Vho$xn&EVn#5EKHkLpS=AI!&B^XEsW#? zp@FWu{yl<8q|l^YyDj6nFa!f!5A1g=){2Z{Mrxs{=U4rrbcsSI}d29^-<;hcsy;2+gN!Ig%bhJfkfy9egJ8BVS(rq`)WwpvbyZ5Vl5{HY4P!6&%@ z6vaT0+f3q&d zw+MvToiWCOKnDh}Ekk~-%Jhq*kSi{d@pI%8cM+^LW}ybQiB4;kF?kPgILGI?Rg1^^ z8m-sue~PIhhnzwVT>I{#LRA+sqK)~fUEAy@Uyn+74?{5fRHLW(YdSlXx?SDm@#6IG zFxpr4(_PmPiw10CHPW;7YyrlkbiGIEZk|Te{kSJn4chaHOE75IDYUzNIUU@!+^FPF zH7=BOUHx6}RR+^U5-)=319D11a3xQnm&o{p0Gt1r=4Sp(m6oZ55P-I;*(G8Gd71uu zd9)89BqsbNee%cB3ZX`*%MX~j8Sl*1MSv-c;;s7Kn$$li7^2MSt~RFbfggX!$xNFp zc^=TYK87;suZeH*$0B)|OOwfS(bqo0vnkK4eV5_6#uczKR<~~VO_k?XoHG!6-T8W^ z18{>u^XsKv%rk2h1T36H0FLBpj9dUj3M-5C0S8)QmReB6Gl7=( z&RCC7Zi^*$x~?U#b~_Jn)kX?zFAQK*mL8~n#0lwuQ3Bh|X&Obvb%=gZOuo6&EEDaB zvFVY}Ulpon4ltTsX{(&2dxWeN&fd*Qcd>Fh*+pVu8@#pXIXr#RiDv}OVA8xlsx;T? ztw^)xo4n1@6g1zmO!LF=i|0Oz0!ZJ7hei&*O@+CUg#~&wbmgV@ohhU(8)1f^`_Xox zw4ITxAC8@93@MiNf!jsdB1nsX(%>#0MRLf$R7M7JXi%vkgD`uSb9wGl54=#F`&MW~ zh~Zx?)hG8G0aR3I+fQ-3Hi$j&iPh-$7>ExMA=ezAA*?VK9QRshsLm)b={cq<3(+J_ z(|k2ZNrq0DX@d|f$yN;V^(!;AJKYVH23O=;xThvDu+rxcK{Q1&5L7OdP+hprd;-Sw z0=?M`EH1`>y{G%GcR9&mbDSmC`0XJV09G6$t7;CLCe1VZGb6em>qlUf0V&OOrM^m+K+Vxc6SoThPf#rG@FGrKPVf)PPm zf#JV{JTBk$1O{D1e*+e_lt2q}?HwW0AHu!bFG;Wp*#+>Z&3R3QDb2f>`M(s!=r$6z z@;}sI7ZtZMl576!M5hz;1oTgB>jFA5EmVQNt|>IUG-_A2=kP$6TftmcBJ4aM2MtvZ z$VIx=Vo7(oc3&`B5dLK#{JdweHV<^Kg_|k%opp}Xr8|s-(4Lp_&XOnB4&)zC)Xo)= zRa!3I^=}e+fWy#9ef1bu4BI+pNK zbed0fxF@fu&Tzo7W~OkRgQ)tJTPWIZ69_p~tOPLtEOneo@lBzIOxmqBjnS(r$_w!f zC0a;fx1uv$jbF4yw-fUE$ZsF^H^wi68EEFDtI|=#HzSJ@Ci)03-1^vzHi`I{-O`{X zgEkJCmtzgO(+-bb>3{XpYu#0EL=M{{iwoECh9g$aS(pHAVAppjy7pIRBP)8?;&-g% zT(bi$P%BZHGpJ>v80%IdUt@Y+%6@Sk_g$!}!Z-bA1>m$~L8g3X1W=eO%~d$v!CaNs z)5AJ@>Myhb7LYNi2axDml}u_y&THrL^bofD`UGNa)8x_^x*;_}#%Slb?|A2RX5-!4 zXwMS?SEjn{I1b&^9O5SN%2`KU-U#uu0a@@<1mHKZQ%9edq9@WfZgi3>?$fyPWyyR~=-DkNL5Ck-$UN2YOa4&MMSr8u7`HC5L_wGXpRqhWTJuu1)UvpNl zmXnq>Ka(1TQA|s6o8J|!+|u4=RNq2YtfQC_9iQeI``2{E*P=Z)#Ah;-95q5^4q?1_ zu?v$Kt`h?4-!znX%#hbgPrI$#P~hV?x=XX5Ks&{rSk zXprtgG=Mn=T`Ybl`Rb#I9ux0Cf{?n%;0Wk#KVi;oKT#l~MRIdA>0btko13Sjd1-gP z_HKMWQV>GHrMRq^`RxbL+*N*8bNoyKVVsY6*9Lxir{&I;OP+zw{a9tbWdk^z;pu2V z&PXFTQgoEKNef*IHP4U(^@8brV$elEo(9oaxoKhP3sRQkF&Ldi9zt}DT~Ofyxx+|z z5SVSfqaXQwoKFAIN4tyu=el%#)eVCT^6tT&z$b9`Z!t56(3TLRp`JsDP``Ic0M1jf z0r?VMnw7rUq^W!ttc*D%--neYdfog1)X4mfT9VlP)BP?{&FDEx+{V}gi01($eR?*@ z-Z0c=J{Ej?)-l>OEZPP{4|fQD;+Chg-Sx{?HV1UHaVaF?_nasJO|=+x=7^nH5;i_l z-*Rcpdrt3qmirU#&+glr)GNOMGNTdt_bdOK zDkA-&g*52bW-&U%e*+GC({KY0e>QZ=L=wmQ0MZVXq><(aM<`Ii&BiL6p;QHE_`jDr z!!#j$qRL%wtV$E{%Yzb0Xw?G+f`lsGqD$1SXl%)aH%XK?kS?uM3>#K z)tz9PBp_%NRgO5;QWdbj%Gp^kR*~Iz z1)B~89iXYsktA@YkV%lQ!!k(GC38wqH{SPJlFu6uFC~T9oj|+qy8m%(Q7ovD4`_D@ zxM~Z9lh+rwWOys9VDqLHa52fx3eCG4os~{bV^=a%Aj7c-amALI}yez#OoL zOU)iYn6=l^?U(lLV`^`;)s4E~`f|j=(*~`r!;*W=3DV0SFPIp!Wch_pVJE2oG`AmS#pYpdk{h)7k9issknYIN~w*kTkb#G3|OltLz98B==%?#vEKwq^ADiB z?-K+2e)1tz44&Q~7ytslY z%5ybm8eP&`8#RUv@xEg>+^FG;Ff^fs^c*^j^vLhSpzLOmaJ`xA$D@H3nC$?E_{SkG z-Qtf!rxXI9cif@g7q0*FEZVuTl*m@I6v7$h4#5k1{i_mK{jVe7p{+o4jVvxt`}zIG z>EE=?I7Ea`GH#R@|KcV~j8PKJzLw7Cr8^slavKu2Bhb0@N=GfJB~Y!8I=*DcUQ3%w zxE2C6BpT+_xZnIoZTR1l|F{galsXMik*`sQ6r~;#RJ^Y`e4F;mOXkuWe0jCo9Ogn! zqVXm_&;L5igHgCRxbxTNXtA#d^K?>*{5)K4fq7eQH1zn%C^A3$g7 z%Cms^J$mcwT6XK}=JS)u!CSG}LAMWoSnf*n`qO=8bDYu++O{fLW^>Hr4la52wYcQp zX74P|Ghj3XAmY%v3w5|8OMPJO(>Ic(u5dE=nu@nE!ihY|bKo9+YOavyg}gOZ$C;sU zP)AMv`Jzl*|LkU(qQlGk>;crRC)5HkfB#Vdn(Q>`-|_(cbf(DLC;oZ#li~rS6Bj7v zKY0UX=M>5dlnOd2lMX#8lZ~9H<89761vLjY|4D~Z zTH&a`CJO8NwCr=}ox2)!=Y11HG?2yAiR)$aDVJVPY?;n;kk#ECtD|K( z+t!M~|3`BA1`r1}QjeR@k^jAse%zBWEx*u8T-H6P<8<$Ca&XxZ-2F>lcu}62F#zn@ z-VW-DCm^`I$ZQ8D5vt@#p_@A`9QXqh_s%Ri6W-2H^LMxV7f`c2K=}*q#-w`~-A(c0 z2*V#h_1%{i_~$JTpwo)`H@UaV!0gMpWswpT{%40*T6o%`{n9(t-N&g%@!odP0Y^CH zLMs4k^KP0_?5gGe2TzV0^~Db6l{8w1HwgUGmR^9AOPk7e@{1I;rE{T!l?wJ3zsL56 zKN(fr*!g(s)AqXT*Wlvu+bd2g;z@Nmrr{Gs49hY!G^AuqZ$i=1{)?Ir&;-zbVJ?8P zrSUIQ3$Q7w{$u<8D(uBbd_lHycY<6~8`oofXnnyfX6s>F=RoW+@74cverf(dD{$$2 z*h-+oluLv5*JZ=fJv-r3 z8?)5i>8)tp0qX~l1H_48R6wx4l>F3c(atGFsCnDOHG+GWMkqe6s;M)-n~$A%SCy9; zGOZ*rz13k)PBejBGduhMl0Zup`?y8-MO<-~malA05a`7vMrEeKQ0>p3YqcY5x#-nu z;CyEc@Xd7rd~HMD<>BRa11yG&duXE*?y=@_Wpj|m_fp-^s8eigZ%W9GR(G? z`i~wes=EK;tzc3hTP}o)G2vE5c1*wGh0Uq7_gOP!(1r@@n(>@lB7vie7^j_Tggg6r zc%WK+zXz@s&T*o{cjl*ND3x#t3DH9R@Op)TH9YD2w>i|^*kwK5JA+>)xHTAIzGp$B zM)e$;90D#^Op@=6i?Kzw1EyMf9r_60D-b1%Zn_nGDT9_2$0bm+b#;;B8r!a3Q8Q!e zf2Bqg(Va{w#&gK-W+%;XcU+^#$#ueOwt_+}JaM^RDUV@?_ghnnOLZY(6FdI~%%ULx zqd+MpJ!4ef$Kkn1O~$rAQw{iYFXvGjDpmX*Kx%s_8aQ7>(L&K3!fB(*1ESs*Sjk&k zEBeW<(6*UPMnZaij@P{7t|=6uwIe~!0So$^usv3EL1U*Y+XkE|0_+A_?-F8Fu-OKN zYNn(;l_&CzI$CI}S|I`{a^IlUNLa&N)39q?dAW@DBpJ8@-%V0{U8jfV!f{^=O-eC& z1PZ~qNL1{VMfXXMoaz3O8Vw*xFF6?tp#Sh1J#$$&hPJ8sBW_k_haqtfpb7sl{TZ-W z-@&oP+ABGm1zg#RaiQvWs>J8wrFkL=M2kCZS;;@ucT0FxKa-SizYZB37wsXe^c%jy zzs#W<%;V&+buB&7G$&slty4l~yy-KSz^*VDhYLJ_Zcp;y`vj&8Pw>uaCg%G5PvV0r zhY28(d`6Q#9k`sQzfy^2um}!$moGIGE}g4tWV3MCUaTftX`2xE+<1rlqES-ojd8G1 zs8C=e5Ry!{^zzQT#W z@~3niWleNujjKaG>n|mhx~8in7oAp$DUXdD8Kd7>nyV_#pA=Ii?E!%F!{pm?Di+f$ zR8;4}Bpqh8wmj^sNjWY@=0O@(qs)E0qVM~T+cUqXWF`l`Prf?N={G_4j7O>L*1XL* ztE-BaEm&5mzTM|{im3P%C-@9z*JBlJE}r<_;)TdpMeV9~{WdOtMLeHgT!bpTo!Z#Y zM+iA9ayqhf37+n(mdiA4XpHGnXpmdhn{8HaNx< zRuED}UF*HKr1v>LzPHi^$jzj|V^wu)*@VX2th;;spd^`O$!KsDhnQ`a zFx@(1NmG@-)Ihh4s`ouVSMj^aP`G?RpiSeXX?T+hGD6UQtZNr?%MBV8lk$MzF$`LeQwA876iw9 z+P8}O<*U)Po-DIy?-#}#9`QXipPkcc)?irKXwEfn)76Bk+F(Fgxl;jkwrif~J7gqG(TJDN-GX8HbmORbtaqVAqaawIvgZW1GguTa{H zj0w_(q^?*xQgmq;w7)FMKY(stKXibYUOfRleS-A#84A)9;12`>JpsL@WD`-+w}0gu zl|{i?**1FgarIbH&+gm99OyY9@u_}P*)}D*FHPa*tFqxb$fX6la7Ekg$KMGh0pGRsxV=zcb z{uyFf_97cz?*D_~b?&$QMk|--i?ux=vi5uIN;2NBNZu#$pF?`ZNPk;?BX|o>!=rm| zzOohzhI6>{yXx6CJ$a_~sWY+diEQ9T$$UeBzjopuk)k^42I4jXZ+Sj;H2$09GHT!1Rr&&3@9bEjQ(DZMl2U?CnQerXz ze)h)7j4G3NiNBd!vRBBf-GI(cQDTh=)E~d$vh)GkPP}pYBI)`58^navYxYjeA{kQi zbC?C5Z3R%>_Ub47?#E=E&z5T6@)>T7N8X;qq)keS!66Y93T!*mkq30o-!!#+M-&

Nb*4Dxdo5wjb~QC-z(H!#L{zHGHPX?mq&o_-D6SFof$Zl*o!flPSTO$xt&A5O-6lzm`7PEN)aW=Ir2L@|}FgMogXI6x>% z{=Uu2z>nOh!To6FGq*|Dd@ksb>)?g{QfOjL_ej;9YG^J^d2o$#D@#=fw^c}BsF zTp7W*4jPNZULko{Wg`Xh@h47ExG@yJTike4Cd|*$sfVwffU9-hxYV3aRQS0?>Ljbe z?A_M>J>ncFw73y&ylYwVUOr^1FFR=@s!@@`5o^l9xFXFm58Q96+~wG*`7qb3pHq$F z88&dXI<^>Q?u~Zov>ZTAh@-0HpIMieTHmmcuZUn+Yi}_kx zg||S9AYwduKn&OR#1szT!@b(7fR0S0h=C7!h+B=svLNYUoyb5-7&94*Yyz|cg^T6!W zg|zRg1p`)FAidfL-*MILG13~pDXsmDAGj##R=QlGsq5nT6FMe2bgo6GTJKBbC!XWf zev|g|U)%l@K768l8w;S!g?kkq_g;#P&=>B;4s?L{SkdKvNPbZmXpd7U zY*}yG6W(Z;5du7_*CA1tQw6bs&3NSJ?}=xMJVe;>T0JBZIpc+4dW~kgq!-CWM|$2T znf~rs!gzG^(|_ii=)C+?W59<7#`)j9!}fjO-rudTg<9El=Z;c_ZjZk{ffC!i=VoQ_ zKz8rAhc`@m3}#r5v1~It1oP^{$Ui-*I0WfTMSZO7lTyEv1m*s%YYYvd;+5||3tw|G zcQrup4uCw6tXwH;YiZj5KmI5%579&0b$r0zgJWG{Qcc=yFTy@Br%-c`ZqiscGtTlIY= z8icRy36Zf9mH_t2z{@}=<~MJuA&!CQoGPCR8rS{+f{$vlt#N;2J{3-{j2;Bc(+wSE z98mw(-z8(?!zQDzd5cB;R?b=Eh>M-eo#QqR0=HCo02xBo|B^NZE5@TF-aqGk{>mCG zug1Ds$T$!vsoIKP&wLh`oj7-hVSLiA%+-)xW=VOX^g=mCB9@;wltsg*Gwu- zGhX#oW|{Wx!l+=>SkIrPC_QY~U}MCjTQ43xjbYe<}W)V;{Ht?8^kpz>&L# z*6EXz%%5fT?9@=JoeK2?)=xS=>Dgah&YzpU#aB#8teE)m4NhzyydEj?mQP9MbE_ti z-JdzbZxhp#zV&9Qv?uE0}`W$HE3mnjjlQFAsK@Qew&W^}WZNHv)LHAwzv#|Yi!-!-L< zoM6c}5i}&O&9udPU*r7!bL_%RUz4CA>FGAYXMWAk&`~J7mb3P25Tl#3^>~R$c&&2O zkh|z|S-e3a{UO$#?(ric@wtpJ=)yfDZt^~!F!1*ayyg@wWuUjS`dS=p@%@8#Nv=ZA z_#X)6TTkvJR<)j@FL}~&YvgEOLXib_)W1t*m4yw__ES4`i%qE?ZHVhgjio64TIFxs zB%E!vI!!cSj{B+k_w0!4lDlQAUbVV+=35|ZoQo;LpisqK=E~rc*^!|}9lmqc-(8UP zlN749{vgW0@SJ?J0v@nVZiN1d8pXipgEY^Aw}M32PiXlBS1}_P8Q1L=v|cqO{|U54 zmWdcC&(kRX`VQmA680vz^SW@iv|`llf~q7}6HS=4hm~ypLe8Y%;A`s1{qV*=7S`PM z@$#+R^eWh=e^)e4aza4O99!q&gx`c%n?s|nC-x_+N?GEY#Dsym#$SAuSG)U9;^xDi zmPX`u`!1o~UcLYNH3h@;MIBFeP_jYVWkeb!d%_BvIxGL-S-W}i(DF0T3!RZ~X@bv> z-^9|YsmIkET5g(Ah)EW}@`f6BBXfm0@DmNXCXje;N6DTekS?bG;8=t;Z<}zsV7bS`$Tx4~mUXiEoVn_BY#-!2&PC zvmEqfoAl87ln=ojRJ|cjw%-dGJ>9RV3ehfHH%D8P``E{4S#ZRxevKoCOsO9!Uiq$h zGFRw$oPNewSa^7D(aobknZ+EG?mc&o9ZR*-G-WoEt6PT}>>umws%c;WZi@5CLO^h+s+jB@&=>P8gE z%9+Nh3bA9&>p4Y|J%TN3Id<&O24W8TDOT%}$rGH|uKL#r9yUmyS)bl9b2h^j1;*`x z3fL-?=pcEnNWP%2E_!_-q*a(Vd#(KM+ww0vq+6vV{Tt_;z^42MWAQbMm7ze3#QV7G6*kz=krjZ$p@~_eex176D2&gQ6!yoz1amiux z>}V|RKDtf~88VOGTB7ozEZ^tX?J!_UCfzS1gy-)~Z+r$GK(<%kz6@gQbO#*Y1NB4G zBa?Ly+R@hZGFa)JY5{= zAF<+|o9ZZ+Z_Gwej?I2O<15|%I@g`5+ZiB=Hj;)_e!)ksd+=4LW#O-vPu(c6{yJuz z-EXjEt$H#k-@ws2Ms&G@O-?=(eR%-c1k~ira0g^o-BiC>GPuqzK?(a^8bG95-YqM) zVVUpUf)Lid$|%1bp1wETeE_lD`7G&LYVGu{7VI{x28m2>20KY_F(wda?d|h1<1`wC zP~Zf}O*=#EJ~>#&m#Dg5lD`@UP{>=#gasXw+Fi!yjOqStN|HXZ zUp)N^rxls_r|6U>A)K@*``cDN=uR$t03n2l}qWG*0JlLEDHJA&kE zTx}-z)3S(@A>hir!f;&O6EcM9v}dyR2{1jqJkXY*s?;xMF3|9kp(m58Tx`dT8(6sd zuE0&Di-p&C7R+X*9JIAlX4q$-%t?{EAI;=H@j81TsU%^0jxp>@r6GQTRnK{1r5`&% zKl-Z>;u^KxTMz?p1KnNzo3EdUM!2=$tc^%vCicNbeO|I;uy^#>RAaomih~E0Lh9^U zOp@h;o*&aE^6Sqd1oZvv<(btbei#rzJA)|T$W62TI8$o6d|@r5VR6^>Dt2dQDEsrN zH?HJF-H2-lD~(&zpF<^#L-*>^O4>cs^8(y)S*HQ%gVfO8ANaD;BRg8lzseZ4Um#VZ z8|V#ZXtj@w*0Fl&f-R{9aTQM}2F4*K`W-tR==A;^UIxZfKS5aT=jFrB7RboeaXyV=V+u-S8 zYAsOA%I!~xSxV@Q^??-QvvLmM#^5-A*2;_a+)RqS`6;qqdA>o==JXPJbLteK&S}5T zOhnEO`#xsbNnO(xOuA#69)A~=Dp#J*^(SSLht$4xLartv`--Z}%go8X!?~UB=^%du zM#nK89#nF!@EuA19)3vaeu`HXTC)lAIc&M^`?@pd^Dw6K$ZeAtvxo*T^o#&U$xqKa z4$biMFibG#$!$SX(Cs@Xb36bo$DXOy!}S3AzH$+30q8&FV4AQV6W?n<0Fub9fX3(SyP@DgRYh(Yz%h|iDqBsm(q*O8_ z*xY9}tE@5~1xPpRp9(ky$g<}>Wg|vs?|xQ`foo+WW^c6rypJruK&V01!;A=e^6W>O z1H-^nZ7dQ9OX?USMuZgkd7xt?)uE%3q6;Yc2+5-G zc^pvxd=sVQ*tjl*v)|&^kU`4IUq4?QB!JPyB{#*ZbGSY#K7dpoKp+ET`FOFzHxyMY z*x$;d6XDLR~j-M%8;YFvgSzLulP{9Eip z?Hev)V_bRlq5-<8nOR23(DN|NSR60m70l+pdI+zrseE0%s6*x;?=1J9WYnsra+C|* zbLiRQh1zG9tmkI$pv8;s4cmOo@AG*lYdQ)>zq3k|M;oMcD+{Z!&tlQRn6E4ct|e`^ zlYX;XJFvvzb#O+Pevvk#OX^s_FyAZtY0f!X$}jtoZ8c`_E)yPIBjzT{w2B#_C0i!!!cnJPps|9scYHvBDtv`xT$B=SLA_^ZCm7X{2u^{Sur4O}ds zw2%?j$OFZjj29Kh&aVM3_nnoDLz%m6pC*=zy!+FZrMLwbuQXS-NYfz$BBN#LPQgQy zTgRSG1+Cd_9=~fuOni*W;)U2TONw*vz+LyTu>GyVg3oJGnZa9W^}Doul)L4Q&(q02 zvR__{(nn?`us&t?^;F{Qnl-#whFRz#shvE7YdFv8XmO##-95UCDW~WrE=h39mI*+h zr*qH7BS8hF(j)5f=S7aZN&94zGC$GE&5mC;6O0e~a=tvOez*Ht#6tR)$=LWGrRts2 zD}}Sw`&8lSpz9+5=|R5JCXz`Uqkx%^&>&k&YqLIz<@CEjdO({hT_fIF@vzr^%=W!G zdlO9(DI=0{xPC$J=q(qmAXq&}Ea8n+b^jb#Y2#e0pSpvcl?6*GGPf@CZ&lM6OjrMO ziVF8m4J)lpZ{`h{Y1f0m*NSK1u+Leb&X3A$ZA~%fx4Gkm$-4!s-W!@rr^MKr`Et%x z>kIKu@=kAhnZo6B(H9+#@|W65W|Hg(M_37Uj#9KyWSsoDdOoeumVqMe&?Mwoxt2-D z#Y+Stqge^*@Tw3|{uhn>f6l@-lNbGKLGz?C=PnOQfk?Q~30|=HRqf)K=TCEXN!shca@ukW(fMyvG9r~py z5^*82G**d`yfi58Cow-_MA0CDRM0bFkFz`A>yoVU8$w1f-|3_kHFBv{yvRpMmwRm< zNE&DuKV^vgi7Ox>$AR7g>lqjp_SH8XjKQ&%Ke{sLzd<3cxFZ({Q}!?|5kXV_h^JtP zoylTqny(S(5L92W5|72QP;n&5ONuFD#e0SOUZv; z(;EFz+KNnYJmTQv_rpBnGO(qa32!BISF0e4(RxQIA1iLHN$;b#S_@r?F`YoYgv(&o zPNMX^|GOl@OoL>PWD&sA_(4iI6HtkeL$5OuKBYR(2}4$ok8p~ zzNzi_tD|9wh5Iq^#u|Hdo>IjKAgYNhE>ML%|B8dWBHi``@ccrxx z&9hiF(|D-7_Pmh*N+!22l1#>Cc#LjC`^IDxW@68#C-z{Y{PJgUQtcJ?C&e8k3(J$K z?UZ7o#42f(c>Kx>T?#%Z7Dajm=4jd(wrCiWUhQn8#%F4mEHsPWJlifFl5*W01Y`QR zq{u%>v)PKtBWHXlXY^xG=X1w|$i*&2rimpKuEKShQ?XF1%xJGduKO?Y6JJbADLa;& z1*eWXag6vO=eEn|Q}8D)p1q|9|1SX9KqkLFkRZ*d#@7jnxhYd8vmcb0Fa*gL4AwjF zwxZKWtRH0pA!nM<73czPgJb26T?s7Y$|KP$7$LTeZ^WvfWzsRdv0}svaafp2Pu&Fs z%#DlA0k6D>7As&VCfmA6q~!(32m!G;nfH?X1+zRUvLIz3obEmq!qSYT2V8}8@UgyF z7kSq^wO<6iD3fX9+i&C>tK!-MqW?Wed zcGv`MDLn5Q>#QC``}`TDq*YT}br8UB@{gs9ui&T>5xR%o4zQKWHKaDo(QLkD%E^ZQ zbCH$_!74edZp^=qw5a112F|sAzyobp(55aqs^_IUsPEyVajdlq^0`1LJzH{vNNxZQ zmM;A+Qy?+10F)fY4$K~p@FfD=5uZk_%Z;xJe)CtXAJmpXowD?fiP6n`^_#}Ey*g_K zpt5iiPE=@~tX*DPFL}MXaO|lT5aHiTo$F|(6=|s!w=&@P8bHJdi{I)?2k1=*4d!`r z?Jich%uo&4bT5k1F!rRH@Sy|EEO?ei5Y_`#h0<>IW5Pl&52?^$;&&v%-W#=-w^iL|M0c4c<(5;C{m>EJ_O z%XeZhg8a#^vEbQRBd|+HTACw4;(Yr%XtHVG*)<=eDop~vg7$Z#v2#Dm#o>;wJ8wTD z*m%3G0|oAGPw&bSe?pXK}+`e;T@#=Kd8`Rp85Y8m@dWW|>?mpuTNT z8@zE-RamT8py8m=JkCPtBATv_(};Q_zupy_Q(sk=7lZ1;SsX|#9^_i*8I`$btU`{g zR*?lY0Cm5!G6WL9S1l#0^kyIp;;?(Xb20NtLj!x&iVE0rqjU^9sY>^5Z1kJKkyKRY zlQ5Tq+X+AbM-X}l?;G~U;Dx+sSRr98H#2kxLjqKH-HrentWk5C8WO%uL9c)rX)-Ik za=On1*qZaaShRIrU;qpRS}s_)TM*~j4XEUB9vTHc)|ww?2z5(+XTg&LE6{*)w6+%b zx*F0vQ}{=fPvwhkO4l%gTD30N&ON?Iu=$Sh6z;OMjs|6^?Ee6$gjycA&2`piI-5Af z2d-rRT7joBt!K}^s%*kXxmxo^dK6IRD_e0Y&!gmD?@saXR5PS`(;FaVBXz^p9>7PG zR-J0$0J5sABI_{@ZgA}>D(5UKS&C_*&9>in=O0TEW@d^NblX0YHrYJeR@XNqIVTav zJ*zHr+Tbh{Z=tSPM|=ZTp?%;LVQZ?#@Df05v^2%Rp`!XlAEHz0<%^Rv*AQk`4yyjd z&>aJgc!@BX!LqfV>m!)X|Dhdyip%fP2gz_*w2%hPIfO%B8dJTe|YM`EQCzCjO zfVY_ydAh5kQnk-5;CsqvO9lDF0GtZ1B|+(I*{^V^z6#wu;i9Jl#L}9;N3JN=6nT+e z`H|Zd|D{oKd=&M_GAEZysu>bkKpIHQ+w!-|Bm#=Tq~0IW+*33j`mLqZA-yeW1i)V<|f<^{UE7%B@`g1!E!I_cx? z(qdoMS$Lz=XTTA3BPW|1rT!nmc+yjC@?~{3cINPc(6xHZvF-9bhwz=2CSW-bdY*np zl-5_4yMHMIF?!GC8Tmq3y;UlQ^g!I z4ZAK8$pp9#qVP4!x+%U0_d09hp>xry+xtSRhVH$5e#FdQ;F@@4diDh`6F1$L=lD-+ zzE}yyQh$S#9WK@x#_r!E*nb7y*Qz?{%mYWr(2-;00ja6qn}_iCJs-(FHe=2bFErnM zYAsNm0rZw>_i8xZ7cA)((e|1?h(q2D)oOH2_<<$keIXYC^oC=n9j>LzBKw*7N=?zv zA*Eo>wT&9{M8QznELG@4?8HV3<*d+~;EL*ToU*JDn267RF0o%Uh0UVoCLZU4GJfJh z2hY|pDcw|4q;@c7yHY-oA5INo1Fh9Wu5FQoK|^P01s*UEgvI5o&;^TDbd)7_ax>Gw zdJ|2|Tt;%ZWQl!h@KbA$Oak9R0#Hyk@CZ6Qs_!pfT6m1w+%M^vP;btw;IvK_h4|ac zF!fW92WAYb24=9)!S49k(UUSR#&|RL@yhjM=u9(Tn*I~o?ht#ksiYJ3eP#2?r8sNA z0j;WFrEAVD{3^Yg+;|P(Vb$3ko*u*a4)j_ktENP!^FM42jXdR;jaogrOT(R zUM~27Bm+?vo+2H zf&OuFs81}gTR`g)-J)$hVHB9C%HNTE5b)f}ZZ+Fx4X>ydg0E08g4xa#%#^&;_-Y4l z0%8--vd@4rP;SNT##%{N_5Qnf(rAm^%MC#}c-Z5Qx~Gx!H;5Lv4qQw*9ccNz{6+K3 z*d>~;Jwd?u7&g7f;2!xz0bjv;MHbrA4;Q~UdiW2VD(njOiDk81 zi^E8!3pO$Wx$MpOpplIU?(*Ai^c)Q38-|CqP<*K!{#i9FBvh~-e*u%8F-+?Dp*`hpKHoqP0}gPhXDC$wvH@qcDd~SyyB&J8FS_6X`IhI;}_AQi!+B$~$I^v+!c?1g16zX*g1-lCHTfrnq($=g@LuW0TcwUw{ zOwbE@(Yv15Y;l8AMO2|3u;tZM$tOzX+uy^5poT+Wwl%je8q7STGQ@{L2 zOQm_;2#enFTB9BEgLvh_8?kVLd z9;{Z59D9Uo;gAJE1Xy=Os68ly)xfqo+Cb=sNIjQyTd)(J8xtD!-~|N{m_w8s(W@9D z`7fI)C_PpMMnK%E8tEaRg7s?cCFwiwd=?t!)kkZXymjKyFm#6xY&-})UAm8#Fr5z2 z6B|1yAk9E{9s!$EORxocOOs|@r=-)vo4O|cZ52sKx9b> zNE<0mAk3D5;&(2A)o?|NpA>BS{0J#|pD2X_*5~v-0l3pU-XC})=Hxe%>+ogTNACMf zdrKd}c-!MjONO4eNqFzPKHNidP+hXXt1ceZ@;!&kciJXt)%diUZ4t9^017@4*3Kua zT}{DgE)UWipzF?@b%08?JtGxm+rsLXI$qE;E5$CFbRLq1$Bo(aM8U}bS@Q5d76W^< zKpM8-;&qosfcBq7@1qR+g$jM2(O7Le#)owA@#`6a;8*QW1|j$2w>bMJn^hLXN0;nr<^J1oe#M;f;v0ugpk!ORZ)A zwMSWr89n+!D_4o5=UA}KdhRlc>QJ9#7!40sf+_=RadKnOu?@TC!2tDeXTcXuu2}nN zX^3$)x+E4Wkjvnl8+N9J31|acv!Fn|BxUe6c@BXZJmU);dduJ$KX8ZJajWs9T0 zSSw8*)H;Jr& zyUal(+Hqr;9RS=25hJq)$o3y8-F->gkBLESZiu%!IQUkK&7V}&n#KvUUw?y0%QtH6 z@-!BIdJUNPgQ4fc2Sf5oP)<|6EL#b-PZIZ^TIU{&6}mYYSHG&a>nuk&1L-bDVO6=*kzkm3@xKCnJjDXQi86bqEK&KKSm`JZ!|^1p)S zQkG`n!(*qf!@{<9zv3PPY6n^V0s*uRPm%0COT8uAE6;=tu~$wf;XV)$sZNR8xLm}~D8G}p6`+ZgajcSU2dZ?MK?1)pglWEsu?gm%O;aln3|QBBgKyJV z=@(csY2cd~$s12%1)O(c)!QcA>&%{Dg+ixERJ^_AE&2_!vFu_U&wS}nxihnBHRK3MgJIevc<1HIKp z?Kn|{rdwxW4w$e9iqANdB0}KdFfsUluyN<4Vs__?}?$vw?6;{S_q5h*emh;M}!q^3F}GB{Ri(i zvUkb6za!Xumv~-hWIhlU#9cU*@^SE(>k(Tn&WL6iVgcGX{LZfnu(Y0gE3ow zQeaNl;qN_w`OEei9KA`Ki&w+%6*-6p%2NU8ke1JfDS5{MH_-D$vQ0yX8F9{R3WABI z2aC*U@A^%T(AHV%dc*w?i&IV)jHV$f8n+{$-Oh4@Lc2wq4ylL9(jK)U<+%rd>*3ci zDv5TyaqBmMe5TE6b{{Fxd>LLTq&{3$}(zVjDJuy8d?E` z+Zyp~4HI1J8<)D_oSIEwdEL5kH1JR=&`TnG8AvfhMyoo)oRArN_=ODRZ5;-UFgl0L zJAe=r8y-5sSx|T*PlQ8vR=%geagQ{h;Fa5~KE$AH@B`fZdZMY#Hv4^k76C^=96r*! zbJq9`l7_1s9o+k2{roxdknX8t`E1Q`NaJAsamX_)gX>+3yW z(eEh4I%1|cBfA%=&dPrA8akDgFD`=R4-G?(sSj(KqSt;!3kEAo=Qh%Lv1NYPSridgLcX*{`=qo=f|oLmB3MkQfq&vsZ7)OBxzEVWYL1=fZ0NM5oftnH9_{2H10z>DTE>pXkUnpO@)`zeRq$$3^%6$`o#=h z&9c}7l#5`ebLlMWMAoaME^F2s-)sXZ0rsvjvUx!)y_pS&sYC0q%Jd*KHysxs@t+0)AxN2bXRd;;=Gsps(jW>^?)cP&e=t zDXTj~3O)@dXqWBK_!go(31@f5&pa>Pyf9t7Gy8Z}5!SytfH#J~qfW(Bk57a0PNmXo z>pGJSUXu&J1;&R21mOl-A31jGLVn4TVaq4HA+7emx)8oL{-ns!`3Q4vZjM}R`dEFY zpq|4s7itxKW1~N=v!Erb!x-#p2;owQt8>1TN0wJ`dhAMsD(K#1jd;pn=QgjZminx- z*HAn(@41F);S+7Zxpdj2iV{{V70s&vOQ@#>8ICpDr45qV>A z@-h^+0&>iFmDRoDiV39e97h!PB7&D(`@uBaht(8%EihDTm5%!iA6evV%k2Sg&O#s) zboA0dXt`!#$-G0W1C+_IaXBNbfM_eXg0l_QabqiqzK5utX!OJuIN;BZ zXN7f$^p1)khbKuTNcS?_7JxWB5EjsNl*WBnZ#>d>(=w$YK{$A-ILfHYNC3Nag_Y=< z!a(k3Fabsn5NEYi(`(Yf)P~(NM;IWVVP6G1n@C>!@4_Y4{{WD`29e?0gKg^&xYV2n zS&AS5@CE}~wt&jMhAX36lCQ!m52ova6X1V8d53A}R38g>IZHs)^C7>8^<=Y3?D|6n zl>xEvlFqN}q7>AxMfv_C)rb73(pFBg#A!wKQ!LZ&3MbkH=P+6FJ%`A5^{3MD(Tn;Y z4pM5);QTrrygjtn@8FnII3@o8TGrqmFe+~TNE@vU`Xv-e3Cbl-A_LL~DqXr6S1RCi1 zhb(ZhY`-(RmauOubBV7vH3I^dp<^iA(b+dIlq1<0edW$nC{Sl*=%MBjT(lP{d54=<+++FY|zj&TjdE)$e1X^3L zO7lc(Qp0vzK;gXs;-KOe+CVCdFi)NdX4300$^hW;1kW-wWx;h|<{a6iFmJ|M_z6AE zQA*}2kh+dG4v^^P!{8DJluXUx3>~GyzFnpm05(1ht%BL7*6)sxr7i0I6R`J}Si@3= zuyl`@x%f;lV0By*HhuX0;u_8%4~L&Na`+;}vh|gE{78`|0V;RyAAgBM#(dfj)(}-- zbr$~s73)hEUHo_O%E>dh&E@$X!{$4ywpE`F7h-e)@b%VvS?P0u=17|?Q~M&ezePVJ zJ#DoY;fINLQ3NlIik8qm!V1wf3XF)h5e3$EiTsnkYX1O+6eQhIN?h5mSWpY$L=mw# zE+aj@6X!6>vtg<>|3rvad^F2F5DS(%iw9(wqGGqGwkcglhQ~z!Vfg z?1x#a-{+Vvq?^(Crl-ePG3OEmMFQMSTs@-T-ey|QdO2>-cNOEL*T(YALAU;qbMCW5 z7n!cdCZJDZ2DF0eUjG0Be!uGDO$Uf5itj{&`hKhU6byAr z2=}ElLv@fQ5HKdjz6~bd(9KNOE)zu24nbcFhU-xR*jgB~tUqHxP<$m6@Ge&bw}P+z zaVWe(pgs~FlQsx13Nma@zKkm(17qTC8(`A;_aN{U0k_17VDl_~ArD3$#CR0l*;~sM zhiK6=+N0F&pY9!xG-XAn&8d+7C!Ai7c12TSnwA0gPe zD)1ZzgW!(4BMCF2P%t#5+rPzViTYq`kBd_JZ*Scl$rsAT&^GA&16h`=qm{KItJ z(y$JSJZU}MnB5iHvaa2^Z8zIo>_xdsFLK}v0oq#tCeM6E7ISv+nQqC|iKJK8Ger*G z7jY#|L?;09!#yImsbIOG;1<*;GVvJ1db7}KEN0$VE{9~%Nu;oM_Ho+riO^2W=b9!Z zOJ`3Mf(J6#SL-n=Nu)V|3zVx{?mgfFf{z;2dZN7sqM;Gb&=D~6^IWMeAzmv4Td@_o zdX)8wDfiHt@ZG8y2)}B+27$V|!_DZAsvTv@l0dhIzy{SEu}SQjL)Hz~BU+&!RM+7~ z6`< zMbFl2n%4}aR_;tra3;X&kOI_x%9rE)U&PWV(Bbzc{kr9b`)Uugr%!blB$Hx2=USWU z^F+4Iki_+nYxRb6s#!Z-P_IHD3?`PH*{4flH?;MXYc0gTYxJ5xURW*w@CL=_F*aOB z5|3+00d2#YO!ytlTChOlu%_FIYSD%;Ty7~kgs><&!u1?wIBUlnm}@RsJ+V4P;PIpu z?$t+L(A~vv9-9R$bgEG#I;;Ue9lTnFI#E`V*w$@6jZ5@9xkDqn4}b~AqnD($Jpftf ze@J+k>L>tEQSe(hoXa1j<3;X3NI6vL)nI%I3tBm1i#vHHSS^}}c8%<-;cipaRT&nV z1cIq@Uk;2OI7h-4!nII%_O{46+wnjFVRoAl2tM=)wZIk{&>s_Cbkyb@$2jV|cKDWy za7#;N@pWgj2s#Q6iEO8`s%MU=!0>t3oIWvIbzWbeJ1stAc|5q zR=%*$AsH=bo0^1m1t^Uz4jYTMM7Vt7w^oR2=@F(qf;)(Hvc9mM_+UOzl7Yj1v8Dmz z6*H?t<6S1<7%N8lpP0Us!>?%_df3cOq#X!FEzD05A{hKdAmrrbDCL z(BE1Q>A@1ld)qPk7fBpwiYgaK`o+xlmoe!J5cK#BCM~fu=59sXNd(_+R{kJ09$Rpx z-Qo_gf%&~&e-+W9W;fPZ5Z)D?VQ3lxzAW{i&rex#9>&`~(8>WoZSg-Vj54n^9Oiaa zoABkxT%KKV$af3in`!3jQ;@i zE)hhUQ}sbH&;W)sL@hkIa}{T$YHUY>>)IuJ;J?V(L)`vlBlL!|5^qI7;5xn&3Z29z z#SZbjqhRhX3GU09C_6+Nvr0@8N^~XauI|7!(x=}&KDi5k&{uB@P6@f7I4>!+IEnQ# z%{=pf8e_m4P@5rf4nKXH7lH|6wqYRH1iHKl!5p%h+b=!Toz@|VvU_OC1+CzU4^eOp z03AGfl4UDS(zZt(&XKU?s=zw_e>6qV0iaI)_$){qvf`8KF*{AB)Hs8l4lM8dhz5Wh z9yd`-wy%~a3recG!phmu@^pZX@ydN*8UPy~0#jX8GxzBc&t8NE2Xi@q3JN{|7PNJX zyGvcUcgl@K#CdrZ1r%WTTA}64DN5njNU3YBSjv`wAZ8xD8cbH@Rl2)BNvFpBp<|!P3?IdK8Agc7GYjQF zxWoF0vVm`-xpI4a6F^-e!}@ ztQL&uO(3{laK|Ts5Tx}I_|HgtWt!yJQ#(y-tWedj3IO&Ja1>GDAh}EH5ddXZhJqd0 zs)gwsrnz*TvC=BEI!zR>ECGNZjtiNG{D_j}n2Hy%js^F2YT02%^-QNnv=Yz_;)3XP zmP2$`FC%G4-#2~}ltY}QQ?igNNE(`&a|AKv-PBF(ZQMlR&`2S#qf)phtpd;vp8*z* z=cGZT!YIQhXSWa<>y_Q6fi4HZq(br8-qH4x=y{MXxZi`MCIg}H^Id8w!Bi<71kS-Qpf+_GiaMg=+0AU7dPYu8BUT9f z*y)O%&&c*4A=$vHk)sKsds7T|5e))xQGp+@h_w;1we*{y_J|;H)Gy{7CUwZsO4wTk zP#q1W=npGB#5WH>^*+kyJS6<@nwkLhr?=9)D&sBUI+nYq(^726{WO~w-P7ILKrkza z4vkHs?=)fcL)M4U*heB#R8EGyCx)XGp0Pf-xR4_OM- zQO71dX4%^qnpp4VA1EkepnNaEH)xjn7mf*(bIm%#*iOHz;y`J;L~Ez44NeS*Dh;u( zi&uv&Mg+Ys55&K`?2uqlMxPKk?5#@I8yP)65UQ2Rdhf;)1#7#|fij@u_pV{E3VH+M zO8)=|387G)x7*}Vz0KHWEvxzFW1&p*vYHF$nWBedz%eqzEgY8y`hy%*bkyE0s@LfXtW9r-f#$N5g7iF5 zsSfh=>V{*!wG>Ukw*LS!^md_xjNX4VB7krnF8EHj`WC&mGM?*7$#J_@n(-b@z2F)E zaC{90^;CV+iZ3x;4Fv2O@)$amv2S=3QICNGElXhzv@v~c=`USsk~+J(TkG+3429M! z+12UR8-DM>k;e6(UyCASQe2_pusX%LM`j&OxM$bmP+HLzmH1`{tk>n&SnCKZRvP?j z`juWViCQbU1kF%2@rL)c-O^PN_Ex{@R#e4R@q;FVD;fknF22=4g+zb6dAsTc_C{KInoqaEx~m z#8(Nxu)C=Cnn$%Gye^9zOz|6p6I9%7p}_@PJsGl}Fg18()Nzg8Bs`3Myi3?4b-kvr zdFGg&C^c$mr21@}5bHQAh!wp z%!^v$W5w4~7EZdRj2EV!^HOJ(D-qr}UE81J;9^NZ-;W-pp*&3$DbQDxH|weX~9HZhF{w>9fD{kj-m zUa}P^&TbE@;z!VROAZlgpG1(so938&r%gXs#L(|zCew;4AAKpnhJunw%V><2U2L!!NR zNp67@ic+Yp+__GH^zl&Ds6VSE;G0&-koqa^!_iM@iPecHYxlHzFgPW-;or!-vvroi zN2+1*&#l zU1?I5ly-8SNUc@r6m{8EK-Hbhy?!Oa2JEt_b)wXhO~M{`%9SC5CmDQbU8)?S^ej`P zG_jPa0y&I6JxBzR>vk~1sSCg6>|oNH8u-?WaXQx+Bx<2-tGGZPbW}b-@wN^GA=iCZ zWrV>fs1J}C$*}~kxM{QfU{EyygXFF`0MnFU&7z?H0EG9j`3}jUs9gGFO0Nw_yym83 zCz6wo#`X&4dre$rqp4NFn=YolZ@k#gK$~ezmB~2y!6{n!xu=)|LOyN?Cj=J2b%9^3 zBB;2D7gtGHu(lbs`sEdv6@~OBo)+iPJ;+roXjd!xPLwcBBQBDA!zmhRawYLJVDL^7 zr2`VmW$uwH3$YBN;?^&C+RA6!>L|MXp_Gj$aved~d?~@4F#%@kEVs~U?>ST&q^?q0lwv3c%Rv?65B2yrG@Bu+bPl}wm zl}8Ql^GEt1&Ciy70_5T2d_ptd6+Y0Qc>hD>%UbB42 z`pBCh?=;7-h&twU<_&^<)XYe_1a+gVGIgY|Inb8vuX*m#2o$dXHp>>Cp6HL~YPB&O zU0=lB!_5xl7gyFh)Vx#FtQR)%GzxtXiG{Zm4`jL_ucX_ptv4$M&cKQ>{o_ow~t%kssP!WJNrfR zJsJ|C)q2%deVlzUA~CX2pc z@&hAU=q8M67u4%6IzK>HNKvkXLGl)hXFCn*bq|>i4&Rln_{4*4@4SRp5-Z zI{l>?;zM_z_-}g;kncqgcmqPbE@&w>FJx;;_MBwpo|q8G?Mb2+)rshNKr|{CoveXb z07pZ;Sf8OTK14K3D1JZ0GJE!Fj_nKf%bwq=h1A7)@S_K-ERIlSdsEcdjik1dZG!{v zRHOZ8Snvbb@uk)->_hC1scCPuZfjcdX7Rf;dqnOouLyBZKgk56yIu)OV=jCHY=OG4 z)B)J$H0sp`e*8XDoY|0y2j6zyuo@Gjd`%7aQrJ!tadoxQRz^BMh&!GWDMa*-iE0?! z@^Z_rhNzoKdIQ=D4BkQGP9x)7Aa2Xr*IqcMNw`27;I&A2!QA-?dV-ogl^8n0cWmG8 zo1}m<>+%+%>#@tW*Bq5?R9|_uTMP5PN$P7n5UMtlPE{+1C{xqra77(gnRq>r{H3DU zA5Y7p-TwfH_ptd6&CDk7j+xmvYuXnp^=6G{GeZv@AfC7-I@RcA3i8|*vLr@qaXjaA zOsqPmwh0Q*Bgx@}njI&$D-KUyOU=(FZ8qOm)*63!&f5LN5$eWNm(ZDt$HDF568!C9 za`Mv(XxjHrd99;exW_9PAw#QF&`!c^)!J;HKEY8gaGQQ9Z@WVc#$R|p$@LCRFs_+^?XJA6i14ptQY^4f5WizsA+YZuMz z+Q<<5Vez0^(bhcmrR^VVO0nJoRq|y@N3Ng+1sy&;Bd3E~K9Taa97)uat66V4EU+IX zmoIkQVlRBqXs0H#ksgo%K}X3dG-c=FThT*-fCPZM;$CmxB|!0Z>h^aSlM#9 zNl`^$XHH`9ODbIxNmR>EDM@}SXg_RAG102}P124qW*zRKPrR#a5$H6i_=4p}EMVR? zE9n<;iW5QGszvPWRj;h4PO@Dep|6jul&U6X*irM0R9z1bv_jkJnEJ{U%3;t^iun(f zjiK~LZ`c~6+6bh+pR5%9+y}}O8PF*C3&6EnBCaAfK62(AW(U#~7gsENpo7t9A0n0^hTIekA0!KBD?%C*uzQSaHJXF$AO;lyx5~|%LGn?{36F}| zuTJm?C}0njqS8zw%{P2&ksWT1Lzg&-at z!{j@(I;t){STs&nM#5Robfu16xe^OO^34S7JZ_~RJy~a0h~^<%b0IVyba0ysc0bfS z=-yo@xj!l~6LL;D`c7QK!kt1ewL5y;6NWhW z2AhpGH@05|Jo6v2b5-vg3vDB0J?M{VhQGM~0GV5({c{AP_#@&5!0#?9oU=IZyBWSt znW9}1um~N|`=OKrgX2)uscqeSu@-?@ zqHHzjpJ)J6c>;wvkCCK7#%+{kx2UKFiM>Z>NHe0ld;F&qMz5h0ICu}NSmn;!(f}LK zgXJ}OUulyz*E%|AP&ReHf0j>&gYrZG#mdJ<2xCw-`FYSPdaIATFjlPVoS$Fky^D38 zh9QGt=dutS)yqCGL>T>NKgZv}lXYLuOrqk;>Abb^)74Eb8UT5C-A{4DE~-}y>i{$JcPdKo(+TqR#oN3eknAUhr|smvD#bgfGC#@cz5w%bi9ygzsAH_Oz)F2O{t zL^qX3XpBQ^Y1dA=baltLkOqRH zqu0ULnp>G}U<*sk-j6`6;m-ta$)JC@do8G{RWw_dI~4+H@c^|0tgH{s8)BA_6QDij zOdmp}dV#xe`R2j$4X`;?EXUohHC3f_Ln`lCpla2(2%2aKdab3oiW$eks7FT5a*K3y z1~w;}2m^bovid@rjR(n4TG7iJ{{Vpz9zLlWC+|oB{{S{>xlo?pTc44vK*nmMp0sQxg!=h=JgW=2-yJ-uO zqQgO|^QgQ40_RcGfvUoHpa+Mr`3~9BYK7d^Q==vqp^befxHhwE`Tv-OXW-E5zDS~ut_aod?R@N|4ql!$>jRS9lZ#-)fZ!y>A&(0{3? z4)^}zhmqMydTs>+qJ(r{DUXB=tsJou1lVpkH{6kRPChJ}9u04OM$9lixzh&g57nZ?hQu6a{drpul3 z`$3yF*gr_yS?Yg$r+V|SFs5piT6}z8!Mv=W&)>CUM!vM2Sg8|^eUB^-=ciGBlx1)!ox4)L? zF<;%Y>*4J@K9|I`7i^!jK&;(hcSEhMR08T=1<`Dq`)tOuh7iE>LG zbEnJ(RR-*H%l!@F{xi1zX{|xq5$*76zt{dd-oxZOKIyutcbC8~g$Sa$de3ntezSLt zK@UBaue8>%s;xQ9rU}vkps$D7jU~P#hW?W$;L(2)#SU>osQdXn=KFe*Iwigjw5juy zslsqiY6HVlyjGTVXI2km-3hotR5;dW8?eG@Sact(-GfmVxK^bBE@b*Up)^1{d=u+< zXpf>fEU}zt=`7=0=sV;0o7w7f2Kh2f8NK+}J;5Ig9y+5)_!vAcq5$V2I*e{0`^L;} zRjz5z_%$HG?iq?`96|AD_=RHfs&q;}3UJhqC<8C+S?@S`Cl!L+5coZ(htl{p5=D3E z9I~`sUb6N6x|xA>)Y)#30wn>jmf!)Z&s`Wi^q2b31leeA}a@ z01s3joYk_~N9ztfTEFAH>^?)i74RulU9gX8)PY4G3APU^p)NOOR+?Enn`s|tjd5nz z(r!1zSFuYcaXSC8vQG?Mk$hx@kYw0(n^F?mH_E*+- ziCM*sG(lrfy)dtU--zwKW2d6h(*w#0wBF2$Yl94ZAQ^Wo{buu8mY;b=t=ANuoz8(B z4~M?+SAq+6r|nRs<%N~yavIByA5tTh+9n!dbw8sVITfTFd%(B`g%iJ?9RPS-U!qsC zE3_I@G?zDy3-pc2w`9Lts59?Uu3xG(^^~uFBB{NNcvXIUDmr`~)5GaS#Z2IV&v$hB z=6gbi=>r4KSP#58gVhmterBW&s1swP7CuX!M36@bWTzcRF8Mfs05Bgmv1oMXtwDgb z^#_*FdwmX%o#(^Rc)6=Ne^T>a{{ZqH_8%eIhOJ8C`m*ZFhA-^w-0wgu_l_`*<2iA| zPif7s-qD->=MSu=S?BX59-H>e_CQDif{vdKlP!dGVgtWNwXWl&yI`BsV(Ga~$)BVb zeaQ>&{{ZG+8C>8Af!H7df{%i`g@EuX#5%Iy%^^Zm>rW)w)JbJ|{?lTN49seOWT$$= zFe%$e6{bEfY2k1Jc?%fTi)_Th80mE0yQ(wvm*{Ts)m12<1m3U>$<`-Wj0-##L{u!+ zQABD&USAtShkvY;#q1ip&9Q#aFb41Q57D=+`pT)0@KklrhmdE&q;uk?rlt=^A&oZs zL-V<~51U;Yg%k3ydu9$dLO!E3`G~NrWHRp_)DEI26`QLZCLr_omVWQfQL)L-K^&cQ zbbY5khIxK?U&6PziF~ZO9&dm7FMAJ=?&a{ksLodvucWH=Iqg(Rp&bO#0o&owj^-JD zQJMtpZ1-nB5xajnCeY9CdDRXxQA1OM`kjat6BJ&#?2tfceWLLAH6pfjqj*Ou5eB7GZcc z9SG^8?>08g8w6UEmJXMlq z%n~al6Fn9^Hl)uKKTVvHor0fYQ|Z(oY=NJgxe4Plzn6FW2D+=;xfw5dz@IMv`#ZkX zo9tk6flP3(VQR<2NR19S3d+~xZO#e5BiP%wCdeCcD!MyLm8?ogbn{RI(mvH<877g- z!XqxhoL`{$--G0#h3@)}*yX1FNQtlYwBdE8U!t#Ps5ey})|CUsE2^y)ABUt6K96Ch zPYw^_e-dX(uI#c&wYTQ#z!=4DB%1FPvG#xgRGhrnezyK|A9oDaCWZ~nb6SMUbt-H=mS(fq<2(cF+ZrY*IU z7%j0PIbMmIC@ki_k#Sv$#Su~L*eWY@J9{H+uM)tr7^z%kq;4Q6YC<1uE)6VHB?8(~ znf@Ac+fj%2bV59RNL7M#y~CZsdZWv4^#-Pcjo7@oB!svFhvI7sZtVHN$`tVqzK=G8 zMRO9g!$XhDRSIGf@-CeSm8td54A^g?axNaas!of+J?z46Q<<_51!a3P^Jt$)JS+Y1 zZ9O&~WE>wk#!erPk+Upzwwfs#k&-2ng1Od=D(iwLV!ZuMG+DmcqV~J{7BKgBv(1Zn z2dgj9ONu;5U0R*BmAov2XPpP^3BTlf&v9iv-kPp2|sktP_Ju3VqfyjA#e zSE_8rbFWBBpH7{{OdgAfRl)YBTAq^c?Nfj3K!9|QwXkX^hU2IW&cmZ=^yqld0{}C4 zN9Lzg^Pbq1Vo;#r%_ouE!JrW`0{gy)6Uqmqoe7K|T(9m|au>nFvhMol8gyTbi&P!5 z?<76?G;dP0FJOi8mpGk*rkg0kjaK^9hJ-Q)9-^OTi68H*HDPB?2gremNCubarct0I zS(K<3?CUrMWiazl-z?vN+OxE;KhVAIe}NhkJ-__|@$UP@6E&a6+x0WNkHH9Q%Ygq- zj82pf{k-slR)x*6Nrhm*5dNVz<^z2xImAiXAZ<{T%nElBVlzYOET+xIMjKGf9aGEkrG2} znb1-KjX(AJi>pztSaPB_P4EIzr!cqco&DU+fMG>hRUa{SyT+rV@A5~&n6GuG9TvX6 z-UJR6dMj&-fCAb}AyQtOH4SFF9k&C|UHckE8&P^u7isWRcw+D#kQopa%Ec)#5BG>Z%k1e@A~NX z5P7=VMtI3P?-%c_YKLxfxaRwY@JL83Oj8Q)DT>soKQ-oLup7pryb)E;=*%Y@iV>Tz z?JspmRjhoi~x)1tv@Q~LY458$mI zw+iJ93~rUpkY~^bV+pcngmV(twzjt3DtT2@NH`cI_Y86BH^eMeRKhb#rk({ZlLX%# zc5k|sRcZ?zpGWw9s_R&)3PS5`tDbXX%oJa#EL>&jPZVP8^c%m-Q!T%-xgAcpWZNTX zHnumlQSo0s$~*ALLIY8WhnEnr#9;Bb;H9Z6N}N-<1x!C9Y5Q2Yfns_F43>1uQiVP_ z^Wc5WU09FeIn$cB>&e+S2;mOyy=uYTf}_D5tTgUAQ@{MscfXzcEZa0*EN5kiHbbv` zFZ}ZAzF>USDsD;XVux`4X@D%g7xk;N#*90HBTV`n8mMPh?8+Bt+4>Q`z`3&H2ru;$ zlWy?{@3(#|2P#r$Z#2cNZ!%>+IqU9E`@U;=j4}FHK0W5OT{EO-0^EI(;_;Suft_iB zAwa%g&9dmQ&Ih@#y?!g>jPQtWYgox1QS6P0G4IWV%28IqLOD8ag3$7-PBU7asJr|C zPwc-P`Eem`lOb9#$6V}6iswZNpCnn$m}e24`UT>v>~)e8Z+Lt9E&C!y{n%b!v_Zx0 z+5|3~s(zncrt?j0wIR+l{D*i1@^nmvHE|`GLmi>`I9<~2$AeR6vExy8VDXb#TspHI z;nEXKJ~tYZg}p$X`?Y@VflkgFTfdCl zoxM)Fvq^E@oi~0~EAup8ikV)E?X}nV_CP$(U3o5Nt1p&z#EN0-9YSX#v3Vr!L8Ges zN%bKW+LsT-vSFZ}`>VUH8Twn;h|G<@sm=a{-^83Kog8!g&-7QW8P!?mF?asPl6kIZYafQ{^1vcHFEXtUiD-g)u#S9wTkj)DuRvn=oODn=m2y-KpT; zzfY$>Uvo}6=rO$z%`Ll+iSvb6-LV-aTo$C7ALimA?g%WO#D|)!zTi5GoaUo#~L_jW`cv2MA*Ja#Ug;NZo4G zlNnm+et`^P+wH0BglRBLQj_N>s+~c;6yG=w%^03fv)v#n3@&NrZI{k4iVpoS@ux+S z-Aqn0A{c9oT*H5Ui#DSUp>-8R%D(2N&e-?srm5)L=RvH~9P%K#X@H}VB(fj5zWCVX zvs_iw|LCerBZ^Q`fxSu3a=(jf!f^afm347fEyua?$(BR(rMQY!aeFzh2G!3=N>KG& z#-rH71i5=5-B4HZ;2q6FODv#Q4*m1mTm4CZNZ#I zA4Vm*A=>v`8Q-zxx#O$D)eT_V@7>A5a`!J#hKTnp1m5R}1~o`}zf6KcJhRSi))|D( z9}vloGTAx!3$%LoCj#g3|G)plgMY*Lw^X}i*0h^$>oEHN!l7QoqQZ!B&4r!PZh@}` zIf<_fBwkF#R)t)J7D?1bVI~5TlsiX#sZ?VKm|C_h5ETs{SEQ2Q#VC=Yu9u=cEeYUQ zGwOAqf|@c;p}T7os(js7cO^B#gu8TqRI|Vv`{`#_Zs&^?^W~FD*VDSQ|VNrVb1Xj)LR2?+G;Zhx~iEEdTfO2uRt{zll+*JMi;fvL$XZn0y-=Ih$xnXg5uNaAVE>g;~X%j9Y(iBz(x-K?FI@x{7 zJW|}Tgn4kX{f)<1`d4G`NK!=-DN80E4vxF51dI&opkA;(%9=3^uL@<(b|u;@$>iSTCYk$-G(6o>Jr-@CBMO^WGYtHJ3bC2IBvV-ps@=b+#^Nd6LHc z>XA`J1!5_PN+|Y@B`oFHtdaT66*%3=sjQ)XL|-sY@*qwZnOyF;me00jbtsymkG0;A zjNpXfMalR=wO_Q^>z_V!6&-NnIq68>7essOo$%uD&<+!hl!E~tX*|842F|D#^70TOdFQLy=jJ>TSfOO(kt(D7SXbx%60c3%V5&qVujA{l9`1(Uk7jm zeI^gM*up^pJaU0h08d=_a2WXitLumA|17Gt{C|%BpVNIo^q=B~`6i+TC!+cJw_7Iu z51{@{6OLp4?_j#Y$SUke*m%{yK!bRjVE9n$e@f%O$^Cio58{FUjOI6`IQ$pr7pQ|D zaYyVDx$+O;f0F^Eu=^n6@}Kx@RWLk~G8cGE;~tF0QCAgIPCKt@k(55FnO$e7kosTc z+&;qTQoZ{d?*LInHzgcK=>o$A!|%8UDbKnW>jt*N5CIKnBeAobz;+^ zhR0uzVE6zLCT&m_4yp?bjc@#FT%Ph5=)ShH>;+Fa;^w2IPWh8L=Cyz0|BFqWw%(Rp z*HGsP!M}d`gXbTiFu-Xd;^qS_V2Jyu;P$BP_P|pM)JMtJ@-Ol~0q2$Q@LiWx8z+l^ z_P7yI z9J5u8YZ~zWZ~5Kqzu^pmEC0}(juZ~j24d2--7S^>2D43!DmZ~tvG_MJKoiwMwC#Rk z;b&42_mtJQ7~uWG2q@=wV2FF-_oKj50x3+|Kx~JaU!cr3K#&SIj52E-NBnQ`?h}bvvC0cePnJ{Ud+icTxQ#kQ?6jCvxz^1JU;1SvqP1kl}E5 zv;T%JiVx0Fr|bVz&v*LZOx~O;=j7ITFYPb+yfARK5-&`Vn|_40+Vu8a_)`=ZxDV-D z01Wf?sG&P3ki(x1ho=udQkOqnWFL3)Iv&yx4icX)uk7W!e~!NXmtMO526Ng?`2z+% zg@IlE#Gfvh3H}28M#KE{5GA{f~J)a;v}3sCqf zkQtfkKpSqh!v6iGmJCrx-q&}wWC?dL*gf9KWmnpgDbML&1q%ar{{eF<4_@yE`$tlq zD1lFVz^9>nmxp%mSDCilC_Vw6$2Xaa9$ATd1CH5uJA6AJ$0E{cO{StAQ7x4#?C`(f z^#2716COYb$D=$^2J*^&f^*vvsbtbI6Ra-r${fRl)At1{qTqmW&=uAn)p7= z8^82GSxJY$#NfC-gR1P8u)izrDNszmD>2atOmG552`bA>=h3AJunN7xiM9BUg?O&a zckMW+dNS3zm9@O=*dB4je1CZN3p9*?&)pr@gBu}#p#jsw1c8#u9Rzf89Mddzo^*N$ zjZk-Mdq|OO{nYVLNl=7e$@Dzt&@%m8ydfBNZMq^3sDp5X{B}eP{+;q~)qD^nKnKte z##H{qy{C6J?p|%;UJ#m+S@w|I8mHw32c1>uaHD_*{uc{X|ExyB1d z5c=$-wp_tm;PgK5>K1tT-+6)q;|HLeLE~5!h!Y4e1pj9pug(ndcX{NuKcCm^c_2L= zb_15K#Rs;0j^*#}bMN3uY49kZx}L#dz&DQIFisbkP&*7<08~+6R`VxM;1lUTa7K32 zw+h;-6J67#`YzT{(r<@vZ5}A<4bAviG^qaq!Bz=iB9V$M@Hh_mh#>?9UQh*}+5@0| z{w3wFI{;_(oW_q2&L9o*eb&@^&g{EgcTzwPTWFYHQiU6bT(1bUOtio`5%3XC5g7P5 z_6`nP26z+x1?RV*-&IH4+!|%aU90s1#?<~~uITy~s9^admK(XdWeWog8NLU+vw#m@ z`N3ggc)xjF(}9*d4Dd$$qh+9*=zdzM3ck2W*`)mis*hpE%1VEJlkwh?fA1lx2u$dS zA{CsI*98W?W&u<~_Z?s^{oOgQ&Hy5KHG#)}uIk@_HeCFgqXG9=0Ykzc4rR4F%sLJA zj`FzImv}DeTM#i%+89vb!@E+y!F)gg6a*)00R$ZUBjYb&fP%`Lmpl&EgbwoTQqeFB z(daX<&6b;1bv|Sn`izVE^6P@tDZ6+9u019|LGW39{u>VKtfQy2y(~$R zlJ^4kQuUEYjL%n7x2q9>#VCVZ3?hrCxX%H`(erxXJ`{2b++p++zwiHX0bp)P?c=+= zCcM_$+ym)Zg{{&po#%-zIoPX;?{csO!!25Xxz9Ad%5Scyir)fZU|_ocA0mGL@Ec9B zc;S)Y#*_8W>cNIDd<2E>pM-8(Y=0t~lL>ms57ahS5vAKdTz+-pf2168-TgZhAPk^s z+wfZGvZ*=ca&SqcZY{UjzSwH=p$@a>fw4c~HVz>$ZUH*YsQZGT~v!VQaLhMRf^*`qa zz&HHZTortF3#nU&Rqfd~Un)JjjTT&pb=qom-Aca%-p$We#Dy=#TemXbZ^d};wIlj6 zkGp|!@Sp2X7Jozgt(*TQ{r^7Zv>WH0^gqJ?mCFBNpc9AtpRopLBfS6jssEjY*nef@ zuW8c19{+1#;(t$KT#*?VEB_LB(nkCvyY7 zlRy6PoeWTk;{zkk6E!G$JK_x+X2la`KFD2%4#u$cK=*MmgZMSSyqA%~qS6{qadU+r z9DlbM7u#?=v6bddtpv;OF~%yktCAUm7zH5Yd}PYWvq_^-(dLb3Uy3X_8@`@>YHeyq zM7_3+p6)qk5$|0(aUkr55D_fnY6y6_4myb<0qm{FLB=8;C)U`Jz2pw5P(EhrlzTdP z!Vi`}8`z>ju=P5>p*iXim%D=S+vIuCHgE|P%p{6XY2Q}P(_;nQ-aA^oi{^m#=ywwz zX2hOqYopr;rl>F!vRrFauskZ{mF*dG=5&%%H^W{3JA{Q}L$m5k(0B5Wc2ELi)yZNEUrv)q>yes)@Ctj1<8 zMOPtWrtjB0?d$Bsghn?Mu^H>+kMTZ|7w6_~EkCxi=id}3zVc(y`vr=FJsDA*s*EE< zlbmguMA55Ze(m0}c-F<|Lu`B9y8fMV!LEI5ZOM{@D`G;IYRnFsMIyI%!9Ku=!nNJl z<5^pTA+Qwem_J#kb)hX%@r-?UPS=TnvifkPW{|WFZ8UF@D|Qqv;So!4k)D zxGsTwu>9Up8yaHgQdyruHh@i}6VhnnJQh&b(iOUY?3sf~!5ZccccaWP(fBd}4ZZ9o z`ns=4+v@Hgbg_Nv-kV>8!FWHa=eDW0ioR489O_m;sIyKn8)9J|f{4C2+MOh0hpDc$-tAW`O-iHv;OSVNmyn zF;u+t9rPycjC%P&q-oAD=d&^7d@~3OD>690(qT7up*DZyVc@e;U0}DaS~IO?J8aM9vT@>97?ZjH@3ka z1iCbNk8u)AVhO2XzmbXPX$m~PVimJgAjS5WbS4Rfwx2y}b+ZxxKK+~8E!l0vL8Szs zLbV==yA5`jUOv@qG}}pbt|>Z6H4X7mS=J#c$ZPD@izR7;C=Zf_uSBD8p2rv176oML z<~*Yy!R1*BdTHZfq-Y&AHEf#tFuZN|Fw=B%1!pw!rRm*EebbRhDTAs{pW@n&bpX$6 ze6Fk=uDmfJN2qxQCTA_JR0`*y7Mr8_jPnE;c~)qv!+ z{%wtdWG#a>+}uKBC09WT$5*~{kEMcIs->xtt$Kd4w))*DB3YPx*moy5dKFCYlR_`? zi>f>D8T&9apGE|!uKbQq8JQ{)4%MhEdWU6a=0|L)7WepTKB4a9)H!}#VYkpr)sBVT zDXfK$*qqmoxhwo@)lHP=rB@*r<*98<7ApD3-zg{(SW0PaQdM6nLlj*ES`_*f&LKr?DT`7WY&R(bP^X0( zst%N#wY@lR{Wao)uN_lCQtFR}Cak(i4f8oqZDI~FPT1NUzvm{s&Hhqbaq*fvdWyQ6 z#G^i3F*3m4YFk>ej4fiVxySDPO`3dz{Gt4C-&@S&@&=;E`kkr><_{P@uEbAT?kL(R z%KMA&RV}0lbhLFxPxN}rQ<@EcO|WH!I0^>i*~)het~JyoAKkKYi$dNzlw%t75f^n^ zvr*Q1qufgAM_4Aczik%SoFB*?9Y$19XeK^?&U2up`=o2|<9w|hI3B8YVSp~m4KqZ2#u(sZ?KdpXI6JNn1fve?U# z$qPQlc~YGzFC7|KVsl8$0@;g)GK!t{U~0yGAzg1}x5p`qdkNi}&5Ft))7DB4@wjWd zW4JiVi4w=H7uPSjTfX10C%!3oTSM`1od|8CJMUne37?}#+U*{f_5>}SS+m!89>0v; z!Y-?0KDdqCedgSGr~+hZwZ40yT|_bEKiYA~Ub410_PzM>f!Fxp_{4!vH%S})SI>+m zXnUCpC_~NsISrd-p4}+%&NFu-#xwPbykr&~G7_yJt^pg~i^~?pzQEo;yBGXz7`@^m zu!wtT1{c+V4@O9ugGfg4@MPzDmBT*hlD8bC$5MQQW`u=kIixB- zQ=l@~VCh-*8DAf^EYSSE+f#+2X*cNcVM+Stn_Bm1G~ArJ;K?k6;e7n*Vy|ecRyH$| zZ2UV)Lmi}Vif?BdH=u%M?6>uA!;8}|2BpuGVY_pSVhTEIlcTL}n>5uV(cc>9jpUs$ zZ{N|J(!V0~@9#MHM(Y=V&~w2>FJ5kdrjj{&>kpAXK0*FaL0hvFb_mj;)AUB_ia7Cb zO^V{My4kk_4rdMWDtyW-V)c8D(4iqN(MQvxD-0^w!P^e2EIy{_y76(Y)#+>zG~+H0 ztd;9z-Eq#cPALcRx-Hh;O{Gaq(1Yk&%acbcdeuy3zR2O^ZW~-D2+T!?kyfRR4nBMk ztUY|M2&%Wsc~Ts9!M)QRGV^jli1_mraYNXg5_?SSTeSjP3?HA8adGRn`O$l!y%kGj zZo|2xI@+#B$L+FJAJ1{4p0{!2IQs6NaYWih&SVF@xhjNI4iCl~QFJZ0MMZuHXxciW z3)$x*hkC7*u@Q(0e<5%3mqi=Xcj!AuPJGnoe>H_GntrD*6pJPfxktjcJ9Y3Q`I<%I z>A;dxu;HZ5miK)Wy4%Gg@Gu{vwjJ>+ax(JN2>)Fd$mMc z_^x(My)T7m!;sA}`=Tx9t^6~Do^4H&;UdB7i%3>BDB-rW$O9uo0Sf4~5@@M4fp2k6=<13q11U67k91^MfI@z^&vD&nB`bioa;-9Su z%@WpXFA-) zx^qab#o}?V|Fg9bEC@V63)}J~FS}5Vm6g?xU`)V1_Sbpr>y9EioG}s0+0BTk$4;gF0{k7vc0uW4DpZ%O7u&><;UEcuE`2eq<Wu%_3&v+&2xl%tx~tp3rim8#JP#dVjMxdrX6Nx-oyJrti&O z9&M{#yJEe%ylB{4sl7G>Y@Wo*##@SxF?a;5y-ZD6vs*h6IcqLXH)GSVCSDBCP&_22 zi#*n9%UxXHG_A3JvH2mhkpk7KYN%P_m>`n6xS>io!BE#!($NV^8BN^b$AV#;UFugm zm)fb($THNCRKN8=ymw7Em96@Ol#h$OBND_g5)kMnw&WbCBl(GVjy0RcY~*qqTf>;j zCOorq!{*X&u*y2cKkCj{2~3MjK?j-j`#YPR(e&Kq6E7$8KY~$BO&k684JZc!tT_dY zsP>34x%A!2dE9c*OB%~I18o9tH6yzTy4T0WyDoX=nJWx;Xr>#F-e`AA?1FmPmxxqV)yJ0>?9Fi8 z;r$j*_#$a)Hxtc@+pV%wx6yLhnnQ0R)6Ik}(XEYdhpp$ww|+qR^G zXxXq`-=ZZ1YOcLzY-r(tRhE4hbmju5Ze9|_?-8gMFTH7@USQa*4|nvTpd8?hSz1_m zmbP9m(dz!?(|W*Hm5s2&C7ttS1_iXeM>RdNWh?dJW}EiAoAu>gq&2|q?j4>_^QC(! zceLwG{w%S*VpX3O5L|=?l3bQ@jcumsfx7N1@RV%b7orl@=EH>LMZPQp3KrtAjnVV^ zg&Wm58e|N&kv*D{;?lbg_VlCPX%-{W^5Ldd^i5TiqZpM1pY*&(%Tr?XU+0!Ju<-tc@As<_n{R2V87rv7zY#0tklpOD2okGQR*wDYCI zy`@{$^o&{Uno$Q}IYn+JXsC_5=GMem9*;+-O}n+PrJ5hS=pwjxVMvXxv&RE%#zTG7 z@5E&sIOm4w>U87_h+D-CNt;F^lQ@=pIl@k{xK?%h4aTvbCo!%bDcdzwVF)fyIG+ou zADn`^)d_l`vwIflQB@l1mz2vBRQ*_PC*n8Euev9%li+wYYP1wth#VN~bcUH=O+ykD z+9DB;vd+ySZ4ZTX1?T`C+%hjqHQ?yrhNncM{Y$pZI*4`w?*%rtj>Qo36Eu9FrR14d4 ztERqsps`r;HTYXCJAOZ4^-tqK_REy*YEo_g&S`N|!~|L5HEZht;%BX!`9@mFO(Y(> zP@zg-7=M72+6CsV1pBFuvwk4BFX2qKC2(q^PIJ+YGm(NR@UjrAal`5OwuIXiCr2R6 zE$7&Gz>XT|)wGJKcBh&K^Ua%{3*$M3etIjizR?2^VeU(`Iz%#CVU&r~DdZcD*E-xA zpXdPbn$SZAg^)KKIHhp53UW+`K$)~;XW^q_#fQ_77AAd#1??hbh!@Sw6U!aE8xmPz8r=PJl1#TN( z`XbJHHXVPCudq43%fGfa*7LMxQQa2uk*sxB+z~0s7J7|Ze#roZ;<0bAjk1GF-pE-L zt^Mf9LPIuCeX5&=_bjO>`xgkMQ4de>(j(l}+R$^O;S|=Ou!0dZ^e~X)V6SQZ?g@tL z*S%QYWRkGT*=%egZuTpuC}`+jtW&8^!%d~_35baE>IA7?o_xz9f4@Peo^!uCq$xk2}y(6DwSCy-(1aVc8WX>joX# zj8jf4q_K>v(R$+*wX+rtq!+x;$oW|7Se%Zm39bUAK0Yw^9sFP=+#)v1nDyO@#x4Gc zoG6J_$fEOYv$}u^msdz*O)FY?qM90@P#m2&WvhbP+GE8|noEjheU&u-JT=zN0!yRk z4T^_t6Z<}D{&?9Z5``YvI-S7LPsg#!A#Pv176jlV#PVCqk$RBfMrdEFF6oAf^*K(# z_o05POxoyBPDyWO3I@sS*i?jLA~xpfJaC+zYvNJhkkJ!i{Bl-CCRb|Y{c!CD`j2g2 zBV?#h4IfUmK@VT?nr+-G5$(pxJ}~2mTVh+RPZtoa#=YX&^?ostd&zbl(Nfi=;l|2A zKh(=)$4Cf&o6{DWC?imNs1-_=SCpcOJB3+SG*iIpp0@a$7~>s6E)1<8c?oHl^>pg+ zxpG$RDwGrS_Vz}J`yI)xAf}|}f${A7CkxvYs8F2&wxvGak7%Q68$r8iiD^U(xN;$M zXNF(gr^I^83F+#*4R;MBjgCC+uX1h#%F5u}BaS(Go_fkgGbY$Ev`A9C_`upCR%Xx! zB%;$Dy*-JB5lhgF=!)`9X{YThhZT)3$yB9Bg1(kLDO6|Av7e3GH#TQ>L&nGpuWscd zaV(w{C>!n$wB28zu7ifMD2&vVj$=iY-bzQQnLDYufPAln4o8%OWappFLF%~@XNth_ z1F|8kebX`S)afvdSS{#cg{(6BIZ3UiyA@S<+H*^`>@|8;ibz%?4c!|?`wE0FTklCl zZb~|`S-rqo)?p*qT&!mDy%Ch;rD35J)c}x zPU@*0UYt4(9XvlRJomuX4fpk$DqmZ}6?OT+8Rc-{US@gR(LReg_c_HL<=EY6RfKBV$G(QQ2RE&9M=l3!h^)s zv>n~V@^^J~#RP7qMJfhVL&#RetJRH@ypx859FHi0UuSW(AJo>+ybMus+%a__;H%hO z-l#)KKjLU7F^|!0AsKAewCp{6;Ab}L;$8IS!pCktlKX zA;(_R!g0182U+|~;`$&LO561!7++zb9GL#Ee1u9ma2ZE#VwcR{86TiJCY3^)PqVa> zD9|BAuBKNU&gMsV90P$<{UeXb^q)el z!Zoh)TdI;nZK*ei-$h*EG~1d{K_@%$w1smUBjsd-NgErvXXfG+#A)(0)!mvk(udyg zJ`B+hpoD@E!DQO}Hl0#PJ;6uWY`v%JwON~iW-Ho8L?X#y`4~{|$Z?@kAv+KeJH0D^ zf9-0L@4N11ujHrw+8g&W#hm$q%|$QivR~jT5L)6xp^Ug>P;csuZM?Po@@I?0=^Q`{ z2niu8eUd7(U+A4CV-Km*4dl!v9~ot&n;Iu}<32CEmYm$X3d{FSklEtDu*6B8l&vMbA=hjS zS60l{Eecwa9mdeiN(8H25*G{AHJ4PWAIo!4M($Xbp)_-XuGd7SqD2@=t3vs;3+xZ1OZamUcFro?5a8`~@Fs5@yHU29Ek6+Ya^yF%wnX zA&2N}e<^Mu7h9o8_>91!fvltGHY(r|vsqPB@X?R9_VAI4x8zahy%kBs(#IHmd6-NU z?vJYyXzmi1KDFyzH4zwGsXmh6Y1>uE`Qy=)vi#)bXL0MIAY(N5;9c6FeD82Q_Fdy? z0x66~-*{VFNMME^-;E|Sj1-vG^c&zGKzFs&bZj7#jG=riXvKM60q<&dtLwC=4|dI< zl14QQaMd@0SpgHTf7go$bzB2U?W)Mx>PBa}%ze=z|NgL4Z~3BHftFe`jqbJ3Agw1U zQ0@YWOTkxE(do~kC@*)Md(cDhQe!B~-*Y69+kfueDtwYFJ!-lU^x_$oAC6jWe{w!m z7rP&8C5Yc1f={mbwcyDscS7zy$+jyu z4C0T~fi`Ww_Pz_yqDMcypQRT41&WzR0bJo4T0Q1dtouxH;fvGfL8_fs-@AIzxPXci*_ z-ywNL-P1`o12^FpSa8m;87C>?T=vLWmcqg;;q`ZaL)<-3h`*a+3R>h!meMP7FVDBmVHbL%^!{zDj=hO$ z4up(i>d+U{h$vhq7ijHJ^a^~1!w)iVuxW2_?oCAqo84|`T=3eLiq3_ZN1bJCYro{1 z7<3g%JNmOV(cw&$d>&1XEyi>6if@r0ykU|m6eT`nF{>`}(9^~w_X$y34Az$9r#?)k z+&b4jwEQL`VtW&zV+GWLY%Ph2-g^n=yl7-KvA}m1;bfeOF+ziI?0t@v(#1u zC5@Fa`w%t6>pG8=#z%$moH$YK{pN<;EeEa$kWj{2{`PIAMW)^EE2iUyunYbig5615 z-9?nD*g)g*&T|q(e1FC{(!x16W8e0WO8*5@(cP+@op=jJ5n-v7jcy{61TL0zu_Tm} z=clh6U}I)Hedy)VzW(78BanyK$B`+^z4zvwFVgLJfdMv5J-eWTUn|oay6aWfTEi&A zi;`2)WwJhSuON6IMkKSV4b0U#&`^$Bo-D!H{Hcay&N)#|Tff|*-oG-!*phO?erQ^B zS3~1iWLHCq7O)OjcP}07Bb5?HLA68x%hQb0u4b&wgrxPiWPsx)X>R!o8__p3Z+lDI zrA0f>FlC_%d%6pvZVy}lPu}lH&3$psr|!osfUd%xmgiTT zlC&U>t$|@Cc#=x-=(s6h2^Q#ACosx)AsZf)#LURl!gP!Sr z`!P4ao}t3e`-*vU)CNxA3n9x@HFAPyHc!&0dzdBkOyL#Wx>(ygwj5=4$nD4Wlgy5K zrWFp~l1EB-k@t`CFM4j0v$rmJ4827A_GQj^=g@o!N$XT=l9Ok>OTIm%4t(%tQMJ+D zQ`Wbe**Z||8{PYqs{F321kQJ@OB*dQmWEfKmUbV9n7_m8MB7&-i+fwts8E8e)yA=$ z^9i^R)-MoI;n4+fioF5u%%(+o;(*AR zp1Eso=+G$mRM2R0vTzxZ6y(^XeTH<-(jp+etJ~`7`>1y7ZVTu2k#3_Ck5d|L_Z=Yz zZ1eNWp)sL^A>}gh#jl*fP@0!%jbB>7dNd%f`Ww07h-*Y;FrGo5e?#DuX=nZ40_95P4$3gLsZXm{D=eN?b{eZEZgg%VxjuL*RvtOVW7`I=K zSWIv7{pe^`E>wTqGJd|AeglcNO1hecjNWG>1~2^mR^}mi2jT@6nFENev-ZY2*dfIG zHgg)Wb=ux|&vgjtg}5LTZ!?cg7k`1$S^SD58N%6qfuuB>V>FvXHJc+en-qQ=U6ORe z4oKRs9Esa+94R_{5EF>{1Mz@+*eb;3ie?dkaVef~58Hsa+?XyRk}k!6v^UBF!HK?S z?=_ij`MzKrkG~#Uy_a>=INr3}6|?-kT|B|`U;9%qP=O69NWcF;AS4119gn2CxpQ_v zTxBQz811pdkCXq{pMw0?{*>bvd9erwu_vD(*U8snnlxSFr+_g+*(%y@_w^)&1>q0% zxRKNMoWDTdVmt0Ma)A?ra}mjJ(aO)InL0@8oeD)>vhBtVwSO+9#rg$$)ZUW~!%fUQ ze&ZZCbCZC`=Rkf%gXOXa;LJ)i`tccco$c?Sk6Q}5{4j=l?_&DV%V zj9##=MaT9qeiBc~w$phts9-Zjia1dgcnB#MQZ^J=zI7aNmU;$twYaxhimw}^MLu$> zLPWWgnrEyyBgsPjk0fX34076UR9A^KR8I#Ju_}~W)aT~#a);-qktr~1jh|SKio_o{ z*;{o^F|NFdUrZ$(PS>6P&PDR+m0@Jb@M_DtqRtG7CteA&9VRu%w!B2N;*|FwTA^=% zvM=J}@GsDtsG*?eyfuY;F^^z%jckM)Cei?M4gb$DNr6A=G5LB+yp~6a$bxS8%mQo!ZC!*|NP4 zLYn?H>}Gr=6#5*BSw?{*>DLA;GLkr4Q@%AP2d(0cg{BXpwgi^nL={zkcVs3nHOKj; zC-<3(NcRc7Q!E$a!JYK!3k2;0b@}z_^;Y7y7}*!wS~*Eh3~xDhBb?c}f(4iInMt$O zQ2bW1#yNrl-u8K2jVCHS$ehiJWXVd6I}~RSU}QfNByysE&OUW1$r@=HG3bF)6eTrA z5VNfPKG|9tveEbgC)j;pPsZwsY7XeU-;0q4?AP92Hr?MYsXC2{(OgM~PXV=u&h#hq z7kL@T>JHy`kwD#j1oRT3RWn(CfP%oZ!ujNZbsse4*SVV_6_=dhhxeW7N=KufZF!23 z8fwzl6fX3xbr)&!?BNu2xo6W?4<}JM>eT*Xn-V<3b_zzQ>#)@LWjVyhDqT= zRWy>LU78j6`qh~F_48k#*&?&t@Z{l&!?BAO<0JXI{?TxXFkOX+Z|qbstzo@si?h1% zj{|3ww+k$_ME0|K>C7JS&kI+jrCjOUlAmWe&9)}(Ik(D8i{~dJLKMxOgH;@ohnvPV`up{S=gN-!L89Yr5U?ykfQV zlG9=ao_kdZ7w=>?7+aW@ZJ*-#I0^|+#DxaDyhDFV#r)~T8?TTfhnh%&A4`<+N&X$% z%+=1d@>n+#2Gg|DK{(y(gGnsH6HiQ_jrJ2M1|Ksw(`6PKtMXoNqIi%>4MbThh9ZzZ zuHfL}w2Z2GjHUK^Zx_lo*DHn|GV@MSdpS+#oGnq>rSu+PS-~03IJ}n>3~wJ}NJV+D z3$R1q7Ni1S&6lmew?0gyJ1tVT=6#>ep@{&|B@Ov6%CGZ_V}8l$3e&Q0-{dp1%J;W0 z#JHo%v&5*X6>Uo>Iyn1ER*zABRS)TX`Ru2`*mwUe?@Hx;;X52#5=BKS)k_^c70TB9 z_0p$8iCi`khiBQX3SnC9SgvSK> z^vY0l^0%`%0bBow-Iq$Io6gFiAs)-$Z|o)fetIpw8XF+Bc?iIUhPxDo=}qz)F4&1gU2ZFqhCwH-jh)5xSqxvlHpf1 zwf()@hB~wzR4A?Yc8$IF#o$e6gW~f0qtUeo?oQVr&@*@1>0|TqJ4U`aCNE%flrtG2#do3WCm#sDCvXk|hZjIH3y*Yffo5zjO)Fz1-+5i{Gb`}LWL!UZq>ps` z6Sb}g@P&e~Ub$2;$)$2|Ovgmev^D=kz6dyK64JWF%2Jl?_CZwFAh`7Zq3o@~+Iqsa z-ylJY6?ZG{?rz0B!3pl}ZpF1NR-`xuf)m`m#fn?8QlPlIb?5)>>)qFPuutCPV2;+x zHM3Ucd1jt_es_Yw4_`_Gea6-?4!dX|>$@MSbaOsPxcmeTJ7c=hK_jNdf|Ql#a?aDI zy@M*O9wRcx>ya^ILxMFZD2w_p`^Kgl3C;_oo|1J?=UfWd8&=H4=5IWnwe{FsH)TLh z*+l+z8tcXc5b98??Hx9ly-9o)Sk_z zxq)!#`?X!(sA8W=Fh(vXx-{9}j+;K)@#KO+QYK_5#Yl83A z%R;VtS+Yaq^`aU#0MZorN@^7*;}Hw)^C=IYYY{!i`l7|$y6}#%q9EFCMNabS967jdL zk8F=kf)blrSq!Qc7GU~5csapn_M^Lrjm&dV;KY(!48lhl46g>;{oT@SH)IU(la%5))X#HDHQ)QiQUXRl*D}*S#?X4xrOy zh9_nJVK%nze&w98aHi;VN7fd*k3DVV-sT^>PH%r%_wl?et8+v6 zSVm~DPSTZQ`&+do3ed;G6II{mXrQw%`vW+-;bPz>)DApq&>3vjYP(V*~L9a#;2qCoA*tHsNM*3kj2}30P-junT&-Ue|r;^|R)9fU}Q9NFf z-KWrp;SmX{jWZ>E5HRV|^%c33V7*-6w28A)2W=w36lvY@)d@P^ExG`W(W$MeT)-HH zQsM3xsf=5V7uD~B;O7jJy0&vakqA;o=kKL8ffORT2g?F?Z-lxC-XYO6?}LO2jULx` z)!x1V-TCz7R!w#mrQGSxHg}u9ctbHGbBP%g$TR~I5AHzKi>b&hJ4gF|rKzlNGpXU= zR04#=G!yE8w)v$ToL1S}@`TAn*jY+l)t3MM zT-L)zdAjm4lN3L9Qe&$ zLqYY1(%uOHl~kUTLCU^4IN&7F_VWXcTdXW&?FBYs=U|2uC}<96pFL%g1h2C-2*{Nx{S;Y9FsuxH!lzCM+(l?z}kKTCiU!5l7FBf!T-}jT57yrPsH&@cDW;zmBvfL>h7pDPv+Gwuv}k}4cP;JD z@30|1_NdkESsDfhj9a2Bcldeirr$STREuIxh7Ih6NP!X4_lrXspxuNzpkxL%YymCZYUb8(%>}MMykN*ay%z8uxd$>lb zQWJ1z8iC3OKV9OXTGSX#_=zeasG(beJlpT5wKftdtzD3AJ6LPdu4L`Hu(}76*eV0s zWrP%j1T|Q(*cBAxuTHbeXB;fl_4ir3F`st4BKom-mCyk3d@}0rPC5uUBH($<5+w4= z0jRnYbtCrrnwMnO4b_3_Kqa6r@V?-jXMyg9QJ8s|1*_tTFp}Ob963ew_=r178JM-A zIH`faK6A9==aoDuY~Q+C@9atacz1n9V6j~L``KRw2 z9%(Kr@hmBAv51pJ+}D17d_TZ(<|pOvNb7K!#OV7lKNTQZ6O~<#0^kKLW1&U>gY$sP zx85~?>m&zkLw`(FWAyNH;gs3%Yv_1|(#T0Oow8VL5(ODa1%RY;qWxZig6k!&M58 zb(UukE4xGI8(TdD1;ITS;G2m`VJu!rKDOFR)H!W=bGc$SMD6xU*`*+azpQS3vZ+Ax znT%>xYgMv`NYDSnBF^dO?^rl4C|!qjs0-qZ2)8#;Tit3@U-RJ%Bp>f}VSRL8y-v1HqhR0it^$Er zMV;R$)v(r#nZR49Bxk- zzT<%FjSjgLlJwx#^784S=Vdi=CW5;)HQaw#oWqV7vFMnYEpqF2`4pJ1b4tKCbKC_p7;=1MX_dA| z<#>0gk}f+^FL_^$?agpHi!*N@qVw2;A6^UBddp0TQxAP^#sz)B3rs1`O+$?EV~KN4=LeX!Nc3E$>%&M5H|2`AN8sU4w9=I^qd4 zC`d!R=5Rb#I#RD)2!<>N2^T_ajUQ`Z+1N6lYo?rlHdKm(O~!lH?VV-hmLgWu9MG&I zLCm0GT(j2jrmktjLhNW32?xmfBXl>Wf1$g=7K_CdY`R^i0)!McDn|bUEXZ;oZG^q` zGhT?e-Pet5B@Sv);;+g~qNpW6W2F28veUSJ)ww^EM%*(oTbQ!DjG{C zP;LDQBPL42)S}UOg{ORVqm9+Gze;1*c)ct51v~;b!h{*fVH73YV7)3A=ZSMm!JHv0 zgt5LrfetFF2nw?3mUp)t(5jKq=F?$IczMCQmUXfuXQ`9JMd6Ew#bQ0kF1-G5c23<4 zlbL$`&F0_Xk%dxw#e*;%|ueeH34AxNRFjzq?6}&BmjAY264T%66lN z+3<;}mXf>eUW3O2VBMFmD?b`mHGVF#+Ms(nCgc(Hyn1X0wfKAATE*Je+}y)P(spG) zr68Lv7@5H(21~iC*W0?Iu8QEA1*-IffIF1Y$@(g~f}r~)yNX-e;`0C-;03<{?cU(( zQo7@;zLSNnuewkeNdO`|Q_5H%F<8zSD?Fh@FU;xj=G^!VfM&S3aK5 z_uCE3mce+F)?YQh`&Wy4N;wTn^%O+jYc*6xa84VwV`XDcoY(%G6&Dwv;foU&rDN^i zkf)4X%}5Rvq3v68v6$!|rWIdI`7T^Mgix<@l~3dc*=vWK8)$vefQr#njFI6PlgXNZ z&`H~aBw)ZM&SQyrUMw`|XNrcC5EFX7hT$83Q-=KL7o&KZ*$8J=;s)*ZGNVv>Wvmdw z9Ewc^A@*K;Im8=?5A@5T2|OJsqYXtC;by(TS>fcsWL>q3lJ2_)LW(p@+g8LGPK>(4 ziI4ygYR(icftZpM1z8dzU|*Z00y&>2k0ZY2cYCYFe}LS>ehW%t^KGQ}yd1?7zpE&W z4JN~TEQ=Www<=oh3-CeI7Ego27Ngp}c#~Fu?;^Zc@_rA$zTPxB1GNsj$4z? z0j&xBNc3)gg_R#B9QUS%IckxLbU7}OulxjJ*XBEkycEjRGR4p;@W}8KzGwJ^sHeCD zfsA;Y#$Al8L^keR?%%E^jyq@rV+WYuPII_$1?g{a7@Na|CFURK`nubMT&s1Z>u-7o ziZOxx5a-|u-uc&! zda;3O)aUEj)kBz|2zP%Fo=gE+B{)BQkBZD36s0*stUs$XE%aRYqY|;b;jpjaq;Wib zQLMaOWCe=zi*{ZQQOfDDSEWqbv;U42+tG$p(_IJ6tV%n50U>+7y$h|f>9I89+)ns_ z#dekP@M;JxAR?Pgtl_JJ6~ zlgpNPi=&|Jh#cTR-@&Dd`$jcoXw?=!l)CK9QEzAXL5;nhjIPg*BSA#UK6RjJPr{z7e{MG4SmMve7V&2LD zF8uYx807SH?{PwJH}W$l3|5IS+!#Qgk zTLS)iYmU+8_Z~!$)ZySn7l_E4trMu!#4aXVQ*TFf=K|%Yh%p;#o@k5p_b`?M@7K~! zh{;VF7mEya|FRe1sUoPQm>%`T7*wqEW#4N{GuYm6oQ2nJJ6&j0hS}_`nTBl?on{Os zX9v%6S|+?kyZ-@*X|>I&>ATHR2kIFU&v$OCU-w@0Z|>3Sp$N9i$7a`TnTw)4KGg}F zm`ISOUHd#PSFFXcq3c8(<45-L#Ik|@hD*G7_qQ;#6=mPyUmPU^ylDIqoA(+_fZ=gP zmw60g>9!y*k7tfqAoOECns5Wvx_KWVkawHp5U%VZ;B6k0K6tlMV+HykOqBM0p2>zn z+u0+WIC5dm0d6N_Ii-PV02rI=3?}qn2b@U%T0lQt_%svYkJ9deG%gN8qqMm|6-a)R zKUb%9+FKZ#Lo1pt^}J9Q$8v36HAAQ`jkolUe1{J0z$brJ!#_qhRcRH4ELXym^E zYDj#K&9Rpe-rmx^Qix2@MX+OZ%SPPn?BzxnlM)})t4Gga^ewT%AK_cy;<`b(Zv`>y zbtqm0zfrb8Z!<*U$U?z{mmT`bkn8}ir=IRR1AEQGRfR=5-DVEla(J`)dN%AMmK{}mVvBGW*5r?_w%WnM;+&`AfYzNs4cJI>vJj01Ym0ZW z*^&^c@F)3bnpAcjkyDFQEEP*8*A{66IElJI1Tex03cV+g#VVCU0C2K-&+#Wxk-TN7 z%z0zid1})zL{7$ZSr|HM9MwSRoc)*R&f!fpL3HGf(S^Z7HR?J9|GyO7+z&K0L_k2= zaBhMT5m>&Jv#JB<5u*(XWM2ALyEoS#>!@aC>eSQ?6>_E{<3rtSn&YpkDN|j%r4581 z;M0Ds9sHHLtu}1*wmh6AVSrCyM4`AOz#~-9OFT4*5i2VzbS!w}=Zw33DABpXNuO;i zkS1*y?EK_idcYR=iXaR6#9tee>bCpD-FNqFffQL9tIF8$SDFHIk|9EXYQOz>tT&OS z2jen4maeOu3b9^sd|Z-kYL_w&s)y~t<-1CqhM^tPt+WtSACfalE@RSfVvFmpb457W zIx&3?fO2EE+}07Piq(UNH@;$wtpav4OW&K7y;d+IS#6oH0^f4yeDP%IkwTNsq5FvC zT>ZD^Q0+nko&~ek zXPFN*Y=$9N5(PhEY+rmF?_2Nt-@f5`V3+>b|VNCM?hHn^N5;5kA|_dhuaB^(XUWj8QTcvQiL=5RO9(a2iu~r#eCpO)`2K6IYPp zHg&mDlp!Zz7`DqmywKt?N;tGJRR4Y7Hm-1=d|Zt`yPDhZTdR%Y0V;7_X8ij0gD;CU zQVx#bg#p%d9Xnz2hTDuZyJGm>tHXgRC{!=4!&sA!k96Rbjk-Fypj^R3VBE}kyISf0 zbP^%E76`klBF3Cr2v8XR5!9fJLnC75<3Pypj9|d>VPz5Q^wY8Pp!GW6_8YbCqItT~ zolR_KrSnZpU@g}kUgnz5Ppe6Kou&JuUEYqa^sLA(f~?F2dV6sKfyT80ACJE(k-Iq2 zn(&f&S<-6Cp;{XT=(fi3j*Ob|R?k(VX}bZl;m)9F{jqXwUGi|$JVC$rcZHpWgEf7H zcynaF>QPP}%DzN%L||ikQ^MP6UiJ%u>dFT*dQ4q+#CFz>cS-6U)gj_xoL1glhqbBZ1eX5L=B=ePUxaI6KxeKt-lek ziIx3Q!(;ed(_j&}OzHGy-qqQvQ*&49OHKY>t%8amFydp@C89yaS?L?2kI~X?AbqxE z;Ci!%G z#)aWGj|;*-_jmki@7$3x1X@mVtlvWDT1ZZ7He5b3_lhcnBHTd`_XaQPuI|#ZjC>v}-b{H^ zq~&3nFv#Rv+`d~;iz=I0z1MyCuuevH>xPzjj(DCv{Kx(uBJM`0YWrNZp<>M z`Q&7fq{RsXuoi0^mhDQEeh`%gK$i}nnf2e?WXy!3GH%SOdkA->YYnzP$>byTo5XOK zpU)F|*V1Jz0K%`=R4xn*i_FmW8h#fB=v$T)V8}+-_j<(dW#%u4o8H%8)*BIxPJVsA zh_eqKqFAJFMrz;^@LnCbG)gKs`*Qz}qT+nAYm? zslJ>S3W{0}?7uOPfpzIhId8I<38QA#i-r4>^{4z90-^W?7-xUmE{xTc*O7Ifq!+(h|-iJTwHBsRGq4FNz z1N2sqsH=j00>shMy@=?tPoHyvE)Jc|ia0IV@Xeo-Q;yN1BB(At{JCodt)E4Y`0t;P ztFk@igv=y!QhDdBx}MVmu6x#r4fBF7l>gb-E-&;N?z~YI>>cm%XlufxCa_9gI#8tD zd}JPdge&)y+V9@G9``t4jY?n65+A1yf_e9E!1yoq#cnS~frKF-kJT>Ole?mAiz}Uj z6$ySEehDq?phW`UPjeff`+675KXFaqiJPDBR5YlL_H{lG3~os?`3F!VDsBtCB)ewq z2G`^?4BDJjyDqc9?PII$*8?%&_?Wb%WZg^H+A(IofGrdBuVXptxS3l_>Y8^5cR%G@FUia^lm^3)r$jFfT=*@aACg3R=`MUK~ zjlF6#>1W15%P8^L8W``NoVOb`RI1D z<3;GScRcjyx%ISnv_i5Y{wCPELe9^%u(L_abhU!B(nNf=EvVPK>>r>h5bl67(=F7$ zd18JR0==g0ctJhwm3gY04n4Xt?|1>9_S!tvt-$Z)cUttqweE1TsA;3U{woBew7=T; zd-}2byz2Z^AP~nKE?)`zPriZ+2Vo*0!9T$Nk+1v@UL^weV-XE^gLMDQ`NeNIUM2kh z;8o!KmH+T6kA#B&EkAgmNp9wBgpdB_-PvYu=*!dpvYFv{E9wq6U(x$tU-`edpt%97 z-)R5rkvbb*3%7vU^ixKe8dj)st*M7S)%3ujEiU1hTB4J9WF<NKo>b%p!fP-+v#i=2f0vEDUl&8E2XZ`^|0UB_K+RQI*@@tS_Ie zrP!aoNV80!T^_kTSqQ-+M>BR)HA}};N(_V?bo*T!4D%W=@T_G384poqud3;)4crv^ z6QA}L0ukt^3J^x{YNrDV-?-5@9NuH+OLyGIUoc6V@5z`%`#yI>2swHiSt$oDDHI~Ul;faI7%%N(+J4OqTx&@wcs}>RRKp1{ zwH?k7obBP{s>;fpZTA*X2k#{;o?RQG?SYKHla5@uIJWknF?2Dye{?EN_Y_sM4WGjJ zlr~2sBX~JdT&0lg<~O$|b)GFIPEtujTqUo(gD}qLAI?Di;sEHgKH%V!K!LuasQ2JS zMr-|4aK;vz487J~`&GA471hZfZA#aH>My$s zhn?W|Hzbb7J2-dz&cpS!TEW`D2HVW1AAS01xubn)3F9&DZ(8Z~r`ZR*C~oq==gEF_ z3LA-jN`vTRqHLKg0?EamU;R9C8U+yTrG4*5l&_6tqKuzSo96f)Mm%a~GhQt;H9!6X ze1Fs0akKCRV!haoc`v7C8io*?&eEKWG@`%fu}+9XHi2Q2#Rm7utNCjZ@$jPY-!B#S zCF=9ENrq0{%^n<;DleM2A?Fm{-AFw!QrUK;He|zv(Z#F#$#--ZnZT~qgr*HV=P8tf z(lYC+z6-9m98+n97MP|h(5|oe+^4FFh`y|;qldl^scrqVx=t$cltu|}3}VzA7AtGD z+Ymwvw+rZbq18o@eR8p}rVLuz5}hA9aZ6U1z!MPqlB;?kum;m_3~tK z$R`7+hy!$4NFZYZG0Ye~#8GwnYBl5g#pqmA9X5a|k|7GW@81p<(+9bs{Akq9zo0~O zxN$&wv*86zo`A% zlQ6JGuTfQ(BPm#=f07TgPd&kVDVBmMee&TwowRY=zhof)VY6+#1<9UKLU4Aet;(YW z&JaAbDofJE+e5f5y+e;(ky&`FglUB|tCq@Jbk z{kE-^>#+Ybu5zkZfLwN+k;iMVM9wU>SrHapf#iSe4rVEFM_#g}_3apoIA@`-j-}rJ zl>1b_p;JaEG5)B~yscZb8#-|H`A9eKo0x(yYklKSb=3O~8uU;{#w}S0LGaLlezzXr zKK8flK!h|SUcB-m)+}zB!5?MCR^hL6q*Y_==VKBl@6RQ+^UX^alFLD#;RvO}u&@`+ zQ#f_y1&#of>V5qNk7M)QWQdd5=Qj+z{fWh?Q#=g~IrxMWyY-H-!(PiqPxyY;eeiaSBClIhIp(*`p7Yqa_r#U zUWE_Ef8GDT+oCTy07|4e2Ojy}11e*dDgq^Ike{j_mnQ-toxxZB~A^b!^H+!l96T386CxLO|tP3(ZQ2)xcs(MT(^(lRJ)pVQ7-d5(7?3O#7 zUz{c(zv?s~@`geh+c#!K!#X{ zS=%Kkh*pWzc^d`^Cm0r3CX;~(hrq-J6_hx8bEkc+l)Jr`KFn_L__y7Txav4Nm*=l` zL~cA{`DT^nb>!)NBjN3DLab>r%z7iB;Oh-US&0SsnW+S~IuSBLlIk;0uLLT#a%VA1u2Y&2lK<@Us%|WF zJ5!mcI(2R~v!6L^K#77EwGW4KW)C6#g6KaYGqV{99>Sy3?E3~I2lq{TU&2&a*ULj> zQCxC*iV;-KDj?nfB>{@W=1s|DzE8J0dDJpzn6|S1=cK-MUlAi(3+pnjbipSa8^sG; zf=ohP827{@b_J@bi`T@O_%KANbHsc50ld z((l34k8wjrRgqXau=}Ur0Zf)ZqFTX<0}q4Q(8Z#C38Mb+it<`T#3GQAJZqLqNpUoj zCmGil6$&!e3GZh0!yADPm9LzkMxi%3*VF z8B7X(@pE18^gYQpVjcV4pBKoJS-+yOnU(}IF*5YppLPiM^(A zY$_4Lp%JkHAl{*Od)t8)T(a8!0*_Q^&U*{oN(>e`N_xkMg*N&@#?o&-#%I*H6{qEj z-#&BrvCm)Qlnrd)nhDfW**)#UO|z)aN?xwRI#Tbn&c20In{qokA^a$=c^=sltcg!Z z_*8M@!HK^>AH?S(S~f(on!|cEQ=WuH&!AG51GB^a==eSyNPAF*qp@}*0AE7#54&|@ z@>Z4IjYIOYuR>d!w12%bRO`#D=p%ahw0g&k85ot!<*!Hp_XvKQvu zNbxzS=)QbFWRN}dwq#9q-guy}5 zGkLbhcQVhFJDN-mWI;Fm$+UeI(?y$yo$wa|8AC?&=he4|x#xpd?|%T%uzUaphA7-V zdaF=>sgpzyHznM`=GrrP>0L#PQG;qwP&IfGBjqIJ;=G%63(Z$WrvM|48V!iz3#=G@SVXjrPk}M+Q z_%;;@e!IES+k7V2fka^-Ki$PFoGTzcK6jHGrDEVvO5+;MUx6-yY&EWY zR#s*pckxUguTHxbm41&#IKRmMMIGB34N%ec6*!~NwV0>gyfF?QeU*D- zSfW|!C>2cYGxLbcJ?lYk7P?S+_6x4k`$oqBc*xBz6kPHK+d4>G=;-I#t+OVK|A*6I-~ki3|)=Pm57Ja{S#?bFYnM%{s3QBKcdV-~-YiYeXlN+^AlrnrWY zcptlL%j=AS=q}5{<(^cyDtCA_kr9<8!}MDx!v56PsGEjnp!HhM9brDLQWxpo9KvfM zp1)*zpW!G2q9@+lCnc@1&!-sT1BSY`AKyv0MMOCsI64Mow>Hm{{mwmBR}!N9 zn&}=$&)hP!vTVk*4T?(D_d?G^yxn`CHl~SwS?nuaoPZwA&7ZkD{i+_F0PFrvzdlqu4Q2O4tiJO?$4!VwW zfCctj`CjCG*9Rqnj^Zl0H=AYp3#L)jm7p~22*O(i>_|R}pQhCE9T=X58jbq?s7hXx z=AC3Jd{)1U(dBR))@kT+4yjNmRjB^f1u&S0t#7cKcbc+2>B$XH3dV(`5M*Libau=d ze*()(l4Rhh&{T6GS=k@`Tuw3-SG})ivyA)!?jqky6Gp6|dU{!xgq?u_Nx%D!WsC=T zIvXHp>vGd`LT`UgF!bOOMdE1>kUk@tA~<9T!O%kKumB&u+7=O8fb*>3Xeb;@b8`D3 z#F_9HpMXC<1A$lw^7P(A66rT?`mN2wUktdl^L4gu8s-O-r^dl-RMipKhSLyG#hu2V zTqWBUPZFLT5UpprV;fjg)0l|sbt%l>cslV6?G&npqv+B7vao4t^g>=NfBVRoDSNNJ zKr+s>s2YDI;d)8in10h{dTzz5fC(Bq-90sq3jwlwV#KzGMLS%i+~ppLcH zXANlfO=sZ~#Jxk^kkTrm>98EE?1HBd)CYfF#KXR&-dwzX#pGeiGnAm(-8;~;*(*f< z;cPEyY2IzXw*4+i)L{pO;O%3-ZT}mw1d(Qjx?PLCLi}yuu|{^EbqUf<{>pr^ae^J24U zxDJwK5FL2n&H7i1R$LS9S`j>! zJc%9Om828$POmcQTFU~obXVr)_9Xux#HD9>inDn%Ojn1`3Ial>A@i47`OAOPebm{e z4{75qoCFH1PLia{oGmX=xerC)_K!}`Cz-|y9hrqjyIhLv^i9T=(gBjBxx98^We7T!mvx_J?V5$GCGbn|^K;)${Dg zwFy{|cUH@@K!q%N;)}#|?-@^fN&_KG$R`BAmD;%~D_Z!ln41vSl0-Z98$Hbxdo_7L zp>>^f;p4Fqb)CO9+;e!IjXN9dZY`N?VV)(#lOa z%S6nBWUD`zn5*b{ZYKSQ>JAz}ESzmxLefbPMRqN%H)lDORzfF{4cPSo^5>hW>?!sh z-P!krru(VFTo*z0@cC@6L9-icqg5vRNdgK9{F^L2jDR7=`~Yv1a!nl3)X)AqADq5Eu>`bOIW zd%$O$+n?-(wYh427fpO+OuRtdf`PKgClvXsUDqiBBa&-9$F(vy)+-wPnZ76bWEOL; zeS{WF5LEAWtww>Y)o(?L^h$i^LG${4P12k>{>2h>&pFo|`l%RlD~>}myc5`ne6@33 zWuMianB@TkC_^0y9JA+=-vNNaRjJKfi!fa6Eu00HE9!eS>=8E}qnf&diQb|mu zygCJmLOvHPjE_6PO|QfJOgv#j3sp-gF@)5K&i4D|8?KThvE!ppZ=l>bW*yrnsYqcZ zM$n9Or$DfP$ViTK`EbmVkM9LhXP_8%0N1upLy~C?^ZbS*H<#MT`%W-O&9`E!I0M|L zQDD38th-9g2!J5-x608z@ZttlQy{!OAGln>A@Q080Mai{RJ}VcP$*FYRIVCH$}5mq zl|Fg2l|K@5;te0@%Z(Pf*)MahyqLRXKP3Tn`3%NR4@j0Gd^a$S$xqk^#J)7+Z?i}0 zPh1-4va>fSGLsW?8nnzH-$I&n-|Hzn#dRp|8Q{Vd;=`NLIZY<$y7GiMa>wJESBx>n zXjx!o^}`xJl=WKf7Orpx#G&oT0Hfef6G8PYQA(c!^6!0@NE^rasSEkPx$F+@GY!F_ z%+Sf)q~|-8s=q}weM^jEnASpW8Jp#UaseFgq`Ox~$IFbYX$vG6)@Xa#w3++nPIuPk zrfD5$^_uZ*7L9wPlUi5dlU{wC+=ur3iK&GK3a3fYks?u!t!lcOWJbheY*k@XMB`5v zYdhub_fh7J$Dv;k0(??4Ek#J(^6xBNqln&K?K?*?Z|52?&Sea(g;(o`KQted2xhWci6}i5&JwoUh&5`qc!V zQW{p!os74I-g}r5&LVxu{k`EFPByBy$jZA3zS4@oYBroCwW$nY^)@nGbxKs>Qrn$g zq<0_DE;kilqxfrJF0=T|b3*D81R&)ztaOq!4KD8*F6?T zRMYd5s4;VR5wC*`KRUGDhv)D6Ec+TjW>(~USkE-+bq50R33#=wHI{)L3nj%ys%Tq) z;|Pk5sz3Ur^05`de@f7kGd5Z6kN4ECL3|u85l3u&s#91pFo}*lN0ShOYVP$1BQy-$ zIuTeeNSG(+qeR&QW7aB?jTL2Y#V3aBpsK$B%T8%rwm~wMa|&;EjB}gy4_?AZGek3X zN^@B2c>e)Z`#wj31I(%!ncXTR%`57#r>0GjMkoFO%)*X-z62y%`XqVY8SAWx)Huh+ zL+PG4_Lrq$NJHL93-xZjEU2>Gu$FIQN(4SWRaV3l%KCa;><%;?I?Il?q9Z&^^A0w4 zYzA>mKt{$g$Eqc=VwW?<312>K?7uT$euf6Aa`=JDN4JaryM3Gb^bdgdj-<|yDraC| z9}W2M9y#$e0Vf@ER7VGYyTrJdFx#r9Hc9ca%X7JSkjY>LKfKLGq~t?%^DTPIR-a{a zDC`24R!e7ganr3b0&dQVhXPd;jyBB@52Qy!>Hq|9d5~)y56c>|<+MMm(DBGZNWIHQ zR0`}c^3FF*;(Zjy3{;yZWYinK#uj!Xzyz+7C8JNm6wPCnqfF+?GM)B_U3JQwdxjYk3$VGaF?fJKsIjvSY*40 z!``X24K)g^FEccyy%aIs5|NfC&hf|*Fl%T*}cDcJpIN0FoF!IKz13L1!f zINlE~H41FhZl89wN>yBTN>+*A#!o}7S79d?rW@-dj|km_{#UX3|J$R{RPAcUbR{@6 z@%W}~b9~Iar}04Tbz__ZR(wB@pJVVg~`J!C;6a6zdQ+5LBAeEuQu0- zc)?K5ERkAOtKAQ1K|h7ib9htIAckYl#+9f0mgHB@jmxT4ect`3Z`~ zQum2Ow#T9{=`@W)tgp$y(r>7+Z^-}e7ib?8n5jvkh;duw&iXyuh*-dKoky6>fvQAd!+{N1 z2WzW};&^BR%FE@!2$;s*AqrU*cf@CwpMaH>5AmdydR?>QO!F}>FsJ4gjtMi@WzWr- zTvsKzgJ#8Wsr?fZmZ*j})}-665#**~BU!hjApb~o7H+PFdq z@gKl9PHR%0BKxnVeG3^H7Fs{p z4}vt@Luas>x0aIJQm3%CC4iNcHjtGFD|EcMCRS_vQTX*W^H=?aa&E{K&HW4ZL>zy^ zA!16W+M8H8GYq`B6#}l*hAZky3xDa|#9YpUC)G?dF77_0s0G7j`fIWX&38Y4A5^P& z-C~8whkOn*xS79wD*TR8wUrRF(&LfPko5M2iu8ucNDSCPr9@4g}nB z%~k;WWq|MW%+Dg4AI3!%#JCFslM*k~y(6>1>d%4T8?I|HfF((kK6@_Fzy&33dSO#3 zwr~ZqHiz`u1f9lyNEpv!4AJ_yr5VA_>k!|Y%cJXc!nB7Myk)!3hM&%xA1C3D4{X4ZE_JK5^x&*wR!xX%D zY!W7Rkl*|8rqv<$?XHQ{vX_IcShgU-5tL~hECc9R<(?H;Wn(nL3}`3|lM8m}ajqpp zJ;xs37D*UjJmlDV+T`Tr30 zmQhjs@Bi=y-QA5ycc)7?(%t2vg>%BRXpkQAP-hjXA^tdE63N&#ZK5&RD*rZo1<;M<;5Hn&j;=`J9`t zMu%yCf3iDm?8Ot{8k+HDuRxk|w3Kr(1)rKO3wQR5+N2GQ!&eo{01JiX3@=5#x0C(W z0}QgH_3?Y#*FcYsESEXf*9=*~lpUgk(f!VLh9!SW=_{ni;zU(O zO`wuYxj77&s)F^64fVW|^Y9h`LEPdsqj$tO))b$dVYzpL(=X<33~mvb)M>^S+G~;V zeNdB3De3G!rYVZXv)o=NSFFw+NprHYihOLZ{6bSbZ0sQE%>}nK#ps;$NL=9L#KUcm z08KQCmDkLmXjaY~op{}7=Nbsl3)>}2n!^;h*TXTa5o!wjq6O$S2=lFHeWAoG&xcO3 z#2NHt#?MSukdpr`#$@f1`Yb0wNmaqy$M{ozd~6DCz3-o_(q>u{b}Gf8!s0#s1~de- zsh8-;s3{6Q?;OdX;IKBa=?sp#^mMF|AD-)SoUyM8#-UbRk@cH)GV)2_swqs!hHZ&x z@*^Z&gzDBgBYXt$n-uyp|GEX^FITUzegT8% zDZ&ufrt$e+G2)ec!MEJkqQf_YwVY%TSH!R7IrF%3jj#6-#7z1^-* zeDh;xE6K4+S&_(mJX~uBmDuthfXaOr%KABHUiA`lKPIJGx6zM|qM!v!gaZ|iaS>yz zZTTCNB^AEHHoJRPcgd3aHS925z~`!nAwgyzsG`3x zb`|HT5H)j~QdT*A0Pyw%MSfydJY@4N0WB^iMojD)t-U#LIV#dwe|fZL3jjrVzV>B* z!RQoMn10Gwuxh3n|9SL-X!AjmbE@&`3}URA=KRb+1Bqdtg6BlzTo2f{V9*~aHV?( zBOvN_)pn-O&^N^S5XQe?#qi4I+kIP`Q}7?sYDBuP7-pal+y^(@IV#&O=HJ+a=ClqEDN2p7cb0 zAF^H+Q}8I9pflPik>zMwFq->OK+36X433+eCqKPtss*93lxg-B8;C0N<%G*{sT3T+ zO6GukDX)eVku%aQb_XSSNcSn5>RA+~>;)LBLHqH;lyJ>qG#~An=AQ{ z!_~gjfxakWm8+MiuP;!2Z+wS(BI1uBV|O@YzW6to=C%3n4ho*USNYlrAc`A$&7aMk zM=@`<Z#75pBQ2~U#mrf~}U@VfS(aOZ2hZ)an#a>NU6X%JdtdO8vZmc3*< zwheZgm}JCOwuTb$N@)`2AFt8mzC9Av@&>lz8)a1Ico=;R{rI$;#>}no(WYKD{lglu zw-`4m6Fy~-Uv|Va+_uCC5&gxl3gAvNhF@%KC7^Sc9_ZzT!>bKXaweI-nihX5tNN}e zP+5~yWmoaik?6smJRCM-NZAN7o{zw;h{3?2B=trh^e86!ffj*7LIO+I+{@V{0(uVA z^U>|sP@w$nmxeKbd6y>5x>ndCI$0Oo0_Pg^R?_ei2bV)w`!z>;2`>Jt+ZCZ9L%nNx zVs~MazEuV`A<9a>(;{{a>FOnukC`l=!O{Bqs^2lod36D{v_opWUgv;A(YJDI~4jFA0qL$Hb!!SY~5=6VY zt=kP#T2KGJk;iBjd~IsLL?&GosC6(x-z4DsJ$P<`=HycpP}zy*b8S=4z-5JTsCHAkRZfG5-^x|$<5@R7{=5L) zZc+#(eV)F)lXJMyLJz^D-+5lGjh3cYzT@EkQb(%2U-0)|C4%Q8xNEea?C^E9#hEY{ zuL8~-#?A9Lhx;?W;KO2I&cMQU!Jn)T6sal5#UV>UhoXT&kw{kaPepOfENMBZI$R8r zuGW7Vh~KTeSBeZK*h6ibqNFoUOD@+Oa9=Fz5&LG0s3iA$**{UF{Ib2k2{U=M zg4r6+VyV;5ACCfaX@S6g(LDMtX?X`;(GVQ>s+uX51$GmY3D(!Hh=gR$hVy^a>?Xkh zNkJ>mm?_#lU=oPviWrx7Fol@g8M~nK2ZO5J>H?|ye3l`QwGJQY&wTks0`j1H&%5$i% znE>b*qX^Cj>+#Hb(c4em|B!wz(o4-tr)+x^#eO_5w%qwni_fL{|AU}k=Pug zrjhH9d$mn#E{YkB`rS{60{mHhjkZS*&+4P_Js(L=L~IsJxfXx(Y<$w{sb-xsFD+x~ zjh6kwMYQFk@k5$+Fol0bNXocAkFwHqSw-qb@e1Xj!~4~1X-z@=9+~6W-064WLy)j% zR0hz=XTB-lmGpKmYGS(3O5 z7OT{r)wW?u$7cM|rzM6x$ec!ZQ0Cjfp@vYNHu6GojdWqDRD~UM@+@6aof&NKWQ_0- zd1v8@?J)gYIXeKZ8X=EjP}N2kwaj?Atn73U7h~`nGoOL1*3Y5i0bak{VLkhh(%ahR zPm3zV1YiWVLjWxX0S4E;bUrcWLevC$=TAvLjJ(VvpoE587f6603 zwOzRMXD8J?7XjCwR$FS5LjNVXGe`=%;Ua}cs68rJ9Dm2EDr7>#VRr%mlyA5LO@?f+)Nauq zd^KCIL?)9g&O@@L_%>bj`A#+OsM6#HN%nW7U*XXzMM3{D_4cFvrUU5(cI{Yb!~Ab$pEJRX@_K4+iyb$BWXJTaA`R`T-RQ5iZ+^ffO(x6y799=YM~C|3Fhw9>i& z1HpxK>eL@T_1*qy+tD`8w;|kb(TU5cnrtx%KQ@Y~5bn@uUoSn_>H)7H$#)2e`<#~N z`shg>s(AvY)T;<<;5kY$|1;7i6eARZT&q_ytPhT+2=I{*#W;5e}g;(3ccWhkyO zr&?gS{&k36R1b<5P}iX9E8_ zKV`>7gP_-f80wnTEiC96m0S&f&h60N%vcW-#JgX-KqZ?%j_ZW8?@e8L;$47Ck6^-< z0?H2F)Y*qJ`mYU*20w&4f6E;eRckS~L%LF75`s3u>QuV-Tm+olR>jXqUH>8Qnwm!X zY*D>PuYhK?Z-m<9J8g$0x6NF^glh22d!QZ-pti%lWT8^_)IRU{@y5^`;u^x~k(rDa z*eO1zCYt zE$;0E_EVWBL>qa#xgiFlOZ@7^?5@y4^M@Hda|cVwsfP69!4D;m40QV(EZsO3yfY@I z{D$71k~cFZ?^}2pJUXAW#$@qBr$dfb8boedY>_{iB|7i39nWBAf{5ws;}4)VDW+dM z_7s5bXmE?|$(yP#_#B|R2C5LIb=EzGOVm7WbzX|af#=uSJ0cG7Yhz+ha6}gzKt=_= zk+!c`pl`JyK=hcO@Pj@NG>+xK4)Z9HnZ7Gi%JLIB4eHc$<>Ly#RpKb6n+iR$0Mofk8yT69Gw-zhwHK zCamkW-%kqFdxIA86SO=(h^HRVkxIxx#F%4VJm_mEquL_e@QI>`f1?z&h3iv*MV&FW)+?w z(=$FgsjtU0lQBpymT_38jU}1V+9!oh+GLNGNI!ZaVVd>*ex9Ql(Xh{K8`I%J<=dGQ zzlR5Dn0rO_EP@Eq3|`ENV;jv1GO=aDYn8`xafcO7v%!b`*mKR8B^S!-O_jCXyu0$a&{->Tu{tx+%% z5vXnKoAe?nB-^~1--W9-wBrm3x@%Www9jq(dqjWlQguE|F4z+6Sa>FJOa#uUnuSXJ zJ_OTR%;YMS4&>-K`w11ECnjj|Bz4A>O@u8_nhctJwD0zne4ZP@PAguoD z5c7>I;**M59fp+LA*Q~$zcSC3HJpo3}HBg7pNN*n#kHy;*ieiP)x?fwKB*tXeZI=h5xb0O62~*euMrT6LR) z(mQcbG?cx2f=UsKSOb?zo_|>`7V}&B$McQRL2i;$ju__q5jO8;9)TH3Q7?$%FTAG_ zrI1XezjEFenCo9v$3*1bh5ms<0LYhTnZpX7A>v<}(r{F4+A@z#&7n`RL+N z*=Z^)n%-4;Runu1`tUmq5pF@naFsohAhzO4PrG8J@7t^9DQjy|1pg$o>E^wFttO+W zKjAy+4D<#NJZvIKu~p!ngydCJB2bswEZQNlwA z2N-fYQtE)Mz*#EfU!mqTJvH{}#9G$GOHtlDw18YN)k-|jAN(4b1+v=m3KsI@@|d*w z5$6ADSNT(6P^og=bZfE7E5rtFkRJC>gEie_jCJM&oi*A&Z&97dxxi1!<4e`as44(J z*H*59ky64>%ktTg^jK5H7S>X;G)|m2sK1>ZwlOA#JGdQY-F5&kwva9J1 z5%)A^UiI+riuP};V|CDv$MX+HZ}Y2U|9uyNi#q@aO5@A-dN13T>5Z{39K=m*0{3bE zs;JSy53}%`&7hr0dPh@HhdA0Vn-EeeTU~zBD~E1>2PV6eE{p917}C?k^SEsJhbpr* zXv)e<5tUzW(VmerKXXi$U{r)gMOMcu~iCk8tUybDzfVBS6*{ z{hH1HURd8Lf?) z`-EtV$`rwbLRowAhI=`f^M$oq=No~*mvBZRe7`D)aw->Lgx9D_wkTPXHSbmETJ|=p2C(5Q1%N`&R z&DK_v$d!t8-=(YUIqk)}R)CSURh)6j@LoGu`6x%~A>wrfln%4%Ekl<_wXBe|*1rI2 zD)G`JvFb2vqT0UI>FE%8%@h&j{K+vOy2v&qeW5W6-1)UIJ!W;G*Vj<%sY>x7T(xCJ zr2Z@ zIG3A539Qul7y4q=G4zw&$o}hmp^WJiY_{$WGwC$>4}kWsK3}{+%G2f9j(q)8sXSuk zMLNb2C$#mE`9k(XddC=mj4bT^TcwK3)6E4|Vd!S#B)a2jJvRB5R^nSKuc;?H31U0U zk|+}xRnOP>*)fMr6UyZVGW=;MU1C4)aU{q>u@3W;cOsy6+d9Qie`rP| zi2o9@Jk#Kts-DnWExcBdrBOIXl2>|it-sIPVk1Z^axfv~Y=C!W9zR2e=Ea=2v`gax z5A7qMr(qB37EOTDRdUUY@zgTkxk|3xjgfLJDchwQ5xH#e;*r1EL$g&WZ2OY#6$Ob{ ztsP3m7YSSU2D@@~%C2OR{;Pp=0JdV~YjoD@OxsV=yK2AYzSq=dEqYH_b%c9ThoGe; z7*z}`XsyKTG3nNF-J{i$hG6*`->8wvw>g9pXR-XXEUma8mQAU-e%)tTZ zn3bco^CIQ<<%v2v?ZBRk)f>7-hxrO=y=*f58^7nY0@Jyj-z)k&8dufjo{zj0t=A=d zF`IZSc&>$69y(4QcyyU?Yx}!*rF@HTmO@8YY@02Lo&0TI3OyGc>vADIMter?{iRVk z6;wF*X~ie3rB`%%i-tO@ovx#HqKW6W{{evLHC^>`VGE(lg6s4Mu422g(#v_%cD|Wc z-`^-pVVhh+P)T0+MEw@K&Hu84HQ_Ay3n#%z$hn^2=4Dx_fS{HtC{2VT*J=q`7m@T!L@SUM@)e2wn~#ZVy1<_o zZvZOx7k?6?m?|I!gDZ1MYUhmG?-d{V1aC67Z2aFSW$<1{=K+*m8LLE0AAS^ooq}Lr z=c+kBOxlD|$k~sr^BPT;dn;x#$=QNqFQ1CMFlrMV`tf!;yRV5_JH-3J=&98Aa7&~o zf#Ui1A7=&I50U1Q9jX%)x!YgEl_!&}hcu(cEq^;~a0af-HgBGB+h-ZCuRjCwDCkaU z$NA0;ri?;I{WCapQWl3~0L5>-H)k!?(flVGVj6i4DoCrl2Pz3hyjKch_c`*17Lf$n zEtuRCVR{o+N_3)EjQIQju}+_wO4`>rD0xI(VT1>^PjzpZ9;*9_`MxF2v%Z7o30OE@ zsH+;Q&2nj3_=4O@QtT_`yaL%H6?f-;p(XazGt2_IHCi)ARu_JEV`NDQ93Qh7IvV{|f+LN4k>H_LG^tZP$W>p}g+G(>+43s^ zAOut0T-=!ZY%Ehby9}a|T9@HuiwV?)DOc$+TNl({9uZ%cFQ$vs2Y+63ISYye-GO&F zcp>{yky^bVfkCggR$9YvKGCm>#D$jQ-T#^uD=RIpt%6xA%GqmB=$-;h;>|qbguj(d zyI30{vd_=oZ<*E+C*b0LrgJ zP@vC}cr*qoGVtb>HbsMQM$BBavi$2>Z(vxNQo|FY;GHQ4d7twup{>siRhvgXnWVyf zGu#EIz2T)xHA@E;6k;^QZsb3(`a{1$8g)I%-2d1p8RA@Obz)Yp6WWJYhLb)UJbXR= zI^;jzjpR?Z{^)n}jmJYuXgsQ8bS|F9{^Os3mq~a3blsZR>l8OOvl+~~Tf=@2rp5%V zLGPnM$8WB9mU&`*zYq9+8hYF*^!iqoAJfs%5fdVzDK$ZKOP=DFjnqLir8csyYQb}h z(9I1nX8YbJn6mcD00;ibEnir_s4MGlUKCb{jSr{mniu#sSghquaL7+XNVhf$A5x3OIbok zeU86eYmXS7v@|tS8YFJOzk`ip#jVNTCZREr;m1y4bofjr;$zRpcqIiZwaJ=xgz1##`YI?Jaiyz|+EOj6ps1CCUs9 z3>!?ZGBH0xRnn*RLoK62h1RM^Dw!mATP_2(ajJx6S+ZCuyw02pQ@a1d3vW2cq2fvE z5d}YOG;G#P{fHOC>&bxmR%+Mxag6vWZ8yf z1ztAvVVU=`Y$Nlr2pJO9$GKnIEtrNnDqI^b)3I1>(J^KA&ADNA^SKLt+Is;UCj!5fPG$%xP1w%D+e|(8QI(|kp;H9xkeC!x ziJ>A$BC)vUoQ)sf7yd6Z{Ivf;7eOP2i9d)iQQgkU1>(|YE@@^mN44niEOWW zi-dTF6OAOJ9SGezd>5nt{~r;Z)_01LOLf?!A*eY-9lZ0gttk9oeJz&Ui1x{DB9fxm zG^$y8RWyqwMeuGr`p|u1hUwgn39d34h-fLwcCGKT_t+@27=g)UFF$c0r4)#~1ENV9 zw;x_Y>X+7))dWzso)0hcaQwQR3qQ>B?#CbEJL#lse$2)7{}14;fAWXoKFDntZaD{T zklZNwnmk8iUPQf!w*WN&9sUQ90Q@fI?>8CEYAE;SSA;=6-)0+4$gpUYxbo{j1BO_DFJS=^dY*&h1$*k7boYf-Lq%K$ zgP&Plh@7H~wqQ>~O8G%mptG2pMs4V-(w*xDVHm+UnGN>MiZUgv`ENYvu*lJ3KU}pj z*t?;%nmZBcfLEhZ!p!+?w6L#Plrp)HRm5)-RT3@PHggw{q#kc2G}x&4jPB=-(qo2~ zv^9ceJbF`G(O+o?$2cN&8JOQHTzn1Dm`~oqo{MZp%46qf&`lQBWWvdea&O* zC9vpo#hm)WUjG3WItKzsIV;w2s;v2-x*p#_s=4LICroiz^;>y%5?2?=*{>H^q(^y1 zqj9DER~z?R{GTX1$<9h+R;hFd;80;sE`rvWR&R|WqF-uMx^8x&(nV_H@W!;8Xw*1! zC<02;QxuWHT{NW9w?1Q3XyuFxA;^HVp>Y7~`tU~a0wFdDiXGB&^Iq3Zq+lT}hcu{m z`Vqj&9Pl9O5aG&}?-r-Ua}#Ku``lD2%j{JRs8jBH{LEk)d{-N_QE|nYRvL&66Q#4; zyY;9M^g1#I=p7~i=FPFvP1W0mvl$%b8M0y#U9+XXcXxihZzsrW1eV$# zRcZ!N^IS1T%DVBm19Js{^2b4qGYo6Po2!6x10ys05uKvS{s|!_4tzp`0pk)N?d%~+ zuX{f^2Z5DyySsMa0nmYMNcK;bOEi9~#g1+aJx-|#RkGV~07C4MEQ69a5NxH-NFI00 z8wW27#E*eM8I`Fd_2i+)3#=5l)wY-|A$@M-Ktvc0>irw@wu^Vbeg-VTbD6*nM+#gm zcS|<7_~y(~=-92Sc);!BtVYS5}O?8n(P9OBC$hF0KAN>m}u#zwXC9QU;DepvaZJCxlK`L=Yv9 zQ*aBZP63*4LHscn*E3Z2a-s%&qwA0!%oU7(wF6e|v3gKYU3EBB$lA4~s`sb5c+a&Y zLKpA@Tgr*6(+=*Jn*3nfC;Mu^0wI(wns2K|oEKF@BV#yh4zd_{i*K_hnSQB z>Alp`g4(A#spocme*x>b_9?{>7qF&H=l;zHz$%6TH;3(b0k-(F%Diq%0e#d8 z@M=5{64l!ckE$=#&X$y@0G;4`{R(CEj>Jx59~O^+DKIFuuV~|V zWRCT8DH_-6u{chQJO1!@aqG+PaD<4gd?Q(LFmOJpoMLM=QF<*nu7-1%TTOZ)787!d zrVWIRb{P=&Yfhd~(Rj*B<-`qPlNy3 zsppM2URDG-ptjOt^JohEc}aa4?}zM&Bm4Ga zu{BiWMC)IqqyATK3HWvvi%AidyTIFPoJ1mJhfi+KHy5Urj=K8s6rx@i0K~_SoDF}e zCD*42m5l3h6iO*typu&c?c~F^^Ton|^u#qoi6dB^ie>2MW9g9N5&uACD*pj;(J6Ut z_L3=tdMyi!O{p}@Waik(m*+0^NDTKF?)09wZhxnY@ru@2Bs<25?z=G(`6>@%>df<&l5LyaPA7@;r3sGSx<-l8y(36P6EP=#U`v);%@PM4*;t$j(v%g?D< zmR4d5WPRj7_jP29@kL z;k1Rl8=VM?rLp>8)3qpnKJHYS`X4~O_6%HYl*28$@#g4(aQrX^k1TO9i%1AAR!z%? z@N8K#T?cNazwl3=4cN6O_CH41Y*GJk?jYc+%RbsW&ZJZ6?M}Hz{JQOuElht?Vm&r1ab8VJpfWr?p&_}ELh%jgZoE4iXh@pyS81Ui0a_S{B-3}e$&GWVC zMdvSQa2oe)^;8HIdW?~BGj}vOW($){V&K1(&dKC;mM2 zjNKQRKPf13A3sve-OON1_K^j@CvF7g&R20kg!E+{e@{JM*oNfrm_t8>4d${5n48182RuT@4+-p=a8QjNcb3!m z()<-ZtED? z^nDS{sbv0I9o-5g%;ki|A5vY&3{OPqD-}l4jq~uXZ=JrZ?Kh~Jn+(-tkXonT_Eu=T z-_2uP!Dp@EO8Wh(WJz``>B1_FYsKdWE`_-T`A45#hXc7mpl6}7YWd@B%FsTnt#>w7 zn!(u)dHgKVe?*)~1#^_Ck4-HgjK${zG=_3IF;D-&(g%Mpb0cNW_To4nFmmH%bFiM+^YJW07@OZL{JK1cMrj73 z4+dA9muhiIp+2X6#siD6(CXG@W8^vW8KoiCstOd%L{(Scde0hh$bTARqQeilOgH6O z`FDUpA;RCGOC1FflxqK_{{UEhU@@XpaJ?dylYj`5N>bAEohskM0UTni#lS8+&y@Un z3kUNT5}k)fn4Q(dSk<2*pZbcBBke0`jU*zo81_xE>(Tg6E=+}#UJ=R+Y1lD4e+yKG z2}=%hfEbMu;KEtn-QV>xuzvSU-1{)o447?@1N$1oFQ?HZuAO5X;;%B0rsev#!i zU1ql!11%C*AqNUc)9#1^VNoIPWl4**F^C)9(r25V_9Oxmp^fB$|dGLx(l# z%p_>NcWALp>Awr#;01D|+4h+33g@%0h<^>@C#1@w#`Awoy{P>Sw>H#?pPl#y;}XSVp*h0u(^cF(0u-#JG?e>Q zxS1vOm98F?FaZ$$a@i2yK{wi-0v*liB>UW^w`OoM1vp3l>XD+mEWqfF$?}8@;opiW z>a|SW3{;)tOW3@N! zViZfp#m#Sed@BY_zLpI~byH@TTK9Rh5G5XCcNB78P7x5(7f0vY8Ijhk(S`t!yBJvb z%?~^Da{J$8-z!E%Xrj^w%9sD5{VZ%uu;CQTGhTYDC_+P;B_;m1zf#imn)qXEbyw^M zRVMh;oK>YLllDai3;Lkh+Yb8o16fms7+<+Q%v1_n!dw3oVgnJ}V>~R%NC1-#7k=Jl z9b@jce2`5-?ctCdOKz=U+#vc#u=h3R$R(E{j!<0=mzy!NrOItwhy=Bu{U?z6BU+738CAuXJ#|#q{th$jy)|p*B*iR@R zA1zCLubR$S4E<@62Bi?X? z!HyH^wKU=;wdsav0%)0?w5omSnKN{X9Hz=`fe12&B;^KtNxQ7OJUZ}qG=~|B&ae3B zPh*Xe3X2>SI2ce!psZH6c{3U&eu0hcbaz_o$k{!*j2c09b%f*TvJ%4Gn$k6;??V0JFkkBP5 zP2uAovO83$k*l>w+w76QEw2?;GH&}yyT#r(70$VZWTkhoeQT@|IsozL6Hg|v!n;rs zN@&QA<6)7to>lykf(Z%cB0V5uM z=zE6zfS8Z5!TuH~ptx7sElr$1C|*cnVgzfxQYh_=H0M`v5oAix;B7P_&aMYfr$mPH zd|XxG7sOgQ#gw3;CdL%kBDFN)VMSKbpCMS1XTe+AH>NxVlxCwY!m`__MmzYcC ztx}uHEm;pJrF98^C!^OJ_6C|1Y?;dRDPQHAP?@?Jn?Dt#l&LX}3wXno6)#5__jz%& zYaYh0^LkJ7*z$O>_UBDs=+Y~u+u0UUso@>^N7OI^!B!EPAMM^M?VzdnO1`^N4fIsJ z;{NdLkA){v=t6-f#m7}~M_r(Qku2;X8a41stdZE47*vSHZ~tO_Z3U$qzM&&2wdyiB z@D+x|>)%VYq~NiA(Y&3}XIuv;XX~T|tn9|t=-R|P?#nbt4D_X(eWG1Kuo5aYTQdCz zupO1|bHFF+A}ZhKHPZDlR~evm>h!4e+BE9fm+Z#5#Yl0-UACjqfy*RMO}n3CyIz5c ztDU=yCZ%r8zeRA}fzRITNEsK#bgsX%7YunDr_@OQueiJHbvy^K-lR5TL^LNPk*|BC z#h6B?@Ez;IIHSEG1HB8rZlIRd?RcM#_q7Nwp7 z59AaFzh*aNU%wn5eB7cPF0@`bT@;qfsV9uPbm_Tyi~+$lfush%n8%elh-W7hgOf2D zhQ|@{D?i2 zw$BESyL0)W>?|)nkw3$$PM+qkp8CcZh=cB@$MEoqR--igwFvO*6uFdkDP^pCXb3&# z!=ygRcYihap9(*{a_P`W>e)yortOLjc=de;QZ_|~80JaF{GiYKP6>T~f0&Y{Eit`m zu^hDI8xf9hGnI4jD=H9u$dL|lV%eGcLqzhhmV^fqLvypdk%;(4#Ol!(J33(=eJJr) zJA}aJ(-(7j+`(W=99itQi&>iERG<-u317Nbq&%YyEBhMf^^C*^jBGDkf5GoQ9)v=5 z60g#7e=53Et;Oqk#dPj5&!xz}n=rH((hCtNz=&q3RQBWelcz;~d9L~+9wUw=TC*zU zA!RZf61C4nN)6$V^%G`_8mEYAhVgOw5yw$PTdQN;KG{jJy1ja9mej+4NZaKLJg`uCIR|xw6=~?YV*u zL_U(?G}8{z)*3(KxCpz1QN+=5>e@nqQ<^jAWMRCinMo3&erJ^F9=`xQ_bCH7L@1MH zeUOt;6*{igO^oo;2Ah~`@Z=b+t>W(SaG&+^VI*?VBSTV&8f@6<+C+{|je(#7AD1v| z_6W2vEq1H9pA#BV2IKAGhdCDxG{WL^2W+2So&x=N!rTb!`o}joJgc{y!Zqs;`*z4Y z17}Q1lj|+sSUIcSMzyJ&MoiQ5!kRk&H?X1-XvCkP7WVlO`ljYLB&wcjQ$*2Dqwy)0 zqgJ^vM5j)Vb8ErZxWN6{TV zrk5>oah~x;KJOjR^qHXEKBR8pSapZma-ZfKQv+B@?*J*XNyfT^8RvgP9sClOJ?vmA zNZ2F|Yhq-@SYIfrTZ%l<{_z!00H>XD0u-}lh|zaGKAUXq)MzC_gwI4m4$b-#dnffbx~sz&;Yh%sqndv^%Ale4;x)2OC!*zkYL#WB{v zDxBrFJ?-hEe66i={@2>*tAg#W0>k|F>Ppc{rAZC)9l7Evnf z^e0v4{KYb>Ntx9a+vW!E*J^%0)8(0D`X`ne+A&=d&v0Gcv2>jZU~f{<8JPzk*xF5efvzP2oE0H^o;X)C39<7R)Z%=!gr1Kpk$n zTsS2|2$1x7ocUAoMODq%cyCn_2U=%{^X4!rHNK@>B-DS5IX&mhIy~Y$DNhmzL!Yd4rzE{cq@e)?%*ehxink*QLg-@oYRVd>;lVt)=~| z+2GNPOuUE;9k$BaZgyToPi#Q)ef5f;OT{?5_R`cFqsoaj?=7#}$qfgel$vqSBKA7C;M6-(q)EDw_rG>>!M zxdodLrMNopo?1@NCwvKHtEJVnE?km^PKJ`>nv8W(ZU7LNXbj_>62T{3*b8hVPZN4H zlC|+Kd=m_H_nPBB^Nstizc}~*@uZUnFhL43AYZQ~V~L9E*~Qm+g^WZN=}EmA1LzLm z&1f&|$<)OJ%72& zZa;?|@Png*G|bR7eu18TRmgR_ZO0g4E@>Y9gC`26C>Ep37+kGx;G zAs(6g`$3QSX=vaqhu08ld?+4h!xQQxg=9x-+j^YSr||8soXEI9H%A`99wCQOW7 zbMazLhu(Jo)U+QLqO@?+IITKQwhU~{?zndrBl9l55xaV5i?vo;;9VaGj%gG_nyVkG z^FO&B9#Kdio_wtuntk<_|PZW~)0Ufnq$7(gqG-wFes+9d{G@M%<0xLlQbZC(55A~_SvQT;F59SGTB?7ZF@)syh(bopl1uomX_K{Dmga3<+W9Q|g5dwRVqq;)Op+FL&mVg*Z}lw;gftO< zE8l<4ie(b2OjszSDnI}FAQo-Zb_P zd{V-^;=spxz%_D$H?>S0Z5k6!c_33T+d>G- zbB|7wR3#bus?!Qo_rUKkIr!Va%3-C)lR-FYTIy!;J7V%q{^~GN-zIS9>HqciRzYpN z54dn}cXul^I20|G;8t9MyE_yq?(P()KycUM?oJCqi zGQ0EIqb3Zk<5Ji_2zBf_xO@Be=yGhci;EL zxeOC!Xi~SKrih$Oj)K(u7XhuOyhEi2R=QD2=Pdm@6^YY{n9p?jZzyWS<0+*j|}^WIoqv15XB6+ z9Ds{T=_J)^oW(QEQ8>%)lq^H9$<_E@Cw*d}##BstoK9SZ8O$TVN7B|Pyj6)or;nl7 z@fSjJm{Xq032n9F+;P#$=cs)dh<-76yek!5wlai3%cCx?vOjCc?pkTLMbV(6w7!yO zw&Wi(-p1yUu)MmxOzPi|x&VJHlY=$=hKp*C;)tje>B~>?aucm$JdWvKK1tyMHvRX^$9^2gU@^ znSYM0*Hh{wfI<0*r>#@{*aAcTE;y0GO(^=UWQg8q{fDOSeP5@=)-@(s7~uCM>y z#pMRW&35rGn|NCVR!O4Iu<7PvcDX_2Ogl8C*84EyadjKBibqGF(F+SgSm8PW>-VbL zD@*dzjd=N)m02j;nR_*iSzQzZ#c|m6j)$DRoS<_RxhKSU}SI0(YncKg) zsm|cErGu6>DP-qy3zx77Nz&u`ee|=adX;W*{RvMofe@D@>~&ab*gm4X%3vVKpCJB$Rw?nukB6spc=7&v&)Y|N zRZ;fUx(mtrM%)T#VI)G-MkJR$Y>*iUp776w{qWhzVpp!_muX|mavkA&aGa`nZ2`=m z_s`rXLW-m6lqHR7QHp8gK*;>EM6S3GQjve`Q9Ld7DQ&6p0){KUq4-rvEJccBr4*k; z4sE&Uwij#twy~@uE*PZ1vDSO$3Dqce+}CuX2M5YF(&!E1Pm@IAS`@g5l(v#zWba?g zn;`22wNRW-L8FQ8EM)O4s!1;@Z(`zv6_s6v`R3oqD)}ywy6|b(P>0l4lREUD9ii;CsY$B(8U?fxCbtvhzOOB?}~7cL&sc)7l~9&>riGRUbl3nE~%S_ z=;HI$oBP^91(E)O^s1zmEZH!u(Pmw7sc5~QdyOC@}pSvp5( z_UOHtD@)hfb>2Pc62+p%vKFgUwA>6e{iNUJPy(;+QJZj$0%H%mit!h=2K_46QWw0kg(Je71ltNcbCa0dk z7NvHDJS=c9X9<$=#OMf~my>XCi4j3^oXhwJ7+!~eag;$e#FOki8j_V=*SbG~lbx^S z_FTK#OC}HZuk`!~L$ZeVwFi(GBuT-#;mu4A7TSLR8PG^IMQ^Rnioe>7sTMYl1aqk^ zq6lr0L6~SATBDTCuti|KkPsB*RNk>3iWVcX+K9Jn7U%%oKio87!!^wl>M9DMq@>MN z5%%m*)^vz}urEfaT0Jqml#_EqX zWQzlrW3x(c8;d{c<%pE^^GvTu7cCNm0e|lW)D4QW-~R-JpaLGHn(CA=>cV0qP=5(J zq>IGby|vPXdLf%@bZXe@xMkzl@ZU8wsPBb7a4|5JNKP5xPIlY7Nz&W0Y+L53@YsVt zJ&qM{rF3Iu$Cu3)rk79PX|F&Camjyuso^*%rw5=S9g7>=CC{`L&HVV5m~T<*0IXl* zuPHx|o5DV;0a>K30XiWHWdhzb6Fy0Ot);fn|OFNVg*qcayk?7$GGXzw)KAt_9 zaV8mLTkVD}%iWFvIxB0fUJ-TKI_1=DHAzQa#xx6a^f!J?QXqz_fk^GknxW`AEuqaE^AVpkkHK|zP&0O`f{f$F3 zW+*<$j5J8o`RC#I$2a@~t+mwjl4yRF{+TJM8anq{M+gpR90rv7e-*mWS&cH1Y#h7w2D>jQlIXopct~#g zrcQ<96EN+1fSE0a__HpO6b|$I%pw`8=VF(5W45~|>0^oJ1jBMVJ}s8WAGtVRI{2T! z6A0DQl76SUh>1e|7lIGTjYIcw;o8Tv8C8C}zQL>3aVOCyG<(CyRXUTkTu}#L9L#HV zgV1Se`drw{PaoCDXY}3=KU@MQ>MWJRO@33mKOgUf=Ws+m#XJ`1Z3Zm?8%2U)SS2K~ ze!_p3{J`iyWEwevqNj22F69$GbX;!XR0X8gbe_ZiNOch(edo~>AU&zi5e!5|16xMU zYCB&Wn0vikB-P`fKz1w(kl&v*`}~^XK8x||1t|P_YM>Y<#ZCyRlzG%;@f=4hV3Q~c|ISSRV z-#uot=vSa;<@SnL*T}DN%@R8)ch$I)({7k#p{ANwfiiSFum%};^&f}xD9F&Rulb5& zrzTA2i7%h6{EG#yM4J?+jwDgzCr4TVZQnT9XJJ7Z>?~_>Aw`sxPtS=(45UNJb>JGw z>KWf&N%!iW5dmU;k=USl$4nJ6nT8R5eeI=NIh*9L$eNj}q49{GWGTk4z6$F}=L6vY zVmez-H^EhurORELt*K+1k68x5^glf6)ioyWx3Sd*c58^z*VdvR?^&e}E(j|ss^dOj8~<$%YpPZ=kM)h!+J9^02~DJJQAg{Q%tWfz+Qo2a zUfa%&nRg(&k0skrhcUK7GI>^hJU#xW%(sMYs%^m7Op1Qe$v;wYZt2N6l8 z+=g$`akI0!_tK>T5LDQnC6bfmf$d;s{*0heY;rya+F4$NEOm%cZ1whI=qiEKbje*j z?$^_@mr0{KJ2Bn^?0CZLqrZdd*$Nh?QcEWNT}=o{K;=!P&%7dj6<1Mk;0&!}M1WDj zlS+1Cszv|ugBBY!NTMP_tV$Aqq_sxmR@!6L@Kxj|dfB{#dtT+O+kLkBJ1AsQ@STAC z`0{vi>O1MHI?$0d7wZzgjDd)n5* z=#5M7n1k2cpm^AOA1~)1voYM8ATBIymy*+zF7_~SjVjy=bQk!}N457|)*(s36;@56 zDUnLefZb(r@z>(;+qkuOd&6Bp9$5b*%9J?KApdngE+VI+fW|xW^a1Zpxg^T^ej&P5 zrZ|tBP$Uf?#{8?tkz9>y8inXm-h~%V9yDO8Gd5%m(moeK`C$VZWq?>grqF$Y&VN9I zJxnSf88~A012BhY{*a~f13v&vp@ROZIPZeC^H_)^paYIta_N>0OcWa?)lEBsyeAJD z&XqjWn9Qjf1H1^5o_mOrO@E~{L~a?+#JX%f7x%6zY<6~+BlW(%PVIvygiFu|(c zPc<{=aOPVE3FNAb(W1GaGB8Clb+QY~lA+tA_hckxva_V%>$M>@qXP3F+|E5kz2{vl z;Z?$)=J8t&ZdiK?<*ayYoJLr0Ysj%A{#{?9kNDoM3unU)j4VH2rO{fqK9`k0_qj3# zodGQ0!w2ySHmM6-@cbSJ^@GBvWF&(?hoGx^=E7edYjd#Hr__?9aE0g81FrW$TDU9P z`uouQDS#>A2$LM-XDEVPPB7muCvnI3%m=vYU`Z6sy;{8+i!7*e`If1wx-k6KJB^3lG$;D;_me)B>ihZCZmqh?LK~-6X`MMC|tf zMivDVh)!P1M{zNFjQK7LI$AmXAwg5-A>I6$jucX5v{Mj6Tu!N4vZd~D7dbgu8O+-> zEQgm;`2xxeV%ip&@NUuL%y~OWC#`57uv;`-hZKSd5SAz%Hmqhmp9OPU{3wnjLwR7@ z(U-p&QCKpbaQ71M+Z}osRbe9+3rtF!PtKm-mNGa9lZ~M?5J^n^=Kdhc{A$kph2VE} z)XxLL;#7txibelvSwozDB@Hbqp2C-+XMq?MVc<=pb>2!u`<6zc!3O@GQUv7yVbiT~ zcD!boW{LI2juf8n2JsLxm+IVY^KaE21imLpB``gX#6n+68199wc~uaJFpJSI1?>|KKWgQYO#H(-3R?{L=EhT;=sSga+rV642GS4Ehr2?@}`{9&Gzn_$$%E59^0H?z647s+yi z{>y!C;Xh6}bwM(>K8U4$cMeZ2!Xzjy4g2M z81>17w;QAStXT8q^r*tKqD2@s;qiwtL~gVFDLe!;k^Y62iuHR+w;UqDBtzGd@wtUi z)i@%XWWe9m`>>umMIXi#g(ckZm7-EZou!*U4&Q_2EKxR-yK!a*jzthUKMhwd|2ELG zRrNxPTHa|JO7X#{9rNVcyZ2WL59{lF^RjulD=|?;F^7blzuGm{MwDPbV;MIt*n*mO zjLV}17n-#MVHSZYYq#}A-IUpjt7%l}FMLRk^1$*T zCgW?8skCuSQ9XkUW2J>PwR5f=+OPgevQoGuI@9}LhxUk**BW?>f0b&FW~VMW?d#7j zSXJ84D?LDoh%Bvu>*5fem95P_c+iT5v4kzz4uu^Fz_HJVjZZ=vAFjU}=vzZBy(8`zpK;t(e$d~LuNvjH-A)02QHAEe23$gCUn&RN>!oGQQwAp*^JNFJlt( zItP0E5TrW*Knx40sQ42IhTC|fow77s(0F;*9Ytkhd%i=_wXBK~z_~-;8knno{%3%m zBLNHPVF?;WDg!fz+}C+QDWYF4_XqjT<*^VkgRE{h>H@cn0$U53)Y)rct6A`=;0#t zGhX0IhcJgXO*I9kE(t?E8{-13pi$g0tGARxelieo==5jfP|a)o@jLYP3)nR=y9cp& zjdHzSD}ajJ;l0y#v|xYwpY!1*2}a9kDbYU}nGu^o>4BEe-2k`a;|p}C4s=VT=CUsa z6H4_J5=Yuwzh6n*^T4>jpD5p(;(S}yF*;Bw624lMgI~vbIV+Nj{@7>vaC2xd@sQa^ zE>&nr!7pGqIzmme@Qd7AW`=XUy%n1Ynqd{ERJL=X%wkKvU=H;n>78s9Ahkp&VHE{C#pnTyW!2TX2!XR#&c1;C+aKt#&^V(pYa@@ z6pcL?T>_#0(wU?ccd@t|z1hkJjS>JY_h_7T-qW#ViwKNcF&!6rYLxAT(&- zD|F3X=vWUMHnB<^Y#YmFwA8!Wicv9Dj4AyYep61*E!jFd*QQ#LXt1 z{ioX~6}L;7;zbu_FO_6?TWKo1oi_?`6}L{cBVZ4IT#KL29qv;>_r#W%d!39?Z55NY zdU)R;q!TJ0(HC2(*eEd@G@l)q@v4BYYyYHygx-Qer-H(uV#C9?gdQ{BHOqM(;Qf#V zU3uoC7W9h<_}r-waz#&k${D06xpHLM!lvD1yXR)TQ?Ixa1)xHqlST$AF?btRXa|mp!ZfzUSQ8ZAgvjx!PEn0)7yf!1qGwqVSr$T zhsp?+6xU~9TY0RwGLO#mXlV|SnWM$Jn_O-JN*DG%<;qr!;pP)RTp)wi4eU=7 z@-xhEx8pzc11IW_K#{ArWhMPZeh0kUi_-{Gi&b5fcWy*-t?%+uVZ9l;Kdsod+Zd5pQ z?1p2zGA*%xOl&tRVGCx0GEoKRUWxB1&|ucL2eD(6o7*|o(aVJ))~%CmradOUFco1H z%!-S=Kl&gh(!9(L)fB@(B(f3gKry2ivVGvn-q@S3hZ( zDV75K^v8kMu)o)+10M3`zttmtETx`!#44A4T}`g}Vz%vJPrYa(fq$ej?{5V03Qavj zc!2$NT`SsgFE^e29&dK7`^i)fMIC4L8Nn<6Q>Q|P)Sn4$E9c*ZF;+C%m13FCO0~0X z(F9s(0pp`mZ_7}&^Fok02O89}Ujs?wZ4G}YS!X(+Jj25diC-;-*t|hGl8&lhnV2#B zjc0dM>vjwRM%(-dJp|+(4@lxy0S|HPuCaQ2Qn!6#Z3DzShNp;Z6B%nKkre#^b6dNE z4IkRF$Q6}elK#!@>PUD7usG4&8 zO^Q60=DTB%EUZ}K+#T+s^??Vtc+dHLmM1)4i6#lx@m{QR{r&-(d81u5>E7Ly|CZ1| zZl0I^{oP^*&-2UGisc&R2Dr{Q6#AvGDZK;N_9P?A=C`eKFJyjfC27w7s~**KgYOcM z?Jf4HsQBI%cl?E=36=5{ty331^PlLTy$BDVi!gtlP=^gW>eOlfAd9_uYrKhY@=Z`g z2*6AtA=gzr(8+$4DFn58(A%J5Kj-94FeyFmK+C<2WSx5N2-(L(q~DPQLb4}s()QZE z=Y^l|(lsL@=W3|Anx;H|k9fq1X1_S}VT<>{He9%4(a1R^urNGodKgAibX4#~pZF~o zZC5~)In?L!MokG}zrxiq_1EEbz@LSEP~nGy?>Ni zM4+6*CF`0EhUTrxNfCCTMF-kw6;pnWcY$fHD_Q<}S&-sUPkIX)B+X0e0NJz91Uij7LAnom)Q`*P_yD!C&5ry5hi`zh9l$}a|RuNgwS2lvn1+N{Zrl$ zO&~rzH%uMxx$Zx-XH0LPyrcH3$CmPO{4G-!YTE$GGW!MuT5+w5NG{rXsdhBv2CtWM z3j_*C&$!@J$9lytOAE5J{|HY0**>#*Rq4-1SOgQ<^#~4a_{8$#8%h9k4=2P9#VfA; zgxE@CCva6Rr?}=!Yd7{;TyAr*mH~Xzp>0f}Q&GIAV((*}#IC=9uso%_I!lN}8Qopu z&r#t3H2RqBZ{KKjCPLW%hQy1l{e}{ilVTI2sVgk3q=iwa>+TWhU}1^3#O0luM(hE@wWxU}OvHoeV#ff@*<))pCvn z(M3Q8J)jQnx%a<8^B+ij&xE)2hSo87n!}xP<*#xC3tR%7k2~}9IVJ{6wZy*UR%N~g zbXQ2F+%UuMcf^3&zSbDHn?Ce zqK&hADDj5u4BLQ~=z_zcd^?JH>0Y4VcTapt)SjyfsM(p!UEngx;zc?9Q{kdnt70|A zxlD+J$3r9vZiefOK8vuzOw-`tVVcUH73HrB`}osHDNHg~2K_xpar)14{D{Fi@kB4G z_S$pZbQB(bu5=TFd`{6OGe(R$q|5lsgRgT z;YY{oU*V}RcYry*DPJbv(Th$9k!%*Pd||5PUk=7Db{h>?IS&^i({p2ZQ0~qnO0`5q z(IxNsiH^+;ww$KsnwFFeG;;oQLKv|)!|21sLq?9v7DICAZ?EGH2k9O%NqKo4Iz|&U zTW$*4uuWm}xCgcOiDR|h*vtIonx$7M($VP{CSEV71}TUI6!*#aybF<`%UUi$I)Y1h zZ7B_MFM67NX7}pCNY^Z2((;f*PdZY5eWToWFDA<3q2FzY$BX7@`mg?j$p;8|coB>k z%UwJQ4Vq4noXbmNH;|0wrx8BBf?7(eztA+^_8BmH+@>oKIKVLERyluKok$btu@ zS8nX8wdFX>yDCk`rty}yACJ85GEwU04Y&4_Ttovt&>L!@@T z6B1_587U&6E`(Deg=LNO)Pi~s;RAcRB)_f!tIK7`F9oC<8@+^8?kE0PR|`!(X`?w8 z<{UTFMMR?vr$nanzZw7%a;r0bv8pxJHs8#p#&|!h{^nX4fA#*4r81UjMa#}C+Be*_ zbWM(IWZ2AFQY(7dOTr3`oW8|Q#?e;zrEk}tBzk`2xW(_>HdJ7A?Dz6HM`Zo^^F}`V zXNYlyJGcu}+Z;CnDAA zhyJd#ESeXyT)7fiI-yT>5(GphmPG`$ip zo!1pH6u}2-)f+qd)1do_zl@M!w1%@PbwxfP^WTAYNNOGg8N#zXLF08`G`(BekO42n zFT8(zui!b|ua+eqmb$?P1D4YEMYw-8*_$z@&^@-mKrBUUA zUV;b2cTXo^5X8XqKA!9XL)$ zxWx|sb83o>grkX;izwQX_G*&WB4UWKSZReFfzsn;k!@3-j zN)CIq@UNN!*@v7XyTx_)B^6Fc(?i$i9Rie)?=ky(3;@Rgl@WBAOl@7+I4zGpAsf47_9J?FSM{@F z;v57cI(v-;e&s-8*ZhU>VjUOL+7eiAg(~DaWNGPtZEjI09kzx|%< zNrPnw%4T_JupHBf?E3Kh=1^W=?IRlI3CN5dF)RtMFED&ENXsC~`pKwzqZBvUhXSrYduE70)7bK! zqj4)%dNC#GWII ze{K!$G=@ER3Nb_5TvI~loxh(}?jN+u(j&;>_51`ZS#N<%H_0(q9B4(dO`Cc54nipJ zm?Qf&1NNm8O-ke&?bx>}@*D~=(;w}a%C-ooG8%hjY!%+WWO_#M_ARKvn0VoWk@9a1 z7Nktp_UawoDi!w^OQ3YV^RQ4az=pEB1In>;@wXH#n#029lWmht7MjDmI3fgUI83~XUo38XMWq=p+rRV*V zaqI)Dq<5Xej15k_qQ{SI&&0^p<%f^))R}+ppC~Pm+SEa(_AnkPb!5y z@BY0n<;$@fq$|%DQ#39hE8V{W#IhXG+MTNe)qj$M;k5+Ro1(e7x~>nvvI^5heOY-U z5CbAx^fmda=FeeDBNQ!-CXhXp;^jobtAE$tIBNRn#Kr^?73^E#)6B)*|GCWPRZ2Cc zT#Q{^E%YzXX}FSU&!(0Vs6_)T!eOZE33*5gyb(B~?)~ZD8$4O*rLtSm^3l*R`XuR4 zpyOpSNV@X#dBLx$ja@GXGJve}p%HAY;h;&)ufNZlIqvm|_=Wuzy>#U8iI)ahZj|Wd z@HPD(fSL7`|J}&Z+i8ppKJLOe32dKQa9*Wv(z~z z60FG6=xqOV$jZCDiZPFgA9&;;Bj`T@%4K@C6De?;o}q1>{=n5ymdLYev5vCB6p>Be z^SN7awr@o+suC@rNRPNRccF=#g`GnLnkal?~5)h$gle0+7=Kh%=tC)9r2)8f;Fk=BzaK@MGWVHRrU%CLPmP_4Fi&Iv<<8tUOFq-V-~ZW9bMNP16KR( zO6~4iHQXi~j(*g;!dy4#Bf(4^{sF0{=H2&P%E?b8YZ7 z9Nh9?d82}KBSic0KYTVxqVV0M-C~f0=Vg{Q3;^&AC=t0?MJ=P|09^Uv5|;k}-^t-! z+pnL7U9Cp>T`HA$a&rX{mG$EH%X^^!m^(mR<-+aY9;#@iGGvY%J91 zvu`^_jJoZn#Rz=Us{hm>SKwYIk6KBh>$x2gHH8gK&7HV3{`NGGvn)d60KyRkGUn&t z`&JC|?ypMDB^0PWMj@(Cxw1Yxr?w6|&J+ca+I2rB+T9kYq+H$3hv3Nw>?WOK$wx>` zm8eM8S)Y{?X@c>AQ2#}&+sTG;Fi+Mr!)$ePr_D|Bya~$BxlL!d@sSf8iq4SEIh~GL zm&JZCQj`0-Rm`Gl?TQE22%p7HAy7WiJrf`k^e|&);{ieYJALhNH2w1~VARKfi4H;AoIg-BhCI;gqSG0iGVcG6k!(Il=+D5P^& z=#sy9ycf7n_14vn*oSR8v{dM`Le>YN7}8W8v-S>qn79icba6ms*<58nFS5F&l>%TG z8qoP7%#t;GFv2Xac$VfUiw;!T%U^+6FOmVef6Xq;SGwOJS`9R zE(4Tp5hLWv)jDjeH`OQpT{7p{<#)+uiu49^Y3a1Lc7N6Xs%~zbPER0#z&%KSLac%n{rgg*ngbg~d~ z7`D@i#Ls4iCU}+Lg#x3SBVTKW0Zk)~sN3k8!nN66ZP47@ff&qQ8>!j%F<_e$S<;0cfIdo2JRwpYYnpaVKC|eX0K2d3=72lD8{psPCq)P zj}KYqE;6J-o}4p0#hxE)OXqBQ@rpd!k{Ya$X-J{U&`LSBqq7Gf6Y13(XO&8L6uU)^ zTO{(5QO2UK+!3F@k;9w=EtUO0z<>=k?gXW;Wq)5l7`ZOQmY{IznHSx35Tks)u77q4PbM{{Xv*eClVRHIr!hDa;cJ=knTumaGb` zyph^XM_S5tb@L_U35^DSIqBO2Y`Bf`P@n@44j_z^GOn%fqnZ()lsZqHUMtfiU06E{}$c?gkd7$IuKVI!d-hF%5@P@DpUB{-w!4E~a7eS|wD lccgyW^DCw-XW3~&NYk{5ITe-YyRFH*3jYC${sI2|_&C!zH{EK1l*)w}~*1l)WT5D#nIUYHl2F|HIc=Q0E zpa1|0@*i+K4k!VXCr^}vE@w8g`g|8JycqE)!3 z`x>6J9qPl4&M-|UtxCfVXhr8!qJ|foW7nv->HqX(R6%%2hKy$Usx~S@Pkws?x7uOx z#Csv^A2^<%*JSn$O1ZsAGZ80|b$>rb`q7lb_DoAbsvWlVy|1azlERf;%xD1)`;9im z8{TIA+Up;!|EKIJuqA4khJ1&#vYW@_okwR${Jpm#ICeYCo)G>63ug>g@*mnc>YHcE z%6ZqC>hxt)-q z{bNA+(w!5CQm56EzZ-Lb{RLL(>r21=^HEe{liGGcDPihALID6wz^x6^-w7gZUFHVK z;x}W;{q_kX#1BgpN%Z!Z%O3x1_+RpD;snqeq^_=KY!Y$l$A=oTAPA;GS}Oo{cnshi zcGnp?EehO^s<|Wq09MRKZ2J8GYKXZiu^D#j_B(@Xi`l1sCqe7F_SK>AGn1J6J@X2+ zzMqMl?}thG)d0nhNT&`P0q+W zP8=W|-&LJI^@-c*b8zVO8X|>c-GeU2N1970nEQRtHuspe5xJr>5>`4bd*_MV!TUr= ziGr}?QRmxiXsatjmBQ`?cp*fa-$kmnSW3Z{U;1%$Wrl3et=ot4|K-L1E;u3lXmQ8w zr}<|{5NiA$#z!*z+g{-99^bPn(|*3S79k$nS?)$EDtNcSTTVNf)ge+luefgiH&BSt zLmqmXUFr4;mkPYBVskG%$>?4~_|(0sx0B7tPXMi-uWn7$>eYLDy=fm^ z4YS)Z^qtw-l4UD%Q{0j-E9v4k+pLG~s@UNtP4^C9;k#TDI<~M_Vf5(5AXSrX|L>{5 ze=n63-Lk4W6HS<$k;QEL0!H5XmI^ofML+=(0;DrRg^ygbxG7}m*MHH z|EB-;&o3_fUXO;}2D>yrUegTXE-S%QO1UirO;HCrCCvxBS8%iyYy`U$71R=M?jM3D z(02JIi&LSwgw&@{E3kxm0UQXu+{M+XTvg|&T$)9hTWw`9*|Zvg$(quiD{8ba zw@I=$);t3rN5=Ld>WP^O)H1=dofrSBj-)P8*_dndVB-FFi*Zn_e#@& z*M3dIc&XpiZGgh!iNtR$4*(3H`UFC_`4h|EAd(N1)b*!N#{oc)7CQ7aaE|8WOMqMF z^sicqE$)+^yKY)zl9?je*SRA@lTRx6<6|3x!5)P9bR?+e>-j$q`F*BL;PejCD>X$B zD$F-at%w=4+xskO2zK5Cf;@!b-Oy;~V$jBQO@&68-r2x@0zw}r+4yPDFV1x|AGVr} zbuSu4Ucld4@~|28w#e;#GhRhv=3PxHu*kADK%G)s9QSxDedk{iK*13|@T{fESmPn$ zt<(KO3d|sFlNIWsv`SHitgH9!%JB^Kvl;3}Ux&tKeOBuCt0kvCs()-=4{*-B@8W1* za|d8Zf8t$zOE_V!wphaNmW03LoaUN`ijHAjiktgh+tag-+SkgA%?F!256=Ua=Qj_I zftxmA1xQh)`yF(Nj-#0ZH}iJ_WPN#cWwOG`moGYNw&b0~^8z$EDvD*!2L(s&;L?J= zi)~}6eRWiWlGa-2`Bl>){O5BU!LiaG4|-p#;n6VA1n7VmddWS&JI>SoA6QbfK^@Vq zcb&}SGY_Iz#wI%OvZ?P=p0Uk%WWtoXw*1ZHN4NZlqf>T29dYGu`|m7jGqjYD7|X%; zOGEi=1W8n|5SKZ!qKB@SO_qew@}4$!CXJ^&9^2KjO3Gz4FB;DLIvpI6FA=^$a9VsK zY7GDat5k^6I{33h2(Tkq%`csO_p?7!z(2EO+7asQHy*8*fiM#uGm*!;XFVXwN5gM)@ zT$5|};pCQ{!U0D6o0?X>e?d`m5+LoIl1F~D9hsBOLJ8S&O7R8P z6Fq2%z$KAG?~i{3g3_GN%2Z{E;3B&r2T_D4#g1;N6zm!n4MC+%%DeVTaXY(5`$qh-(YSuuKe6UG0Kcad*I<$O4opdVD`xtPhPp5V>0h@K1WVP(e zmA$NPvtPCOLdw{HZVU{UNClG&A6Sw78!3-Em3b41Qm4#Q3Jy8YG1c`HTEB1q8hvC? z{-uAJU2r&GaoIilD9)fWTw_>p_s#Nwh1t~%<{7n)b*ZO=`HCJL5f@w0vDEe4AT5hv z`sy;13z#PYEfJ{#6%hh8h!ycd6Q}5&Zm#?0HuwBka+oiy)Oq?#s$m9S0>c9<^_eo7 zMe-h#+CP^AU6!>b7_lnQXFu5N^)mQ(={Pp@#_vj2KLqYu?QF;DWbM28&#t_44Nz8c zwj=pw=0jN<5WZBpW?k(K-d@`S=;Fmxdw6gR0N%#~w2eW;#pz$hn6hK};>&?$({ste zvI>Il-2A@~YDg&uTiH~uSQF5b^jNq2G~|LS2^mYzZIbNJnRIcgq()K#;cVX#{v)u+ zF0v!uD%!rgck9Mmv(IV(I&(5RgMCI_c0=K*qv816`l|}A-re?H*{TGyGSR^?3}Gc$ z!n+s}cjQ)#J<~cqZYT74%iUe!rsG1cDA7==(Uik)RRCHF$J^7ARn^~Ck9jik{(Bjz z6IqJ-BJ%(R2K63My4p$mOF$_$Nf<8i!>wfn{{Sv?1mEiLrOv85*g3DORuFDzj9v1Spz92bN6SSFjQ$h-uQCB77IAd(yY42FAO{6L@~Y z&wg(;D7#~Ds;M8NDCUWMn_%1A+t+w~DnBOX?ZNueFiZ6AtyG>O@j}K_&ul$A_=WGD zi-)z_oi+sQ(~ga9E-gM(u7zX=fo7#^PfXpp#KL)F+4hl`iF7inedJIs`2Q#N}<}X4G%^AuwMN&H3ufY; zg;s#6=Y~DP^OPNUU?KOh3od$stouLSgQ!lBv}Mw~wfV^Z#=|zq+*&vtbHG3qURCf}w@4E=6#Qb|Mp%el)+=FSzjt{2HVWpM zB)g@_x|VHNrYQt!Q!(s8HfC2<74b>sW+zE;adKHpsX;LLRNmZ)aBZl5TIw-gUxNi7u;nl14w2^g-RYP4z?*@ z#atFt{0)W=Li`onklsX-Dnuoc*6U=sR^D~0*mxIZ??K6(?n2GAoa{9Cax5#^R{S-0 zV?b8c-=8-gvd#1Pt>gc8FKDTpS$AmVk9xCncg_{bBne%J)H-^}r4af{FnP8q9&|Y~ zo`bp33S~>%ER)^lP|)kp6Jpnya%P|1_x9VKYLekl7$$vvEIUxVq+3f47XE`D<2wMv{}aHCk)1J?QhE-MDnTWo32+o z+A-WSLzYkFJdhAv{ZbOyaHf1z-(;sh;%%3_VPNt4W}Obnb8oA}j1W?=I6U$F#^MTW zZL_nAQweSzAnofZGi6wEa`XlIh@i!_f@B-9Te81UGoe(H>uNH|te z$y@$QuKCBKaYolFoQil?Ip#i-J>8kDM^%63aY3ND=6T!BB>=chYWn&M#b3mI+nG+X z=QOtc;bn%b%fCvHZE~(hN#t@@ z?Dpj(i%0I_G7cN!US(p?lm6{SyBY4%VuK51P3tdxcwEA zn}oe&2CnX#RX%QYAb)2nP6%XhsQN3hmS ze59eta}+(xF8b}xEyoQn+hJ1W(;l*hr!upaeEbWX-$Y5ziR2#&z$s9WeYU@dI~bh$ z;v2wrE@0=$kt1z|Yf5uY@E(GHcwsMpAf+Xs+@yYGwFpOc?_{I%S^Onn53G?mFT$q7 z!&_U~`=p6R$s;HoeN25l7K{jffbOP?UP6(E2j<>x7?>|@;b5;23dHcBx;A8y&{(;+ z)U0Xn+M0WA13Vrzch|K~FyhfO=AkC+(-QI3wBbpo>#00CudQ971kdfZI^@iw)O4bW z#Kv2kN=jz}Q$WOnMzxTPm-g0pMwc(oy2cYl($vC753uDux!7& zlT}TyFt^S_OM>a!ip=^NK}crdSHtwBh|zd|{I8W3iv2b`v$>~>rq;`6WFuTOA2iaj`Fmap0MxCYx^dFv zTm1$lkCtLyX*m;rAx4IEnuJ*z-meG?X#MT*-cE@dY2ZqzDA0HH3^7-bY3}YtR4JN6 z?ls4FIRt70Ak|uzL2j z2O9pZ^D-F<_VgK^BMgy;GSj+;#R1;)gP}_(!^!2vnYl5RI`zUjf)!!0)fNLv(~Z1T zbx{UlBA3-N=RL$HMMa`JfapoQ{m_3 zAY7`vV&3!v5oU6`B-Yyk?6U8N3cKTiNDygHvY7pCP&nAeFnb1x!V~!e?SuPqE|f^v zHLw*bkriN2lwhbC4JAX1tbS(^tCDyOywbWZ(i=nu_WQG~qP31WG~BELKjcE^R!2!a z(abWD9Nucp-KeMq%bwfdomalfM7-E@=7TVst@~*^@T5^%1$Q&Du7xsONPKaD@ zA_J;eK9Egr=-Tc~wZEBB95Umf*+bvu zbV`P|N>12P@~u=HQySdC!JG`TAq?Sgw_bqyolAzN6WJh9cU=#9;*pFa4Ma}d<hl?uW@1!5?Oe2b33FGpTxJzUJyXz7mxbe3vzQICFhCgZ(*a&d6k-TYKU? zE{HTwvx5oNls~TywN`Ko@T*y0^^~l5)`Wp4^2GNymq23jpwOWq$J$rAZdyA0s}4?B z@78cAti!sydDankU8KREk4ZV;y>jCGE=P=ap(lNZNMSNB48DD+s2!1$e><~ytkCj8 zLs&_U4oi!tv<=kGO#Ac;nCHCD6(1qYRWo#|SCyv1GZ5_qtemHZR$nFve1njh9ubC? z`hm^O;x$yEE6`tLEPRxAl6E84|a_ZDs-leb@bv$VY+vKWSeZ=>W}Ijom(Y7yVZjM zAD|6J4X#{YeZZ3|g}%X$IFYMr^AZo7M1FoQFEG>_th?xYfpc%ZOgT6tB)Vb@D{nZF z{Q=U*e&7~_>cteK^JwmLzGMRqJ!NH~mJ2s1eNQ{Y{mcELKuC7B*Q3-xveCXX; zix8$YK>lg}mdMZNq!6Ce-ACS*B$@5Qp)^+xes&d$lE#?2<|J;DXz6to5g7|~8koEB zib#~0`jzd`aOUre5aXTHa{};g%gIMw^O0&tHTc(}PYo@CN`-MxaaUs>dd^PnQ44u5 z`!nwMMfaWY$}(L?>UQ;(s|PfLUK_fm?+A=HAObqCgjXhFG2QiZhjhrL7tvYgu(d=i ztXNQ1iR(7M0Q7y`j`KgUr)&XFIWFEuVEsa~)BAXw1a>3h|LMK{W@rD+sK@VCaCBZ*EQ0*WtEs*pJe{_%8Fu&Qp%xN|5p|0x~tF#c^^O**fCuTTeMTxm38U z(4_7etsDoGap`W&`9~7_?(_0kQ+st+{eVihk_8+uCT01Qk2J*o7%*=P`E;rlj0>^Wp5gmBTZ zty7IazTM=_F=0;YiMGs85BjMfccDhxc|6SF0#=onSFrEWQiS46Qo6lW*t2-Ic4vRD z2EH+><2Di$8c8!pQSlGbVLImEjZa%WsiR4xGmzu!k8=|?ae0F7LP}{UMesvdJ zRgC3YCoz(AQ!@Aqyc-_h^3ybZ7(`&h(jjcefN+Sp-9VvZyqns>}IYFPXg&YIuv0lYH14-1h5#5&Oua+zxy^i@{ zuZRBYyBw|Eq*i9EocSRYh(WSFAzujc0FBeKidk!iNIq5)8Bd>bfmT(?h!b`BuW4*_ z`G~7^)zu0>q!_rwhI@Cajm|8C6C|*VSy)_!R0kNvJaCNxWqnA4iTlW; z2Fj}-6@tRq1Kp?+-O6HogH6XjaId)=^8FYeWx~2HJELnOJ@`L=d*?o1ug^lTJk(;S z+O-JDPdlmhB8}rn0GWg`6$^IRMQlAAA=UK_?=r^Nv{>HR%|F;O)Z}#%+9re>)VIG4 zgh|@cuXjEB!Z9b7(ZmM1TGmvC_9))`tS)yqR{l+=V}1&&n)gRKjgkKnmK$7+;doJ!h}-a ztm&2+g;$Hr{pz2;3^fCr32V$r(Mjk-Rd4I=INJ;UWj zr`8%(XA<9a2a%}7uqM1;cfAO5*>Ftk3c|-*sR8`ojegr!`}FK$&2{pCajN``91)*-;5;=5Oa9O9=7B|QU0+mWvKq6XHB zK4caNbtR>QP4;{=1KA{Hl++CcAo4+~|*NM_8#N@iSMqU+z-UPgYCqv41s(IaM2UqLajeNxGz5MQ!&6>lJ zh~1RN{!611qeE3<(d>L9myMRX`{q@N3xUIl#c(QLIk)US!-Fn!aMGDYRqJF(C%2V| zzfiMV7H*?nAk(gP$fq?ZgI?mzsDKRSZgBiBhw4k4xpyQ@lX$ArM%U`R(JSkVAh2L! zm8k#90n7uvVAr4NmTums@`cgrC3QCM24zfOJ`)?bw7XPnjhmsibb~t^BiFxPDv!NS zakiG%OVVU@swnyzD7Y7T$3x*UB9^Q1zTXH`iRBJM_<6+K6ev79&j08+aQOmJMKfi- zv#r*F{@2{Djg0;(!Gi-M6koD}yT}_fY{RH9nF=S+vNV!q45P zqDpeV%s%1#T%6`>FvaGbdTzPR(!+|=wcOsS%ro9W1qF&wZhb4%WpL75kq^#mk}sp; zSN<^|^us;6e5Rw*F}~TnXM7RJVlfv0W5~9xF>SWLQC!x+j|sS97An7e;~3D2s zGE@X*GJgW*SNpkQxk8k{BeO~jcYva2k2%Nl-e+IGGZzZ9sdhtMU%^ZsWB;XLsVNGKb;R;>K>f zujuC7SqTLJkjv#yF%6h9m2VveI&)m^n~{>AzlSg zQ2b(PQM!+0SHfXzM(mSk{lJVb=g&e;yTGA4u7}}iBbI9bqtJb+!8s*7b)(U|2>FYH zOo1Sqgs`ifK>+RO9l(KU60KoMlKi~}_{TM(O0-afb!@(;cy+BH(5X$&QH~ zfhL(dqvv_B5(Q`)s??wOwvuxP#xlMY^XgUMJPu7*)Y`{1C&ybS9KeTC|^@0$9Y zXGIj;<(@TU8y1WyNgw(T>***CrS6Zc1?8}rRbuQPWMi&6tqIgi`G2?pd0-@B?rRHm z*;>o*Kbd(|5|fOZmLuJ^LX}BceZwX-yhkxG+-_x%^?4|8=Ka`b!fGYy zfoaycU%KM&WkajssXnQ)1GaG@`!rznZB*2s@EV3;CcN|?>0G18ZrF~9If%2`+M5ep zo?ZcY?Xe}zCSCy<*|BZWZZ3Hc<#L?5zTU5@TNP}o>zcD45bQJ~A`@FtFP-oER5w67 zPBhsppUZ3uyf!8QKU{P`p-C3Y3oXwqp`N&|FvZC@X4LrYJM)JI?<^#C{D|Us&u@D* z?qjk;F|N{yEhN#GR_=W}LOr9lQq82MDG$@k2yL$9^CVT88qaF(u4 zF^Sp9#pHdc!OX`8f$yKztf{B(zLL?(JI!Ifx*i05zK*l)1I?E)*H_gS-LaVhe!Ts{ zaG|eB>UI0|29)U&xm&5tl5qf!1Ybc*zMh((OS<9kmAMfzij*xPMJbcYyfqE<{tZfP zYcg>FV^3`}^-yh<87O~MpnY7o^6yM*{vC_=tnq}q5CWW zW&WtWO|+#r`jy(C^ia7|G%Ft9h-pmy^5!57j0^h0*HKxFWN9oZ$=32*6Hu*P6HdTo z@-c3NsL!sdS6(}*buPjupqs58UsKO6m@M$tXnQo-DZT8xbYtL`yOMkjCo0!F6HRh! zb}u&6Xzz84Klz!Zaq(mDwae1AiRMpBM#~h`H%aDWl>vlsEktd*7JKo*g4JB@^C%GSqW=tbA0SRoGY4RTN2{3X_+ysX0SI+>ce~hM}W{yorb} z1%ky$;nKEVfX>K8*-7CTFs>eIyS{rr95Mm`R~2?EOl)g*UH6x8_0s@wlFQ}3!;o}o zFgP!itb~8j-%B(S2QJHW>7aKJHeEU&WMD57;-1tXGsQgH>0X>Dr5(llhH^lm6?)Cj zHQ_Tjf%=Q)FRj2wP$!|Sn$B4huO`#ke1*i~z6Jv1)H0PtmSGsrypzK!mo}7|; z+B}et8K5G=N0E0&PJ)1`vVZ#HH=KWFpbVg}G&{XXza2{u#G^iycvODQe~``DA3ZPu zIIg>|7G-p7cyIX=js))OgVu`AhwaLaYz%ymIvb7l^tOg+Tr4lRZ#0n{@}#Xh)hlYe zJ5@mQM>jfXDi)pUeMrheZlu^1k}QgSv{KRi*W*hxN7-;z{+Da)OdO(irP9|iE>`<& zQmGS~U*2D4+nFibGEA{ck)q5-zoxUfX5l-pDcth0$d9+JWdpk1I5_&Uv+sqQmYjSF zpakJ)x4Z4 zZShYH#7Ftm8D(o$wxQ)$@q=>&EjuQaBv(15Q@)9QDN7G_tv*0*t}|D%t2})DP?qc= z!^-umgS-j(KdR(2EF4$bZ1hj$jjYJvj~P|G4lyK}eS1jri?RT+0A@C??PN@u{^N~Plf0Ha@9 zQ$3e(GTKev**9^N^+TqG)eka4Y|IbdUDVJXukf;uQ15#3D&`kV52^~*jcX01kQI8& zdcO+D^e32v($Hxp3oFTkM4IsB!>+l@yg<^SEw`dgCpwU`g$dTshFy$?Onv=g*xNei zP*T~BDpD{;{cO<<9E<1fCT>o}mI-5&=?4w+R(=nqDf4%yo0Ae!uDl1<1jog~CqI58 zo##$R7w!7ekqu={=Cxtew1?MR;sWgUs7689*OBA|&;1PDB$(o;fLrCm(4BclFDK`e z%9CFHgPFeC=JZ{a_loyjB=cqKmpVhD1=kaz2AS&C_s5Bo;nmeyR)Fvput%7y}GW2+kSU6fR^mZ01V-S z#`Qym<3*xll9PI4<6ZmT-%kI+W)8PXXIy5E_SpKSedkvJnf_DATE;8$kvvpvz%%*k zT@8y%)^NQtQ|r3!OowJT=cE?cL$N@5TmUA?RYrkRynd=dSS5%)5&W>ParIRXJS8Ro z%ly^o7;v1J^n4ang7^TY*?8#UfUgw|^DDz8WIABKBbK@(Yp`#IC!dXCsE|?6{?6>y z+JXnHpv3gy{4qEt$T-sxtsL9_)`w2Wc{N9W^|5}P!M*DOQxi5Q+_J_udN=KUrKffK zRZOmQL1^hO_2rdUCiY*LS=RfUVRyvdYfRaw?>PdKwHCm(<@EGvUX9#7g7Bpw^RqWi zlEzP|Yj}akola`2`=P&aay*-_(fG4awsJBy%>^H|_`SXRa5)(W&0!8QZ$p(| zc@DPg`j>qD6EIqTdFF(8laVm6R-^iUvk4X6ur?>Pl%Y<3zp~!C(CcfZ)O8-BnAYRa z{ZgFfaVfnqHgPl7<@yg|BW~t4 zdY#$JW}3d2;HUI|VMQL&b(P}=a)!RxzNR(fll(D?^RTYT)>C`*130<+8N1R))Zv zcj39g>8pfu^Z6E44A!3JM#R2i`CFh84VgSvNv+MVwm+wWdF3{oY@GEBD zzhP7Y9tfFMeKBC$z5d-Eo%AgWRsGq=6?sj0GGn?3VP~ytA?3kjXpy=2@OqWmNK~^f zVm((51BEI}%-0NlH{+G`eGQ_sX$#EBlYdMd`&A2kfk>`P%* z#kJ*Q{9B~kkX9~5hwCBCijLT> zBbMN0zD{X~hCe=VFC!iz72iuL8rIBh_p~jqap3mhPI$_g8{nck zyG(nSVQ-dUKa)`7k|3{kh?_8f4%jR+O3iU$;>N=44J=C*lVbE*DrMW!RYkd(Lk_LQ zV#U0+g-N#|n_$(U!(hcr_DAE~;l7GaR~0$D8jXu!+vEv6-m#W!dIJv6U?51h-dDJB z{N;n4LmEYe#(NC^&k9}&-ynPR|J{BDhYbfVvFQ;>3K%Sn2Ds!?;nNdn?^uaQeb<-| zF%s{xq^QaN`iv?T5=@s)BvEmimFRBl#O!b3gTUO}cfLP!vJpi*6_W_-M1FcIS|QKg zE&O1d>kc{8o~|->z`JN^gnUCNRpL|x3FkbxJMBe|52Bb;^L^-MkL3#ehj9JJ>>p!F zF2ybBf>&7$1%4-a_VIWz-Y!gbD_^=h~2%jJ04eLD-A!F zK6zSCPNNyF%qy+TA<--yCy~XFL>wIFpg>9-xv#=a$UhVkc zNpDF79WDq5(Jr>LZaXFiAN+IyGsr5?iE%AvTH6DD{geIdV{&bu{_yml&Q#J_{N4M3 z_`dW%6*v34nsgVh8%qq=G-h3>qGySDQ}}#-6r9S?2#C6R9cjUaPSUxOvZ)%H;WpogTQ&J>lT?D5VHfm(fXQCEZV~cO1HD6M zHchv{cBiMB$|=GPo%BeJSqO3j4jFa&piA9x6d0AP9KXr_c2^J>09i`1ZnK$-O-o9O z`)Yl1TpW_eG^LM%*s5O%Ss2mYYCd~=psnhQ%>)L^_2PdVUwRqz?_90kTBc_tYjlqD z2Wpy2b8h}&o@^a@DPk{U;L~C*p18EjZAA^6z0Owhp#W`47rS}rp7_xmSN#UpQRpvO z(W?8kz5)!54c-3548XwE8s6P)-DAq5n689vgM-|-kg_Iw@3dfHTA37Ue#loc@K>Pt zIaK;$J3x`uSZFmmyyLpE?%9>xlyt7U;@9i{SK<~ZVpYz){2wbMB-<2{7}M;O`s!Og zQnsaMlVd?HYJH+yq?F8ugpOYN27vr`05x0l>_YwmW_?(JV&d=}-i8H!(! zrN!Nn(PR^|Tg@yJNDS4_U%n;=)ezAcc)8YL+I$wXpz=*PN$!h$AQx9#c-b6zD*wMh zs1c5xjj~wu3wY9fFE-G-)=%RO{!$`Nv5geFLLISWE&LyejGdz5gc*$y$LwU^cKybP zQB-!C#~i=w;CQ`m3YL{I?6g-)S0WY1xBuAge|<#}OEuEF-#9(sJSPG=l!ucfz%C>S z_}`I9|Lb=DeGNBxN2ertX^oofn4UU$f`anY@2#B_C&>FfsTj!{O{vdaxP1Gfh^XY1 zJC9ke^6*}}E@AmxOzJLqvnLIC4=BZ{6UV?zO+@(ZN96dE#&b>_e)~!2W8fRZ-VHWR zx+2ct9B*PgYDLAO;Q#0BL5U zN-xdj>@~hCS!WKOhrmKYOZslw9=4(?mL*s)ke5HZTb137KF(ZwHW8#>pH}G0vRsu} zr+h#OI$=9hkr?^jNNPdyky7*{`?OSaL~QIaVB$?uZ2NflmFGzDLS^Ij6w6qfqO4vl zL%)4@Na)vN;OpKiSz&LDuEsB}&O%m`7Pc;I;d!4@zo29ewh1C43itG*yL`veJA}Ye z;VH>5l=MsQ+Mwb`Z0omFW8lp8Vc4RXn(FehPWV}w*U0-%Q&Y3LQ{m_5TS6{D%+@aU zEmvWA=CHFeZPK%hJIBC6;@8Twj5SqU>DTg_c-D6!hbRm9fuTsA+MBZsU@EWF0+`8? zr`hD#+oHA6Q^C@TsK#%89~g14pF<_AXa<42n}nRg3C z&8-=+cjKd0Y^_UJ?!Qpx9CXgv`aER!f&cJ_q0P*iQK@+hgx%47Mjx3FW$svO60_&m z9KRHN;)o&y6f`f>#_b3~A7sa5eVo{PK~EE)(V8CM?$jcOv4xTX|J`Xb`C$E3+a)<# z;nnli^qza#=!SSRK(CjR-R^p7NH;<j zfBum?F_P3@(lJ65P%YBnJO*qX8v@K>m|nB1Q8nGC4%O7_Q)pM*Zq1AjK(mXz1O#c>qlRIc>*u>^~G5}Mz0Kt&R5_p&B8flh4BD0rum6uVDrQJ=V2+&*+EGdy2z1 z8IQ^y#}cAmhZO7a96rrrO1foX$Z)>#iH?pxmYz-}aX6&TWY&mfz~H*8bCBv`Fbj@h z+{Lv;jN5!T7Uraas>og)>m#h&6L-GeOOD)9iG&bMdX$h>Ou4onKi~5og7GcB7aX+>)L%seL3j0#Lbe7 zjMs|`ixmbJMb|3P2h4fzPu(@yi@yHw`l3ml(fccGl-jzYeS#kgRG;r_-mPHyD0oK4 zhF|Dm5p+SAuJ0I7`8Q0|MoP=;Wz;Saa?W?hpVE(?^BH+j+28-*Wv*1hP0xo5*72Cd zWx}A_Xw^-Ho|;KprpST-iPmys-JcN0akV%7w`CttKm4}L%E?2SV|k7DC0kSsxf`wo z2uL$r1+%jsZCzs;_Ia!g%ZgX<;4yWw;jPhKH*t9GRUDHL-(N0kprYQsoO05X#<75Y zyWDP&jWxCq>|9qTXMcVK`n7M;baedA$4M|W5i?<<%9W~;7r&h2!F%O2S85OeuW5ES zb!ej?A6*vd2IG&>wktZ5nYq*7e=^F^VOR=+>AwHIYSeIuxpf5`=g1qmVQ5Qpzu4t< zEzUh&G$5V+#^7fslqyf!)1bmmz9m{{|?;4;d;pcPONYQbEs> zP8jaDL0n~B>hFZp8m&0H^oUd2W&}TZt@=asW2HuJjA-VZUk9~Jqvu2^7g+B0IpWCyR5yVHfVhG|u`xZ`>-8rhwe zHmz%{3i83>oTjmwjcBqm#xw6tlf%jOitQ?lXm+IdBdM%?7{!y8KSfMc{yfk|zt%H|E;1%?S1rdRDJ_Q0uGnZ49 z>3nJZOBe&A!JqX$=C4%Oy_RYV`brS@NdES2?4Mx7+Wr~`Z9%CqyH6wEhkBkZI=4Iq2we2)0ha-@6KNnY&1Ye?beex)ZV_u+?-_ zFIAVA!!?*oV(FwqO{P|Ad%fz2f~>HU0bO>|{+1%8i8wKE|q^ZqPo@-1DOT81RNfJX9_BQqxUf zOYUj-VqF{yZ4AOfJ?6u9?$oy*10Av?=j(00=VitmZrO2bI^0NbRh9Oi=hwLR=!9hi zo4?N7>##$+{PUc%71EQ|F}bOt?|=ty7gjOIoD}=zp5UFk`rpd@i+wCu%tqh{j#ioN zn~EFbfoNg_s_EaNvpp?MPZ>Hb?Z50Ow;;NPP5-ix@*#Irw<9%;^6Ln6aoFWvPL)F` z{OW@6>tg`o3Qfj3plo2;RB@7p(wRRW*c$hwDTR$p( zeft<0ClGGPJBV@(= zVGLJO?!7w(^k-H6fyGgO?7<6eZZSi^u5Feq$E>-zr|jS_%=zp~Zk_AbA;HRD-&C-v z5i}eqZThGu`Ps@z&4#wOquyo=>>!!tkz6eLa)LMaJibTstGWnPCCF9$hSrj;iI!>G zo=TU&V?!aeVXUyS+n34*c8V{vWoyYE)BMpD?4noA3QYzgiR{1W!uEvz<<*U9lfAsF zA2_}ZwJngjxggmu7;w#1pLZ>%-Ea0bv2);c(g$5xUHzfrR!#wp0zugolLcq~)6OBC zmov*t$+)KQ6@XyD?#^^uhsiGEa5p?$NwCRJKH%{;SH&1Gz6 zaYat=QaB-VK(FzgXRNfkAdP^sk|TA>H*=! zETZdLLd^FaA7sRfnG=T?gilnKtVXiu!OZk{2VE zmv^y+V^eZ8Q7tToXuF_eKtpS0fGfsnn(VI3j)!yv&ayu;FwSaGFv@$X6fokd8fbG% zTxa&-=Ar3+R^Ux%X~oAY)Pu4w2=t%8N?*ADy3o3+_l5EYY?!$de+-0kpw-?g9!*;v z1H0y{MxxobeRdznm9%eE@zhSlta^~MVRO*GwAV&WFyy-@SWqH~S2@Fgz=;}p7J?0c zc)!|aRe28Q{NCkzR%GH<+wbh{T*3HR;hC}pq7#2N{-{=9hwJj_aM2|@YtH4;6qrZ2 z?nXm~HLdR?IX?Uf+Di$s6b|mACw->nSF;Jj90Lxs)WZEAO((PeFQVQ$D$4fz9u@=y zX%LW>7`jWkySux)Lt1L+9$K0qhwf6kyJ6^VX+c2W@%en$@BQzF#bUvApX;1`_TJ}= z5?YPtxl~Y?o&|nTupE!(GkSj4kKU=)NW*AiA8?Hajxn9fHJ?^>lj~L*J>ArhnIq5h zh@$PxMAAz^zBJvP;TMwd7NIxy9a|dQ@e;I-2Zqdg&Hjb0eMZG^UJ+lq@Lb@lOL z_%*q!KR4Dv2x@b8VPf{p?P}UF<*n{I!8WA8?IAI;W$Ux@xG6%g(H2ym&g(nb5SOO& z)?K5XG=IR)f7g7lxiZKAzh$mPkzrBQ+4;S3uyLg2S<{Y50_OeCn41a$E&H%?_ZF$Z zG;Xc=`OHWuOcf3Ooo6I-Rq=VvmEuI!W|^yFyLo@jJ5uIwLUu<7;x6xd>q4qW){ez?bE%jKNc{{Bu;^w_!;CbiZ2CV`uwaO@#E(Ur)^`_^)aoN=fI2taBI7W7V=kJ&Z zL{U|LOtyDD;lz_GE4hBJR#a3(FJ65OxYU1)ySx65TD$u9&HsARdr*MLIKksMsgRec zaply?!6J^N0ndnt9N;F=27~?ql~D~l`?P*mAsc(Hk1Q_BG)9np>@NB58w8Hsm%80O zZ3^{LLt-{_ji!r|&a~drc+Ke624>QVX--4tyDHyP!Ld)IlfUFE?a9S-bm$=V=~+SG z>KrdO+bWXumsO|UcnR$B&Uc0i%rh<3z;fz8Ro8Eff;V}>Twn<``0D>}nJR610{_05 z%IGs$&9cFV2RM%owj*6`2v_5Aq;A!WYJot&jq2PA?o=x-qJ6}#+~x2&Rd@rPLO_qL|s%ewE@ScyuMlcVX_^i)NH7XtCkIO$9|eA$twb{6yX zE`F_~rA1Qi&dzGOi_HA%-iD<+?C_k~d|Q3;y$2^3SytF<*GLigPK%l(PSFbds1tg_iZOs>k%3%b&T&8NV$Tv6P zP06@^$NAGZN0gBDoXMWHXj?1MjE84Ed6xyJ7mX9j!eEb9^|LnIkHJrEaXcGab>5SH2d-PBEL1LG^?_-=HEebb8L7GSf-q8pbG?1(6 zVU{yRF5pX?qEg%=CWYVZOZ^W-rh|^IqSQH{0-2ZkwG!I??dfQukqU&b+|%txA6C6s z5-MgF`T5IaG>=bnk%cW2v4epRjPjg%n)HOPRzB|6m{RIP=EKtc{7S^lKctU^mLD1! zQBTK1?yY)$*K7ysxC&Rbk!!6ZpMCyFT>G&4__e8wUOJ7k=rm=B`69>L-8-GI<5^F! zU)jdtb&xJ82R+T|ixA>Lj}M2W?DxtVQVigW_Zr%Ddg$0l_AnnE$3>u?pT_xHS4z=$ z+{2-a@%^8(;ta`CaQf9oJv4WUuptMl(lsitUZVrmiH6Y~EIt%R3(u*vLlvf*`DI2< zl720h&B!qw-^LTWZYKw?N|yWozV>V%ByRy4&NV?yO8jC5ZN)cfN?Z-W{EFfKASZDeIxe2{5;j&sY{#E zr77^9FTSV4-oNhDy+gmk&vDn2EeO=w>_tyay?kq^)$Cym0WXx#pIRrSYT=l#4|4b! z1=)|?A7eEs3fykaxB41Fz=L5L4mKpOJhqqdaousx#OM9DOhpF}8iRlUp=<^&6H&qH z=IoN?X|2f#10R#piSL8)C8&c+;PDajeY)509X*kADd)bA@Q zvVJjr{k7TIEn5V`Nh8_I7+oceo46Q&pI}2ESe2_RLOWK{<~Q>_k%m8DhZ!0}D7t z3>QlLRAiB@+V=M^X)2^YpgFCm;lz#I-XUx?G~LN;>(n;6asosDAvuPT>Y%3BKo!PjK9A3` z(Ez8yefMIK6DGsW90hO@U69VQbnmQsnuCRsdnu}jVs>U&pkE8s!EsJOB^kATHI~P{ zZD~0fg}iWR1HJfHK{=BuBW$v7CO{Zo_fEuL{MOJno>z7|V=d0Q-Tl9RT4!mrq*A}B zT6^ArX1C#i8&Yt076*Lnsv^s`=D!AC+2hbeqK-bcrZ?~c!hK+i&`V?-AURbVEVX3OKP z18j;d#ar!xW&vZJar96sMvW3RcEwXt>oe{D;j!=qF^iAti6I-3~_dRU|e-~ z0#=V@(=DR&?&?d9+YzW}&NXVUv~(Iw&8t&3!$15iVqj2?ia6+Fpg62po?v#&t_X{+ z_C6h8wp`;J(XKVy|NG|k%>MwkB&2F7*_HL*se4@0oWUBq6Ofvkes;{?H-7&Z`hM|) zRIOL3yD|)WOnW*UH)|LKcg&PIi&nKP}hQb z`cOb3q-=ex^o)(9Q?6wC8Yd3AS-co#4c3WuS8*4KS{jmBjEGCMZfTGhEhI5kc|!UO z>n1&vB1W82?(+gDvE4XfFK=G2lqi?05UteejD4a|shKxzLR|4o_WqcUhoHF9+y3{h!0D+b8=yE<4NnZWt>zGanK6{aU ztodQ{OJ8(uc-{v+v((+9dGr3CcF_Iu<*h3Yy7*c}mHl4vTn*Y-C(-G~hSK1K{?Ofw z{DHPyw2Vq+MP7nnKKH$VPjiCm39V#~ffYLE?F>_%2g2|of!n^2N>0Uj8o4kq?Q?Uj z+OgA02L5Q)8uATz!N$ImnQMK~DLm$dk-h1MV4_A@vKl1WhyC-^q8**`!&{I}M%CO= z=LEN!(Uz>7d)dx2N{8R+jfWGZ+e0AYY-4goCFXf$Rix|eM${umz``qy7lxyi3fGY{ z3kHUMOL=a4LeEiM9$~R#+|mGtR_G?m*S(##3pQmX@pmsbZ(V1;wyKVjGnfFVbkwHN3ghXRI5-Rw>T{ zPk*LzRc358*+k}T!|FSf_?p_3%0!d9iZsD{jRK{Cl2|FAYZp?*5CW8T0|jc4_6iHm z!@2k)OOUoR$WX)-yUf|{XrbTuODR%oDZMZ@pVku{0@yiSD@{$rY*0IB0=t=Vo zadiw6Ew=$CJ>rJYaz+$Eq@Gq%F$0kZ{noFIA8E1Qvfw}M&(8RI6Y9b!Bj$9~DohGhgQ-AaCzV^syhCew0Jbl+4 zjT43bh03LIM<-(gjMJk-)G8)mlZpt#b2D{zpdG_sR-@OgS{83f`5#+;!@2$82n*x^ zuYwtNYx1BZD3*bFoyxq^gX5DNZ={^E&Ivq4E7DMNYs*CuO0|; zc}X~y>XSLNXJTj)`m#la&l$$$L_Lxnm%%h6GtQ!F-`qt0Yyg;&-47CVCL%_%40ZRD z^-~!|mvkxsr!F`-VPOF6qK8i=Y=&Uwms{(WbU1CTr!PrAiB{14u!0zCS6>@l%zNq@ zmS*~L@4q{0DkYj3f0kL$`x0V2$C+09Et5zHA*D_j^&!Pd9uS#c_I7bkv4KP)Dp-bW;1 z<_vDoT;#PvA69C?n&mwuQjCZ5ps6v69;`JdQXB<{NDo*j1xAeaRVKnwPK)6;bqfd) zE~^hgMC)7PwdcTkr&?-xvFb@Lz};5LC8M)6O~s`W!W8+T>(xX}wa}NPE);FcZ_li;qd;vkqaIQCEFQ zxy~{loDvUngzM(8Tk+!Y-qsSg15S(8Dt>UVl~6Sggt>&!OeF5~+b&L?socS%W{tX> z2l=o6g6&G3b~r};7n{EDeV`+5a=t0${;7k!ab9J4Mt!c3QOchc@qX<=)C?2Vh1_v@ zVI|U@SYZ4l5t{tIkZV5`B!`VAONGQ%aTsIFE~yH!ga7kBQbE%QHxB#}wfjiGXOt$) zI&T9fOuZ*KEYuivS=s|`LYB>TfYO{0v)WEG9!-&)@*F$K7+%^)h#FB>__OU|xmHBl z?00k2ZCc35v~f&3$wkA5e%$^2& z&2o`O{hJxRCpHoo!HL23LBx$Td1(@atGd@4^FS5R1q?lp>g8sTwQnwgm!tlc4z(!v z-OiM*1E#E~MgUD%0DZ+e9?q9jI}lqMU6O_;grg|T!qwHDN+&5x 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

H^AUqc2mXm60lZX+5Q? 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%0DY|A%{7gkA4hXNH} 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 diff --git a/docs/freqai.md b/docs/freqai.md index 303c2f151..c0844bf32 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -112,15 +112,15 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `DI_threshold` | Activates the Dissimilarity Index for outlier detection when > 0. See details about how it works [here](#removing-outliers-with-the-dissimilarity-index).
**Datatype:** Positive float (typically < 1). | `use_SVM_to_remove_outliers` | Train a support vector machine to detect and remove outliers from the training data set, as well as from incoming data points. See details about how it works [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Boolean. | `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. See details about some select parameters [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Dictionary. -| `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. -| `outlier_protection_percentage` | If more than `outlier_protection_percentage` fraction of points are removed as outliers, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact.
**Datatype:** float. Default: `30` -| `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** bool. Default: False +| `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. +| `outlier_protection_percentage` | If more than `outlier_protection_percentage` % of points are detected as outliers by the SVM or DBSCAN, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact. If the outlier protection is triggered, no predictions will be made based on the training data.
**Datatype:** Float. Default: `30` +| `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** Boolean. Default: False | | **Data split parameters** | `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. | `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. -| `shuffle` | Shuffle the training data points during training. Typically, for time-series forecasting, this is set to `False`.
+| `shuffle` | Shuffle the training data points during training. Typically, for time-series forecasting, this is set to `False`.
**Datatype:** Boolean. | | **Model training parameters** -| `model_training_parameters` | A flexible dictionary that includes all parameters available by the user selected model library. For example, if the user uses `LightGBMRegressor`, this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) (external website). If the user selects a different model, this dictionary can contain any parameter from that model.
**Datatype:** Dictionary.**Datatype:** Boolean. +| `model_training_parameters` | A flexible dictionary that includes all parameters available by the user selected model library. For example, if the user uses `LightGBMRegressor`, this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) (external website). If the user selects a different model, this dictionary can contain any parameter from that model.
**Datatype:** Dictionary. | `n_estimators` | The number of boosted trees to fit in regression.
**Datatype:** Integer. | `learning_rate` | Boosting learning rate during regression.
**Datatype:** Float. | `n_jobs`, `thread_count`, `task_type` | Set the number of threads for parallel processing and the `task_type` (`gpu` or `cpu`). Different model libraries use different parameter names.
**Datatype:** Float. @@ -738,7 +738,7 @@ Given a number of data points $N$, and a distance $\varepsilon$, DBSCAN clusters ![dbscan](assets/freqai_dbscan.jpg) -FreqAI uses `sklearn.cluster.DBSCAN` (details are available on scikit-learn's webpage [here](#https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html)) with `min_samples` ($N$) taken as double the no. of user-defined features, and `eps` ($\varepsilon$) taken as the longest distance in the *k-distance graph* computed from the nearest neighbors in the pairwise distances of all data points in the feature set. +FreqAI uses `sklearn.cluster.DBSCAN` (details are available on scikit-learn's webpage [here](#https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html)) with `min_samples` ($N$) taken as 1/4 of the no. of time points in the feature set, and `eps` ($\varepsilon$) taken as the elbow point in the *k-distance graph* computed from the nearest neighbors in the pairwise distances of all data points in the feature set. ## Additional information @@ -763,5 +763,5 @@ Code review, software architecture brainstorming: @xmatthias Beta testing and bug reporting: -@bloodhunter4rc, Salah Lamkadem @ikonx, @ken11o2, @longyu, @paranoidandy, @smidelis, @smarm +@bloodhunter4rc, Salah Lamkadem @ikonx, @ken11o2, @longyu, @paranoidandy, @smidelis, @smarm, Juha Nykänen @suikula, Wagner Costa @wagnercosta From d44296783e6264e25a3c20cfc7f5e104883f8ce2 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 6 Sep 2022 20:10:12 +0200 Subject: [PATCH 139/437] isort datakitchen --- freqtrade/freqai/data_kitchen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 471634c85..2ed0d73af 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -9,8 +9,8 @@ from typing import Any, Dict, List, Tuple import numpy as np import numpy.typing as npt import pandas as pd -from scipy import stats from pandas import DataFrame +from scipy import stats from sklearn import linear_model from sklearn.cluster import DBSCAN from sklearn.metrics.pairwise import pairwise_distances From 3535aa7724c4a202007841a1efa18c70fe728ab5 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 6 Sep 2022 12:12:05 -0600 Subject: [PATCH 140/437] add last_analyzed to emitted dataframe --- freqtrade/data/dataprovider.py | 10 ++++++++-- freqtrade/rpc/external_message_consumer.py | 21 +++++++++++++-------- freqtrade/rpc/rpc.py | 3 ++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 76e184296..44296ab40 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -121,7 +121,7 @@ class DataProvider: 'type': RPCMessageType.ANALYZED_DF, 'data': { 'key': pair_key, - 'value': dataframe + 'value': (dataframe, datetime.now(timezone.utc)) } } ) @@ -130,6 +130,7 @@ class DataProvider: self, pair: str, dataframe: DataFrame, + last_analyzed: Optional[str] = None, timeframe: Optional[str] = None, candle_type: Optional[CandleType] = None, producer_name: str = "default" @@ -149,7 +150,12 @@ class DataProvider: if producer_name not in self.__producer_pairs_df: self.__producer_pairs_df[producer_name] = {} - self.__producer_pairs_df[producer_name][pair_key] = (dataframe, datetime.now(timezone.utc)) + if not last_analyzed: + _last_analyzed = datetime.now(timezone.utc) + else: + _last_analyzed = datetime.fromisoformat(last_analyzed) + + self.__producer_pairs_df[producer_name][pair_key] = (dataframe, _last_analyzed) logger.debug(f"External DataFrame for {pair_key} from {producer_name} added.") def get_external_df( diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index f0b177647..28628c1f6 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -10,7 +10,6 @@ import socket from threading import Thread from typing import Any, Dict, List, Optional -import pandas import websockets from freqtrade.data.dataprovider import DataProvider @@ -225,9 +224,12 @@ class ExternalMessageConsumer: timeout=self.reply_timeout ) - async with lock: - # Handle the message - self.handle_producer_message(producer, message) + try: + async with lock: + # Handle the message + self.handle_producer_message(producer, message) + except Exception as e: + logger.exception(f"Error handling producer message: {e}") except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): # We haven't received data yet. Check the connection and continue. @@ -300,17 +302,20 @@ class ExternalMessageConsumer: key, value = message_data.get('key'), message_data.get('value') - if key and isinstance(value, pandas.DataFrame): + if key and value: pair, timeframe, candle_type = key - dataframe = value + dataframe, last_analyzed = value # If set, remove the Entry and Exit signals from the Producer if self._emc_config.get('remove_entry_exit_signals', False): dataframe = remove_entry_exit_signals(dataframe) # Add the dataframe to the dataprovider - self._dp._add_external_df(pair, dataframe, timeframe, - candle_type, producer_name=producer_name) + self._dp._add_external_df(pair, dataframe, + last_analyzed=last_analyzed, + timeframe=timeframe, + candle_type=candle_type, + producer_name=producer_name) logger.debug( f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 3757c58c2..98dad278f 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1064,7 +1064,8 @@ class RPC: for pair in pairlist: dataframe, last_analyzed = self.__rpc_analysed_dataframe_raw(pair, timeframe, limit) - _data[pair] = {"key": (pair, timeframe, candle_type), "value": dataframe} + _data[pair] = {"key": (pair, timeframe, candle_type), + "value": (dataframe, last_analyzed)} return _data From dc4a4bdf09cfc3ecb588cdabb3877e07b5762ab0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Sep 2022 20:25:46 +0200 Subject: [PATCH 141/437] Wrap cleanup in try/finally handler If a database has errors, the database cleanups would fail, causing cleanup to be incomplete. closes #7364 --- freqtrade/freqtradebot.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index f7dca1d75..1d171ae89 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -142,17 +142,20 @@ class FreqtradeBot(LoggingMixin): :return: None """ logger.info('Cleaning up modules ...') + try: + # Wrap db activities in shutdown to avoid problems if database is gone, + # and raises further exceptions. + if self.config['cancel_open_orders_on_exit']: + self.cancel_all_open_orders() - if self.config['cancel_open_orders_on_exit']: - self.cancel_all_open_orders() + self.check_for_open_trades() - self.check_for_open_trades() + finally: + self.strategy.ft_bot_cleanup() - self.strategy.ft_bot_cleanup() - - self.rpc.cleanup() - Trade.commit() - self.exchange.close() + self.rpc.cleanup() + Trade.commit() + self.exchange.close() def startup(self) -> None: """ From 97077ba18acd9ea0ad67ba45e917aca6bdcb3b0d Mon Sep 17 00:00:00 2001 From: robcaulk Date: Tue, 6 Sep 2022 20:30:37 +0200 Subject: [PATCH 142/437] add continual learning to catboost and friends --- docs/freqai.md | 1 + freqtrade/freqai/freqai_interface.py | 3 ++- .../prediction_models/BaseClassifierModel.py | 2 +- .../prediction_models/BaseRegressionModel.py | 2 +- .../prediction_models/BaseTensorFlowModel.py | 2 +- .../prediction_models/CatboostClassifier.py | 11 ++++++++--- .../freqai/prediction_models/CatboostRegressor.py | 15 ++++++++------- .../CatboostRegressorMultiTarget.py | 7 +++++-- .../prediction_models/LightGBMClassifier.py | 11 ++++++++--- .../freqai/prediction_models/LightGBMRegressor.py | 11 ++++++++--- .../LightGBMRegressorMultiTarget.py | 7 +++++-- 11 files changed, 48 insertions(+), 24 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index c0844bf32..e790bbb81 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -98,6 +98,7 @@ Mandatory parameters are marked as **Required**, which means that they are requi | `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old.
Defaults set to 0, which means models never expire.
**Datatype:** Positive integer. | `fit_live_predictions_candles` | Number of historical candles to use for computing target (label) statistics from prediction data, instead of from the training data set.
**Datatype:** Positive integer. | `follow_mode` | If true, this instance of FreqAI will look for models associated with `identifier` and load those for inferencing. A `follower` will **not** train new models.
**Datatype:** Boolean. Default: `False`. +| `continual_learning` | If true, FreqAI will start training new models from the final state of the most recently trained model.
**Datatype:** Boolean. Default: `False`. | | **Feature parameters** | `feature_parameters` | A dictionary containing the parameters used to engineer the feature set. Details and examples are shown [here](#feature-engineering).
**Datatype:** Dictionary. | `include_timeframes` | A list of timeframes that all indicators in `populate_any_indicators` will be created for. The list is added as features to the base asset feature set.
**Datatype:** List of timeframes (strings). diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index a9c21fb65..b6f3d8ebc 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -86,6 +86,7 @@ class IFreqaiModel(ABC): self.begin_time: float = 0 self.begin_time_train: float = 0 self.base_tf_seconds = timeframe_to_seconds(self.config['timeframe']) + self.continual_learning = self.freqai_info.get('continual_learning', False) self._threads: List[threading.Thread] = [] self._stop_event = threading.Event() @@ -674,7 +675,7 @@ class IFreqaiModel(ABC): """ @abstractmethod - def fit(self, data_dictionary: Dict[str, Any]) -> Any: + def fit(self, data_dictionary: Dict[str, Any], dk: FreqaiDataKitchen) -> Any: """ Most regressors use the same function names and arguments e.g. user can drop in LGBMRegressor in place of CatBoostRegressor and all data diff --git a/freqtrade/freqai/prediction_models/BaseClassifierModel.py b/freqtrade/freqai/prediction_models/BaseClassifierModel.py index 2edbf3b51..e51e26e0f 100644 --- a/freqtrade/freqai/prediction_models/BaseClassifierModel.py +++ b/freqtrade/freqai/prediction_models/BaseClassifierModel.py @@ -61,7 +61,7 @@ class BaseClassifierModel(IFreqaiModel): ) logger.info(f'Training model on {len(data_dictionary["train_features"])} data points') - model = self.fit(data_dictionary) + model = self.fit(data_dictionary, dk) logger.info(f"--------------------done training {pair}--------------------") diff --git a/freqtrade/freqai/prediction_models/BaseRegressionModel.py b/freqtrade/freqai/prediction_models/BaseRegressionModel.py index 2ef175a2e..45f0c2937 100644 --- a/freqtrade/freqai/prediction_models/BaseRegressionModel.py +++ b/freqtrade/freqai/prediction_models/BaseRegressionModel.py @@ -60,7 +60,7 @@ class BaseRegressionModel(IFreqaiModel): ) logger.info(f'Training model on {len(data_dictionary["train_features"])} data points') - model = self.fit(data_dictionary) + model = self.fit(data_dictionary, dk) logger.info(f"--------------------done training {pair}--------------------") diff --git a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py index 04eff045f..66e6ec1fc 100644 --- a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py +++ b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py @@ -57,7 +57,7 @@ class BaseTensorFlowModel(IFreqaiModel): ) logger.info(f'Training model on {len(data_dictionary["train_features"])} data points') - model = self.fit(data_dictionary) + model = self.fit(data_dictionary, dk) logger.info(f"--------------------done training {pair}--------------------") diff --git a/freqtrade/freqai/prediction_models/CatboostClassifier.py b/freqtrade/freqai/prediction_models/CatboostClassifier.py index b88b28b25..13395879a 100644 --- a/freqtrade/freqai/prediction_models/CatboostClassifier.py +++ b/freqtrade/freqai/prediction_models/CatboostClassifier.py @@ -2,7 +2,7 @@ import logging from typing import Any, Dict from catboost import CatBoostClassifier, Pool - +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel @@ -16,7 +16,7 @@ class CatboostClassifier(BaseClassifierModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ User sets up the training and test data to fit their desired model here :params: @@ -36,6 +36,11 @@ class CatboostClassifier(BaseClassifierModel): **self.model_training_parameters, ) - cbr.fit(train_data) + if dk.pair not in self.dd.model_dictionary or not self.continual_learning: + init_model = None + else: + init_model = self.dd.model_dictionary[dk.pair] + + cbr.fit(train_data, init_model=init_model) return cbr diff --git a/freqtrade/freqai/prediction_models/CatboostRegressor.py b/freqtrade/freqai/prediction_models/CatboostRegressor.py index d93569c91..0b8bc162b 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressor.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressor.py @@ -3,6 +3,7 @@ import logging from typing import Any, Dict from catboost import CatBoostRegressor, Pool +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel @@ -17,7 +18,7 @@ class CatboostRegressor(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold @@ -38,16 +39,16 @@ class CatboostRegressor(BaseRegressionModel): weight=data_dictionary["test_weights"], ) + if dk.pair not in self.dd.model_dictionary or not self.continual_learning: + init_model = None + else: + init_model = self.dd.model_dictionary[dk.pair] + model = CatBoostRegressor( allow_writing_files=False, **self.model_training_parameters, ) - model.fit(X=train_data, eval_set=test_data) - - # some evidence that catboost pools have memory leaks: - # https://github.com/catboost/catboost/issues/1835 - del train_data, test_data - gc.collect() + model.fit(X=train_data, eval_set=test_data, init_model=init_model) return model diff --git a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py index 9894decd1..9ed61488c 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py @@ -3,7 +3,7 @@ from typing import Any, Dict from catboost import CatBoostRegressor # , Pool from sklearn.multioutput import MultiOutputRegressor - +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel @@ -17,7 +17,7 @@ class CatboostRegressorMultiTarget(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold @@ -34,6 +34,9 @@ class CatboostRegressorMultiTarget(BaseRegressionModel): eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) sample_weight = data_dictionary["train_weights"] + if self.continual_learning: + logger.warning('Continual learning not supported for MultiTarget models') + model = MultiOutputRegressor(estimator=cbr) model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) diff --git a/freqtrade/freqai/prediction_models/LightGBMClassifier.py b/freqtrade/freqai/prediction_models/LightGBMClassifier.py index 4ac2c448b..0023a9f69 100644 --- a/freqtrade/freqai/prediction_models/LightGBMClassifier.py +++ b/freqtrade/freqai/prediction_models/LightGBMClassifier.py @@ -4,7 +4,7 @@ from typing import Any, Dict from lightgbm import LGBMClassifier from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel - +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ class LightGBMClassifier(BaseClassifierModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ User sets up the training and test data to fit their desired model here :params: @@ -35,9 +35,14 @@ class LightGBMClassifier(BaseClassifierModel): y = data_dictionary["train_labels"].to_numpy()[:, 0] train_weights = data_dictionary["train_weights"] + if dk.pair not in self.dd.model_dictionary or not self.continual_learning: + init_model = None + else: + init_model = self.dd.model_dictionary[dk.pair] + model = LGBMClassifier(**self.model_training_parameters) model.fit(X=X, y=y, eval_set=eval_set, sample_weight=train_weights, - eval_sample_weight=[test_weights]) + eval_sample_weight=[test_weights], init_model=init_model) return model diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressor.py b/freqtrade/freqai/prediction_models/LightGBMRegressor.py index 2431fd2ad..81f0e6d22 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressor.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressor.py @@ -4,7 +4,7 @@ from typing import Any, Dict from lightgbm import LGBMRegressor from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel - +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ class LightGBMRegressor(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ Most regressors use the same function names and arguments e.g. user can drop in LGBMRegressor in place of CatBoostRegressor and all data @@ -35,9 +35,14 @@ class LightGBMRegressor(BaseRegressionModel): y = data_dictionary["train_labels"] train_weights = data_dictionary["train_weights"] + if dk.pair not in self.dd.model_dictionary or not self.continual_learning: + init_model = None + else: + init_model = self.dd.model_dictionary[dk.pair] + model = LGBMRegressor(**self.model_training_parameters) model.fit(X=X, y=y, eval_set=eval_set, sample_weight=train_weights, - eval_sample_weight=[eval_weights]) + eval_sample_weight=[eval_weights], init_model=init_model) return model diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py index ecd405369..2b25493e0 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py @@ -5,7 +5,7 @@ from lightgbm import LGBMRegressor from sklearn.multioutput import MultiOutputRegressor from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel - +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen logger = logging.getLogger(__name__) @@ -17,7 +17,7 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold @@ -31,6 +31,9 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel): eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) sample_weight = data_dictionary["train_weights"] + if self.continual_learning: + logger.warning('Continual learning not supported for MultiTarget models') + model = MultiOutputRegressor(estimator=lgb) model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) train_score = model.score(X, y) From b1c02674492993571c1cbc10144277eb29fda7a9 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 6 Sep 2022 12:40:58 -0600 Subject: [PATCH 143/437] mypy fixes --- freqtrade/rpc/api_server/ws/channel.py | 4 +++- freqtrade/rpc/api_server/ws/proxy.py | 10 ++++++---- freqtrade/rpc/api_server/ws/types.py | 2 +- freqtrade/rpc/external_message_consumer.py | 7 ++++++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index 952b3b9f5..cffe3092d 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -3,6 +3,8 @@ from threading import RLock from typing import List, Optional, Type from uuid import uuid4 +from fastapi import WebSocket as FastAPIWebSocket + from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy from freqtrade.rpc.api_server.ws.serializer import (HybridJSONWebSocketSerializer, WebSocketSerializer) @@ -105,7 +107,7 @@ class ChannelManager: :param websocket: The WebSocket object to attach to the Channel """ - if hasattr(websocket, "accept"): + if isinstance(websocket, FastAPIWebSocket): try: await websocket.accept() except RuntimeError: diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index e43ce6441..da3e04887 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -1,7 +1,7 @@ from typing import Any, Tuple, Union from fastapi import WebSocket as FastAPIWebSocket -from websockets import WebSocketClientProtocol as WebSocket +from websockets.client import WebSocketClientProtocol as WebSocket from freqtrade.rpc.api_server.ws.types import WebSocketType @@ -17,10 +17,12 @@ class WebSocketProxy: @property def remote_addr(self) -> Tuple[Any, ...]: - if hasattr(self._websocket, "remote_address"): + if isinstance(self._websocket, WebSocket): return self._websocket.remote_address - elif hasattr(self._websocket, "client"): - return tuple(self._websocket.client) + elif isinstance(self._websocket, FastAPIWebSocket): + if self._websocket.client: + client, port = self._websocket.client.host, self._websocket.client.port + return (client, port) return ("unknown", 0) async def send(self, data): diff --git a/freqtrade/rpc/api_server/ws/types.py b/freqtrade/rpc/api_server/ws/types.py index 814fe6649..9855f9e06 100644 --- a/freqtrade/rpc/api_server/ws/types.py +++ b/freqtrade/rpc/api_server/ws/types.py @@ -1,7 +1,7 @@ from typing import Any, Dict, TypeVar from fastapi import WebSocket as FastAPIWebSocket -from websockets import WebSocketClientProtocol as WebSocket +from websockets.client import WebSocketClientProtocol as WebSocket WebSocketType = TypeVar("WebSocketType", FastAPIWebSocket, WebSocket) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 28628c1f6..c1ad0512e 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,7 +8,7 @@ import asyncio import logging import socket from threading import Thread -from typing import Any, Dict, List, Optional +from typing import TYPE_CHECKING, Any, Dict, List, Optional import websockets @@ -18,6 +18,11 @@ from freqtrade.misc import remove_entry_exit_signals from freqtrade.rpc.api_server.ws.channel import WebSocketChannel +if TYPE_CHECKING: + import websockets.connect + import websockets.exceptions + + logger = logging.getLogger(__name__) From 8d16dd804dcc0b0cfe94e1b3389186bc23d8e957 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Tue, 6 Sep 2022 15:42:47 -0300 Subject: [PATCH 144/437] hyperopt - freqai - docs and refactoring --- docs/freqai.md | 11 +++ freqtrade/configuration/configuration.py | 10 +++ freqtrade/freqai/data_drawer.py | 28 ++----- freqtrade/freqai/freqai_interface.py | 5 +- freqtrade/templates/FreqaiExampleStrategy.py | 86 +------------------- 5 files changed, 29 insertions(+), 111 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index 303c2f151..f8cf64d21 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -279,6 +279,8 @@ The FreqAI strategy requires the user to include the following lines of code in Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](#feature-engineering)) and labels ([more information](#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. +*Important*: The `self.freqai.start()` function cannot be called outside the `populate_indicators()`. + ### Setting the `startup_candle_count` Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). @@ -532,6 +534,15 @@ for each pair, for each backtesting window within the expanded `--timerange`. --- +### Hyperopt + +The [Hyperopt](hyperopt.md) module can be executed with some restrictions: + +- The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI. +- It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md###runninghyperoptwithsmallersearchspace). +- The [Backtesting](#backtesting) instructions also apply apply to Hyperopt. + + ### Deciding the size of the sliding training window and backtesting duration The user defines the backtesting timerange with the typical `--timerange` parameter in the diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index 7c68ac46c..d18b67ff2 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -285,6 +285,7 @@ class Configuration: logger.info('Parameter --stoplosses detected: %s ...', self.args["stoploss_range"]) # Hyperopt section + self._check_hyperopt_analyze_per_epoch_freqai() self._args_to_config(config, argname='hyperopt', logstring='Using Hyperopt class name: {}') @@ -537,3 +538,12 @@ class Configuration: config['pairs'] = load_file(pairs_file) if 'pairs' in config and isinstance(config['pairs'], list): config['pairs'].sort() + + def _check_hyperopt_analyze_per_epoch_freqai(self) -> None: + """ + Helper for block hyperopt with analyze-per-epoch param. + """ + if ("analyze_per_epoch" in self.args and + self.args["analyze_per_epoch"] and "freqaimodel" in self.args): + raise OperationalException('analyze-per-epoch parameter is \ + not allowed with a Freqai strategy.') diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index dff6b5942..9eeabef8f 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -93,16 +93,6 @@ class FreqaiDataDrawer: "model_filename": "", "trained_timestamp": 0, "priority": 1, "first": True, "data_path": "", "extras": {}} - def __getstate__(self): - """ - Return state values to be pickled. - It's necessary to allow serialization in hyperopt - """ - return ({ - "pair_dict": self.pair_dict, - "pair_dictionary_path": self.pair_dictionary_path - }) - def load_drawer_from_disk(self): """ Locate and load a previously saved data drawer full of all pair model metadata in @@ -165,22 +155,14 @@ class FreqaiDataDrawer: # create a backup shutil.copy(self.historic_predictions_path, self.historic_predictions_bkp_path) - def save_drawer_to_disk(self, live=False): + def save_drawer_to_disk(self): """ Save data drawer full of all pair model metadata in present model folder. """ - if live: - with self.save_lock: - with open(self.pair_dictionary_path, 'w') as fp: - rapidjson.dump( - self.pair_dict, fp, default=self.np_encoder, - number_mode=rapidjson.NM_NATIVE) - else: - # save_lock it's not working with hyperopt + with self.save_lock: with open(self.pair_dictionary_path, 'w') as fp: - rapidjson.dump( - self.pair_dict, fp, default=self.np_encoder, - number_mode=rapidjson.NM_NATIVE) + rapidjson.dump(self.pair_dict, fp, default=self.np_encoder, + number_mode=rapidjson.NM_NATIVE) def save_follower_dict_to_disk(self): """ @@ -455,7 +437,7 @@ class FreqaiDataDrawer: self.model_dictionary[coin] = model self.pair_dict[coin]["model_filename"] = dk.model_filename self.pair_dict[coin]["data_path"] = str(dk.data_path) - self.save_drawer_to_disk(dk.live) + self.save_drawer_to_disk() return diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 9a05e8383..f631c9126 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -92,10 +92,9 @@ class IFreqaiModel(ABC): def __getstate__(self): """ - Return state values to be pickled. - It's necessary to allow serialization in hyperopt + Return an empty state to be pickled in hyperopt """ - return ({"dd": self.dd}) + return ({}) def assert_config(self, config: Dict[str, Any]) -> None: diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 0e822a028..78132b06d 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -6,9 +6,7 @@ import talib.abstract as ta from pandas import DataFrame from technical import qtpylib -from freqtrade.exchange import timeframe_to_prev_date -from freqtrade.persistence import Trade -from freqtrade.strategy import DecimalParameter, IntParameter, IStrategy, merge_informative_pair +from freqtrade.strategy import IStrategy, merge_informative_pair logger = logging.getLogger(__name__) @@ -47,11 +45,6 @@ class FreqaiExampleStrategy(IStrategy): startup_candle_count: int = 40 can_short = False - linear_roi_offset = DecimalParameter( - 0.00, 0.02, default=0.005, space="sell", optimize=False, load=True - ) - max_roi_time_long = IntParameter(0, 800, default=400, space="sell", optimize=False, load=True) - def informative_pairs(self): whitelist_pairs = self.dp.current_whitelist() corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] @@ -226,83 +219,6 @@ class FreqaiExampleStrategy(IStrategy): def get_ticker_indicator(self): return int(self.config["timeframe"][:-1]) - def custom_exit( - self, pair: str, trade: Trade, current_time, current_rate, current_profit, **kwargs - ): - - dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) - - trade_date = timeframe_to_prev_date(self.config["timeframe"], trade.open_date_utc) - trade_candle = dataframe.loc[(dataframe["date"] == trade_date)] - - if trade_candle.empty: - return None - trade_candle = trade_candle.squeeze() - - follow_mode = self.config.get("freqai", {}).get("follow_mode", False) - - if not follow_mode: - pair_dict = self.freqai.dd.pair_dict - else: - pair_dict = self.freqai.dd.follower_dict - - entry_tag = trade.enter_tag - - if ( - "prediction" + entry_tag not in pair_dict[pair] - or pair_dict[pair]['extras']["prediction" + entry_tag] == 0 - ): - pair_dict[pair]['extras']["prediction" + entry_tag] = abs(trade_candle["&-s_close"]) - if not follow_mode: - self.freqai.dd.save_drawer_to_disk() - else: - self.freqai.dd.save_follower_dict_to_disk() - - roi_price = pair_dict[pair]['extras']["prediction" + entry_tag] - roi_time = self.max_roi_time_long.value - - roi_decay = roi_price * ( - 1 - ((current_time - trade.open_date_utc).seconds) / (roi_time * 60) - ) - if roi_decay < 0: - roi_decay = self.linear_roi_offset.value - else: - roi_decay += self.linear_roi_offset.value - - if current_profit > roi_decay: - return "roi_custom_win" - - if current_profit < -roi_decay: - return "roi_custom_loss" - - def confirm_trade_exit( - self, - pair: str, - trade: Trade, - order_type: str, - amount: float, - rate: float, - time_in_force: str, - exit_reason: str, - current_time, - **kwargs, - ) -> bool: - - entry_tag = trade.enter_tag - follow_mode = self.config.get("freqai", {}).get("follow_mode", False) - if not follow_mode: - pair_dict = self.freqai.dd.pair_dict - else: - pair_dict = self.freqai.dd.follower_dict - - pair_dict[pair]['extras']["prediction" + entry_tag] = 0 - if not follow_mode: - self.freqai.dd.save_drawer_to_disk() - else: - self.freqai.dd.save_follower_dict_to_disk() - - return True - def confirm_trade_entry( self, pair: str, From 5aba5de20f5dea1f61aa7ced19a966744b5c3e30 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Tue, 6 Sep 2022 16:17:10 -0300 Subject: [PATCH 145/437] fix link - hyperopt spaces --- docs/freqai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/freqai.md b/docs/freqai.md index fa58feb07..7aabb0e56 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -539,7 +539,7 @@ for each pair, for each backtesting window within the expanded `--timerange`. The [Hyperopt](hyperopt.md) module can be executed with some restrictions: - The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI. -- It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md###runninghyperoptwithsmallersearchspace). +- It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md#running-hyperopt-with-smaller-search-space). - The [Backtesting](#backtesting) instructions also apply apply to Hyperopt. From 95a33ab2e639d8510c45e731946c5ed2a9189493 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 06:34:03 +0200 Subject: [PATCH 146/437] Add amount_to_contract helper in the exchange --- freqtrade/exchange/exchange.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index c3dca43a8..af072d555 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -446,6 +446,15 @@ class Exchange: contract_size = self.get_contract_size(pair) return contracts_to_amount(num_contracts, contract_size) + def amount_to_contract_precision(self, pair: str, amount: float) -> float: + """ + Helper wrapper around amount_to_contract_precision + """ + contract_size = self.get_contract_size(pair) + + return amount_to_contract_precision(amount, self.get_precision_amount(pair), + self.precisionMode, contract_size) + def set_sandbox(self, api: ccxt.Exchange, exchange_config: dict, name: str) -> None: if exchange_config.get('sandbox'): if api.urls.get('test'): From 83d9f3aeba221bb7a1934a193de66bb4c3887019 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 06:35:58 +0200 Subject: [PATCH 147/437] Add test showing #7365 --- tests/test_integration.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index dd3488f81..77ed822d1 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -485,7 +485,7 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog) -> Non assert len(trade.orders) == 1 assert pytest.approx(trade.stake_amount) == 60 assert pytest.approx(trade.amount) == 30.0 - assert log_has_re("Remaining amount of 1.6.* would be too small.", caplog) + assert log_has_re("Remaining amount of 1.6.* would be smaller than the minimum of 10.", caplog) freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-20) @@ -504,9 +504,21 @@ def test_dca_exiting(default_conf_usdt, ticker_usdt, fee, mocker, caplog) -> Non freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-50) freqtrade.process() assert log_has_re("Adjusting amount to trade.amount as it is higher.*", caplog) - assert log_has_re("Remaining amount of 0.0 would be too small.", caplog) + assert log_has_re("Remaining amount of 0.0 would be smaller than the minimum of 10.", caplog) trade = Trade.get_trades().first() assert len(trade.orders) == 2 assert trade.orders[-1].ft_order_side == 'sell' assert pytest.approx(trade.stake_amount) == 40.198 assert trade.is_open + + # use amount that would trunc to 0.0 once selling + mocker.patch("freqtrade.exchange.Exchange.amount_to_contract_precision", + lambda s, p, v: round(v, 1)) + freqtrade.strategy.adjust_trade_position = MagicMock(return_value=-0.01) + freqtrade.process() + trade = Trade.get_trades().first() + assert len(trade.orders) == 2 + assert trade.orders[-1].ft_order_side == 'sell' + assert pytest.approx(trade.stake_amount) == 40.198 + assert trade.is_open + assert log_has_re('Amount to sell is 0.0 due to exchange limits - not selling.', caplog) From 4d69df08dde96d067d9daebbf2db3a61a24dd44a Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 06:43:08 +0200 Subject: [PATCH 148/437] trunc to amount precision before checking valid partial exits closes #7368 --- freqtrade/freqtradebot.py | 11 +++++++++-- freqtrade/optimize/backtesting.py | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 1d171ae89..a2f39afd6 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -583,7 +583,9 @@ class FreqtradeBot(LoggingMixin): if stake_amount is not None and stake_amount < 0.0: # We should decrease our position - amount = abs(float(FtPrecise(stake_amount) / FtPrecise(current_exit_rate))) + amount = self.exchange.amount_to_contract_precision( + trade.pair, + abs(float(FtPrecise(stake_amount) / FtPrecise(current_exit_rate)))) if amount > trade.amount: # This is currently ineffective as remaining would become < min tradable # Fixing this would require checking for 0.0 there - @@ -592,9 +594,14 @@ class FreqtradeBot(LoggingMixin): f"Adjusting amount to trade.amount as it is higher. {amount} > {trade.amount}") amount = trade.amount + if amount == 0.0: + logger.info("Amount to sell is 0.0 due to exchange limits - not selling.") + return + remaining = (trade.amount - amount) * current_exit_rate if remaining < min_exit_stake: - logger.info(f'Remaining amount of {remaining} would be too small.') + logger.info(f"Remaining amount of {remaining} would be smaller " + f"than the minimum of {min_exit_stake}.") return self.execute_trade_exit(trade, current_exit_rate, exit_check=ExitCheckTuple( diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 8f6b6b332..97418b72c 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -537,7 +537,11 @@ class Backtesting: return pos_trade if stake_amount is not None and stake_amount < 0.0: - amount = abs(stake_amount) / current_rate + amount = amount_to_contract_precision( + abs(stake_amount) / current_rate, trade.amount_precision, + self.precision_mode, trade.contract_size) + if amount == 0.0: + return trade if amount > trade.amount: # This is currently ineffective as remaining would become < min tradable amount = trade.amount From 3454a52b9523ed567f0c009cc7b3bf8c6100b75f Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 06:55:22 +0200 Subject: [PATCH 149/437] Explicitly test amount_to_contract_precision --- tests/exchange/test_exchange.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 3352019a9..3b903f8ee 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -4456,6 +4456,39 @@ def test__amount_to_contracts( assert result_amount == param_amount +@pytest.mark.parametrize('pair,amount,expected_spot,expected_fut', [ + # Contract size of 0.01 + ('ADA/USDT:USDT', 40, 40, 40), + ('ADA/USDT:USDT', 10.4445555, 10.4, 10.444), + ('LTC/ETH', 30, 30, 30), + ('LTC/USD', 30, 30, 30), + # contract size of 10 + ('ETH/USDT:USDT', 10.111, 10.1, 10), + ('ETH/USDT:USDT', 10.188, 10.1, 10), + ('ETH/USDT:USDT', 10.988, 10.9, 10), +]) +def test_amount_to_contract_precision( + mocker, + default_conf, + pair, + amount, + expected_spot, + expected_fut, +): + api_mock = MagicMock() + default_conf['trading_mode'] = 'spot' + default_conf['margin_mode'] = 'isolated' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + + result_size = exchange.amount_to_contract_precision(pair, amount) + assert result_size == expected_spot + + default_conf['trading_mode'] = 'futures' + exchange = get_patched_exchange(mocker, default_conf, api_mock) + result_size = exchange.amount_to_contract_precision(pair, amount) + assert result_size == expected_fut + + @pytest.mark.parametrize('exchange_name,open_rate,is_short,trading_mode,margin_mode', [ # Bittrex ('bittrex', 2.0, False, 'spot', None), From 972b6991057d00ea1d321403cebf8e2feefa57ff Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 7 Sep 2022 11:11:31 -0300 Subject: [PATCH 150/437] hyperopt - freqai - change validation to config_validation --- freqtrade/configuration/config_validation.py | 9 +++++++++ freqtrade/configuration/configuration.py | 10 ---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/freqtrade/configuration/config_validation.py b/freqtrade/configuration/config_validation.py index ee846e7e6..b37d44d0f 100644 --- a/freqtrade/configuration/config_validation.py +++ b/freqtrade/configuration/config_validation.py @@ -84,6 +84,7 @@ def validate_config_consistency(conf: Dict[str, Any], preliminary: bool = False) _validate_protections(conf) _validate_unlimited_amount(conf) _validate_ask_orderbook(conf) + _validate_freqai_hyperopt(conf) validate_migrated_strategy_settings(conf) # validate configuration before returning @@ -323,6 +324,14 @@ def _validate_pricing_rules(conf: Dict[str, Any]) -> None: del conf['ask_strategy'] +def _validate_freqai_hyperopt(conf: Dict[str, Any]) -> None: + freqaimodel = conf.get('freqaimodel') + analyze_per_epoch = conf.get('analyze_per_epoch', False) + if analyze_per_epoch and freqaimodel is not None: + raise OperationalException( + 'Using analyze-per-epoch parameter is not supported with a FreqAI strategy.') + + def _strategy_settings(conf: Dict[str, Any]) -> None: process_deprecated_setting(conf, None, 'use_sell_signal', None, 'use_exit_signal') diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index d18b67ff2..7c68ac46c 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -285,7 +285,6 @@ class Configuration: logger.info('Parameter --stoplosses detected: %s ...', self.args["stoploss_range"]) # Hyperopt section - self._check_hyperopt_analyze_per_epoch_freqai() self._args_to_config(config, argname='hyperopt', logstring='Using Hyperopt class name: {}') @@ -538,12 +537,3 @@ class Configuration: config['pairs'] = load_file(pairs_file) if 'pairs' in config and isinstance(config['pairs'], list): config['pairs'].sort() - - def _check_hyperopt_analyze_per_epoch_freqai(self) -> None: - """ - Helper for block hyperopt with analyze-per-epoch param. - """ - if ("analyze_per_epoch" in self.args and - self.args["analyze_per_epoch"] and "freqaimodel" in self.args): - raise OperationalException('analyze-per-epoch parameter is \ - not allowed with a Freqai strategy.') From 2c9b7659539ddbf9063f69f4a06429c3790552fc Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 09:35:37 -0600 Subject: [PATCH 151/437] add suffix parameter --- freqtrade/strategy/strategy_helper.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/freqtrade/strategy/strategy_helper.py b/freqtrade/strategy/strategy_helper.py index 43728dc1f..55afbf7a8 100644 --- a/freqtrade/strategy/strategy_helper.py +++ b/freqtrade/strategy/strategy_helper.py @@ -1,3 +1,5 @@ +from typing import Optional + import pandas as pd from freqtrade.exchange import timeframe_to_minutes @@ -6,7 +8,8 @@ from freqtrade.exchange import timeframe_to_minutes def merge_informative_pair(dataframe: pd.DataFrame, informative: pd.DataFrame, timeframe: str, timeframe_inf: str, ffill: bool = True, append_timeframe: bool = True, - date_column: str = 'date') -> pd.DataFrame: + date_column: str = 'date', + suffix: Optional[str] = None) -> pd.DataFrame: """ Correctly merge informative samples to the original dataframe, avoiding lookahead bias. @@ -50,10 +53,17 @@ def merge_informative_pair(dataframe: pd.DataFrame, informative: pd.DataFrame, # Rename columns to be unique date_merge = 'date_merge' - if append_timeframe: + if append_timeframe and not suffix: date_merge = f'date_merge_{timeframe_inf}' informative.columns = [f"{col}_{timeframe_inf}" for col in informative.columns] + elif suffix: + date_merge = f'date_merge_{suffix}' + informative.columns = [f"{col}_{suffix}" for col in informative.columns] + + elif suffix and append_timeframe: + raise ValueError("You can not specify `append_timeframe` as True and a `suffix`.") + # Combine the 2 dataframes # all indicators on the informative sample MUST be calculated before this point if ffill: From 047ded1baa7c7e980b98c8289f689e2f900cf203 Mon Sep 17 00:00:00 2001 From: th0rntwig Date: Wed, 7 Sep 2022 17:47:27 +0200 Subject: [PATCH 152/437] Check for constant columns --- freqtrade/freqai/data_kitchen.py | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 7670cfd45..0a2355c48 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -184,7 +184,7 @@ class FreqaiDataKitchen: def filter_features( self, - unfiltered_dataframe: DataFrame, + unfiltered_df: DataFrame, training_feature_list: List, label_list: List = list(), training_filter: bool = True, @@ -195,31 +195,36 @@ class FreqaiDataKitchen: 0s in the prediction dataset. However, prediction dataset do_predict will reflect any row that had a NaN and will shield user from that prediction. :params: - :unfiltered_dataframe: the full dataframe for the present training period + :unfiltered_df: the full dataframe for the present training period :training_feature_list: list, the training feature list constructed by self.build_feature_list() according to user specified parameters in the configuration file. :labels: the labels for the dataset :training_filter: boolean which lets the function know if it is training data or prediction data to be filtered. :returns: - :filtered_dataframe: dataframe cleaned of NaNs and only containing the user + :filtered_df: dataframe cleaned of NaNs and only containing the user requested feature set. :labels: labels cleaned of NaNs. """ - filtered_dataframe = unfiltered_dataframe.filter(training_feature_list, axis=1) - filtered_dataframe = filtered_dataframe.replace([np.inf, -np.inf], np.nan) + filtered_df = unfiltered_df.filter(training_feature_list, axis=1) + filtered_df = filtered_df.replace([np.inf, -np.inf], np.nan) - drop_index = pd.isnull(filtered_dataframe).any(1) # get the rows that have NaNs, + const_cols = filtered_df[:, filtered_df.nunique(axis=0) == len(filtered_df.index)].columns + if const_cols: + filtered_df = filtered_df.filter(filtered_df.columns.difference(const_cols)) + logger.warning(f"Removed features {const_cols} with constant values.") + + drop_index = pd.isnull(filtered_df).any(1) # get the rows that have NaNs, drop_index = drop_index.replace(True, 1).replace(False, 0) # pep8 requirement. if (training_filter): # we don't care about total row number (total no. datapoints) in training, we only care # about removing any row with NaNs # if labels has multiple columns (user wants to train multiple modelEs), we detect here - labels = unfiltered_dataframe.filter(label_list, axis=1) + labels = unfiltered_df.filter(label_list, axis=1) drop_index_labels = pd.isnull(labels).any(1) drop_index_labels = drop_index_labels.replace(True, 1).replace(False, 0) - dates = unfiltered_dataframe['date'] - filtered_dataframe = filtered_dataframe[ + dates = unfiltered_df['date'] + filtered_df = filtered_df[ (drop_index == 0) & (drop_index_labels == 0) ] # dropping values labels = labels[ @@ -229,13 +234,13 @@ class FreqaiDataKitchen: (drop_index == 0) & (drop_index_labels == 0) ] logger.info( - f"dropped {len(unfiltered_dataframe) - len(filtered_dataframe)} training points" - f" due to NaNs in populated dataset {len(unfiltered_dataframe)}." + f"dropped {len(unfiltered_df) - len(filtered_df)} training points" + f" due to NaNs in populated dataset {len(unfiltered_df)}." ) - if (1 - len(filtered_dataframe) / len(unfiltered_dataframe)) > 0.1 and self.live: - worst_indicator = str(unfiltered_dataframe.count().idxmin()) + if (1 - len(filtered_df) / len(unfiltered_df)) > 0.1 and self.live: + worst_indicator = str(unfiltered_df.count().idxmin()) logger.warning( - f" {(1 - len(filtered_dataframe)/len(unfiltered_dataframe)) * 100:.0f} percent " + f" {(1 - len(filtered_df)/len(unfiltered_df)) * 100:.0f} percent " " of training data dropped due to NaNs, model may perform inconsistent " f"with expectations. Verify {worst_indicator}" ) @@ -244,9 +249,9 @@ class FreqaiDataKitchen: else: # we are backtesting so we need to preserve row number to send back to strategy, # so now we use do_predict to avoid any prediction based on a NaN - drop_index = pd.isnull(filtered_dataframe).any(1) + drop_index = pd.isnull(filtered_df).any(1) self.data["filter_drop_index_prediction"] = drop_index - filtered_dataframe.fillna(0, inplace=True) + filtered_df.fillna(0, inplace=True) # replacing all NaNs with zeros to avoid issues in 'prediction', but any prediction # that was based on a single NaN is ultimately protected from buys with do_predict drop_index = ~drop_index @@ -255,11 +260,11 @@ class FreqaiDataKitchen: logger.info( "dropped %s of %s prediction data points due to NaNs.", len(self.do_predict) - self.do_predict.sum(), - len(filtered_dataframe), + len(filtered_df), ) labels = [] - return filtered_dataframe, labels + return filtered_df, labels def build_data_dictionary( self, From cdc72bf8cab4bf78b2da460690a3b71ab076bff4 Mon Sep 17 00:00:00 2001 From: th0rntwig Date: Wed, 7 Sep 2022 18:14:13 +0200 Subject: [PATCH 153/437] Correct indexing --- freqtrade/freqai/data_kitchen.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 0a2355c48..790b3c078 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -209,7 +209,7 @@ class FreqaiDataKitchen: filtered_df = unfiltered_df.filter(training_feature_list, axis=1) filtered_df = filtered_df.replace([np.inf, -np.inf], np.nan) - const_cols = filtered_df[:, filtered_df.nunique(axis=0) == len(filtered_df.index)].columns + const_cols = list((filtered_df.nunique() == 1).loc[lambda x: x].index) if const_cols: filtered_df = filtered_df.filter(filtered_df.columns.difference(const_cols)) logger.warning(f"Removed features {const_cols} with constant values.") @@ -1205,7 +1205,6 @@ class FreqaiDataKitchen: def save_backtesting_prediction( self, append_df: DataFrame ) -> None: - """ Save prediction dataframe from backtesting to h5 file format :param append_df: dataframe for backtesting period @@ -1219,7 +1218,6 @@ class FreqaiDataKitchen: def get_backtesting_prediction( self ) -> DataFrame: - """ Get prediction dataframe from h5 file format """ From 322f00e3e8c7c183e350e84e4c740e0d34130c68 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 18:19:25 +0200 Subject: [PATCH 154/437] Fix empty entry message if order doesn't fill immediately closes #7368 --- freqtrade/freqtradebot.py | 2 +- tests/test_freqtradebot.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index a2f39afd6..ec32cae0e 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -919,7 +919,7 @@ class FreqtradeBot(LoggingMixin): 'stake_amount': trade.stake_amount, 'stake_currency': self.config['stake_currency'], 'fiat_currency': self.config.get('fiat_display_currency', None), - 'amount': order.safe_amount_after_fee, + 'amount': order.safe_amount_after_fee if fill else order.amount, 'open_date': trade.open_date or datetime.utcnow(), 'current_rate': current_rate, 'sub_trade': sub_trade, diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index aff0504b3..30b0b75b6 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -3655,6 +3655,7 @@ def test_may_execute_trade_exit_after_stoploss_on_exchange_hit( assert trade.exit_reason == ExitType.STOPLOSS_ON_EXCHANGE.value assert rpc_mock.call_count == 3 assert rpc_mock.call_args_list[0][0][0]['type'] == RPCMessageType.ENTRY + assert rpc_mock.call_args_list[0][0][0]['amount'] > 20 assert rpc_mock.call_args_list[1][0][0]['type'] == RPCMessageType.ENTRY_FILL assert rpc_mock.call_args_list[2][0][0]['type'] == RPCMessageType.EXIT_FILL From ea7bdac9edc7b3f5c5e039e509b8d368f7045a3e Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 7 Sep 2022 18:45:16 +0200 Subject: [PATCH 155/437] ensure inlier metric can be combined with other cleaning methods --- freqtrade/freqai/freqai_interface.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 5ccc9d1b2..32e42e115 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -427,6 +427,11 @@ class IFreqaiModel(ABC): ft_params = self.freqai_info["feature_parameters"] + if ft_params.get('inlier_metric_window', 0): + dk.compute_inlier_metric(set_='train') + if self.freqai_info["data_split_parameters"]["test_size"] > 0: + dk.compute_inlier_metric(set_='test') + if ft_params.get( "principal_component_analysis", False ): @@ -446,11 +451,6 @@ class IFreqaiModel(ABC): dk.use_DBSCAN_to_remove_outliers(predict=False, eps=eps) self.dd.old_DBSCAN_eps[dk.pair] = dk.data['DBSCAN_eps'] - if ft_params.get('inlier_metric_window', 0): - dk.compute_inlier_metric(set_='train') - if self.freqai_info["data_split_parameters"]["test_size"] > 0: - dk.compute_inlier_metric(set_='test') - if self.freqai_info["feature_parameters"].get('noise_standard_deviation', 0): dk.add_noise_to_training_features() From 48cadbf933e829c8335a3ef593aa324b7d08a659 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 09:52:22 -0600 Subject: [PATCH 156/437] remove duplicate line, change window to timeperiod --- freqtrade/templates/FreqaiExampleStrategy.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 0e822a028..b172ab805 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -92,12 +92,10 @@ class FreqaiExampleStrategy(IStrategy): t = int(t) informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) + informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, timeperiod=t) informative[f"%-{coin}sma-period_{t}"] = ta.SMA(informative, timeperiod=t) informative[f"%-{coin}ema-period_{t}"] = ta.EMA(informative, timeperiod=t) - informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - bollinger = qtpylib.bollinger_bands( qtpylib.typical_price(informative), window=t, stds=2.2 ) From 5d338e697c6df2d7d3d5109fb7ce29309f6dcdf0 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 09:59:46 -0600 Subject: [PATCH 157/437] change window to timeperiod in hybrid --- freqtrade/templates/FreqaiHybridExampleStrategy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/templates/FreqaiHybridExampleStrategy.py b/freqtrade/templates/FreqaiHybridExampleStrategy.py index 5d1e149dd..286ff012f 100644 --- a/freqtrade/templates/FreqaiHybridExampleStrategy.py +++ b/freqtrade/templates/FreqaiHybridExampleStrategy.py @@ -135,7 +135,7 @@ class FreqaiExampleHybridStrategy(IStrategy): t = int(t) informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) + informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, timeperiod=t) informative[f"%-{coin}sma-period_{t}"] = ta.SMA(informative, timeperiod=t) informative[f"%-{coin}ema-period_{t}"] = ta.EMA(informative, timeperiod=t) informative[f"%-{coin}roc-period_{t}"] = ta.ROC(informative, timeperiod=t) From 4c9ac6b7c0959a7d596279a1388145f8a90bd8da Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 7 Sep 2022 18:58:55 +0200 Subject: [PATCH 158/437] add kwargs, reduce duplicated code --- freqtrade/freqai/freqai_interface.py | 15 ++++++++++++--- .../prediction_models/CatboostClassifier.py | 8 +++----- .../freqai/prediction_models/CatboostRegressor.py | 10 +++------- .../CatboostRegressorMultiTarget.py | 3 ++- .../prediction_models/LightGBMClassifier.py | 10 ++++------ .../freqai/prediction_models/LightGBMRegressor.py | 10 ++++------ .../LightGBMRegressorMultiTarget.py | 5 +++-- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index b6f3d8ebc..101df88ec 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -661,11 +661,20 @@ class IFreqaiModel(ABC): self.train_time = 0 return + def get_init_model(self, pair: str) -> Any: + if pair not in self.dd.model_dictionary or not self.continual_learning: + init_model = None + else: + init_model = self.dd.model_dictionary[pair] + + return init_model + # Following methods which are overridden by user made prediction models. # See freqai/prediction_models/CatboostPredictionModel.py for an example. @abstractmethod - def train(self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen) -> Any: + def train(self, unfiltered_dataframe: DataFrame, pair: str, + dk: FreqaiDataKitchen, **kwargs) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datahandler for storing, saving, loading, and analyzing the data. @@ -675,7 +684,7 @@ class IFreqaiModel(ABC): """ @abstractmethod - def fit(self, data_dictionary: Dict[str, Any], dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict[str, Any], dk: FreqaiDataKitchen, **kwargs) -> Any: """ Most regressors use the same function names and arguments e.g. user can drop in LGBMRegressor in place of CatBoostRegressor and all data @@ -688,7 +697,7 @@ class IFreqaiModel(ABC): @abstractmethod def predict( - self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = True + self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = True, **kwargs ) -> Tuple[DataFrame, NDArray[np.int_]]: """ Filter the prediction features data and predict with it. diff --git a/freqtrade/freqai/prediction_models/CatboostClassifier.py b/freqtrade/freqai/prediction_models/CatboostClassifier.py index 13395879a..cd7afd392 100644 --- a/freqtrade/freqai/prediction_models/CatboostClassifier.py +++ b/freqtrade/freqai/prediction_models/CatboostClassifier.py @@ -2,6 +2,7 @@ import logging from typing import Any, Dict from catboost import CatBoostClassifier, Pool + from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel @@ -16,7 +17,7 @@ class CatboostClassifier(BaseClassifierModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :params: @@ -36,10 +37,7 @@ class CatboostClassifier(BaseClassifierModel): **self.model_training_parameters, ) - if dk.pair not in self.dd.model_dictionary or not self.continual_learning: - init_model = None - else: - init_model = self.dd.model_dictionary[dk.pair] + init_model = self.get_init_model(dk.pair) cbr.fit(train_data, init_model=init_model) diff --git a/freqtrade/freqai/prediction_models/CatboostRegressor.py b/freqtrade/freqai/prediction_models/CatboostRegressor.py index 0b8bc162b..1ce31b628 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressor.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressor.py @@ -1,10 +1,9 @@ -import gc import logging from typing import Any, Dict from catboost import CatBoostRegressor, Pool -from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel @@ -18,7 +17,7 @@ class CatboostRegressor(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold @@ -39,10 +38,7 @@ class CatboostRegressor(BaseRegressionModel): weight=data_dictionary["test_weights"], ) - if dk.pair not in self.dd.model_dictionary or not self.continual_learning: - init_model = None - else: - init_model = self.dd.model_dictionary[dk.pair] + init_model = self.get_init_model(dk.pair) model = CatBoostRegressor( allow_writing_files=False, diff --git a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py index 9ed61488c..bc52bfdd9 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py @@ -3,6 +3,7 @@ from typing import Any, Dict from catboost import CatBoostRegressor # , Pool from sklearn.multioutput import MultiOutputRegressor + from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel @@ -17,7 +18,7 @@ class CatboostRegressorMultiTarget(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold diff --git a/freqtrade/freqai/prediction_models/LightGBMClassifier.py b/freqtrade/freqai/prediction_models/LightGBMClassifier.py index 0023a9f69..69867eae3 100644 --- a/freqtrade/freqai/prediction_models/LightGBMClassifier.py +++ b/freqtrade/freqai/prediction_models/LightGBMClassifier.py @@ -3,8 +3,9 @@ from typing import Any, Dict from lightgbm import LGBMClassifier -from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel + logger = logging.getLogger(__name__) @@ -16,7 +17,7 @@ class LightGBMClassifier(BaseClassifierModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :params: @@ -35,10 +36,7 @@ class LightGBMClassifier(BaseClassifierModel): y = data_dictionary["train_labels"].to_numpy()[:, 0] train_weights = data_dictionary["train_weights"] - if dk.pair not in self.dd.model_dictionary or not self.continual_learning: - init_model = None - else: - init_model = self.dd.model_dictionary[dk.pair] + init_model = self.get_init_model(dk.pair) model = LGBMClassifier(**self.model_training_parameters) diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressor.py b/freqtrade/freqai/prediction_models/LightGBMRegressor.py index 81f0e6d22..99e9ff887 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressor.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressor.py @@ -3,8 +3,9 @@ from typing import Any, Dict from lightgbm import LGBMRegressor -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel + logger = logging.getLogger(__name__) @@ -16,7 +17,7 @@ class LightGBMRegressor(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ Most regressors use the same function names and arguments e.g. user can drop in LGBMRegressor in place of CatBoostRegressor and all data @@ -35,10 +36,7 @@ class LightGBMRegressor(BaseRegressionModel): y = data_dictionary["train_labels"] train_weights = data_dictionary["train_weights"] - if dk.pair not in self.dd.model_dictionary or not self.continual_learning: - init_model = None - else: - init_model = self.dd.model_dictionary[dk.pair] + init_model = self.get_init_model(dk.pair) model = LGBMRegressor(**self.model_training_parameters) diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py index 2b25493e0..c34680dbe 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py @@ -4,8 +4,9 @@ from typing import Any, Dict from lightgbm import LGBMRegressor from sklearn.multioutput import MultiOutputRegressor -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel + logger = logging.getLogger(__name__) @@ -17,7 +18,7 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel): has its own DataHandler where data is held, saved, loaded, and managed. """ - def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen) -> Any: + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: """ User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary constructed by DataHandler to hold From e51d352777d9e06518da0f28c974dceabf4afd0c Mon Sep 17 00:00:00 2001 From: robcaulk Date: Wed, 7 Sep 2022 19:11:54 +0200 Subject: [PATCH 159/437] ensure pca is handling same DF as inlier --- freqtrade/freqai/freqai_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 32e42e115..c5ac17a3a 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -467,7 +467,7 @@ class IFreqaiModel(ABC): if ft_params.get( "principal_component_analysis", False ): - dk.pca_transform(dataframe) + dk.pca_transform(self.dk.data_dictionary['prediction_features']) if ft_params.get("use_SVM_to_remove_outliers", False): dk.use_SVM_to_remove_outliers(predict=True) From a9fd12b816d5a36a8233f508dec92d3f4bb4ab40 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 18:28:04 +0200 Subject: [PATCH 160/437] Allow more dynamic timeframes by disabling "choice" part of #7366 --- freqtrade/commands/cli_options.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 3d094da36..4240a8014 100644 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -455,8 +455,6 @@ AVAILABLE_CLI_OPTIONS = { '-t', '--timeframes', help='Specify which tickers to download. Space-separated list. ' 'Default: `1m 5m`.', - choices=['1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', - '6h', '8h', '12h', '1d', '3d', '1w', '2w', '1M', '1y'], default=['1m', '5m'], nargs='+', ), From f8e7ed5d7d8f05cd470517a630431725cff48280 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 7 Sep 2022 18:28:14 +0200 Subject: [PATCH 161/437] Reduce shutdown verbosity of exchange --- freqtrade/exchange/exchange.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index af072d555..569dcad9b 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -205,7 +205,7 @@ class Exchange: logger.debug("Exchange object destroyed, closing async loop") if (self._api_async and inspect.iscoroutinefunction(self._api_async.close) and self._api_async.session): - logger.info("Closing async ccxt session.") + logger.debug("Closing async ccxt session.") self.loop.run_until_complete(self._api_async.close()) def validate_config(self, config): From bf3ee51167f183739b0a71677126b9c18d733560 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 7 Sep 2022 14:42:05 -0300 Subject: [PATCH 162/437] validate freqai hyperopt with freqai enabled param --- freqtrade/configuration/config_validation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/configuration/config_validation.py b/freqtrade/configuration/config_validation.py index b37d44d0f..8d9112bef 100644 --- a/freqtrade/configuration/config_validation.py +++ b/freqtrade/configuration/config_validation.py @@ -325,9 +325,9 @@ def _validate_pricing_rules(conf: Dict[str, Any]) -> None: def _validate_freqai_hyperopt(conf: Dict[str, Any]) -> None: - freqaimodel = conf.get('freqaimodel') + freqai_enabled = conf.get('freqai', {}).get('enabled', False) analyze_per_epoch = conf.get('analyze_per_epoch', False) - if analyze_per_epoch and freqaimodel is not None: + if analyze_per_epoch and freqai_enabled: raise OperationalException( 'Using analyze-per-epoch parameter is not supported with a FreqAI strategy.') From 5934495dda06c4c62950c8eebe77fb431d394eb9 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 15:08:01 -0600 Subject: [PATCH 163/437] add websocket request/message schemas --- freqtrade/data/dataprovider.py | 10 +- freqtrade/rpc/api_server/api_ws.py | 40 ++++++-- freqtrade/rpc/api_server/ws/schema.py | 78 +++++++++++++++ freqtrade/rpc/external_message_consumer.py | 111 +++++++++------------ freqtrade/rpc/rpc.py | 8 +- 5 files changed, 165 insertions(+), 82 deletions(-) create mode 100644 freqtrade/rpc/api_server/ws/schema.py diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 44296ab40..4b5494e97 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -121,7 +121,8 @@ class DataProvider: 'type': RPCMessageType.ANALYZED_DF, 'data': { 'key': pair_key, - 'value': (dataframe, datetime.now(timezone.utc)) + 'df': dataframe, + 'la': datetime.now(timezone.utc) } } ) @@ -130,7 +131,7 @@ class DataProvider: self, pair: str, dataframe: DataFrame, - last_analyzed: Optional[str] = None, + last_analyzed: Optional[datetime] = None, timeframe: Optional[str] = None, candle_type: Optional[CandleType] = None, producer_name: str = "default" @@ -150,10 +151,7 @@ class DataProvider: if producer_name not in self.__producer_pairs_df: self.__producer_pairs_df[producer_name] = {} - if not last_analyzed: - _last_analyzed = datetime.now(timezone.utc) - else: - _last_analyzed = datetime.fromisoformat(last_analyzed) + _last_analyzed = datetime.now(timezone.utc) if not last_analyzed else last_analyzed self.__producer_pairs_df[producer_name][pair_key] = (dataframe, _last_analyzed) logger.debug(f"External DataFrame for {pair_key} from {producer_name} added.") diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index aaa526401..64c1cebb5 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -8,6 +8,8 @@ from starlette.websockets import WebSocketState from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel +from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, + WSRequestSchema, WSWhitelistMessage) from freqtrade.rpc.rpc import RPC @@ -18,6 +20,9 @@ router = APIRouter() async def is_websocket_alive(ws: WebSocket) -> bool: + """ + Check if a FastAPI Websocket is still open + """ if ( ws.application_state == WebSocketState.CONNECTED and ws.client_state == WebSocketState.CONNECTED @@ -31,7 +36,17 @@ async def _process_consumer_request( channel: WebSocketChannel, rpc: RPC ): - type, data = request.get('type'), request.get('data') + """ + Validate and handle a request from a websocket consumer + """ + # Validate the request, makes sure it matches the schema + try: + websocket_request = WSRequestSchema.parse_obj(request) + except ValidationError as e: + logger.error(f"Invalid request from {channel}: {e}") + return + + type, data = websocket_request.type, websocket_request.data logger.debug(f"Request of type {type} from {channel}") @@ -41,35 +56,35 @@ async def _process_consumer_request( if not data: return - if not isinstance(data, list): - logger.error(f"Improper subscribe request from channel: {channel} - {request}") - return - # If all topics passed are a valid RPCMessageType, set subscriptions on channel if all([any(x.value == topic for x in RPCMessageType) for topic in data]): - - logger.debug(f"{channel} subscribed to topics: {data}") channel.set_subscriptions(data) + # We don't send a response for subscriptions + elif type == RPCRequestType.WHITELIST: - # They requested the whitelist + # Get whitelist whitelist = rpc._ws_request_whitelist() - await channel.send({"type": RPCMessageType.WHITELIST, "data": whitelist}) + # Format response + response = WSWhitelistMessage(data=whitelist) + # Send it back + await channel.send(response.dict(exclude_none=True)) elif type == RPCRequestType.ANALYZED_DF: limit = None if data: # Limit the amount of candles per dataframe to 'limit' or 1500 - limit = max(data.get('limit', 500), 1500) + limit = max(data.get('limit', 1500), 1500) # They requested the full historical analyzed dataframes analyzed_df = rpc._ws_request_analyzed_df(limit) # For every dataframe, send as a separate message for _, message in analyzed_df.items(): - await channel.send({"type": RPCMessageType.ANALYZED_DF, "data": message}) + response = WSAnalyzedDFMessage(data=message) + await channel.send(response.dict(exclude_none=True)) @router.websocket("/message/ws") @@ -78,6 +93,9 @@ async def message_endpoint( rpc: RPC = Depends(get_rpc), channel_manager=Depends(get_channel_manager), ): + """ + Message WebSocket endpoint, facilitates sending RPC messages + """ try: if is_websocket_alive(ws): # TODO: diff --git a/freqtrade/rpc/api_server/ws/schema.py b/freqtrade/rpc/api_server/ws/schema.py new file mode 100644 index 000000000..3221911de --- /dev/null +++ b/freqtrade/rpc/api_server/ws/schema.py @@ -0,0 +1,78 @@ +from datetime import datetime +from typing import Any, Dict, List, Optional + +from pandas import DataFrame +from pydantic import BaseModel, ValidationError + +from freqtrade.constants import PairWithTimeframe +from freqtrade.enums.rpcmessagetype import RPCMessageType, RPCRequestType + + +__all__ = ('WSRequestSchema', 'WSMessageSchema', 'ValidationError') + + +class BaseArbitraryModel(BaseModel): + class Config: + arbitrary_types_allowed = True + + +class WSRequestSchema(BaseArbitraryModel): + type: RPCRequestType + data: Optional[Any] = None + + +class WSMessageSchema(BaseArbitraryModel): + type: RPCMessageType + data: Optional[Any] = None + + class Config: + extra = 'allow' + + +# ------------------------------ REQUEST SCHEMAS ---------------------------- + + +class WSSubscribeRequest(WSRequestSchema): + type: RPCRequestType = RPCRequestType.SUBSCRIBE + data: List[RPCMessageType] + + +class WSWhitelistRequest(WSRequestSchema): + type: RPCRequestType = RPCRequestType.WHITELIST + data: None = None + + +class WSAnalyzedDFRequest(WSRequestSchema): + type: RPCRequestType = RPCRequestType.ANALYZED_DF + data: Dict[str, Any] = {"limit": 1500} + + +# ------------------------------ MESSAGE SCHEMAS ---------------------------- + +class WSWhitelistMessage(WSMessageSchema): + type: RPCMessageType = RPCMessageType.WHITELIST + data: List[str] + + +class WSAnalyzedDFMessage(WSMessageSchema): + class AnalyzedDFData(BaseArbitraryModel): + key: PairWithTimeframe + df: DataFrame + la: datetime + + type: RPCMessageType = RPCMessageType.ANALYZED_DF + data: AnalyzedDFData + +# -------------------------------------------------------------------------- + + +if __name__ == "__main__": + message = WSAnalyzedDFMessage( + data={ + "key": ("1", "5m", "spot"), + "df": DataFrame(), + "la": datetime.now() + } + ) + + print(message) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index c1ad0512e..d1e970826 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,14 +8,18 @@ import asyncio import logging import socket from threading import Thread -from typing import TYPE_CHECKING, Any, Dict, List, Optional +from typing import TYPE_CHECKING, Any, Dict, List import websockets from freqtrade.data.dataprovider import DataProvider -from freqtrade.enums import RPCMessageType, RPCRequestType +from freqtrade.enums import RPCMessageType from freqtrade.misc import remove_entry_exit_signals from freqtrade.rpc.api_server.ws.channel import WebSocketChannel +from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, + WSAnalyzedDFRequest, WSMessageSchema, + WSRequestSchema, WSSubscribeRequest, + WSWhitelistMessage, WSWhitelistRequest) if TYPE_CHECKING: @@ -67,15 +71,10 @@ class ExternalMessageConsumer: self.topics = [RPCMessageType.WHITELIST, RPCMessageType.ANALYZED_DF] # Allow setting data for each initial request - self._initial_requests: List[Dict[str, Any]] = [ - { - "type": RPCRequestType.WHITELIST, - "data": None - }, - { - "type": RPCRequestType.ANALYZED_DF, - "data": {"limit": self.initial_candle_limit} - } + self._initial_requests: List[WSRequestSchema] = [ + WSSubscribeRequest(data=self.topics), + WSWhitelistRequest(), + WSAnalyzedDFRequest() ] # Specify which function to use for which RPCMessageType @@ -174,16 +173,10 @@ class ExternalMessageConsumer: logger.info(f"Producer connection success - {channel}") - # Tell the producer we only want these topics - # Should always be the first thing we send - await channel.send( - self.compose_consumer_request(RPCRequestType.SUBSCRIBE, self.topics) - ) - # Now request the initial data from this Producer for request in self._initial_requests: await channel.send( - self.compose_consumer_request(request['type'], request['data']) + request.dict(exclude_none=True) ) # Now receive data, if none is within the time limit, ping @@ -253,74 +246,66 @@ class ExternalMessageConsumer: break - def compose_consumer_request( - self, - type_: RPCRequestType, - data: Optional[Any] = None - ) -> Dict[str, Any]: - """ - Create a request for sending to a producer - - :param type_: The RPCRequestType - :param data: The data to send - :returns: Dict[str, Any] - """ - return {'type': type_, 'data': data} - def handle_producer_message(self, producer: Dict[str, Any], message: Dict[str, Any]): """ Handles external messages from a Producer """ producer_name = producer.get('name', 'default') - # Should we have a default message type? - message_type = message.get('type', RPCMessageType.STATUS) - message_data = message.get('data') + + try: + producer_message = WSMessageSchema.parse_obj(message) + except ValidationError as e: + logger.error(f"Invalid message from {producer_name}: {e}") + return # We shouldn't get empty messages - if message_data is None: + if producer_message.data is None: return - logger.info(f"Received message of type {message_type} from `{producer_name}`") + logger.info(f"Received message of type {producer_message.type} from `{producer_name}`") - message_handler = self._message_handlers.get(message_type) + message_handler = self._message_handlers.get(producer_message.type) if not message_handler: - logger.info(f"Received unhandled message: {message_data}, ignoring...") + logger.info(f"Received unhandled message: {producer_message.data}, ignoring...") return - message_handler(producer_name, message_data) + message_handler(producer_name, producer_message) - def _consume_whitelist_message(self, producer_name: str, message_data: Any): - # We expect List[str] - if not isinstance(message_data, list): + def _consume_whitelist_message(self, producer_name: str, message: Any): + try: + # Validate the message + message = WSWhitelistMessage.parse_obj(message) + except ValidationError: return # Add the pairlist data to the DataProvider - self._dp._set_producer_pairs(message_data, producer_name=producer_name) + self._dp._set_producer_pairs(message.data, producer_name=producer_name) - logger.debug(f"Consumed message from {producer_name} of type RPCMessageType.WHITELIST") + logger.debug(f"Consumed message from {producer_name} of type `RPCMessageType.WHITELIST`") - def _consume_analyzed_df_message(self, producer_name: str, message_data: Any): - # We expect a Dict[str, Any] - if not isinstance(message_data, dict): + def _consume_analyzed_df_message(self, producer_name: str, message: Any): + try: + message = WSAnalyzedDFMessage.parse_obj(message) + except ValidationError: return - key, value = message_data.get('key'), message_data.get('value') + key = message.data.key + df = message.data.df + la = message.data.la - if key and value: - pair, timeframe, candle_type = key - dataframe, last_analyzed = value + pair, timeframe, candle_type = key - # If set, remove the Entry and Exit signals from the Producer - if self._emc_config.get('remove_entry_exit_signals', False): - dataframe = remove_entry_exit_signals(dataframe) + # If set, remove the Entry and Exit signals from the Producer + if self._emc_config.get('remove_entry_exit_signals', False): + df = remove_entry_exit_signals(df) - # Add the dataframe to the dataprovider - self._dp._add_external_df(pair, dataframe, - last_analyzed=last_analyzed, - timeframe=timeframe, - candle_type=candle_type, - producer_name=producer_name) + # Add the dataframe to the dataprovider + self._dp._add_external_df(pair, df, + last_analyzed=la, + timeframe=timeframe, + candle_type=candle_type, + producer_name=producer_name) - logger.debug( - f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") + logger.debug( + f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index df90b982e..9821bc001 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1068,8 +1068,12 @@ class RPC: for pair in pairlist: dataframe, last_analyzed = self.__rpc_analysed_dataframe_raw(pair, timeframe, limit) - _data[pair] = {"key": (pair, timeframe, candle_type), - "value": (dataframe, last_analyzed)} + + _data[pair] = { + "key": (pair, timeframe, candle_type), + "df": dataframe, + "la": last_analyzed + } return _data From 1ef1fc269e2b682a2d8053340e8349436a132269 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 15:26:38 -0600 Subject: [PATCH 164/437] docstring and tests --- freqtrade/strategy/strategy_helper.py | 4 +++- tests/strategy/test_strategy_helpers.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/freqtrade/strategy/strategy_helper.py b/freqtrade/strategy/strategy_helper.py index 55afbf7a8..53f625001 100644 --- a/freqtrade/strategy/strategy_helper.py +++ b/freqtrade/strategy/strategy_helper.py @@ -31,6 +31,8 @@ def merge_informative_pair(dataframe: pd.DataFrame, informative: pd.DataFrame, :param ffill: Forwardfill missing values - optional but usually required :param append_timeframe: Rename columns by appending timeframe. :param date_column: A custom date column name. + :param suffix: A string suffix to add at the end of the informative columns. If specified, + append_timeframe must be false. :return: Merged dataframe :raise: ValueError if the secondary timeframe is shorter than the dataframe timeframe """ @@ -57,7 +59,7 @@ def merge_informative_pair(dataframe: pd.DataFrame, informative: pd.DataFrame, date_merge = f'date_merge_{timeframe_inf}' informative.columns = [f"{col}_{timeframe_inf}" for col in informative.columns] - elif suffix: + elif suffix and not append_timeframe: date_merge = f'date_merge_{suffix}' informative.columns = [f"{col}_{suffix}" for col in informative.columns] diff --git a/tests/strategy/test_strategy_helpers.py b/tests/strategy/test_strategy_helpers.py index a7c2da26a..8cb990e87 100644 --- a/tests/strategy/test_strategy_helpers.py +++ b/tests/strategy/test_strategy_helpers.py @@ -117,6 +117,29 @@ def test_merge_informative_pair_lower(): merge_informative_pair(data, informative, '1h', '15m', ffill=True) +def test_merge_informative_pair_suffix(): + data = generate_test_data('15m', 20) + informative = generate_test_data('1h', 20) + + result = merge_informative_pair(data, informative, '15m', '1h', + append_timeframe=False, suffix="suf") + + assert 'date' in result.columns + assert result['date'].equals(data['date']) + assert 'date_suf' in result.columns + + assert 'open_suf' in result.columns + assert 'open_1h' not in result.columns + + +def test_merge_informative_pair_suffix_append_timeframe(): + data = generate_test_data('15m', 20) + informative = generate_test_data('1h', 20) + + with pytest.raises(ValueError, match=r"You can not specify `append_timeframe` .*"): + merge_informative_pair(data, informative, '15m', '1h', suffix="suf") + + def test_stoploss_from_open(): open_price_ranges = [ [0.01, 1.00, 30], From f4f2884a66c97c05e6871b1ecf2f12b1bc0ec460 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 7 Sep 2022 18:52:58 -0300 Subject: [PATCH 165/437] Fix freqai backtesting time range issue --- freqtrade/freqai/data_kitchen.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 7670cfd45..01b2f1f3b 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -461,6 +461,20 @@ class FreqaiDataKitchen: return df + def remove_training_from_backtesting( + self + ) -> DataFrame: + """ + Function which takes the backtesting time range and + remove training data from dataframe + """ + tr = self.config["timerange"] + backtesting_timerange = TimeRange.parse_timerange(tr) + start = datetime.fromtimestamp(backtesting_timerange.startts, tz=timezone.utc) + df = self.return_dataframe + df = df.loc[df["date"] >= start, :] + return df + def principal_component_analysis(self) -> None: """ Performs Principal Component Analysis on the data for dimensionality reduction @@ -954,6 +968,7 @@ class FreqaiDataKitchen: to_keep = [col for col in dataframe.columns if not col.startswith("&")] self.return_dataframe = pd.concat([dataframe[to_keep], self.full_df], axis=1) + self.return_dataframe = self.remove_training_from_backtesting() self.full_df = DataFrame() return From a50923f7963a58bddd76284cf470979eb7db0695 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Wed, 7 Sep 2022 17:14:26 -0600 Subject: [PATCH 166/437] add producers attribute to dataprovider --- freqtrade/data/dataprovider.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 4b5494e97..8ca638046 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -54,10 +54,8 @@ class DataProvider: self.__msg_cache = PeriodicCache( maxsize=1000, ttl=timeframe_to_seconds(self._default_timeframe)) - self._num_sources = len( - self._config.get('external_message_consumer', {}).get('producers', []) - ) - self.external_data_enabled = self._num_sources > 0 + self.producers = self._config.get('external_message_consumer', {}).get('producers', []) + self.external_data_enabled = len(self.producers) > 0 def _set_dataframe_max_index(self, limit_index: int): """ From f3417a869069bdb01da844017b00ebf30ee6f208 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 06:59:14 +0200 Subject: [PATCH 167/437] Revert condition sequence to simplify conditions --- freqtrade/strategy/strategy_helper.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/freqtrade/strategy/strategy_helper.py b/freqtrade/strategy/strategy_helper.py index 53f625001..aa753a829 100644 --- a/freqtrade/strategy/strategy_helper.py +++ b/freqtrade/strategy/strategy_helper.py @@ -55,17 +55,16 @@ def merge_informative_pair(dataframe: pd.DataFrame, informative: pd.DataFrame, # Rename columns to be unique date_merge = 'date_merge' - if append_timeframe and not suffix: + if suffix and append_timeframe: + raise ValueError("You can not specify `append_timeframe` as True and a `suffix`.") + elif append_timeframe: date_merge = f'date_merge_{timeframe_inf}' informative.columns = [f"{col}_{timeframe_inf}" for col in informative.columns] - elif suffix and not append_timeframe: + elif suffix: date_merge = f'date_merge_{suffix}' informative.columns = [f"{col}_{suffix}" for col in informative.columns] - elif suffix and append_timeframe: - raise ValueError("You can not specify `append_timeframe` as True and a `suffix`.") - # Combine the 2 dataframes # all indicators on the informative sample MUST be calculated before this point if ffill: From 045c3f0f3ae7f27fc8702ec12680060d9c896d09 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:01:37 +0200 Subject: [PATCH 168/437] Reduce diff by avoiding unnecessary changes --- freqtrade/misc.py | 2 +- freqtrade/strategy/interface.py | 34 ++++++++------------------------- tests/rpc/test_rpc_apiserver.py | 1 - 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/freqtrade/misc.py b/freqtrade/misc.py index 6a93b6f26..b2aca5fd6 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -14,7 +14,7 @@ import pandas import rapidjson from freqtrade.constants import DECIMAL_PER_COIN_FALLBACK, DECIMALS_PER_COIN -from freqtrade.enums.signaltype import SignalTagType, SignalType +from freqtrade.enums import SignalTagType, SignalType logger = logging.getLogger(__name__) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 93a582e80..0a9a155ea 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -698,11 +698,7 @@ class IStrategy(ABC, HyperStrategyMixin): lock_time = timeframe_to_next_date(self.timeframe, candle_date) return PairLocks.is_pair_locked(pair, lock_time, side=side) - def analyze_ticker( - self, - dataframe: DataFrame, - metadata: dict - ) -> DataFrame: + def analyze_ticker(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame add several TA indicators and entry order signal to it @@ -716,11 +712,7 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = self.advise_exit(dataframe, metadata) return dataframe - def _analyze_ticker_internal( - self, - dataframe: DataFrame, - metadata: dict - ) -> DataFrame: + def _analyze_ticker_internal(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Parses the given candle (OHLCV) data and returns a populated DataFrame add several TA indicators and buy signal to it @@ -753,20 +745,16 @@ class IStrategy(ABC, HyperStrategyMixin): return dataframe - def analyze_pair( - self, - pair: str - ) -> None: + def analyze_pair(self, pair: str) -> None: """ Fetch data for this pair from dataprovider and analyze. Stores the dataframe into the dataprovider. The analyzed dataframe is then accessible via `dp.get_analyzed_dataframe()`. :param pair: Pair to analyze. """ - candle_type = self.config.get('candle_type_def', CandleType.SPOT) - - dataframe = self.dp.ohlcv(pair, self.timeframe, candle_type) - + dataframe = self.dp.ohlcv( + pair, self.timeframe, candle_type=self.config.get('candle_type_def', CandleType.SPOT) + ) if not isinstance(dataframe, DataFrame) or dataframe.empty: logger.warning('Empty candle (OHLCV) data for pair %s', pair) return @@ -787,10 +775,7 @@ class IStrategy(ABC, HyperStrategyMixin): logger.warning('Empty dataframe for pair %s', pair) return - def analyze( - self, - pairs: List[str] - ) -> None: + def analyze(self, pairs: List[str]) -> None: """ Analyze all pairs using analyze_pair(). :param pairs: List of pairs to analyze @@ -798,7 +783,7 @@ class IStrategy(ABC, HyperStrategyMixin): for pair in pairs: self.analyze_pair(pair) - @ staticmethod + @staticmethod def preserve_df(dataframe: DataFrame) -> Tuple[int, float, datetime]: """ keep some data for dataframes """ return len(dataframe), dataframe["close"].iloc[-1], dataframe["date"].iloc[-1] @@ -1219,9 +1204,6 @@ class IStrategy(ABC, HyperStrategyMixin): dataframe = _create_and_merge_informative_pair( self, dataframe, metadata, inf_data, populate_fn) - # If in follower mode, get analyzed dataframe from leader df's in dp - # otherise run populate_indicators - return self.populate_indicators(dataframe, metadata) def advise_entry(self, dataframe: DataFrame, metadata: dict) -> DataFrame: diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 146303701..5dfa77d8b 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -406,7 +406,6 @@ def test_api_cleanup(default_conf, mocker, caplog): apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) - apiserver.start_api() apiserver.cleanup() assert apiserver._server.cleanup.call_count == 1 From 4e15611b055a7afb5dfc00fd687967fa52bca1bf Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:18:38 +0200 Subject: [PATCH 169/437] Don't crash in case of funding fee fetch error --- freqtrade/exchange/exchange.py | 11 +++++-- freqtrade/freqtradebot.py | 57 ++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 569dcad9b..be5af91db 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2509,8 +2509,13 @@ class Exchange: cache=False, drop_incomplete=False, ) - funding_rates = candle_histories[funding_comb] - mark_rates = candle_histories[mark_comb] + try: + # we can't assume we always get histories - for example during exchange downtimes + funding_rates = candle_histories[funding_comb] + mark_rates = candle_histories[mark_comb] + except KeyError: + raise ExchangeError("Could not find funding rates") from None + funding_mark_rates = self.combine_funding_and_mark( funding_rates=funding_rates, mark_rates=mark_rates) @@ -2590,6 +2595,8 @@ class Exchange: :param is_short: trade direction :param amount: Trade amount :param open_date: Open date of the trade + :return: funding fee since open_date + :raies: ExchangeError if something goes wrong. """ if self.trading_mode == TradingMode.FUTURES: if self._config['dry_run']: diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index ec32cae0e..61c323ed3 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -281,14 +281,17 @@ class FreqtradeBot(LoggingMixin): def update_funding_fees(self): if self.trading_mode == TradingMode.FUTURES: trades = Trade.get_open_trades() - for trade in trades: - funding_fees = self.exchange.get_funding_fees( - pair=trade.pair, - amount=trade.amount, - is_short=trade.is_short, - open_date=trade.date_last_filled_utc - ) - trade.funding_fees = funding_fees + try: + for trade in trades: + funding_fees = self.exchange.get_funding_fees( + pair=trade.pair, + amount=trade.amount, + is_short=trade.is_short, + open_date=trade.date_last_filled_utc + ) + trade.funding_fees = funding_fees + except ExchangeError: + logger.warning("Could not update funding fees for open trades.") else: return 0.0 @@ -671,14 +674,12 @@ class FreqtradeBot(LoggingMixin): if not stake_amount: return False - if pos_adjust: - logger.info(f"Position adjust: about to create a new order for {pair} with stake: " - f"{stake_amount} for {trade}") - else: - logger.info( - f"{name} signal found: about create a new trade for {pair} with stake_amount: " - f"{stake_amount} ...") - + msg = (f"Position adjust: about to create a new order for {pair} with stake: " + f"{stake_amount} for {trade}" if pos_adjust + else + f"{name} signal found: about create a new trade for {pair} with stake_amount: " + f"{stake_amount} ...") + logger.info(msg) amount = (stake_amount / enter_limit_requested) * leverage order_type = ordertype or self.strategy.order_types['entry'] @@ -741,8 +742,12 @@ class FreqtradeBot(LoggingMixin): # This is a new trade if trade is None: - funding_fees = self.exchange.get_funding_fees( - pair=pair, amount=amount, is_short=is_short, open_date=open_date) + try: + funding_fees = self.exchange.get_funding_fees( + pair=pair, amount=amount, is_short=is_short, open_date=open_date) + except ExchangeError: + logger.warning("Could not update funding fee.") + trade = Trade( pair=pair, base_currency=base_currency, @@ -1493,12 +1498,16 @@ class FreqtradeBot(LoggingMixin): :param exit_check: CheckTuple with signal and reason :return: True if it succeeds False """ - trade.funding_fees = self.exchange.get_funding_fees( - pair=trade.pair, - amount=trade.amount, - is_short=trade.is_short, - open_date=trade.date_last_filled_utc, - ) + try: + trade.funding_fees = self.exchange.get_funding_fees( + pair=trade.pair, + amount=trade.amount, + is_short=trade.is_short, + open_date=trade.date_last_filled_utc, + ) + except ExchangeError: + logger.warning("Could not update funding fee.") + exit_type = 'exit' exit_reason = exit_tag or exit_check.exit_reason if exit_check.exit_type in ( From 39b6cadd14e8253541c2836daed435059d20670d Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:24:57 +0200 Subject: [PATCH 170/437] Test keyerror case for funding_Fee calculation --- freqtrade/exchange/exchange.py | 2 +- tests/exchange/test_exchange.py | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index be5af91db..33a56c530 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -2514,7 +2514,7 @@ class Exchange: funding_rates = candle_histories[funding_comb] mark_rates = candle_histories[mark_comb] except KeyError: - raise ExchangeError("Could not find funding rates") from None + raise ExchangeError("Could not find funding rates.") from None funding_mark_rates = self.combine_funding_and_mark( funding_rates=funding_rates, mark_rates=mark_rates) diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 3b903f8ee..71690ecdf 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -11,8 +11,9 @@ import pytest from pandas import DataFrame from freqtrade.enums import CandleType, MarginMode, TradingMode -from freqtrade.exceptions import (DDosProtection, DependencyException, InvalidOrderException, - OperationalException, PricingError, TemporaryError) +from freqtrade.exceptions import (DDosProtection, DependencyException, ExchangeError, + InvalidOrderException, OperationalException, PricingError, + TemporaryError) from freqtrade.exchange import (Binance, Bittrex, Exchange, Kraken, amount_to_precision, date_minus_candles, market_is_active, price_to_precision, timeframe_to_minutes, timeframe_to_msecs, timeframe_to_next_date, @@ -4179,17 +4180,24 @@ def test__fetch_and_calculate_funding_fees( type(api_mock).has = PropertyMock(return_value={'fetchOHLCV': True}) type(api_mock).has = PropertyMock(return_value={'fetchFundingRateHistory': True}) - exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange) + ex = get_patched_exchange(mocker, default_conf, api_mock, id=exchange) mocker.patch('freqtrade.exchange.Exchange.timeframes', PropertyMock( return_value=['1h', '4h', '8h'])) - funding_fees = exchange._fetch_and_calculate_funding_fees( + funding_fees = ex._fetch_and_calculate_funding_fees( pair='ADA/USDT', amount=amount, is_short=True, open_date=d1, close_date=d2) assert pytest.approx(funding_fees) == expected_fees # Fees for Longs are inverted - funding_fees = exchange._fetch_and_calculate_funding_fees( + funding_fees = ex._fetch_and_calculate_funding_fees( pair='ADA/USDT', amount=amount, is_short=False, open_date=d1, close_date=d2) assert pytest.approx(funding_fees) == -expected_fees + # Return empty "refresh_latest" + mocker.patch("freqtrade.exchange.Exchange.refresh_latest_ohlcv", return_value={}) + ex = get_patched_exchange(mocker, default_conf, api_mock, id=exchange) + with pytest.raises(ExchangeError, match="Could not find funding rates."): + ex._fetch_and_calculate_funding_fees( + pair='ADA/USDT', amount=amount, is_short=False, open_date=d1, close_date=d2) + @pytest.mark.parametrize('exchange,expected_fees', [ ('binance', -0.0009140999999999999), From 791f61c0899647f3c04ac072305e73187e266268 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:13:15 +0000 Subject: [PATCH 171/437] Add test case for funding fee update failure --- freqtrade/freqtradebot.py | 2 -- tests/test_freqtradebot.py | 10 ++++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 61c323ed3..269c562d7 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -292,8 +292,6 @@ class FreqtradeBot(LoggingMixin): trade.funding_fees = funding_fees except ExchangeError: logger.warning("Could not update funding fees for open trades.") - else: - return 0.0 def startup_backpopulate_precision(self): diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 30b0b75b6..5f943504c 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -5430,6 +5430,16 @@ def test_update_funding_fees( )) +def test_update_funding_fees_error(mocker, default_conf, caplog): + mocker.patch('freqtrade.exchange.Exchange.get_funding_fees', side_effect=ExchangeError()) + default_conf['trading_mode'] = 'futures' + default_conf['margin_mode'] = 'isolated' + freqtrade = get_patched_freqtradebot(mocker, default_conf) + freqtrade.update_funding_fees() + + log_has("Could not update funding fees for open trades.", caplog) + + def test_position_adjust(mocker, default_conf_usdt, fee) -> None: patch_RPCManager(mocker) patch_exchange(mocker) From 9ef0ffe277e40159c207bb19782504d4bff492ff Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:19:17 +0000 Subject: [PATCH 172/437] Update tests for funding-Fee exceptions --- freqtrade/freqtradebot.py | 3 ++- tests/test_freqtradebot.py | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 269c562d7..6c001a8d6 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -740,11 +740,12 @@ class FreqtradeBot(LoggingMixin): # This is a new trade if trade is None: + funding_fees = 0.0 try: funding_fees = self.exchange.get_funding_fees( pair=pair, amount=amount, is_short=is_short, open_date=open_date) except ExchangeError: - logger.warning("Could not update funding fee.") + logger.warning("Could not find funding fee.") trade = Trade( pair=pair, diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 5f943504c..565797d81 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -506,7 +506,7 @@ def test_create_trades_multiple_trades( def test_create_trades_preopen(default_conf_usdt, ticker_usdt, fee, mocker, - limit_buy_order_usdt_open) -> None: + limit_buy_order_usdt_open, caplog) -> None: patch_RPCManager(mocker) patch_exchange(mocker) default_conf_usdt['max_open_trades'] = 4 @@ -515,6 +515,7 @@ def test_create_trades_preopen(default_conf_usdt, ticker_usdt, fee, mocker, fetch_ticker=ticker_usdt, create_order=MagicMock(return_value=limit_buy_order_usdt_open), get_fee=fee, + get_funding_fees=MagicMock(side_effect=ExchangeError()), ) freqtrade = FreqtradeBot(default_conf_usdt) patch_get_signal(freqtrade) @@ -522,6 +523,7 @@ def test_create_trades_preopen(default_conf_usdt, ticker_usdt, fee, mocker, # Create 2 existing trades freqtrade.execute_entry('ETH/USDT', default_conf_usdt['stake_amount']) freqtrade.execute_entry('NEO/BTC', default_conf_usdt['stake_amount']) + assert log_has("Could not find funding fee.", caplog) assert len(Trade.get_open_trades()) == 2 # Change order_id for new orders @@ -3666,7 +3668,7 @@ def test_may_execute_trade_exit_after_stoploss_on_exchange_hit( (True, 29.70297029, 2.2, 2.3, -8.63762376, -0.1443212, 'loss'), ]) def test_execute_trade_exit_market_order( - default_conf_usdt, ticker_usdt, fee, is_short, current_rate, amount, + default_conf_usdt, ticker_usdt, fee, is_short, current_rate, amount, caplog, limit, profit_amount, profit_ratio, profit_or_loss, ticker_usdt_sell_up, mocker ) -> None: """ @@ -3694,6 +3696,7 @@ def test_execute_trade_exit_market_order( fetch_ticker=ticker_usdt, get_fee=fee, _is_dry_limit_order_filled=MagicMock(return_value=True), + get_funding_fees=MagicMock(side_effect=ExchangeError()), ) patch_whitelist(mocker, default_conf_usdt) freqtrade = FreqtradeBot(default_conf_usdt) @@ -3719,6 +3722,7 @@ def test_execute_trade_exit_market_order( limit=ticker_usdt_sell_up()['ask' if is_short else 'bid'], exit_check=ExitCheckTuple(exit_type=ExitType.ROI) ) + assert log_has("Could not update funding fee.", caplog) assert not trade.is_open assert pytest.approx(trade.close_profit) == profit_ratio From 5e42defafc005de4d475776ae86ce6e242e8c8ed Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:36:17 +0000 Subject: [PATCH 173/437] Update telegram docs to disable partial exit notifications --- docs/telegram-usage.md | 91 +++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/docs/telegram-usage.md b/docs/telegram-usage.md index ece8700de..b9324def4 100644 --- a/docs/telegram-usage.md +++ b/docs/telegram-usage.md @@ -90,7 +90,8 @@ Example configuration showing the different settings: "trailing_stop_loss": "on", "stop_loss": "on", "stoploss_on_exchange": "on", - "custom_exit": "silent" + "custom_exit": "silent", + "partial_exit": "on" }, "entry_cancel": "silent", "exit_cancel": "on", @@ -138,7 +139,7 @@ You can create your own keyboard in `config.json`: "enabled": true, "token": "your_telegram_token", "chat_id": "your_telegram_chat_id", - "keyboard": [ + "keyboard": [ ["/daily", "/stats", "/balance", "/profit"], ["/status table", "/performance"], ["/reload_config", "/count", "/logs"] @@ -225,16 +226,16 @@ Once all positions are sold, run `/stop` to completely stop the bot. For each open trade, the bot will send you the following message. Enter Tag is configurable via Strategy. -> **Trade ID:** `123` `(since 1 days ago)` -> **Current Pair:** CVC/BTC +> **Trade ID:** `123` `(since 1 days ago)` +> **Current Pair:** CVC/BTC > **Direction:** Long > **Leverage:** 1.0 -> **Amount:** `26.64180098` +> **Amount:** `26.64180098` > **Enter Tag:** Awesome Long Signal -> **Open Rate:** `0.00007489` -> **Current Rate:** `0.00007489` -> **Current Profit:** `12.95%` -> **Stoploss:** `0.00007389 (-0.02%)` +> **Open Rate:** `0.00007489` +> **Current Rate:** `0.00007489` +> **Current Profit:** `12.95%` +> **Stoploss:** `0.00007389 (-0.02%)` ### /status table @@ -261,26 +262,26 @@ current max Return a summary of your profit/loss and performance. -> **ROI:** Close trades -> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)` -> ∙ `62.968 USD` -> **ROI:** All trades -> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)` -> ∙ `33.095 EUR` -> -> **Total Trade Count:** `138` -> **First Trade opened:** `3 days ago` -> **Latest Trade opened:** `2 minutes ago` -> **Avg. Duration:** `2:33:45` -> **Best Performing:** `PAY/BTC: 50.23%` -> **Trading volume:** `0.5 BTC` -> **Profit factor:** `1.04` -> **Max Drawdown:** `9.23% (0.01255 BTC)` +> **ROI:** Close trades +> ∙ `0.00485701 BTC (2.2%) (15.2 Σ%)` +> ∙ `62.968 USD` +> **ROI:** All trades +> ∙ `0.00255280 BTC (1.5%) (6.43 Σ%)` +> ∙ `33.095 EUR` +> +> **Total Trade Count:** `138` +> **First Trade opened:** `3 days ago` +> **Latest Trade opened:** `2 minutes ago` +> **Avg. Duration:** `2:33:45` +> **Best Performing:** `PAY/BTC: 50.23%` +> **Trading volume:** `0.5 BTC` +> **Profit factor:** `1.04` +> **Max Drawdown:** `9.23% (0.01255 BTC)` -The relative profit of `1.2%` is the average profit per trade. -The relative profit of `15.2 Σ%` is be based on the starting capital - so in this case, the starting capital was `0.00485701 * 1.152 = 0.00738 BTC`. -Starting capital is either taken from the `available_capital` setting, or calculated by using current wallet size - profits. -Profit Factor is calculated as gross profits / gross losses - and should serve as an overall metric for the strategy. +The relative profit of `1.2%` is the average profit per trade. +The relative profit of `15.2 Σ%` is be based on the starting capital - so in this case, the starting capital was `0.00485701 * 1.152 = 0.00738 BTC`. +Starting capital is either taken from the `available_capital` setting, or calculated by using current wallet size - profits. +Profit Factor is calculated as gross profits / gross losses - and should serve as an overall metric for the strategy. Max drawdown corresponds to the backtesting metric `Absolute Drawdown (Account)` - calculated as `(Absolute Drawdown) / (DrawdownHigh + startingBalance)`. ### /forceexit @@ -309,27 +310,27 @@ Note that for this to work, `force_entry_enable` needs to be set to true. ### /performance Return the performance of each crypto-currency the bot has sold. -> Performance: -> 1. `RCN/BTC 0.003 BTC (57.77%) (1)` -> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)` -> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)` -> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)` -> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)` -> ... +> Performance: +> 1. `RCN/BTC 0.003 BTC (57.77%) (1)` +> 2. `PAY/BTC 0.0012 BTC (56.91%) (1)` +> 3. `VIB/BTC 0.0011 BTC (47.07%) (1)` +> 4. `SALT/BTC 0.0010 BTC (30.24%) (1)` +> 5. `STORJ/BTC 0.0009 BTC (27.24%) (1)` +> ... ### /balance Return the balance of all crypto-currency your have on the exchange. -> **Currency:** BTC -> **Available:** 3.05890234 -> **Balance:** 3.05890234 -> **Pending:** 0.0 +> **Currency:** BTC +> **Available:** 3.05890234 +> **Balance:** 3.05890234 +> **Pending:** 0.0 -> **Currency:** CVC -> **Available:** 86.64180098 -> **Balance:** 86.64180098 -> **Pending:** 0.0 +> **Currency:** CVC +> **Available:** 86.64180098 +> **Balance:** 86.64180098 +> **Pending:** 0.0 ### /daily @@ -376,7 +377,7 @@ Month (count) Profit BTC Profit USD Profit % Shows the current whitelist -> Using whitelist `StaticPairList` with 22 pairs +> Using whitelist `StaticPairList` with 22 pairs > `IOTA/BTC, NEO/BTC, TRX/BTC, VET/BTC, ADA/BTC, ETC/BTC, NCASH/BTC, DASH/BTC, XRP/BTC, XVG/BTC, EOS/BTC, LTC/BTC, OMG/BTC, BTG/BTC, LSK/BTC, ZEC/BTC, HOT/BTC, IOTX/BTC, XMR/BTC, AST/BTC, XLM/BTC, NANO/BTC` ### /blacklist [pair] @@ -386,7 +387,7 @@ If Pair is set, then this pair will be added to the pairlist. Also supports multiple pairs, separated by a space. Use `/reload_config` to reset the blacklist. -> Using blacklist `StaticPairList` with 2 pairs +> Using blacklist `StaticPairList` with 2 pairs >`DODGE/BTC`, `HOT/BTC`. ### /edge From 08726a264be3abdb69569170915c23cd1459c0b2 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 8 Sep 2022 07:48:36 +0000 Subject: [PATCH 174/437] Update FAQ to point out multiple parallel positions per trade --- docs/faq.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index 381bbceb5..a72268ef9 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -4,7 +4,7 @@ Freqtrade supports spot trading only. -### Can I open short positions? +### Can my bot open short positions? Freqtrade can open short positions in futures markets. This requires the strategy to be made for this - and `"trading_mode": "futures"` in the configuration. @@ -12,9 +12,9 @@ Please make sure to read the [relevant documentation page](leverage.md) first. In spot markets, you can in some cases use leveraged spot tokens, which reflect an inverted pair (eg. BTCUP/USD, BTCDOWN/USD, ETHBULL/USD, ETHBEAR/USD,...) which can be traded with Freqtrade. -### Can I trade options or futures? +### Can my bot trade options or futures? -Futures trading is supported for selected exchanges. +Futures trading is supported for selected exchanges. Please refer to the [documentation start page](index.md#supported-futures-exchanges-experimental) for an uptodate list of supported exchanges. ## Beginner Tips & Tricks @@ -22,6 +22,13 @@ Futures trading is supported for selected exchanges. ## Freqtrade common issues +### Can freqtrade open multiple positions on the same pair in parallel? + +No. Freqtrade will only open one position per pair at a time. +You can however use the [`adjust_trade_position()` callback](strategy-callbacks.md#adjust-trade-position) to adjust an open position. + +Backtesting provides an option for this in `--eps` - however this is only there to highlight "hidden" signals, and will not work in live. + ### The bot does not start Running the bot with `freqtrade trade --config config.json` shows the output `freqtrade: command not found`. @@ -30,7 +37,7 @@ This could be caused by the following reasons: * The virtual environment is not active. * Run `source .env/bin/activate` to activate the virtual environment. -* The installation did not work correctly. +* The installation did not complete successfully. * Please check the [Installation documentation](installation.md). ### I have waited 5 minutes, why hasn't the bot made any trades yet? @@ -67,7 +74,7 @@ This is not a bot-problem, but will also happen while manual trading. While freqtrade can handle this (it'll sell 99 COIN), fees are often below the minimum tradable lot-size (you can only trade full COIN, not 0.9 COIN). Leaving the dust (0.9 COIN) on the exchange makes usually sense, as the next time freqtrade buys COIN, it'll eat into the remaining small balance, this time selling everything it bought, and therefore slowly declining the dust balance (although it most likely will never reach exactly 0). -Where possible (e.g. on binance), the use of the exchange's dedicated fee currency will fix this. +Where possible (e.g. on binance), the use of the exchange's dedicated fee currency will fix this. On binance, it's sufficient to have BNB in your account, and have "Pay fees in BNB" enabled in your profile. Your BNB balance will slowly decline (as it's used to pay fees) - but you'll no longer encounter dust (Freqtrade will include the fees in the profit calculations). Other exchanges don't offer such possibilities, where it's simply something you'll have to accept or move to a different exchange. @@ -109,7 +116,7 @@ This warning can point to one of the below problems: ### I'm getting the "RESTRICTED_MARKET" message in the log -Currently known to happen for US Bittrex users. +Currently known to happen for US Bittrex users. Read [the Bittrex section about restricted markets](exchanges.md#restricted-markets) for more information. @@ -177,8 +184,8 @@ The GPU improvements would only apply to pandas-native calculations - or ones wr For hyperopt, freqtrade is using scikit-optimize, which is built on top of scikit-learn. Their statement about GPU support is [pretty clear](https://scikit-learn.org/stable/faq.html#will-you-add-gpu-support). -GPU's also are only good at crunching numbers (floating point operations). -For hyperopt, we need both number-crunching (find next parameters) and running python code (running backtesting). +GPU's also are only good at crunching numbers (floating point operations). +For hyperopt, we need both number-crunching (find next parameters) and running python code (running backtesting). As such, GPU's are not too well suited for most parts of hyperopt. The benefit of using GPU would therefore be pretty slim - and will not justify the complexity introduced by trying to add GPU support. @@ -219,9 +226,9 @@ already 8\*10^9\*10 evaluations. A roughly total of 80 billion evaluations. Did you run 100 000 evaluations? Congrats, you've done roughly 1 / 100 000 th of the search space, assuming that the bot never tests the same parameters more than once. -* The time it takes to run 1000 hyperopt epochs depends on things like: The available cpu, hard-disk, ram, timeframe, timerange, indicator settings, indicator count, amount of coins that hyperopt test strategies on and the resulting trade count - which can be 650 trades in a year or 100000 trades depending if the strategy aims for big profits by trading rarely or for many low profit trades. +* The time it takes to run 1000 hyperopt epochs depends on things like: The available cpu, hard-disk, ram, timeframe, timerange, indicator settings, indicator count, amount of coins that hyperopt test strategies on and the resulting trade count - which can be 650 trades in a year or 100000 trades depending if the strategy aims for big profits by trading rarely or for many low profit trades. -Example: 4% profit 650 times vs 0,3% profit a trade 10000 times in a year. If we assume you set the --timerange to 365 days. +Example: 4% profit 650 times vs 0,3% profit a trade 10000 times in a year. If we assume you set the --timerange to 365 days. Example: `freqtrade --config config.json --strategy SampleStrategy --hyperopt SampleHyperopt -e 1000 --timerange 20190601-20200601` From 83770d20fac8d2acd8cf5d8567cc9d85a2b75ad1 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:10:32 -0600 Subject: [PATCH 175/437] fix existing freqtradebot tests --- tests/test_freqtradebot.py | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index aff0504b3..837a4315f 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -1317,9 +1317,9 @@ def test_create_stoploss_order_invalid_order( assert create_order_mock.call_args[1]['amount'] == trade.amount # Rpc is sending first buy, then sell - assert rpc_mock.call_count == 2 - assert rpc_mock.call_args_list[1][0][0]['sell_reason'] == ExitType.EMERGENCY_EXIT.value - assert rpc_mock.call_args_list[1][0][0]['order_type'] == 'market' + assert rpc_mock.call_count == 3 + assert rpc_mock.call_args_list[2][0][0]['sell_reason'] == ExitType.EMERGENCY_EXIT.value + assert rpc_mock.call_args_list[2][0][0]['order_type'] == 'market' @pytest.mark.parametrize("is_short", [False, True]) @@ -2434,7 +2434,7 @@ def test_manage_open_orders_entry_usercustom( # Trade should be closed since the function returns true freqtrade.manage_open_orders() assert cancel_order_wr_mock.call_count == 1 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() nb_trades = len(trades) assert nb_trades == 0 @@ -2473,7 +2473,7 @@ def test_manage_open_orders_entry( # check it does cancel buy orders over the time limit freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() nb_trades = len(trades) assert nb_trades == 0 @@ -2603,7 +2603,7 @@ def test_check_handle_cancelled_buy( # check it does cancel buy orders over the time limit freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 0 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() assert len(trades) == 0 assert log_has_re( @@ -2634,7 +2634,7 @@ def test_manage_open_orders_buy_exception( # check it does cancel buy orders over the time limit freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 0 - assert rpc_mock.call_count == 0 + assert rpc_mock.call_count == 1 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() nb_trades = len(trades) assert nb_trades == 1 @@ -2681,7 +2681,7 @@ def test_manage_open_orders_exit_usercustom( # Return false - No impact freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 0 - assert rpc_mock.call_count == 0 + assert rpc_mock.call_count == 1 assert open_trade_usdt.is_open is False assert freqtrade.strategy.check_exit_timeout.call_count == 1 assert freqtrade.strategy.check_entry_timeout.call_count == 0 @@ -2691,7 +2691,7 @@ def test_manage_open_orders_exit_usercustom( # Return Error - No impact freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 0 - assert rpc_mock.call_count == 0 + assert rpc_mock.call_count == 1 assert open_trade_usdt.is_open is False assert freqtrade.strategy.check_exit_timeout.call_count == 1 assert freqtrade.strategy.check_entry_timeout.call_count == 0 @@ -2701,7 +2701,7 @@ def test_manage_open_orders_exit_usercustom( freqtrade.strategy.check_entry_timeout = MagicMock(return_value=True) freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 assert open_trade_usdt.is_open is True assert freqtrade.strategy.check_exit_timeout.call_count == 1 assert freqtrade.strategy.check_entry_timeout.call_count == 0 @@ -2761,7 +2761,7 @@ def test_manage_open_orders_exit( # check it does cancel sell orders over the time limit freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 assert open_trade_usdt.is_open is True # Custom user sell-timeout is never called assert freqtrade.strategy.check_exit_timeout.call_count == 0 @@ -2800,7 +2800,7 @@ def test_check_handle_cancelled_exit( # check it does cancel sell orders over the time limit freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 0 - assert rpc_mock.call_count == 1 + assert rpc_mock.call_count == 2 assert open_trade_usdt.is_open is True exit_name = 'Buy' if is_short else 'Sell' assert log_has_re(f"{exit_name} order cancelled on exchange for Trade.*", caplog) @@ -2838,7 +2838,7 @@ def test_manage_open_orders_partial( # note this is for a partially-complete buy order freqtrade.manage_open_orders() assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 2 + assert rpc_mock.call_count == 3 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() assert len(trades) == 1 assert trades[0].amount == 23.0 @@ -2885,7 +2885,7 @@ def test_manage_open_orders_partial_fee( assert log_has_re(r"Applying fee on amount for Trade.*", caplog) assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 2 + assert rpc_mock.call_count == 3 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() assert len(trades) == 1 # Verify that trade has been updated @@ -2935,7 +2935,7 @@ def test_manage_open_orders_partial_except( assert log_has_re(r"Could not update trade amount: .*", caplog) assert cancel_order_mock.call_count == 1 - assert rpc_mock.call_count == 2 + assert rpc_mock.call_count == 3 trades = Trade.query.filter(Trade.open_order_id.is_(open_trade.open_order_id)).all() assert len(trades) == 1 # Verify that trade has been updated @@ -3150,7 +3150,7 @@ def test_handle_cancel_exit_limit(mocker, default_conf_usdt, fee) -> None: reason = CANCEL_REASON['TIMEOUT'] assert freqtrade.handle_cancel_exit(trade, order, reason) assert cancel_order_mock.call_count == 1 - assert send_msg_mock.call_count == 1 + assert send_msg_mock.call_count == 2 assert trade.close_rate is None assert trade.exit_reason is None @@ -3583,7 +3583,7 @@ def test_execute_trade_exit_with_stoploss_on_exchange( trade.is_short = is_short assert trade assert cancel_order.call_count == 1 - assert rpc_mock.call_count == 3 + assert rpc_mock.call_count == 4 @pytest.mark.parametrize("is_short", [False, True]) @@ -3653,10 +3653,10 @@ def test_may_execute_trade_exit_after_stoploss_on_exchange_hit( assert trade.stoploss_order_id is None assert trade.is_open is False assert trade.exit_reason == ExitType.STOPLOSS_ON_EXCHANGE.value - assert rpc_mock.call_count == 3 - assert rpc_mock.call_args_list[0][0][0]['type'] == RPCMessageType.ENTRY - assert rpc_mock.call_args_list[1][0][0]['type'] == RPCMessageType.ENTRY_FILL - assert rpc_mock.call_args_list[2][0][0]['type'] == RPCMessageType.EXIT_FILL + assert rpc_mock.call_count == 4 + assert rpc_mock.call_args_list[1][0][0]['type'] == RPCMessageType.ENTRY + assert rpc_mock.call_args_list[2][0][0]['type'] == RPCMessageType.ENTRY_FILL + assert rpc_mock.call_args_list[3][0][0]['type'] == RPCMessageType.EXIT_FILL @pytest.mark.parametrize( From 4fac12544385caee6a9a64858bbb445b72ea6989 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:14:30 -0600 Subject: [PATCH 176/437] fix apiserver cleanup issues in tests --- tests/rpc/test_rpc_apiserver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 5dfa77d8b..0efcc00c1 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -54,6 +54,7 @@ def botclient(default_conf, mocker): apiserver.add_rpc_handler(rpc) yield ftbot, TestClient(apiserver.app) # Cleanup ... ? + apiserver.cleanup() finally: ApiServer.shutdown() @@ -261,6 +262,7 @@ def test_api__init__(default_conf, mocker): with pytest.raises(OperationalException, match="RPC Handler already attached."): apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) + apiserver.cleanup() ApiServer.shutdown() @@ -388,6 +390,7 @@ def test_api_run(default_conf, mocker, caplog): MagicMock(side_effect=Exception)) apiserver.start_api() assert log_has("Api server failed to start.", caplog) + apiserver.cleanup() ApiServer.shutdown() From 9b752475dbf0c1d6de6e245781ffdb789c54d3b8 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:20:03 -0600 Subject: [PATCH 177/437] re-add fix to freqtradebot test --- tests/test_freqtradebot.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 6f9ed407c..8b95792e5 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -3655,11 +3655,11 @@ def test_may_execute_trade_exit_after_stoploss_on_exchange_hit( assert trade.stoploss_order_id is None assert trade.is_open is False assert trade.exit_reason == ExitType.STOPLOSS_ON_EXCHANGE.value - assert rpc_mock.call_count == 3 - assert rpc_mock.call_args_list[0][0][0]['type'] == RPCMessageType.ENTRY - assert rpc_mock.call_args_list[0][0][0]['amount'] > 20 - assert rpc_mock.call_args_list[1][0][0]['type'] == RPCMessageType.ENTRY_FILL - assert rpc_mock.call_args_list[2][0][0]['type'] == RPCMessageType.EXIT_FILL + assert rpc_mock.call_count == 4 + assert rpc_mock.call_args_list[1][0][0]['type'] == RPCMessageType.ENTRY + assert rpc_mock.call_args_list[1][0][0]['amount'] > 20 + assert rpc_mock.call_args_list[2][0][0]['type'] == RPCMessageType.ENTRY_FILL + assert rpc_mock.call_args_list[3][0][0]['type'] == RPCMessageType.EXIT_FILL @pytest.mark.parametrize( From df3c1261464f8f72063f019ea865759c74b5a18b Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:34:37 -0600 Subject: [PATCH 178/437] fix mypy error --- freqtrade/rpc/api_server/api_ws.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 64c1cebb5..8a3fcfba2 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -9,7 +9,8 @@ from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, - WSRequestSchema, WSWhitelistMessage) + WSMessageSchema, WSRequestSchema, + WSWhitelistMessage) from freqtrade.rpc.rpc import RPC @@ -47,6 +48,7 @@ async def _process_consumer_request( return type, data = websocket_request.type, websocket_request.data + response: WSMessageSchema logger.debug(f"Request of type {type} from {channel}") @@ -61,6 +63,7 @@ async def _process_consumer_request( channel.set_subscriptions(data) # We don't send a response for subscriptions + return elif type == RPCRequestType.WHITELIST: # Get whitelist @@ -70,6 +73,7 @@ async def _process_consumer_request( response = WSWhitelistMessage(data=whitelist) # Send it back await channel.send(response.dict(exclude_none=True)) + return elif type == RPCRequestType.ANALYZED_DF: limit = None @@ -86,6 +90,8 @@ async def _process_consumer_request( response = WSAnalyzedDFMessage(data=message) await channel.send(response.dict(exclude_none=True)) + return + @router.websocket("/message/ws") async def message_endpoint( From 379b1cbc9001f38189afc1bd963bcc6f55601ed3 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:37:41 -0600 Subject: [PATCH 179/437] remove unnecessary returns --- freqtrade/rpc/api_server/api_ws.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 8a3fcfba2..45cc20e4d 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -73,7 +73,6 @@ async def _process_consumer_request( response = WSWhitelistMessage(data=whitelist) # Send it back await channel.send(response.dict(exclude_none=True)) - return elif type == RPCRequestType.ANALYZED_DF: limit = None @@ -90,8 +89,6 @@ async def _process_consumer_request( response = WSAnalyzedDFMessage(data=message) await channel.send(response.dict(exclude_none=True)) - return - @router.websocket("/message/ws") async def message_endpoint( From b3b0c918d98326df8361e5f03302c7ecbd54be65 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:44:03 -0600 Subject: [PATCH 180/437] cleanup old code --- freqtrade/rpc/api_server/ws/schema.py | 12 ------------ freqtrade/rpc/api_server/ws/serializer.py | 10 ---------- freqtrade/rpc/api_server/ws/utils.py | 12 ------------ 3 files changed, 34 deletions(-) delete mode 100644 freqtrade/rpc/api_server/ws/utils.py diff --git a/freqtrade/rpc/api_server/ws/schema.py b/freqtrade/rpc/api_server/ws/schema.py index 3221911de..0baa8d233 100644 --- a/freqtrade/rpc/api_server/ws/schema.py +++ b/freqtrade/rpc/api_server/ws/schema.py @@ -64,15 +64,3 @@ class WSAnalyzedDFMessage(WSMessageSchema): data: AnalyzedDFData # -------------------------------------------------------------------------- - - -if __name__ == "__main__": - message = WSAnalyzedDFMessage( - data={ - "key": ("1", "5m", "spot"), - "df": DataFrame(), - "la": datetime.now() - } - ) - - print(message) diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index c0c24bb28..d1ddd84f0 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -46,16 +46,6 @@ class JSONWebSocketSerializer(WebSocketSerializer): return json.loads(data, object_hook=_json_object_hook) -# ORJSON does not support .loads(object_hook=x) parameter, so we must use RapidJSON - -class RapidJSONWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data): - return rapidjson.dumps(data, default=_json_default) - - def _deserialize(self, data): - return rapidjson.loads(data, object_hook=_json_object_hook) - - class HybridJSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data) -> str: return str(orjson.dumps(data, default=_json_default), "utf-8") diff --git a/freqtrade/rpc/api_server/ws/utils.py b/freqtrade/rpc/api_server/ws/utils.py deleted file mode 100644 index 1ceecab88..000000000 --- a/freqtrade/rpc/api_server/ws/utils.py +++ /dev/null @@ -1,12 +0,0 @@ -from fastapi import WebSocket -# fastapi does not make this available through it, so import directly from starlette -from starlette.websockets import WebSocketState - - -async def is_websocket_alive(ws: WebSocket) -> bool: - if ( - ws.application_state == WebSocketState.CONNECTED and - ws.client_state == WebSocketState.CONNECTED - ): - return True - return False From fac6626459ed8faa8da1f790cd89421f8c026ba4 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 10:54:31 -0600 Subject: [PATCH 181/437] update default timeouts --- config_examples/config_full.example.json | 4 ++-- freqtrade/rpc/external_message_consumer.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index 9788a0fa9..37c604c72 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -187,9 +187,9 @@ "ws_token": "a_secret_ws_token" } ], - "reply_timeout": 10, + "reply_timeout": 30, "ping_timeout": 5, - "sleep_time": 5, + "sleep_time": 10, "remove_entry_exit_signals": false }, "bot_name": "freqtrade", diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index d1e970826..525f4282c 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -58,9 +58,9 @@ class ExternalMessageConsumer: if self.enabled and len(self.producers) < 1: raise ValueError("You must specify at least 1 Producer to connect to.") - self.reply_timeout = self._emc_config.get('reply_timeout', 10) - self.ping_timeout = self._emc_config.get('ping_timeout', 2) - self.sleep_time = self._emc_config.get('sleep_time', 5) + self.reply_timeout = self._emc_config.get('reply_timeout', 30) + self.ping_timeout = self._emc_config.get('ping_timeout', 5) + self.sleep_time = self._emc_config.get('sleep_time', 10) # The amount of candles per dataframe on the initial request self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 1500) From b9e7af1ce235cae8be27309da01df8ae70144100 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 11:25:30 -0600 Subject: [PATCH 182/437] fix ws token auth --- freqtrade/rpc/api_server/api_auth.py | 2 +- freqtrade/rpc/api_server/api_ws.py | 5 +++++ freqtrade/rpc/api_server/webserver.py | 7 ++----- tests/rpc/test_rpc_apiserver.py | 21 ++++++++++++++++++++- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 6655dbf86..0d1378b6d 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -62,7 +62,7 @@ async def get_ws_token( # Just return the token if it matches return token else: - logger.debug("Denying websocket request") + logger.info("Denying websocket request") # If it doesn't match, close the websocket connection await ws.close(code=status.WS_1008_POLICY_VIOLATION) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 45cc20e4d..384bd4115 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -6,6 +6,7 @@ from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect from starlette.websockets import WebSocketState from freqtrade.enums import RPCMessageType, RPCRequestType +from freqtrade.rpc.api_server.api_auth import get_ws_token from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, @@ -95,6 +96,7 @@ async def message_endpoint( ws: WebSocket, rpc: RPC = Depends(get_rpc), channel_manager=Depends(get_channel_manager), + token: str = Depends(get_ws_token) ): """ Message WebSocket endpoint, facilitates sending RPC messages @@ -105,6 +107,9 @@ async def message_endpoint( # Return a channel ID, pass that instead of ws to the rest of the methods channel = await channel_manager.on_connect(ws) + if not channel: + return + logger.info(f"Consumer connected - {channel}") # Keep connection open until explicitly closed, and process requests diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 6ad3f143e..73e80dd48 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -139,8 +139,7 @@ class ApiServer(RPCHandler): ) def configure_app(self, app: FastAPI, config): - from freqtrade.rpc.api_server.api_auth import (get_ws_token, http_basic_or_jwt_token, - router_login) + from freqtrade.rpc.api_server.api_auth import http_basic_or_jwt_token, router_login from freqtrade.rpc.api_server.api_backtest import router as api_backtest from freqtrade.rpc.api_server.api_v1 import router as api_v1 from freqtrade.rpc.api_server.api_v1 import router_public as api_v1_public @@ -155,9 +154,7 @@ class ApiServer(RPCHandler): app.include_router(api_backtest, prefix="/api/v1", dependencies=[Depends(http_basic_or_jwt_token)], ) - app.include_router(ws_router, prefix="/api/v1", - dependencies=[Depends(get_ws_token)] - ) + app.include_router(ws_router, prefix="/api/v1") app.include_router(router_login, prefix="/api/v1", tags=["auth"]) # UI Router MUST be last! app.include_router(router_ui, prefix='') diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 0efcc00c1..ccfe31424 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -10,7 +10,7 @@ from unittest.mock import ANY, MagicMock, PropertyMock import pandas as pd import pytest import uvicorn -from fastapi import FastAPI +from fastapi import FastAPI, WebSocketDisconnect from fastapi.exceptions import HTTPException from fastapi.testclient import TestClient from requests.auth import _basic_auth_str @@ -31,6 +31,7 @@ from tests.conftest import (CURRENT_TEST_STRATEGY, create_mock_trades, get_mock_ BASE_URI = "/api/v1" _TEST_USER = "FreqTrader" _TEST_PASS = "SuperSecurePassword1!" +_TEST_WS_TOKEN = "secret_Ws_t0ken" @pytest.fixture @@ -44,6 +45,7 @@ def botclient(default_conf, mocker): "CORS_origins": ['http://example.com'], "username": _TEST_USER, "password": _TEST_PASS, + "ws_token": _TEST_WS_TOKEN }}) ftbot = get_patched_freqtradebot(mocker, default_conf) @@ -155,6 +157,23 @@ def test_api_auth(): get_user_from_token(b'not_a_token', 'secret1234') +def test_api_ws_auth(botclient): + ftbot, client = botclient + + bad_token = "bad-ws_token" + url = f"/api/v1/message/ws?token={bad_token}" + + with pytest.raises(WebSocketDisconnect): + with client.websocket_connect(url) as websocket: + websocket.receive() + + good_token = _TEST_WS_TOKEN + url = f"/api/v1/message/ws?token={good_token}" + + with client.websocket_connect(url) as websocket: + websocket.send(1) + + def test_api_unauthorized(botclient): ftbot, client = botclient rc = client.get(f"{BASE_URI}/ping") From 2b9c8550b0e6bddc85187958a2cb2816e95c4c2e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 13:58:28 -0600 Subject: [PATCH 183/437] moved ws_schemas, first ws tests --- freqtrade/rpc/api_server/api_ws.py | 19 ++++++++------- .../{ws/schema.py => ws_schemas.py} | 5 +--- freqtrade/rpc/external_message_consumer.py | 9 +++---- tests/rpc/test_rpc_apiserver.py | 24 +++++++++++++++++-- 4 files changed, 38 insertions(+), 19 deletions(-) rename freqtrade/rpc/api_server/{ws/schema.py => ws_schemas.py} (92%) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 384bd4115..f6eb59f87 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -2,6 +2,7 @@ import logging from typing import Any, Dict from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect +from pydantic import ValidationError # fastapi does not make this available through it, so import directly from starlette from starlette.websockets import WebSocketState @@ -9,9 +10,8 @@ from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.api_auth import get_ws_token from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel -from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, - WSMessageSchema, WSRequestSchema, - WSWhitelistMessage) +from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSMessageSchema, + WSRequestSchema, WSWhitelistMessage) from freqtrade.rpc.rpc import RPC @@ -102,13 +102,11 @@ async def message_endpoint( Message WebSocket endpoint, facilitates sending RPC messages """ try: - if is_websocket_alive(ws): - # TODO: - # Return a channel ID, pass that instead of ws to the rest of the methods - channel = await channel_manager.on_connect(ws) + # TODO: + # Return a channel ID, pass that instead of ws to the rest of the methods + channel = await channel_manager.on_connect(ws) - if not channel: - return + if await is_websocket_alive(ws): logger.info(f"Consumer connected - {channel}") @@ -131,6 +129,9 @@ async def message_endpoint( # RuntimeError('Cannot call "send" once a closed message has been sent') await channel_manager.on_disconnect(ws) + else: + ws.close() + except Exception as e: logger.error(f"Failed to serve - {ws.client}") # Log tracebacks to keep track of what errors are happening diff --git a/freqtrade/rpc/api_server/ws/schema.py b/freqtrade/rpc/api_server/ws_schemas.py similarity index 92% rename from freqtrade/rpc/api_server/ws/schema.py rename to freqtrade/rpc/api_server/ws_schemas.py index 0baa8d233..255226d84 100644 --- a/freqtrade/rpc/api_server/ws/schema.py +++ b/freqtrade/rpc/api_server/ws_schemas.py @@ -2,15 +2,12 @@ from datetime import datetime from typing import Any, Dict, List, Optional from pandas import DataFrame -from pydantic import BaseModel, ValidationError +from pydantic import BaseModel from freqtrade.constants import PairWithTimeframe from freqtrade.enums.rpcmessagetype import RPCMessageType, RPCRequestType -__all__ = ('WSRequestSchema', 'WSMessageSchema', 'ValidationError') - - class BaseArbitraryModel(BaseModel): class Config: arbitrary_types_allowed = True diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 525f4282c..abeedb0a4 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -11,15 +11,16 @@ from threading import Thread from typing import TYPE_CHECKING, Any, Dict, List import websockets +from pydantic import ValidationError from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import RPCMessageType from freqtrade.misc import remove_entry_exit_signals from freqtrade.rpc.api_server.ws.channel import WebSocketChannel -from freqtrade.rpc.api_server.ws.schema import (ValidationError, WSAnalyzedDFMessage, - WSAnalyzedDFRequest, WSMessageSchema, - WSRequestSchema, WSSubscribeRequest, - WSWhitelistMessage, WSWhitelistRequest) +from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSAnalyzedDFRequest, + WSMessageSchema, WSRequestSchema, + WSSubscribeRequest, WSWhitelistMessage, + WSWhitelistRequest) if TYPE_CHECKING: diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index ccfe31424..de093b66f 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -56,8 +56,8 @@ def botclient(default_conf, mocker): apiserver.add_rpc_handler(rpc) yield ftbot, TestClient(apiserver.app) # Cleanup ... ? - apiserver.cleanup() finally: + apiserver.cleanup() ApiServer.shutdown() @@ -171,7 +171,7 @@ def test_api_ws_auth(botclient): url = f"/api/v1/message/ws?token={good_token}" with client.websocket_connect(url) as websocket: - websocket.send(1) + pass def test_api_unauthorized(botclient): @@ -1685,3 +1685,23 @@ def test_health(botclient): ret = rc.json() assert ret['last_process_ts'] == 0 assert ret['last_process'] == '1970-01-01T00:00:00+00:00' + + +def test_api_ws_subscribe(botclient, mocker): + ftbot, client = botclient + ws_url = f"/api/v1/message/ws?token={_TEST_WS_TOKEN}" + + sub_mock = mocker.patch( + 'freqtrade.rpc.api_server.ws.channel.WebSocketChannel.set_subscriptions', MagicMock()) + + with client.websocket_connect(ws_url) as ws: + ws.send_json({'type': 'subscribe', 'data': ['whitelist']}) + + # Check call count is now 1 as we sent a valid subscribe request + assert sub_mock.call_count == 1 + + with client.websocket_connect(ws_url) as ws: + ws.send_json({'type': 'subscribe', 'data': 'whitelist'}) + + # Call count hasn't changed as the subscribe request was invalid + assert sub_mock.call_count == 1 From c9d4f666c5fa95e4671ea0a4258abf9ff69b7386 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 14:00:22 -0600 Subject: [PATCH 184/437] minor apiserver test change --- tests/rpc/test_rpc_apiserver.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index de093b66f..6a37e7cdd 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -51,13 +51,15 @@ def botclient(default_conf, mocker): ftbot = get_patched_freqtradebot(mocker, default_conf) rpc = RPC(ftbot) mocker.patch('freqtrade.rpc.api_server.ApiServer.start_api', MagicMock()) + apiserver = None try: apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(rpc) yield ftbot, TestClient(apiserver.app) # Cleanup ... ? finally: - apiserver.cleanup() + if apiserver: + apiserver.cleanup() ApiServer.shutdown() From bc7295579ff89387a402a6255ff5acfa9c583231 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Thu, 8 Sep 2022 22:22:50 +0200 Subject: [PATCH 185/437] improve docs, make example strat hyperoptable --- docs/freqai.md | 22 ++++++++++++-- freqtrade/templates/FreqaiExampleStrategy.py | 31 +++++++++++++------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/docs/freqai.md b/docs/freqai.md index 006fe1393..92e019dfe 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -538,12 +538,28 @@ for each pair, for each backtesting window within the expanded `--timerange`. ### Hyperopt -The [Hyperopt](hyperopt.md) module can be executed with some restrictions: +Users can hyperopt using the same command as typical [hyperopt](hyperopt.md): + +```bash +freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507 +``` + +Users need to have the data pre-downloaded in the same fashion as if they were doing a FreqAI [backtest](#backtesting). In addition, users must consider some restrictions when trying to [Hyperopt](hyperopt.md) FreqAI strategies: - The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI. - It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md#running-hyperopt-with-smaller-search-space). -- The [Backtesting](#backtesting) instructions also apply apply to Hyperopt. - +- The [Backtesting](#backtesting) instructions also apply to Hyperopt. + +The best method for combining hyperopt and FreqAI is to focus on hyperopting entry/exit thresholds/criteria. Users need to focus on hyperopting parameters that are not used in their FreqAI features. For example, users should not try to hyperopt rolling window lengths in their feature creation, or any of their FreqAI config which changes predictions. In order to efficiently hyperopt the FreqAI strategy, FreqAI stores predictions as dataframes and reuses them. Hence the requirement to hyperopt entry/exit thresholds/criteria only. + +A good example of a hyperoptable parameter in FreqAI is a value for `DI_values` beyond which we consider outliers and below which we consider inliers: + +```python +di_max = IntParameter(low=1, high=20, default=10, space='buy', optimize=True, load=True) +dataframe['outlier'] = np.where(dataframe['DI_values'] > self.di_max.value/10, 1, 0) +``` + +Which would help the user understand the appropriate Dissimilarity Index values for their particular parameter space. ### Deciding the size of the sliding training window and backtesting duration diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 78132b06d..8b8e03af7 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -6,7 +6,7 @@ import talib.abstract as ta from pandas import DataFrame from technical import qtpylib -from freqtrade.strategy import IStrategy, merge_informative_pair +from freqtrade.strategy import IStrategy, merge_informative_pair, CategoricalParameter logger = logging.getLogger(__name__) @@ -29,9 +29,6 @@ class FreqaiExampleStrategy(IStrategy): "main_plot": {}, "subplots": { "prediction": {"prediction": {"color": "blue"}}, - "target_roi": { - "target_roi": {"color": "brown"}, - }, "do_predict": { "do_predict": {"color": "brown"}, }, @@ -45,6 +42,11 @@ class FreqaiExampleStrategy(IStrategy): startup_candle_count: int = 40 can_short = False + std_dev_multiplier_buy = CategoricalParameter( + [0.75, 1, 1.25, 1.5, 1.75], default=1.25, space="buy", optimize=True) + std_dev_multiplier_sell = CategoricalParameter( + [0.1, 0.25, 0.4], space="sell", default=0.2, optimize=True) + def informative_pairs(self): whitelist_pairs = self.dp.current_whitelist() corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] @@ -182,21 +184,26 @@ class FreqaiExampleStrategy(IStrategy): # `populate_any_indicators()` for each training period. dataframe = self.freqai.start(dataframe, metadata, self) - - dataframe["target_roi"] = dataframe["&-s_close_mean"] + dataframe["&-s_close_std"] * 1.25 - dataframe["sell_roi"] = dataframe["&-s_close_mean"] - dataframe["&-s_close_std"] * 1.25 + for val in self.std_dev_multiplier_buy.range: + dataframe[f'target_roi_{val}'] = dataframe["&-s_close_mean"] + \ + dataframe["&-s_close_std"] * val + for val in self.std_dev_multiplier_sell.range: + dataframe[f'sell_roi_{val}'] = dataframe["&-s_close_mean"] - \ + dataframe["&-s_close_std"] * val return dataframe def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: - enter_long_conditions = [df["do_predict"] == 1, df["&-s_close"] > df["target_roi"]] + enter_long_conditions = [df["do_predict"] == 1, df["&-s_close"] + > df[f"target_roi_{self.std_dev_multiplier_buy.value}"]] if enter_long_conditions: df.loc[ reduce(lambda x, y: x & y, enter_long_conditions), ["enter_long", "enter_tag"] ] = (1, "long") - enter_short_conditions = [df["do_predict"] == 1, df["&-s_close"] < df["sell_roi"]] + enter_short_conditions = [df["do_predict"] == 1, df["&-s_close"] + < df[f"sell_roi_{self.std_dev_multiplier_sell.value}"]] if enter_short_conditions: df.loc[ @@ -206,11 +213,13 @@ class FreqaiExampleStrategy(IStrategy): return df def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame: - exit_long_conditions = [df["do_predict"] == 1, df["&-s_close"] < df["sell_roi"] * 0.25] + exit_long_conditions = [df["do_predict"] == 1, df["&-s_close"] < + df[f"sell_roi_{self.std_dev_multiplier_sell.value}"] * 0.25] if exit_long_conditions: df.loc[reduce(lambda x, y: x & y, exit_long_conditions), "exit_long"] = 1 - exit_short_conditions = [df["do_predict"] == 1, df["&-s_close"] > df["target_roi"] * 0.25] + exit_short_conditions = [df["do_predict"] == 1, df["&-s_close"] > + df[f"target_roi_{self.std_dev_multiplier_buy.value}"] * 0.25] if exit_short_conditions: df.loc[reduce(lambda x, y: x & y, exit_short_conditions), "exit_short"] = 1 From c5d918075881f62277f21854fdbd85fd94335024 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Thu, 8 Sep 2022 22:35:52 +0200 Subject: [PATCH 186/437] isort --- freqtrade/templates/FreqaiExampleStrategy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 8b8e03af7..991792eb9 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -6,7 +6,7 @@ import talib.abstract as ta from pandas import DataFrame from technical import qtpylib -from freqtrade.strategy import IStrategy, merge_informative_pair, CategoricalParameter +from freqtrade.strategy import CategoricalParameter, IStrategy, merge_informative_pair logger = logging.getLogger(__name__) From 75cf8dbfe428eb2e3874638cf8ae262bda2768bf Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 15:11:36 -0600 Subject: [PATCH 187/437] missed await --- freqtrade/rpc/api_server/api_ws.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index f6eb59f87..16d5ef9a7 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -130,7 +130,7 @@ async def message_endpoint( await channel_manager.on_disconnect(ws) else: - ws.close() + await ws.close() except Exception as e: logger.error(f"Failed to serve - {ws.client}") From 1466d2d26f5cb90fdc1e6343c8fb604f2a0ca657 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 16:27:09 -0600 Subject: [PATCH 188/437] initial message ws docs --- docs/rest-api.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/docs/rest-api.md b/docs/rest-api.md index cc82aadda..5dc7637e5 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -31,7 +31,8 @@ Sample configuration: "jwt_secret_key": "somethingrandom", "CORS_origins": [], "username": "Freqtrader", - "password": "SuperSecret1!" + "password": "SuperSecret1!", + "ws_token": "sercet_Ws_t0ken" }, ``` @@ -66,7 +67,7 @@ secrets.token_hex() !!! Danger "Password selection" Please make sure to select a very strong, unique password to protect your bot from unauthorized access. - Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!). + Also change `jwt_secret_key` to something random (no need to remember this, but it'll be used to encrypt your session, so it better be something unique!). ### Configuration with docker @@ -274,7 +275,7 @@ reload_config Reload configuration. show_config - + Returns part of the configuration, relevant for trading operations. start @@ -322,6 +323,70 @@ whitelist ``` +### Message WebSocket + +The API Server makes available a websocket endpoint for subscribing to RPC messages +from the FreqTrade Bot. This can be used to consume real-time data from your bot, such as entry/exit fill messages, whitelist changes, populated indicators for pairs, and more. + +Assuming your rest API is set to `127.0.0.1` on port `8080`, the endpoint is available at `http://localhost:8080/api/v1/message/ws`. + +To access the websocket endpoint, the `ws_token` is required as a query parameter in the endpoint URL. This is set in your rest API config section. To generate a safe `ws_token` you can run the following code: + +``` python +>>> import secrets +>>> secrets.token_urlsafe(16) +'zs9XYCbTPKvux46UJckflw' +``` + +You could then connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=zs9XYCbTPKvux46UJckflw`. + +!!! warning "Warning" + + Please do not use the above example token. To make sure you are secure, generate a completely new token. + + +#### Using the WebSocket + +Once connected to the WebSocket, the bot will broadcast RPC messages to anyone who is subscribed to them. To subscribe to a message, you must first subscribe to the message types. This can be done by sending a JSON request through the WebSocket: + +``` json +{ + "type": "subscribe", + "data": ["whitelist", "analyzed_df"] // A list of string message types +} +``` + +#### Message types + +| Message Type | Description | +|--------------|-------------| +| whitelist | The list of pairs in the bot's whitelist. +| analyzed_df | The dataframe and last_analyzed datetime for a pair. +| entry | Trade has signaled an entry +| entry_fill | Trade enter has filled +| entry_cancel | Trade enter has been canceled +| exit | Trade has signaled an exit +| exit_fill | Trade exit has filled +| exit_cancel | Trade exit has been canceled +| protection_trigger | A protection has triggered for a pair +| protection_trigger_global | A protection has triggered for a pair +| status | A bot's status change +| startup | Startup messages +| warning | Any warnings + +Now anytime those types of RPC messages are sent in the bot, you will receive them through the WebSocket as long as the connection is active. They typically take the same form as the request: + +``` json +{ + "type": "analyzed_df", + "data": { + "key": ["NEO/BTC", "5m", "spot"], + "df": {}, // The dataframe + "la": "2022-09-08 22:14:41.457786+00:00" + } +} +``` + ### OpenAPI interface To enable the builtin openAPI interface (Swagger UI), specify `"enable_openapi": true` in the api_server configuration. From 46cd0ce9948e6d753a4a19b26ff8797d86bcca2c Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Thu, 8 Sep 2022 16:30:31 -0600 Subject: [PATCH 189/437] fix sentence in docs --- docs/rest-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rest-api.md b/docs/rest-api.md index 5dc7637e5..f4ac2c350 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -347,7 +347,7 @@ You could then connect to the endpoint at `http://localhost:8080/api/v1/message/ #### Using the WebSocket -Once connected to the WebSocket, the bot will broadcast RPC messages to anyone who is subscribed to them. To subscribe to a message, you must first subscribe to the message types. This can be done by sending a JSON request through the WebSocket: +Once connected to the WebSocket, the bot will broadcast RPC messages to anyone who is subscribed to them. To subscribe to a list of messages, you must send a JSON request through the WebSocket like the one below. The `data` key must be a list of message type strings. ``` json { From 92d71ebdb730c16bcab4eb61e3516ea7a58e4825 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Sep 2022 03:03:30 +0000 Subject: [PATCH 190/437] Bump python from 3.10.6-slim-bullseye to 3.10.7-slim-bullseye Bumps python from 3.10.6-slim-bullseye to 3.10.7-slim-bullseye. --- updated-dependencies: - dependency-name: python dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index e84a4d095..b3e5d5e88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10.6-slim-bullseye as base +FROM python:3.10.7-slim-bullseye as base # Setup env ENV LANG C.UTF-8 From e256ebd7271bf138a381108cb237ab574947d025 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 9 Sep 2022 07:13:05 +0200 Subject: [PATCH 191/437] Add ws_token to auto-generated config --- freqtrade/commands/build_config_commands.py | 1 + freqtrade/enums/rpcmessagetype.py | 1 - freqtrade/rpc/rpc.py | 4 ++-- freqtrade/templates/base_config.json.j2 | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/freqtrade/commands/build_config_commands.py b/freqtrade/commands/build_config_commands.py index 01cfa800a..1abd26328 100644 --- a/freqtrade/commands/build_config_commands.py +++ b/freqtrade/commands/build_config_commands.py @@ -211,6 +211,7 @@ def ask_user_config() -> Dict[str, Any]: ) # Force JWT token to be a random string answers['api_server_jwt_key'] = secrets.token_hex() + answers['api_server_ws_token'] = secrets.token_urlsafe(25) return answers diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 929f6d083..fae121a09 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -1,7 +1,6 @@ from enum import Enum -# We need to inherit from str so we can use as a str class RPCMessageType(str, Enum): STATUS = 'status' WARNING = 'warning' diff --git a/freqtrade/rpc/rpc.py b/freqtrade/rpc/rpc.py index 9821bc001..943c1c667 100644 --- a/freqtrade/rpc/rpc.py +++ b/freqtrade/rpc/rpc.py @@ -1086,7 +1086,7 @@ class RPC: """ Whitelist data for WebSocket """ return self._freqtrade.active_pair_whitelist - @ staticmethod + @staticmethod def _rpc_analysed_history_full(config, pair: str, timeframe: str, timerange: str, exchange) -> Dict[str, Any]: timerange_parsed = TimeRange.parse_timerange(timerange) @@ -1117,7 +1117,7 @@ class RPC: self._freqtrade.strategy.plot_config['subplots'] = {} return self._freqtrade.strategy.plot_config - @ staticmethod + @staticmethod def _rpc_sysinfo() -> Dict[str, Any]: return { "cpu_pct": psutil.cpu_percent(interval=1, percpu=True), diff --git a/freqtrade/templates/base_config.json.j2 b/freqtrade/templates/base_config.json.j2 index 681af84c6..299734a50 100644 --- a/freqtrade/templates/base_config.json.j2 +++ b/freqtrade/templates/base_config.json.j2 @@ -67,6 +67,7 @@ "verbosity": "error", "enable_openapi": false, "jwt_secret_key": "{{ api_server_jwt_key }}", + "ws_token": "{{ api_server_ws_token }}", "CORS_origins": [], "username": "{{ api_server_username }}", "password": "{{ api_server_password }}" From 426f8f37e9f45a8dc7df3bce11b1a0b3ace6c5b3 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 10:45:49 -0600 Subject: [PATCH 192/437] change var names --- freqtrade/constants.py | 2 +- freqtrade/rpc/api_server/webserver.py | 52 +++++++++++----------- freqtrade/rpc/external_message_consumer.py | 8 ++-- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 2279acc13..e77940b3c 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -502,7 +502,7 @@ CONF_SCHEMA = { 'required': ['name', 'url', 'ws_token'] } }, - 'reply_timeout': {'type': 'integer'}, + 'wait_timeout': {'type': 'integer'}, 'sleep_time': {'type': 'integer'}, 'ping_timeout': {'type': 'integer'}, 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False}, diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 73e80dd48..557857ecc 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -49,9 +49,9 @@ class ApiServer(RPCHandler): # Exchange - only available in webserver mode. _exchange = None # websocket message queue stuff - _channel_manager = None - _thread = None - _loop = None + _ws_channel_manager = None + _ws_thread = None + _ws_loop = None def __new__(cls, *args, **kwargs): """ @@ -69,14 +69,14 @@ class ApiServer(RPCHandler): return self._standalone: bool = standalone self._server = None - self._queue = None - self._background_task = None + self._ws_queue = None + self._ws_background_task = None ApiServer.__initialized = True api_config = self._config['api_server'] - ApiServer._channel_manager = ChannelManager() + ApiServer._ws_channel_manager = ChannelManager() self.app = FastAPI(title="Freqtrade API", docs_url='/docs' if api_config.get('enable_openapi', False) else None, @@ -105,18 +105,18 @@ class ApiServer(RPCHandler): logger.info("Stopping API Server") self._server.cleanup() - if self._thread and self._loop: + if self._ws_thread and self._ws_loop: logger.info("Stopping API Server background tasks") - if self._background_task: + if self._ws_background_task: # Cancel the queue task - self._background_task.cancel() + self._ws_background_task.cancel() - self._thread.join() + self._ws_thread.join() - self._thread = None - self._loop = None - self._background_task = None + self._ws_thread = None + self._ws_loop = None + self._ws_background_task = None @classmethod def shutdown(cls): @@ -127,8 +127,8 @@ class ApiServer(RPCHandler): cls._rpc = None def send_msg(self, msg: Dict[str, str]) -> None: - if self._queue: - sync_q = self._queue.sync_q + if self._ws_queue: + sync_q = self._ws_queue.sync_q sync_q.put(msg) def handle_rpc_exception(self, request, exc): @@ -170,24 +170,24 @@ class ApiServer(RPCHandler): app.add_exception_handler(RPCException, self.handle_rpc_exception) def start_message_queue(self): - if self._thread: + if self._ws_thread: return # Create a new loop, as it'll be just for the background thread - self._loop = asyncio.new_event_loop() + self._ws_loop = asyncio.new_event_loop() # Start the thread - self._thread = Thread(target=self._loop.run_forever) - self._thread.start() + self._ws_thread = Thread(target=self._ws_loop.run_forever) + self._ws_thread.start() # Finally, submit the coro to the thread - self._background_task = asyncio.run_coroutine_threadsafe( - self._broadcast_queue_data(), loop=self._loop) + self._ws_background_task = asyncio.run_coroutine_threadsafe( + self._broadcast_queue_data(), loop=self._ws_loop) async def _broadcast_queue_data(self): # Instantiate the queue in this coroutine so it's attached to our loop - self._queue = ThreadedQueue() - async_queue = self._queue.async_q + self._ws_queue = ThreadedQueue() + async_queue = self._ws_queue.async_q try: while True: @@ -196,13 +196,13 @@ class ApiServer(RPCHandler): message = await async_queue.get() logger.debug(f"Found message of type: {message.get('type')}") # Broadcast it - await self._channel_manager.broadcast(message) + await self._ws_channel_manager.broadcast(message) # Sleep, make this configurable? await asyncio.sleep(0.1) except asyncio.CancelledError: # Disconnect channels and stop the loop on cancel - await self._channel_manager.disconnect_all() - self._loop.stop() + await self._ws_channel_manager.disconnect_all() + self._ws_loop.stop() # For testing, shouldn't happen when stable except Exception as e: diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index abeedb0a4..1c2a27617 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -59,9 +59,9 @@ class ExternalMessageConsumer: if self.enabled and len(self.producers) < 1: raise ValueError("You must specify at least 1 Producer to connect to.") - self.reply_timeout = self._emc_config.get('reply_timeout', 30) - self.ping_timeout = self._emc_config.get('ping_timeout', 5) - self.sleep_time = self._emc_config.get('sleep_time', 10) + self.wait_timeout = self._emc_config.get('wait_timeout', 300) # in seconds + self.ping_timeout = self._emc_config.get('ping_timeout', 10) # in seconds + self.sleep_time = self._emc_config.get('sleep_time', 10) # in seconds # The amount of candles per dataframe on the initial request self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 1500) @@ -220,7 +220,7 @@ class ExternalMessageConsumer: try: message = await asyncio.wait_for( channel.recv(), - timeout=self.reply_timeout + timeout=self.wait_timeout ) try: From 445ab1beeed411531dbe2ba27cba7c026c83949a Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 10:56:54 -0600 Subject: [PATCH 193/437] update docs --- docs/rest-api.md | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/docs/rest-api.md b/docs/rest-api.md index f4ac2c350..485fca6b5 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -330,15 +330,36 @@ from the FreqTrade Bot. This can be used to consume real-time data from your bot Assuming your rest API is set to `127.0.0.1` on port `8080`, the endpoint is available at `http://localhost:8080/api/v1/message/ws`. -To access the websocket endpoint, the `ws_token` is required as a query parameter in the endpoint URL. This is set in your rest API config section. To generate a safe `ws_token` you can run the following code: +To access the websocket endpoint, the `ws_token` is required as a query parameter in the endpoint URL. + + + To generate a safe `ws_token` you can run the following code: ``` python >>> import secrets ->>> secrets.token_urlsafe(16) -'zs9XYCbTPKvux46UJckflw' +>>> secrets.token_urlsafe(25) +'hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q' ``` -You could then connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=zs9XYCbTPKvux46UJckflw`. + +You would then add that token under `ws_token` in your `api_server` config. Like so: + +``` json +"api_server": { + "enabled": true, + "listen_ip_address": "127.0.0.1", + "listen_port": 8080, + "verbosity": "error", + "enable_openapi": false, + "jwt_secret_key": "somethingrandom", + "CORS_origins": [], + "username": "Freqtrader", + "password": "SuperSecret1!", + "ws_token": "hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q" // <----- +}, +``` + +You could then connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q`. !!! warning "Warning" @@ -355,24 +376,7 @@ Once connected to the WebSocket, the bot will broadcast RPC messages to anyone w "data": ["whitelist", "analyzed_df"] // A list of string message types } ``` - -#### Message types - -| Message Type | Description | -|--------------|-------------| -| whitelist | The list of pairs in the bot's whitelist. -| analyzed_df | The dataframe and last_analyzed datetime for a pair. -| entry | Trade has signaled an entry -| entry_fill | Trade enter has filled -| entry_cancel | Trade enter has been canceled -| exit | Trade has signaled an exit -| exit_fill | Trade exit has filled -| exit_cancel | Trade exit has been canceled -| protection_trigger | A protection has triggered for a pair -| protection_trigger_global | A protection has triggered for a pair -| status | A bot's status change -| startup | Startup messages -| warning | Any warnings +For a list of message types, please refer to the RPCMessageType enum in `freqtrade/enums/rpcmessagetype.py` Now anytime those types of RPC messages are sent in the bot, you will receive them through the WebSocket as long as the connection is active. They typically take the same form as the request: From ad9659769331c718098f2ee8acc17c0fbf3ebca0 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 10:59:38 -0600 Subject: [PATCH 194/437] wording --- docs/rest-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rest-api.md b/docs/rest-api.md index 485fca6b5..704f38f00 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -359,7 +359,7 @@ You would then add that token under `ws_token` in your `api_server` config. Like }, ``` -You could then connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q`. +You can now connect to the endpoint at `http://localhost:8080/api/v1/message/ws?token=hZ-y58LXyX_HZ8O1cJzVyN6ePWrLpNQv4Q`. !!! warning "Warning" From d38cc061396d615832833fcbc880be5bdced8459 Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Wed, 7 Sep 2022 18:52:58 -0300 Subject: [PATCH 195/437] Fix freqai backtesting time range issue --- freqtrade/freqai/data_kitchen.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 7670cfd45..01b2f1f3b 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -461,6 +461,20 @@ class FreqaiDataKitchen: return df + def remove_training_from_backtesting( + self + ) -> DataFrame: + """ + Function which takes the backtesting time range and + remove training data from dataframe + """ + tr = self.config["timerange"] + backtesting_timerange = TimeRange.parse_timerange(tr) + start = datetime.fromtimestamp(backtesting_timerange.startts, tz=timezone.utc) + df = self.return_dataframe + df = df.loc[df["date"] >= start, :] + return df + def principal_component_analysis(self) -> None: """ Performs Principal Component Analysis on the data for dimensionality reduction @@ -954,6 +968,7 @@ class FreqaiDataKitchen: to_keep = [col for col in dataframe.columns if not col.startswith("&")] self.return_dataframe = pd.concat([dataframe[to_keep], self.full_df], axis=1) + self.return_dataframe = self.remove_training_from_backtesting() self.full_df = DataFrame() return From 09679cc79814d7921280846f1291d169ffe23b97 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 11:27:20 -0600 Subject: [PATCH 196/437] fix dependency --- freqtrade/rpc/api_server/deps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/rpc/api_server/deps.py b/freqtrade/rpc/api_server/deps.py index 360771d77..abd3db036 100644 --- a/freqtrade/rpc/api_server/deps.py +++ b/freqtrade/rpc/api_server/deps.py @@ -42,7 +42,7 @@ def get_exchange(config=Depends(get_config)): def get_channel_manager(): - return ApiServer._channel_manager + return ApiServer._ws_channel_manager def is_webserver_mode(config=Depends(get_config)): From 1b6410d7d1e20d4ede790ac46d4232d8cddaa181 Mon Sep 17 00:00:00 2001 From: Emre Date: Thu, 8 Sep 2022 14:12:19 +0300 Subject: [PATCH 197/437] Add XGBoostRegressor for freqAI, fix mypy errors --- .../prediction_models/BaseClassifierModel.py | 8 ++-- .../prediction_models/BaseRegressionModel.py | 8 ++-- .../prediction_models/BaseTensorFlowModel.py | 2 +- .../prediction_models/XGBoostRegressor.py | 46 +++++++++++++++++++ requirements-freqai.txt | 1 + tests/freqai/test_freqai_interface.py | 31 +++++++++++++ 6 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 freqtrade/freqai/prediction_models/XGBoostRegressor.py diff --git a/freqtrade/freqai/prediction_models/BaseClassifierModel.py b/freqtrade/freqai/prediction_models/BaseClassifierModel.py index e51e26e0f..291bacc82 100644 --- a/freqtrade/freqai/prediction_models/BaseClassifierModel.py +++ b/freqtrade/freqai/prediction_models/BaseClassifierModel.py @@ -21,7 +21,7 @@ class BaseClassifierModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen + self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen @@ -68,7 +68,7 @@ class BaseClassifierModel(IFreqaiModel): return model def predict( - self, unfiltered_dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False + self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False, **kwargs ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: """ Filter the prediction features data and predict with it. @@ -79,9 +79,9 @@ class BaseClassifierModel(IFreqaiModel): data (NaNs) or felt uncertain about data (PCA and DI index) """ - dk.find_features(unfiltered_dataframe) + dk.find_features(dataframe) filtered_dataframe, _ = dk.filter_features( - unfiltered_dataframe, dk.training_features_list, training_filter=False + dataframe, dk.training_features_list, training_filter=False ) filtered_dataframe = dk.normalize_data_from_metadata(filtered_dataframe) dk.data_dictionary["prediction_features"] = filtered_dataframe diff --git a/freqtrade/freqai/prediction_models/BaseRegressionModel.py b/freqtrade/freqai/prediction_models/BaseRegressionModel.py index 45f0c2937..da6fba571 100644 --- a/freqtrade/freqai/prediction_models/BaseRegressionModel.py +++ b/freqtrade/freqai/prediction_models/BaseRegressionModel.py @@ -20,7 +20,7 @@ class BaseRegressionModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen + self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen @@ -67,7 +67,7 @@ class BaseRegressionModel(IFreqaiModel): return model def predict( - self, unfiltered_dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False + self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False, **kwargs ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: """ Filter the prediction features data and predict with it. @@ -78,9 +78,9 @@ class BaseRegressionModel(IFreqaiModel): data (NaNs) or felt uncertain about data (PCA and DI index) """ - dk.find_features(unfiltered_dataframe) + dk.find_features(dataframe) filtered_dataframe, _ = dk.filter_features( - unfiltered_dataframe, dk.training_features_list, training_filter=False + dataframe, dk.training_features_list, training_filter=False ) filtered_dataframe = dk.normalize_data_from_metadata(filtered_dataframe) dk.data_dictionary["prediction_features"] = filtered_dataframe diff --git a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py index 66e6ec1fc..6fb49239b 100644 --- a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py +++ b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py @@ -17,7 +17,7 @@ class BaseTensorFlowModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen + self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressor.py b/freqtrade/freqai/prediction_models/XGBoostRegressor.py new file mode 100644 index 000000000..a8f250d16 --- /dev/null +++ b/freqtrade/freqai/prediction_models/XGBoostRegressor.py @@ -0,0 +1,46 @@ +import logging +from typing import Any, Dict + +import xgboost as xgb + +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel + + +logger = logging.getLogger(__name__) + + +class XGBoostRegressor(BaseRegressionModel): + """ + User created prediction model. The class needs to override three necessary + functions, predict(), train(), fit(). The class inherits ModelHandler which + has its own DataHandler where data is held, saved, loaded, and managed. + """ + + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: + """ + User sets up the training and test data to fit their desired model here + :param data_dictionary: the dictionary constructed by DataHandler to hold + all the training and test data/labels. + """ + + xgb.set_config(verbosity=2) + xgb.config_context(verbosity=2) + + X = data_dictionary["train_features"] + y = data_dictionary["train_labels"] + + if self.freqai_info.get("data_split_parameters", {}).get("test_size", 0.1) == 0: + eval_set = None + else: + eval_set = [(data_dictionary["test_features"], data_dictionary["test_labels"])] + + sample_weight = data_dictionary["train_weights"] + + xgb_model = self.get_init_model(dk.pair) + + model = xgb.XGBRegressor(**self.model_training_parameters) + + model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set, xgb_model=xgb_model) + + return model diff --git a/requirements-freqai.txt b/requirements-freqai.txt index 26e4617af..e8d950382 100644 --- a/requirements-freqai.txt +++ b/requirements-freqai.txt @@ -6,3 +6,4 @@ scikit-learn==1.1.2 joblib==1.1.0 catboost==1.0.6; platform_machine != 'aarch64' lightgbm==3.3.2 +xgboost==1.6.2 diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 5441b3c24..7783c00e7 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -172,6 +172,37 @@ def test_train_model_in_series_LightGBMClassifier(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) +def test_train_model_in_series_XGBoostRegressor(mocker, freqai_conf): + freqai_conf.update({"timerange": "20180110-20180130"}) + freqai_conf.update({"freqaimodel": "XGBoostRegressor"}) + freqai_conf.update({"strategy": "freqai_test_strat"}) + + strategy = get_patched_freqai_strategy(mocker, freqai_conf) + exchange = get_patched_exchange(mocker, freqai_conf) + strategy.dp = DataProvider(freqai_conf, exchange) + strategy.freqai_info = freqai_conf.get("freqai", {}) + freqai = strategy.freqai + freqai.live = True + freqai.dk = FreqaiDataKitchen(freqai_conf) + timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(timerange, freqai.dk) + + freqai.dd.pair_dict = MagicMock() + + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + new_timerange = TimeRange.parse_timerange("20180120-20180130") + + freqai.train_model_in_series(new_timerange, "ADA/BTC", + strategy, freqai.dk, data_load_timerange) + + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").is_file() + + shutil.rmtree(Path(freqai.dk.full_path)) + + def test_start_backtesting(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180130"}) freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) From df6e43d2c599badef3247f8878cacec2a81f5f79 Mon Sep 17 00:00:00 2001 From: Emre Date: Fri, 9 Sep 2022 00:11:09 +0300 Subject: [PATCH 198/437] Add XGBoostRegressorMultiTarget class --- .../XGBoostRegressorMultiTarget.py | 43 +++++++++++++++++++ tests/freqai/test_freqai_interface.py | 31 +++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py new file mode 100644 index 000000000..5283501d1 --- /dev/null +++ b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py @@ -0,0 +1,43 @@ +import logging +from typing import Any, Dict + +from sklearn.multioutput import MultiOutputRegressor +from xgboost import XGBRegressor + +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen +from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel + + +logger = logging.getLogger(__name__) + + +class XGBoostRegressorMultiTarget(BaseRegressionModel): + """ + User created prediction model. The class needs to override three necessary + functions, predict(), train(), fit(). The class inherits ModelHandler which + has its own DataHandler where data is held, saved, loaded, and managed. + """ + + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: + """ + User sets up the training and test data to fit their desired model here + :param data_dictionary: the dictionary constructed by DataHandler to hold + all the training and test data/labels. + """ + + xgb = XGBRegressor(**self.model_training_parameters) + + X = data_dictionary["train_features"] + y = data_dictionary["train_labels"] + eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) + sample_weight = data_dictionary["train_weights"] + + if self.continual_learning: + logger.warning('Continual learning not supported for MultiTarget models') + + model = MultiOutputRegressor(estimator=xgb) + model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) + train_score = model.score(X, y) + test_score = model.score(*eval_set) + logger.info(f"Train score {train_score}, Test score {test_score}") + return model diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 7783c00e7..ff0eb24a9 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -203,6 +203,37 @@ def test_train_model_in_series_XGBoostRegressor(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) +def test_train_model_in_series_XGBoostRegressorMultiModel(mocker, freqai_conf): + freqai_conf.update({"timerange": "20180110-20180130"}) + freqai_conf.update({"freqaimodel": "XGBoostRegressorMultiTarget"}) + freqai_conf.update({"strategy": "freqai_test_multimodel_strat"}) + strategy = get_patched_freqai_strategy(mocker, freqai_conf) + exchange = get_patched_exchange(mocker, freqai_conf) + strategy.dp = DataProvider(freqai_conf, exchange) + strategy.freqai_info = freqai_conf.get("freqai", {}) + freqai = strategy.freqai + freqai.live = True + freqai.dk = FreqaiDataKitchen(freqai_conf) + timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(timerange, freqai.dk) + + freqai.dd.pair_dict = MagicMock() + + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + new_timerange = TimeRange.parse_timerange("20180120-20180130") + + freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + + assert len(freqai.dk.label_list) == 2 + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").is_file() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").is_file() + assert len(freqai.dk.data['training_features_list']) == 26 + + shutil.rmtree(Path(freqai.dk.full_path)) + + def test_start_backtesting(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180130"}) freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) From acb410a0defb4626b52879b56e3d4ab8824c1085 Mon Sep 17 00:00:00 2001 From: Emre Date: Fri, 9 Sep 2022 00:11:43 +0300 Subject: [PATCH 199/437] Remove verbosity params --- freqtrade/freqai/prediction_models/XGBoostRegressor.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressor.py b/freqtrade/freqai/prediction_models/XGBoostRegressor.py index a8f250d16..acc4386f5 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRegressor.py +++ b/freqtrade/freqai/prediction_models/XGBoostRegressor.py @@ -1,7 +1,7 @@ import logging from typing import Any, Dict -import xgboost as xgb +from xgboost import XGBRegressor from freqtrade.freqai.data_kitchen import FreqaiDataKitchen from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel @@ -24,9 +24,6 @@ class XGBoostRegressor(BaseRegressionModel): all the training and test data/labels. """ - xgb.set_config(verbosity=2) - xgb.config_context(verbosity=2) - X = data_dictionary["train_features"] y = data_dictionary["train_labels"] @@ -39,7 +36,7 @@ class XGBoostRegressor(BaseRegressionModel): xgb_model = self.get_init_model(dk.pair) - model = xgb.XGBRegressor(**self.model_training_parameters) + model = XGBRegressor(**self.model_training_parameters) model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set, xgb_model=xgb_model) From a826c0eb837af2f4f4b68660481e5c9f436caac7 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 9 Sep 2022 19:17:15 +0200 Subject: [PATCH 200/437] ensure signatures match, reduce verbosity --- freqtrade/freqai/freqai_interface.py | 8 +++--- .../prediction_models/BaseClassifierModel.py | 26 +++++++++---------- .../prediction_models/BaseRegressionModel.py | 26 +++++++++---------- .../prediction_models/BaseTensorFlowModel.py | 10 +++---- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 101df88ec..e4f77a9cf 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -673,12 +673,12 @@ class IFreqaiModel(ABC): # See freqai/prediction_models/CatboostPredictionModel.py for an example. @abstractmethod - def train(self, unfiltered_dataframe: DataFrame, pair: str, + def train(self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datahandler for storing, saving, loading, and analyzing the data. - :param unfiltered_dataframe: Full dataframe for the current training period + :param unfiltered_df: Full dataframe for the current training period :param metadata: pair metadata from strategy. :return: Trained model which can be used to inference (self.predict) """ @@ -697,11 +697,11 @@ class IFreqaiModel(ABC): @abstractmethod def predict( - self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = True, **kwargs + self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs ) -> Tuple[DataFrame, NDArray[np.int_]]: """ Filter the prediction features data and predict with it. - :param unfiltered_dataframe: Full dataframe for the current backtest period. + :param unfiltered_df: Full dataframe for the current backtest period. :param dk: FreqaiDataKitchen = Data management/analysis tool associated to present pair only :param first: boolean = whether this is the first prediction or not. :return: diff --git a/freqtrade/freqai/prediction_models/BaseClassifierModel.py b/freqtrade/freqai/prediction_models/BaseClassifierModel.py index 291bacc82..5142ffb0d 100644 --- a/freqtrade/freqai/prediction_models/BaseClassifierModel.py +++ b/freqtrade/freqai/prediction_models/BaseClassifierModel.py @@ -21,12 +21,12 @@ class BaseClassifierModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs + self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen for storing, saving, loading, and analyzing the data. - :param unfiltered_dataframe: Full dataframe for the current training period + :param unfiltered_df: Full dataframe for the current training period :param metadata: pair metadata from strategy. :return: :model: Trained model which can be used to inference (self.predict) @@ -36,14 +36,14 @@ class BaseClassifierModel(IFreqaiModel): # filter the features requested by user in the configuration file and elegantly handle NaNs features_filtered, labels_filtered = dk.filter_features( - unfiltered_dataframe, + unfiltered_df, dk.training_features_list, dk.label_list, training_filter=True, ) - start_date = unfiltered_dataframe["date"].iloc[0].strftime("%Y-%m-%d") - end_date = unfiltered_dataframe["date"].iloc[-1].strftime("%Y-%m-%d") + start_date = unfiltered_df["date"].iloc[0].strftime("%Y-%m-%d") + end_date = unfiltered_df["date"].iloc[-1].strftime("%Y-%m-%d") logger.info(f"-------------------- Training on data from {start_date} to " f"{end_date}--------------------") # split data into train/test data. @@ -68,25 +68,25 @@ class BaseClassifierModel(IFreqaiModel): return model def predict( - self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False, **kwargs + self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: """ Filter the prediction features data and predict with it. - :param: unfiltered_dataframe: Full dataframe for the current backtest period. + :param: unfiltered_df: Full dataframe for the current backtest period. :return: :pred_df: dataframe containing the predictions :do_predict: np.array of 1s and 0s to indicate places where freqai needed to remove data (NaNs) or felt uncertain about data (PCA and DI index) """ - dk.find_features(dataframe) - filtered_dataframe, _ = dk.filter_features( - dataframe, dk.training_features_list, training_filter=False + dk.find_features(unfiltered_df) + filtered_df, _ = dk.filter_features( + unfiltered_df, dk.training_features_list, training_filter=False ) - filtered_dataframe = dk.normalize_data_from_metadata(filtered_dataframe) - dk.data_dictionary["prediction_features"] = filtered_dataframe + filtered_df = dk.normalize_data_from_metadata(filtered_df) + dk.data_dictionary["prediction_features"] = filtered_df - self.data_cleaning_predict(dk, filtered_dataframe) + self.data_cleaning_predict(dk, filtered_df) predictions = self.model.predict(dk.data_dictionary["prediction_features"]) pred_df = DataFrame(predictions, columns=dk.label_list) diff --git a/freqtrade/freqai/prediction_models/BaseRegressionModel.py b/freqtrade/freqai/prediction_models/BaseRegressionModel.py index da6fba571..1d87e42c0 100644 --- a/freqtrade/freqai/prediction_models/BaseRegressionModel.py +++ b/freqtrade/freqai/prediction_models/BaseRegressionModel.py @@ -20,12 +20,12 @@ class BaseRegressionModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs + self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen for storing, saving, loading, and analyzing the data. - :param unfiltered_dataframe: Full dataframe for the current training period + :param unfiltered_df: Full dataframe for the current training period :param metadata: pair metadata from strategy. :return: :model: Trained model which can be used to inference (self.predict) @@ -35,14 +35,14 @@ class BaseRegressionModel(IFreqaiModel): # filter the features requested by user in the configuration file and elegantly handle NaNs features_filtered, labels_filtered = dk.filter_features( - unfiltered_dataframe, + unfiltered_df, dk.training_features_list, dk.label_list, training_filter=True, ) - start_date = unfiltered_dataframe["date"].iloc[0].strftime("%Y-%m-%d") - end_date = unfiltered_dataframe["date"].iloc[-1].strftime("%Y-%m-%d") + start_date = unfiltered_df["date"].iloc[0].strftime("%Y-%m-%d") + end_date = unfiltered_df["date"].iloc[-1].strftime("%Y-%m-%d") logger.info(f"-------------------- Training on data from {start_date} to " f"{end_date}--------------------") # split data into train/test data. @@ -67,26 +67,26 @@ class BaseRegressionModel(IFreqaiModel): return model def predict( - self, dataframe: DataFrame, dk: FreqaiDataKitchen, first: bool = False, **kwargs + self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: """ Filter the prediction features data and predict with it. - :param: unfiltered_dataframe: Full dataframe for the current backtest period. + :param: unfiltered_df: Full dataframe for the current backtest period. :return: :pred_df: dataframe containing the predictions :do_predict: np.array of 1s and 0s to indicate places where freqai needed to remove data (NaNs) or felt uncertain about data (PCA and DI index) """ - dk.find_features(dataframe) - filtered_dataframe, _ = dk.filter_features( - dataframe, dk.training_features_list, training_filter=False + dk.find_features(unfiltered_df) + filtered_df, _ = dk.filter_features( + unfiltered_df, dk.training_features_list, training_filter=False ) - filtered_dataframe = dk.normalize_data_from_metadata(filtered_dataframe) - dk.data_dictionary["prediction_features"] = filtered_dataframe + filtered_df = dk.normalize_data_from_metadata(filtered_df) + dk.data_dictionary["prediction_features"] = filtered_df # optional additional data cleaning/analysis - self.data_cleaning_predict(dk, filtered_dataframe) + self.data_cleaning_predict(dk, filtered_df) predictions = self.model.predict(dk.data_dictionary["prediction_features"]) pred_df = DataFrame(predictions, columns=dk.label_list) diff --git a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py index 6fb49239b..eea80f3a2 100644 --- a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py +++ b/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py @@ -17,12 +17,12 @@ class BaseTensorFlowModel(IFreqaiModel): """ def train( - self, unfiltered_dataframe: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs + self, unfiltered_df: DataFrame, pair: str, dk: FreqaiDataKitchen, **kwargs ) -> Any: """ Filter the training data and train a model to it. Train makes heavy use of the datakitchen for storing, saving, loading, and analyzing the data. - :param unfiltered_dataframe: Full dataframe for the current training period + :param unfiltered_df: Full dataframe for the current training period :param metadata: pair metadata from strategy. :return: :model: Trained model which can be used to inference (self.predict) @@ -32,14 +32,14 @@ class BaseTensorFlowModel(IFreqaiModel): # filter the features requested by user in the configuration file and elegantly handle NaNs features_filtered, labels_filtered = dk.filter_features( - unfiltered_dataframe, + unfiltered_df, dk.training_features_list, dk.label_list, training_filter=True, ) - start_date = unfiltered_dataframe["date"].iloc[0].strftime("%Y-%m-%d") - end_date = unfiltered_dataframe["date"].iloc[-1].strftime("%Y-%m-%d") + start_date = unfiltered_df["date"].iloc[0].strftime("%Y-%m-%d") + end_date = unfiltered_df["date"].iloc[-1].strftime("%Y-%m-%d") logger.info(f"-------------------- Training on data from {start_date} to " f"{end_date}--------------------") # split data into train/test data. From 6cbc03a96a6ca4234ec1ef06153927894ae38f35 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 11:38:42 -0600 Subject: [PATCH 201/437] support jwt token in place of ws token --- freqtrade/rpc/api_server/api_auth.py | 32 ++++++++++++++++++++-------- freqtrade/rpc/api_server/api_ws.py | 4 ++++ tests/rpc/test_rpc_apiserver.py | 12 ++++++----- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 0d1378b6d..a2b722f0a 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta from typing import Any, Dict, Union import jwt -from fastapi import APIRouter, Depends, HTTPException, WebSocket, status +from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, status from fastapi.security import OAuth2PasswordBearer from fastapi.security.http import HTTPBasic, HTTPBasicCredentials @@ -29,7 +29,8 @@ httpbasic = HTTPBasic(auto_error=False) oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False) -def get_user_from_token(token, secret_key: str, token_type: str = "access"): +def get_user_from_token(token, secret_key: str, token_type: str = "access", + raise_on_error: bool = True) -> Union[bool, str]: credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", @@ -39,12 +40,21 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access"): payload = jwt.decode(token, secret_key, algorithms=[ALGORITHM]) username: str = payload.get("identity", {}).get('u') if username is None: - raise credentials_exception + if raise_on_error: + raise credentials_exception + else: + return False if payload.get("type") != token_type: - raise credentials_exception + if raise_on_error: + raise credentials_exception + else: + return False except jwt.PyJWTError: - raise credentials_exception + if raise_on_error: + raise credentials_exception + else: + return False return username @@ -53,14 +63,18 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access"): # https://github.com/tiangolo/fastapi/blob/master/fastapi/security/api_key.py async def get_ws_token( ws: WebSocket, - token: Union[str, None] = None, + ws_token: Union[str, None] = Query(..., alias="token"), api_config: Dict[str, Any] = Depends(get_api_config) ): - secret_ws_token = api_config['ws_token'] + secret_ws_token = api_config.get('ws_token', 'secret_ws_t0ken.') + secret_jwt_key = api_config.get('jwt_secret_key', 'super-secret') - if token == secret_ws_token: + if secrets.compare_digest(secret_ws_token, ws_token): # Just return the token if it matches - return token + return ws_token + elif user := get_user_from_token(ws_token, secret_jwt_key, raise_on_error=False): + # If the token is a jwt, and it's valid return the user + return user else: logger.info("Denying websocket request") # If it doesn't match, close the websocket connection diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 16d5ef9a7..25d29a7ce 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -132,6 +132,10 @@ async def message_endpoint( else: await ws.close() + except RuntimeError: + # WebSocket was closed + await channel_manager.on_disconnect(ws) + except Exception as e: logger.error(f"Failed to serve - {ws.client}") # Log tracebacks to keep track of what errors are happening diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 6a37e7cdd..f1aa465f0 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -161,18 +161,20 @@ def test_api_auth(): def test_api_ws_auth(botclient): ftbot, client = botclient + def url(token): return f"/api/v1/message/ws?token={token}" bad_token = "bad-ws_token" - url = f"/api/v1/message/ws?token={bad_token}" - with pytest.raises(WebSocketDisconnect): - with client.websocket_connect(url) as websocket: + with client.websocket_connect(url(bad_token)) as websocket: websocket.receive() good_token = _TEST_WS_TOKEN - url = f"/api/v1/message/ws?token={good_token}" + with client.websocket_connect(url(good_token)) as websocket: + pass - with client.websocket_connect(url) as websocket: + jwt_secret = ftbot.config['api_server'].get('jwt_secret_key', 'super-secret') + jwt_token = create_token({'identity': {'u': 'Freqtrade'}}, jwt_secret) + with client.websocket_connect(url(jwt_token)) as websocket: pass From c13bec26d1b01a6173396dcf1f4daed9236eaad8 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 9 Sep 2022 19:41:28 +0200 Subject: [PATCH 202/437] add freqaimodel to hyperopt command --- docs/freqai.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/freqai.md b/docs/freqai.md index 92e019dfe..09a51c713 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -541,7 +541,7 @@ for each pair, for each backtesting window within the expanded `--timerange`. Users can hyperopt using the same command as typical [hyperopt](hyperopt.md): ```bash -freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507 +freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507 ``` Users need to have the data pre-downloaded in the same fashion as if they were doing a FreqAI [backtest](#backtesting). In addition, users must consider some restrictions when trying to [Hyperopt](hyperopt.md) FreqAI strategies: From 826eb8525470e8fa638f61247ed80e2f369493c5 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 11:58:30 -0600 Subject: [PATCH 203/437] update confige example --- config_examples/config_full.example.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config_examples/config_full.example.json b/config_examples/config_full.example.json index 37c604c72..d8d552814 100644 --- a/config_examples/config_full.example.json +++ b/config_examples/config_full.example.json @@ -173,7 +173,7 @@ "CORS_origins": [], "username": "freqtrader", "password": "SuperSecurePassword", - "ws_token": "a_secret_ws_token" + "ws_token": "secret_ws_t0ken." }, // The ExternalMessageConsumer config should only be enabled on an instance // that listens to outside data from another instance. This should not be enabled @@ -184,11 +184,11 @@ { "name": "default", "url": "ws://localhost:8081/api/v1/message/ws", - "ws_token": "a_secret_ws_token" + "ws_token": "secret_ws_t0ken." } ], - "reply_timeout": 30, - "ping_timeout": 5, + "poll_timeout": 300, + "ping_timeout": 10, "sleep_time": 10, "remove_entry_exit_signals": false }, From 37fcbeba580143179c9344021ba2b5ceea516902 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 9 Sep 2022 19:58:55 +0200 Subject: [PATCH 204/437] Update backtesting output wording to Entries --- docs/backtesting.md | 74 ++++++++++++------------- freqtrade/optimize/optimize_reports.py | 5 +- tests/optimize/test_optimize_reports.py | 24 ++++---- 3 files changed, 52 insertions(+), 51 deletions(-) diff --git a/docs/backtesting.md b/docs/backtesting.md index 8b2fdc345..f20a53d22 100644 --- a/docs/backtesting.md +++ b/docs/backtesting.md @@ -107,7 +107,7 @@ Strategy arguments: ## Test your strategy with Backtesting -Now you have good Buy and Sell strategies and some historic data, you want to test it against +Now you have good Entry and exit strategies and some historic data, you want to test it against real data. This is what we call [backtesting](https://en.wikipedia.org/wiki/Backtesting). Backtesting will use the crypto-currencies (pairs) from your config file and load historical candle (OHLCV) data from `user_data/data/` by default. @@ -215,7 +215,7 @@ Sometimes your account has certain fee rebates (fee reductions starting with a c To account for this in backtesting, you can use the `--fee` command line option to supply this value to backtesting. This fee must be a ratio, and will be applied twice (once for trade entry, and once for trade exit). -For example, if the buying and selling commission fee is 0.1% (i.e., 0.001 written as ratio), then you would run backtesting as the following: +For example, if the commission fee per order is 0.1% (i.e., 0.001 written as ratio), then you would run backtesting as the following: ```bash freqtrade backtesting --fee 0.001 @@ -252,41 +252,41 @@ The most important in the backtesting is to understand the result. A backtesting result will look like that: ``` -========================================================= BACKTESTING REPORT ========================================================== -| Pair | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins Draws Loss Win% | -|:---------|-------:|---------------:|---------------:|-----------------:|---------------:|:-------------|-------------------------:| -| ADA/BTC | 35 | -0.11 | -3.88 | -0.00019428 | -1.94 | 4:35:00 | 14 0 21 40.0 | -| ARK/BTC | 11 | -0.41 | -4.52 | -0.00022647 | -2.26 | 2:03:00 | 3 0 8 27.3 | -| BTS/BTC | 32 | 0.31 | 9.78 | 0.00048938 | 4.89 | 5:05:00 | 18 0 14 56.2 | -| DASH/BTC | 13 | -0.08 | -1.07 | -0.00005343 | -0.53 | 4:39:00 | 6 0 7 46.2 | -| ENG/BTC | 18 | 1.36 | 24.54 | 0.00122807 | 12.27 | 2:50:00 | 8 0 10 44.4 | -| EOS/BTC | 36 | 0.08 | 3.06 | 0.00015304 | 1.53 | 3:34:00 | 16 0 20 44.4 | -| ETC/BTC | 26 | 0.37 | 9.51 | 0.00047576 | 4.75 | 6:14:00 | 11 0 15 42.3 | -| ETH/BTC | 33 | 0.30 | 9.96 | 0.00049856 | 4.98 | 7:31:00 | 16 0 17 48.5 | -| IOTA/BTC | 32 | 0.03 | 1.09 | 0.00005444 | 0.54 | 3:12:00 | 14 0 18 43.8 | -| LSK/BTC | 15 | 1.75 | 26.26 | 0.00131413 | 13.13 | 2:58:00 | 6 0 9 40.0 | -| LTC/BTC | 32 | -0.04 | -1.38 | -0.00006886 | -0.69 | 4:49:00 | 11 0 21 34.4 | -| NANO/BTC | 17 | 1.26 | 21.39 | 0.00107058 | 10.70 | 1:55:00 | 10 0 7 58.5 | -| NEO/BTC | 23 | 0.82 | 18.97 | 0.00094936 | 9.48 | 2:59:00 | 10 0 13 43.5 | -| REQ/BTC | 9 | 1.17 | 10.54 | 0.00052734 | 5.27 | 3:47:00 | 4 0 5 44.4 | -| XLM/BTC | 16 | 1.22 | 19.54 | 0.00097800 | 9.77 | 3:15:00 | 7 0 9 43.8 | -| XMR/BTC | 23 | -0.18 | -4.13 | -0.00020696 | -2.07 | 5:30:00 | 12 0 11 52.2 | -| XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 0 23 34.3 | -| ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 0 15 31.8 | -| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 0 243 43.4 | +========================================================= BACKTESTING REPORT ========================================================= +| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins Draws Loss Win% | +|:---------|--------:|---------------:|---------------:|-----------------:|---------------:|:-------------|-------------------------:| +| ADA/BTC | 35 | -0.11 | -3.88 | -0.00019428 | -1.94 | 4:35:00 | 14 0 21 40.0 | +| ARK/BTC | 11 | -0.41 | -4.52 | -0.00022647 | -2.26 | 2:03:00 | 3 0 8 27.3 | +| BTS/BTC | 32 | 0.31 | 9.78 | 0.00048938 | 4.89 | 5:05:00 | 18 0 14 56.2 | +| DASH/BTC | 13 | -0.08 | -1.07 | -0.00005343 | -0.53 | 4:39:00 | 6 0 7 46.2 | +| ENG/BTC | 18 | 1.36 | 24.54 | 0.00122807 | 12.27 | 2:50:00 | 8 0 10 44.4 | +| EOS/BTC | 36 | 0.08 | 3.06 | 0.00015304 | 1.53 | 3:34:00 | 16 0 20 44.4 | +| ETC/BTC | 26 | 0.37 | 9.51 | 0.00047576 | 4.75 | 6:14:00 | 11 0 15 42.3 | +| ETH/BTC | 33 | 0.30 | 9.96 | 0.00049856 | 4.98 | 7:31:00 | 16 0 17 48.5 | +| IOTA/BTC | 32 | 0.03 | 1.09 | 0.00005444 | 0.54 | 3:12:00 | 14 0 18 43.8 | +| LSK/BTC | 15 | 1.75 | 26.26 | 0.00131413 | 13.13 | 2:58:00 | 6 0 9 40.0 | +| LTC/BTC | 32 | -0.04 | -1.38 | -0.00006886 | -0.69 | 4:49:00 | 11 0 21 34.4 | +| NANO/BTC | 17 | 1.26 | 21.39 | 0.00107058 | 10.70 | 1:55:00 | 10 0 7 58.5 | +| NEO/BTC | 23 | 0.82 | 18.97 | 0.00094936 | 9.48 | 2:59:00 | 10 0 13 43.5 | +| REQ/BTC | 9 | 1.17 | 10.54 | 0.00052734 | 5.27 | 3:47:00 | 4 0 5 44.4 | +| XLM/BTC | 16 | 1.22 | 19.54 | 0.00097800 | 9.77 | 3:15:00 | 7 0 9 43.8 | +| XMR/BTC | 23 | -0.18 | -4.13 | -0.00020696 | -2.07 | 5:30:00 | 12 0 11 52.2 | +| XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 0 23 34.3 | +| ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 0 15 31.8 | +| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 0 243 43.4 | ========================================================= EXIT REASON STATS ========================================================== -| Exit Reason | Sells | Wins | Draws | Losses | +| Exit Reason | Exits | Wins | Draws | Losses | |:-------------------|--------:|------:|-------:|--------:| | trailing_stop_loss | 205 | 150 | 0 | 55 | | stop_loss | 166 | 0 | 0 | 166 | | exit_signal | 56 | 36 | 0 | 20 | | force_exit | 2 | 0 | 0 | 2 | ====================================================== LEFT OPEN TRADES REPORT ====================================================== -| Pair | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Win Draw Loss Win% | -|:---------|-------:|---------------:|---------------:|-----------------:|---------------:|:---------------|--------------------:| -| ADA/BTC | 1 | 0.89 | 0.89 | 0.00004434 | 0.44 | 6:00:00 | 1 0 0 100 | -| LTC/BTC | 1 | 0.68 | 0.68 | 0.00003421 | 0.34 | 2:00:00 | 1 0 0 100 | -| TOTAL | 2 | 0.78 | 1.57 | 0.00007855 | 0.78 | 4:00:00 | 2 0 0 100 | +| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Win Draw Loss Win% | +|:---------|---------:|---------------:|---------------:|-----------------:|---------------:|:---------------|--------------------:| +| ADA/BTC | 1 | 0.89 | 0.89 | 0.00004434 | 0.44 | 6:00:00 | 1 0 0 100 | +| LTC/BTC | 1 | 0.68 | 0.68 | 0.00003421 | 0.34 | 2:00:00 | 1 0 0 100 | +| TOTAL | 2 | 0.78 | 1.57 | 0.00007855 | 0.78 | 4:00:00 | 2 0 0 100 | ================== SUMMARY METRICS ================== | Metric | Value | |-----------------------------+---------------------| @@ -356,7 +356,7 @@ The column `Avg Profit %` shows the average profit for all trades made while the The column `Tot Profit %` shows instead the total profit % in relation to the starting balance. In the above results, we have a starting balance of 0.01 BTC and an absolute profit of 0.00762792 BTC - so the `Tot Profit %` will be `(0.00762792 / 0.01) * 100 ~= 76.2%`. -Your strategy performance is influenced by your buy strategy, your exit strategy, and also by the `minimal_roi` and `stop_loss` you have set. +Your strategy performance is influenced by your entry strategy, your exit strategy, and also by the `minimal_roi` and `stop_loss` you have set. For example, if your `minimal_roi` is only `"0": 0.01` you cannot expect the bot to make more profit than 1% (because it will exit every time a trade reaches 1%). @@ -515,7 +515,7 @@ You can then load the trades to perform further analysis as shown in the [data a Since backtesting lacks some detailed information about what happens within a candle, it needs to take a few assumptions: - Exchange [trading limits](#trading-limits-in-backtesting) are respected -- Buys happen at open-price +- Entries happen at open-price - All orders are filled at the requested price (no slippage, no unfilled orders) - Exit-signal exits happen at open-price of the consecutive candle - Exit-signal is favored over Stoploss, because exit-signals are assumed to trigger on candle's open @@ -612,11 +612,11 @@ There will be an additional table comparing win/losses of the different strategi Detailed output for all strategies one after the other will be available, so make sure to scroll up to see the details per strategy. ``` -=========================================================== STRATEGY SUMMARY ========================================================================= -| Strategy | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins | Draws | Losses | Drawdown % | -|:------------|-------:|---------------:|---------------:|-----------------:|---------------:|:---------------|------:|-------:|-------:|-----------:| -| Strategy1 | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 0 | 243 | 45.2 | -| Strategy2 | 1487 | -0.13 | -197.58 | -0.00988917 | -98.79 | 4:43:00 | 662 | 0 | 825 | 241.68 | +=========================================================== STRATEGY SUMMARY =========================================================================== +| Strategy | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins | Draws | Losses | Drawdown % | +|:------------|---------:|---------------:|---------------:|-----------------:|---------------:|:---------------|------:|-------:|-------:|-----------:| +| Strategy1 | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 0 | 243 | 45.2 | +| Strategy2 | 1487 | -0.13 | -197.58 | -0.00988917 | -98.79 | 4:43:00 | 662 | 0 | 825 | 241.68 | ``` ## Next step diff --git a/freqtrade/optimize/optimize_reports.py b/freqtrade/optimize/optimize_reports.py index 519022db2..fa6c3f161 100644 --- a/freqtrade/optimize/optimize_reports.py +++ b/freqtrade/optimize/optimize_reports.py @@ -75,7 +75,8 @@ def _get_line_floatfmt(stake_currency: str) -> List[str]: '.2f', 'd', 's', 's'] -def _get_line_header(first_column: str, stake_currency: str, direction: str = 'Buys') -> List[str]: +def _get_line_header(first_column: str, stake_currency: str, + direction: str = 'Entries') -> List[str]: """ Generate header lines (goes in line with _generate_result_line()) """ @@ -642,7 +643,7 @@ def text_table_tags(tag_type: str, tag_results: List[Dict[str, Any]], stake_curr if (tag_type == "enter_tag"): headers = _get_line_header("TAG", stake_currency) else: - headers = _get_line_header("TAG", stake_currency, 'Sells') + headers = _get_line_header("TAG", stake_currency, 'Exits') floatfmt = _get_line_floatfmt(stake_currency) output = [ [ diff --git a/tests/optimize/test_optimize_reports.py b/tests/optimize/test_optimize_reports.py index 562e12820..5095f2fde 100644 --- a/tests/optimize/test_optimize_reports.py +++ b/tests/optimize/test_optimize_reports.py @@ -40,14 +40,14 @@ def test_text_table_bt_results(): ) result_str = ( - '| Pair | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC | Tot Profit % |' - ' Avg Duration | Win Draw Loss Win% |\n' - '|---------+--------+----------------+----------------+------------------+----------------+' - '----------------+-------------------------|\n' - '| ETH/BTC | 3 | 8.33 | 25.00 | 0.50000000 | 12.50 |' - ' 0:20:00 | 2 0 1 66.7 |\n' - '| TOTAL | 3 | 8.33 | 25.00 | 0.50000000 | 12.50 |' - ' 0:20:00 | 2 0 1 66.7 |' + '| Pair | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC | ' + 'Tot Profit % | Avg Duration | Win Draw Loss Win% |\n' + '|---------+-----------+----------------+----------------+------------------+' + '----------------+----------------+-------------------------|\n' + '| ETH/BTC | 3 | 8.33 | 25.00 | 0.50000000 | ' + '12.50 | 0:20:00 | 2 0 1 66.7 |\n' + '| TOTAL | 3 | 8.33 | 25.00 | 0.50000000 | ' + '12.50 | 0:20:00 | 2 0 1 66.7 |' ) pair_results = generate_pair_metrics(['ETH/BTC'], stake_currency='BTC', @@ -402,13 +402,13 @@ def test_text_table_strategy(testdatadir): bt_res_data_comparison = bt_res_data.pop('strategy_comparison') result_str = ( - '| Strategy | Buys | Avg Profit % | Cum Profit % | Tot Profit BTC |' + '| Strategy | Entries | Avg Profit % | Cum Profit % | Tot Profit BTC |' ' Tot Profit % | Avg Duration | Win Draw Loss Win% | Drawdown |\n' - '|----------------+--------+----------------+----------------+------------------+' + '|----------------+-----------+----------------+----------------+------------------+' '----------------+----------------+-------------------------+-----------------------|\n' - '| StrategyTestV2 | 179 | 0.08 | 14.39 | 0.02608550 |' + '| StrategyTestV2 | 179 | 0.08 | 14.39 | 0.02608550 |' ' 260.85 | 3:40:00 | 170 0 9 95.0 | 0.00308222 BTC 8.67% |\n' - '| TestStrategy | 179 | 0.08 | 14.39 | 0.02608550 |' + '| TestStrategy | 179 | 0.08 | 14.39 | 0.02608550 |' ' 260.85 | 3:40:00 | 170 0 9 95.0 | 0.00308222 BTC 8.67% |' ) From 97be3318f447445dfaab52f8b4d08ba2f8e59112 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 9 Sep 2022 20:17:34 +0200 Subject: [PATCH 205/437] Use Datetime_format from constants --- freqtrade/data/history/history_utils.py | 8 ++++---- freqtrade/freqai/freqai_interface.py | 5 +++-- tests/data/test_history.py | 6 +++--- tests/test_persistence.py | 10 +++++----- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/freqtrade/data/history/history_utils.py b/freqtrade/data/history/history_utils.py index 7a3fa4e0c..6a6e29429 100644 --- a/freqtrade/data/history/history_utils.py +++ b/freqtrade/data/history/history_utils.py @@ -228,9 +228,9 @@ def _download_pair_history(pair: str, *, ) logger.debug("Current Start: %s", - f"{data.iloc[0]['date']:%Y-%m-%d %H:%M:%S}" if not data.empty else 'None') + f"{data.iloc[0]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None') logger.debug("Current End: %s", - f"{data.iloc[-1]['date']:%Y-%m-%d %H:%M:%S}" if not data.empty else 'None') + f"{data.iloc[-1]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None') # Default since_ms to 30 days if nothing is given new_data = exchange.get_historic_ohlcv(pair=pair, @@ -254,9 +254,9 @@ def _download_pair_history(pair: str, *, fill_missing=False, drop_incomplete=False) logger.debug("New Start: %s", - f"{data.iloc[0]['date']:%Y-%m-%d %H:%M:%S}" if not data.empty else 'None') + f"{data.iloc[0]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None') logger.debug("New End: %s", - f"{data.iloc[-1]['date']:%Y-%m-%d %H:%M:%S}" if not data.empty else 'None') + f"{data.iloc[-1]['date']:DATETIME_PRINT_FORMAT}" if not data.empty else 'None') data_handler.ohlcv_store(pair, timeframe, data=data, candle_type=candle_type) return True diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index c5ac17a3a..7a48f6e15 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -14,6 +14,7 @@ from numpy.typing import NDArray from pandas import DataFrame from freqtrade.configuration import TimeRange +from freqtrade.constants import DATETIME_PRINT_FORMAT from freqtrade.enums import RunMode from freqtrade.exceptions import OperationalException from freqtrade.exchange import timeframe_to_seconds @@ -232,10 +233,10 @@ class IFreqaiModel(ABC): trained_timestamp = tr_train tr_train_startts_str = datetime.fromtimestamp( tr_train.startts, - tz=timezone.utc).strftime("%Y-%m-%d %H:%M:%S") + tz=timezone.utc).strftime(DATETIME_PRINT_FORMAT) tr_train_stopts_str = datetime.fromtimestamp( tr_train.stopts, - tz=timezone.utc).strftime("%Y-%m-%d %H:%M:%S") + tz=timezone.utc).strftime(DATETIME_PRINT_FORMAT) logger.info( f"Training {metadata['pair']}, {self.pair_it}/{self.total_pairs} pairs" f" from {tr_train_startts_str} to {tr_train_stopts_str}, {train_it}/{total_trains} " diff --git a/tests/data/test_history.py b/tests/data/test_history.py index 9709e7ad0..8081e984f 100644 --- a/tests/data/test_history.py +++ b/tests/data/test_history.py @@ -13,7 +13,7 @@ from pandas import DataFrame from pandas.testing import assert_frame_equal from freqtrade.configuration import TimeRange -from freqtrade.constants import AVAILABLE_DATAHANDLERS +from freqtrade.constants import AVAILABLE_DATAHANDLERS, DATETIME_PRINT_FORMAT from freqtrade.data.converter import ohlcv_to_dataframe from freqtrade.data.history.hdf5datahandler import HDF5DataHandler from freqtrade.data.history.history_utils import (_download_pair_history, _download_trades_history, @@ -386,7 +386,7 @@ def test_load_partial_missing(testdatadir, caplog) -> None: assert td != len(data['UNITTEST/BTC']) start_real = data['UNITTEST/BTC'].iloc[0, 0] assert log_has(f'UNITTEST/BTC, spot, 5m, ' - f'data starts at {start_real.strftime("%Y-%m-%d %H:%M:%S")}', + f'data starts at {start_real.strftime(DATETIME_PRINT_FORMAT)}', caplog) # Make sure we start fresh - test missing data at end caplog.clear() @@ -401,7 +401,7 @@ def test_load_partial_missing(testdatadir, caplog) -> None: # Shift endtime with +5 - as last candle is dropped (partial candle) end_real = arrow.get(data['UNITTEST/BTC'].iloc[-1, 0]).shift(minutes=5) assert log_has(f'UNITTEST/BTC, spot, 5m, ' - f'data ends at {end_real.strftime("%Y-%m-%d %H:%M:%S")}', + f'data ends at {end_real.strftime(DATETIME_PRINT_FORMAT)}', caplog) diff --git a/tests/test_persistence.py b/tests/test_persistence.py index cdca3bc4d..e7f218c02 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -9,7 +9,7 @@ import arrow import pytest from sqlalchemy import create_engine, text -from freqtrade import constants +from freqtrade.constants import DATETIME_PRINT_FORMAT, DEFAULT_DB_PROD_URL from freqtrade.enums import TradingMode from freqtrade.exceptions import DependencyException, OperationalException from freqtrade.persistence import LocalTrade, Order, Trade, init_db @@ -52,7 +52,7 @@ def test_init_invalid_db_url(): def test_init_prod_db(default_conf, mocker): default_conf.update({'dry_run': False}) - default_conf.update({'db_url': constants.DEFAULT_DB_PROD_URL}) + default_conf.update({'db_url': DEFAULT_DB_PROD_URL}) create_engine_mock = mocker.patch('freqtrade.persistence.models.create_engine', MagicMock()) @@ -1739,7 +1739,7 @@ def test_to_json(fee): 'base_currency': 'ADA', 'quote_currency': 'USDT', 'is_open': None, - 'open_date': trade.open_date.strftime("%Y-%m-%d %H:%M:%S"), + 'open_date': trade.open_date.strftime(DATETIME_PRINT_FORMAT), 'open_timestamp': int(trade.open_date.timestamp() * 1000), 'open_order_id': 'dry_run_buy_12345', 'close_date': None, @@ -1817,9 +1817,9 @@ def test_to_json(fee): 'pair': 'XRP/BTC', 'base_currency': 'XRP', 'quote_currency': 'BTC', - 'open_date': trade.open_date.strftime("%Y-%m-%d %H:%M:%S"), + 'open_date': trade.open_date.strftime(DATETIME_PRINT_FORMAT), 'open_timestamp': int(trade.open_date.timestamp() * 1000), - 'close_date': trade.close_date.strftime("%Y-%m-%d %H:%M:%S"), + 'close_date': trade.close_date.strftime(DATETIME_PRINT_FORMAT), 'close_timestamp': int(trade.close_date.timestamp() * 1000), 'open_rate': 0.123, 'close_rate': 0.125, From 939fb7acb338202dfa2bf945ee51d95e37e14e97 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 9 Sep 2022 20:31:30 +0200 Subject: [PATCH 206/437] Fix enum imports --- freqtrade/commands/db_commands.py | 2 +- freqtrade/exchange/okx.py | 3 +-- freqtrade/rpc/discord.py | 2 +- freqtrade/strategy/interface.py | 5 ++--- freqtrade/strategy/parameters.py | 2 +- tests/exchange/test_okx.py | 3 +-- tests/strategy/test_interface.py | 3 +-- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/freqtrade/commands/db_commands.py b/freqtrade/commands/db_commands.py index 618b5cb6e..c424016b1 100644 --- a/freqtrade/commands/db_commands.py +++ b/freqtrade/commands/db_commands.py @@ -4,7 +4,7 @@ from typing import Any, Dict from sqlalchemy import func from freqtrade.configuration.config_setup import setup_utils_configuration -from freqtrade.enums.runmode import RunMode +from freqtrade.enums import RunMode logger = logging.getLogger(__name__) diff --git a/freqtrade/exchange/okx.py b/freqtrade/exchange/okx.py index 9340dd0e4..49f8ea107 100644 --- a/freqtrade/exchange/okx.py +++ b/freqtrade/exchange/okx.py @@ -4,8 +4,7 @@ from typing import Dict, List, Optional, Tuple import ccxt from freqtrade.constants import BuySell -from freqtrade.enums import MarginMode, TradingMode -from freqtrade.enums.candletype import CandleType +from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exceptions import DDosProtection, OperationalException, TemporaryError from freqtrade.exchange import Exchange, date_minus_candles from freqtrade.exchange.common import retrier diff --git a/freqtrade/rpc/discord.py b/freqtrade/rpc/discord.py index 5991f7126..85acfae4e 100644 --- a/freqtrade/rpc/discord.py +++ b/freqtrade/rpc/discord.py @@ -1,7 +1,7 @@ import logging from typing import Any, Dict -from freqtrade.enums.rpcmessagetype import RPCMessageType +from freqtrade.enums import RPCMessageType from freqtrade.rpc import RPC from freqtrade.rpc.webhook import Webhook diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 70cc7fdb3..9401ebebe 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -12,9 +12,8 @@ from pandas import DataFrame from freqtrade.constants import ListPairsWithTimeframes from freqtrade.data.dataprovider import DataProvider -from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, SignalDirection, SignalTagType, - SignalType, TradingMode) -from freqtrade.enums.runmode import RunMode +from freqtrade.enums import (CandleType, ExitCheckTuple, ExitType, RunMode, SignalDirection, + SignalTagType, SignalType, TradingMode) from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.exchange import timeframe_to_minutes, timeframe_to_next_date, timeframe_to_seconds from freqtrade.persistence import Order, PairLocks, Trade diff --git a/freqtrade/strategy/parameters.py b/freqtrade/strategy/parameters.py index c6037ae0b..796fb9514 100644 --- a/freqtrade/strategy/parameters.py +++ b/freqtrade/strategy/parameters.py @@ -7,7 +7,7 @@ from abc import ABC, abstractmethod from contextlib import suppress from typing import Any, Optional, Sequence, Union -from freqtrade.enums.hyperoptstate import HyperoptState +from freqtrade.enums import HyperoptState from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer diff --git a/tests/exchange/test_okx.py b/tests/exchange/test_okx.py index b475b84ff..12322acae 100644 --- a/tests/exchange/test_okx.py +++ b/tests/exchange/test_okx.py @@ -4,8 +4,7 @@ from unittest.mock import MagicMock, PropertyMock import pytest -from freqtrade.enums import MarginMode, TradingMode -from freqtrade.enums.candletype import CandleType +from freqtrade.enums import CandleType, MarginMode, TradingMode from freqtrade.exchange.exchange import timeframe_to_minutes from tests.conftest import get_mock_coro, get_patched_exchange, log_has from tests.exchange.test_exchange import ccxt_exceptionhandlers diff --git a/tests/strategy/test_interface.py b/tests/strategy/test_interface.py index 65ee05d71..070e78b1d 100644 --- a/tests/strategy/test_interface.py +++ b/tests/strategy/test_interface.py @@ -11,8 +11,7 @@ from pandas import DataFrame from freqtrade.configuration import TimeRange from freqtrade.data.dataprovider import DataProvider from freqtrade.data.history import load_data -from freqtrade.enums import ExitCheckTuple, ExitType, SignalDirection -from freqtrade.enums.hyperoptstate import HyperoptState +from freqtrade.enums import ExitCheckTuple, ExitType, HyperoptState, SignalDirection from freqtrade.exceptions import OperationalException, StrategyError from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer from freqtrade.optimize.space import SKDecimal From 05581db4e387ae8c1b2ae7d097e3b20f349e4b16 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Fri, 9 Sep 2022 20:37:21 +0200 Subject: [PATCH 207/437] ensure columns are only dropped in training --- freqtrade/freqai/data_kitchen.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 790b3c078..1af01cb6b 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -209,14 +209,13 @@ class FreqaiDataKitchen: filtered_df = unfiltered_df.filter(training_feature_list, axis=1) filtered_df = filtered_df.replace([np.inf, -np.inf], np.nan) - const_cols = list((filtered_df.nunique() == 1).loc[lambda x: x].index) - if const_cols: - filtered_df = filtered_df.filter(filtered_df.columns.difference(const_cols)) - logger.warning(f"Removed features {const_cols} with constant values.") - drop_index = pd.isnull(filtered_df).any(1) # get the rows that have NaNs, drop_index = drop_index.replace(True, 1).replace(False, 0) # pep8 requirement. if (training_filter): + const_cols = list((filtered_df.nunique() == 1).loc[lambda x: x].index) + if const_cols: + filtered_df = filtered_df.filter(filtered_df.columns.difference(const_cols)) + logger.warning(f"Removed features {const_cols} with constant values.") # we don't care about total row number (total no. datapoints) in training, we only care # about removing any row with NaNs # if labels has multiple columns (user wants to train multiple modelEs), we detect here From 2f6a61521f2bed67a40ed43d08ef53232b7e2ac5 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Fri, 9 Sep 2022 17:14:40 -0600 Subject: [PATCH 208/437] add more tests --- tests/data/test_dataprovider.py | 70 +++++++++++++++++++++++++++++++++ tests/rpc/test_rpc_apiserver.py | 6 +++ tests/test_misc.py | 20 ++++++++-- 3 files changed, 92 insertions(+), 4 deletions(-) diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index 49603feac..812688cb1 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -144,6 +144,76 @@ def test_available_pairs(mocker, default_conf, ohlcv_history): assert dp.available_pairs == [("XRP/BTC", timeframe), ("UNITTEST/BTC", timeframe), ] +def test_producer_pairs(mocker, default_conf, ohlcv_history): + dataprovider = DataProvider(default_conf, None) + + producer = "default" + whitelist = ["XRP/BTC", "ETH/BTC"] + assert len(dataprovider.get_producer_pairs(producer)) == 0 + + dataprovider._set_producer_pairs(whitelist, producer) + assert len(dataprovider.get_producer_pairs(producer)) == 2 + + new_whitelist = ["BTC/USDT"] + dataprovider._set_producer_pairs(new_whitelist, producer) + assert dataprovider.get_producer_pairs(producer) == new_whitelist + + assert dataprovider.get_producer_pairs("bad") == [] + + +def test_external_df(mocker, default_conf, ohlcv_history): + dataprovider = DataProvider(default_conf, None) + + pair = 'BTC/USDT' + timeframe = default_conf['timeframe'] + candle_type = CandleType.SPOT + + empty_la = datetime.fromtimestamp(0, tz=timezone.utc) + + # no data has been added, any request should return an empty dataframe + dataframe, la = dataprovider.get_external_df(pair, timeframe, candle_type) + assert dataframe.empty + assert la == empty_la + + # the data is added, should return that added dataframe + dataprovider._add_external_df(pair, ohlcv_history, timeframe=timeframe, candle_type=candle_type) + dataframe, la = dataprovider.get_external_df(pair, timeframe, candle_type) + assert len(dataframe) > 0 + assert la > empty_la + + # no data on this producer, should return empty dataframe + dataframe, la = dataprovider.get_external_df(pair, producer_name='bad') + assert dataframe.empty + assert la == empty_la + + # non existent timeframe, empty dataframe + datframe, la = dataprovider.get_external_df(pair, timeframe='1h') + assert dataframe.empty + assert la == empty_la + + +def test_emit_df(mocker, default_conf, ohlcv_history): + mocker.patch('freqtrade.rpc.rpc_manager.RPCManager.__init__', MagicMock()) + rpc_mock = mocker.patch('freqtrade.rpc.rpc_manager.RPCManager', MagicMock()) + send_mock = mocker.patch('freqtrade.rpc.rpc_manager.RPCManager.send_msg', MagicMock()) + + dataprovider = DataProvider(default_conf, exchange=None, rpc=rpc_mock) + dataprovider_no_rpc = DataProvider(default_conf, exchange=None) + + pair = "BTC/USDT" + + # No emit yet + assert send_mock.call_count == 0 + + # Rpc is added, we call emit, should call send_msg + dataprovider._emit_df(pair, ohlcv_history) + assert send_mock.call_count == 1 + + # No rpc added, emit called, should not call send_msg + dataprovider_no_rpc._emit_df(pair, ohlcv_history) + assert send_mock.call_count == 1 + + def test_refresh(mocker, default_conf, ohlcv_history): refresh_mock = MagicMock() mocker.patch("freqtrade.exchange.Exchange.refresh_latest_ohlcv", refresh_mock) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index f1aa465f0..17705e62e 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -158,6 +158,12 @@ def test_api_auth(): with pytest.raises(HTTPException): get_user_from_token(b'not_a_token', 'secret1234') + # Check returning false instead of error on bad token + assert not get_user_from_token(b'not_a_token', 'secret1234', raise_on_error=False) + + # Check returning false instead of error on bad token type + assert not get_user_from_token(token, 'secret1234', token_type='refresh', raise_on_error=False) + def test_api_ws_auth(botclient): ftbot, client = botclient diff --git a/tests/test_misc.py b/tests/test_misc.py index 107932be4..514fec54a 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -7,10 +7,11 @@ from unittest.mock import MagicMock import pytest -from freqtrade.misc import (decimals_per_coin, deep_merge_dicts, file_dump_json, file_load_json, - format_ms_time, pair_to_filename, parse_db_uri_for_logging, plural, - render_template, render_template_with_fallback, round_coin_value, - safe_value_fallback, safe_value_fallback2, shorten_date) +from freqtrade.misc import (dataframe_to_json, decimals_per_coin, deep_merge_dicts, file_dump_json, + file_load_json, format_ms_time, json_to_dataframe, pair_to_filename, + parse_db_uri_for_logging, plural, render_template, + render_template_with_fallback, round_coin_value, safe_value_fallback, + safe_value_fallback2, shorten_date) def test_decimals_per_coin(): @@ -219,3 +220,14 @@ def test_deep_merge_dicts(): res2['first']['rows']['test'] = 'asdf' assert deep_merge_dicts(a, deepcopy(b), allow_null_overrides=False) == res2 + + +def test_dataframe_json(ohlcv_history): + from pandas.testing import assert_frame_equal + json = dataframe_to_json(ohlcv_history) + dataframe = json_to_dataframe(json) + + assert list(ohlcv_history.columns) == list(dataframe.columns) + assert len(ohlcv_history) == len(dataframe) + + assert_frame_equal(ohlcv_history, dataframe) From 170bec0438e10955052fe7782ede7a42a2310cc8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 08:24:23 +0200 Subject: [PATCH 209/437] Fix failing XGBoost tests --- tests/freqai/test_freqai_interface.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index d95ead90c..5f8eeb086 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -174,7 +174,7 @@ def test_extract_data_and_train_model_LightGBMClassifier(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_train_model_in_series_XGBoostRegressor(mocker, freqai_conf): +def test_extract_data_and_train_model_XGBoostRegressor(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "XGBoostRegressor"}) freqai_conf.update({"strategy": "freqai_test_strat"}) @@ -194,8 +194,8 @@ def test_train_model_in_series_XGBoostRegressor(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() @@ -205,7 +205,7 @@ def test_train_model_in_series_XGBoostRegressor(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_train_model_in_series_XGBoostRegressorMultiModel(mocker, freqai_conf): +def test_extract_data_and_train_model_XGBoostRegressorMultiModel(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "XGBoostRegressorMultiTarget"}) freqai_conf.update({"strategy": "freqai_test_multimodel_strat"}) @@ -224,7 +224,8 @@ def test_train_model_in_series_XGBoostRegressorMultiModel(mocker, freqai_conf): data_load_timerange = TimeRange.parse_timerange("20180110-20180130") new_timerange = TimeRange.parse_timerange("20180120-20180130") - freqai.train_model_in_series(new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) + freqai.extract_data_and_train_model( + new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) assert len(freqai.dk.label_list) == 2 assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() From b344f78d007c20b75acefa181c2a2129f4787ecd Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 14:19:11 +0200 Subject: [PATCH 210/437] Improve logic for token validation --- freqtrade/rpc/api_server/api_auth.py | 35 +++++++++++----------------- freqtrade/rpc/api_server/api_ws.py | 4 ++-- tests/rpc/test_rpc_apiserver.py | 6 ----- 3 files changed, 16 insertions(+), 29 deletions(-) diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index a2b722f0a..767a2d5b9 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -29,8 +29,7 @@ httpbasic = HTTPBasic(auto_error=False) oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False) -def get_user_from_token(token, secret_key: str, token_type: str = "access", - raise_on_error: bool = True) -> Union[bool, str]: +def get_user_from_token(token, secret_key: str, token_type: str = "access") -> str: credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", @@ -40,28 +39,19 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access", payload = jwt.decode(token, secret_key, algorithms=[ALGORITHM]) username: str = payload.get("identity", {}).get('u') if username is None: - if raise_on_error: - raise credentials_exception - else: - return False + raise credentials_exception if payload.get("type") != token_type: - if raise_on_error: - raise credentials_exception - else: - return False + raise credentials_exception except jwt.PyJWTError: - if raise_on_error: - raise credentials_exception - else: - return False + raise credentials_exception return username # This should be reimplemented to better realign with the existing tools provided # by FastAPI regarding API Tokens # https://github.com/tiangolo/fastapi/blob/master/fastapi/security/api_key.py -async def get_ws_token( +async def validate_ws_token( ws: WebSocket, ws_token: Union[str, None] = Query(..., alias="token"), api_config: Dict[str, Any] = Depends(get_api_config) @@ -72,13 +62,16 @@ async def get_ws_token( if secrets.compare_digest(secret_ws_token, ws_token): # Just return the token if it matches return ws_token - elif user := get_user_from_token(ws_token, secret_jwt_key, raise_on_error=False): - # If the token is a jwt, and it's valid return the user - return user else: - logger.info("Denying websocket request") - # If it doesn't match, close the websocket connection - await ws.close(code=status.WS_1008_POLICY_VIOLATION) + try: + user = get_user_from_token(ws_token, secret_jwt_key) + return user + # If the token is a jwt, and it's valid return the user + except HTTPException: + pass + logger.info("Denying websocket request") + # If it doesn't match, close the websocket connection + await ws.close(code=status.WS_1008_POLICY_VIOLATION) def create_token(data: dict, secret_key: str, token_type: str = "access") -> str: diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 25d29a7ce..34b780956 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -7,7 +7,7 @@ from pydantic import ValidationError from starlette.websockets import WebSocketState from freqtrade.enums import RPCMessageType, RPCRequestType -from freqtrade.rpc.api_server.api_auth import get_ws_token +from freqtrade.rpc.api_server.api_auth import validate_ws_token from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSMessageSchema, @@ -96,7 +96,7 @@ async def message_endpoint( ws: WebSocket, rpc: RPC = Depends(get_rpc), channel_manager=Depends(get_channel_manager), - token: str = Depends(get_ws_token) + token: str = Depends(validate_ws_token) ): """ Message WebSocket endpoint, facilitates sending RPC messages diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 17705e62e..f1aa465f0 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -158,12 +158,6 @@ def test_api_auth(): with pytest.raises(HTTPException): get_user_from_token(b'not_a_token', 'secret1234') - # Check returning false instead of error on bad token - assert not get_user_from_token(b'not_a_token', 'secret1234', raise_on_error=False) - - # Check returning false instead of error on bad token type - assert not get_user_from_token(token, 'secret1234', token_type='refresh', raise_on_error=False) - def test_api_ws_auth(botclient): ftbot, client = botclient From 4250174de94b4b27acd5007b009034002212d86e Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 14:29:58 +0200 Subject: [PATCH 211/437] Fix ws exception when no token is provided --- freqtrade/rpc/api_server/api_auth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 767a2d5b9..93be251ab 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -53,13 +53,13 @@ def get_user_from_token(token, secret_key: str, token_type: str = "access") -> s # https://github.com/tiangolo/fastapi/blob/master/fastapi/security/api_key.py async def validate_ws_token( ws: WebSocket, - ws_token: Union[str, None] = Query(..., alias="token"), + ws_token: Union[str, None] = Query(default=None, alias="token"), api_config: Dict[str, Any] = Depends(get_api_config) ): secret_ws_token = api_config.get('ws_token', 'secret_ws_t0ken.') secret_jwt_key = api_config.get('jwt_secret_key', 'super-secret') - if secrets.compare_digest(secret_ws_token, ws_token): + if ws_token and secrets.compare_digest(secret_ws_token, ws_token): # Just return the token if it matches return ws_token else: From 79985fda015c0f060d0b0aca7d83962c43c75e8e Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Sat, 10 Sep 2022 10:27:17 -0300 Subject: [PATCH 212/437] fix backtesting freqai startup candles bug --- freqtrade/freqai/data_kitchen.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 01b2f1f3b..88d841b9e 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -468,8 +468,14 @@ class FreqaiDataKitchen: Function which takes the backtesting time range and remove training data from dataframe """ + startup_candle_count = self.config.get('startup_candle_count', 0) + tf = self.config['timeframe'] tr = self.config["timerange"] + backtesting_timerange = TimeRange.parse_timerange(tr) + if startup_candle_count > 0 and backtesting_timerange: + backtesting_timerange.subtract_start(timeframe_to_seconds(tf) * startup_candle_count) + start = datetime.fromtimestamp(backtesting_timerange.startts, tz=timezone.utc) df = self.return_dataframe df = df.loc[df["date"] >= start, :] From daf352e6a5dd660e247a38a1a209ff34561ba7a3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 16:01:06 +0200 Subject: [PATCH 213/437] Test online candle fetching in futures, too disable gateio checking on spot markets --- tests/exchange/test_ccxt_compat.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index 49b7684f8..f57b0b366 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -267,13 +267,8 @@ class TestCCXTExchange(): now = datetime.now(timezone.utc) - timedelta(minutes=(timeframe_to_minutes(timeframe) * 2)) assert exchange.klines(pair_tf).iloc[-1]['date'] >= timeframe_to_prev_date(timeframe, now) - def test_ccxt__async_get_candle_history(self, exchange): - exchange, exchangename = exchange - # For some weired reason, this test returns random lengths for bittrex. - if not exchange._ft_has['ohlcv_has_history'] or exchangename == 'bittrex': - return - pair = EXCHANGES[exchangename]['pair'] - timeframe = EXCHANGES[exchangename]['timeframe'] + def ccxt__async_get_candle_history(self, exchange, exchangename, pair, timeframe): + candle_type = CandleType.SPOT timeframe_ms = timeframe_to_msecs(timeframe) now = timeframe_to_prev_date( @@ -299,6 +294,24 @@ class TestCCXTExchange(): assert len(candles) >= min(candle_count, candle_count1) assert candles[0][0] == since_ms or (since_ms + timeframe_ms) + def test_ccxt__async_get_candle_history(self, exchange): + exchange, exchangename = exchange + # For some weired reason, this test returns random lengths for bittrex. + if not exchange._ft_has['ohlcv_has_history'] or exchangename in ('bittrex', 'gateio'): + return + pair = EXCHANGES[exchangename]['pair'] + timeframe = EXCHANGES[exchangename]['timeframe'] + self.ccxt__async_get_candle_history(exchange, exchangename, pair, timeframe) + + def test_ccxt__async_get_candle_history_futures(self, exchange_futures): + exchange, exchangename = exchange_futures + if not exchange: + # exchange_futures only returns values for supported exchanges + return + pair = EXCHANGES[exchangename].get('futures_pair', EXCHANGES[exchangename]['pair']) + timeframe = EXCHANGES[exchangename]['timeframe'] + self.ccxt__async_get_candle_history(exchange, exchangename, pair, timeframe) + def test_ccxt_fetch_funding_rate_history(self, exchange_futures): exchange, exchangename = exchange_futures if not exchange: From 10b6aebc5f5ada8b1e6aef733f7c8ccf4e29e8ba Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 10 Sep 2022 16:54:13 +0200 Subject: [PATCH 214/437] enable continual learning and evaluation sets on multioutput models. --- .../BaseClassifierModel.py | 0 .../BaseRegressionModel.py | 0 .../BaseTensorFlowModel.py | 0 .../base_models/FreqaiMultiOutputRegressor.py | 75 +++++++++++++++++++ .../prediction_models/CatboostClassifier.py | 2 +- .../prediction_models/CatboostRegressor.py | 2 +- .../CatboostRegressorMultiTarget.py | 41 +++++++--- .../prediction_models/LightGBMClassifier.py | 2 +- .../prediction_models/LightGBMRegressor.py | 2 +- .../LightGBMRegressorMultiTarget.py | 41 +++++++--- .../prediction_models/XGBoostRegressor.py | 6 +- .../XGBoostRegressorMultiTarget.py | 37 ++++++--- 12 files changed, 170 insertions(+), 38 deletions(-) rename freqtrade/freqai/{prediction_models => base_models}/BaseClassifierModel.py (100%) rename freqtrade/freqai/{prediction_models => base_models}/BaseRegressionModel.py (100%) rename freqtrade/freqai/{prediction_models => base_models}/BaseTensorFlowModel.py (100%) create mode 100644 freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py diff --git a/freqtrade/freqai/prediction_models/BaseClassifierModel.py b/freqtrade/freqai/base_models/BaseClassifierModel.py similarity index 100% rename from freqtrade/freqai/prediction_models/BaseClassifierModel.py rename to freqtrade/freqai/base_models/BaseClassifierModel.py diff --git a/freqtrade/freqai/prediction_models/BaseRegressionModel.py b/freqtrade/freqai/base_models/BaseRegressionModel.py similarity index 100% rename from freqtrade/freqai/prediction_models/BaseRegressionModel.py rename to freqtrade/freqai/base_models/BaseRegressionModel.py diff --git a/freqtrade/freqai/prediction_models/BaseTensorFlowModel.py b/freqtrade/freqai/base_models/BaseTensorFlowModel.py similarity index 100% rename from freqtrade/freqai/prediction_models/BaseTensorFlowModel.py rename to freqtrade/freqai/base_models/BaseTensorFlowModel.py diff --git a/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py new file mode 100644 index 000000000..aa5dbe629 --- /dev/null +++ b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py @@ -0,0 +1,75 @@ + +from joblib import Parallel +from sklearn.multioutput import MultiOutputRegressor, _fit_estimator +from sklearn.utils.fixes import delayed +from sklearn.utils.validation import has_fit_parameter + + +class FreqaiMultiOutputRegressor(MultiOutputRegressor): + + def fit(self, X, y, sample_weight=None, fit_params=None): + """Fit the model to data, separately for each output variable. + Parameters + ---------- + X : {array-like, sparse matrix} of shape (n_samples, n_features) + The input data. + y : {array-like, sparse matrix} of shape (n_samples, n_outputs) + Multi-output targets. An indicator matrix turns on multilabel + estimation. + sample_weight : array-like of shape (n_samples,), default=None + Sample weights. If `None`, then samples are equally weighted. + Only supported if the underlying regressor supports sample + weights. + fit_params : A list of dicts for the fit_params + Parameters passed to the ``estimator.fit`` method of each step. + Each dict may contain same or different values (e.g. different + eval_sets or init_models) + .. versionadded:: 0.23 + Returns + ------- + self : object + Returns a fitted instance. + """ + + if not hasattr(self.estimator, "fit"): + raise ValueError("The base estimator should implement a fit method") + + y = self._validate_data(X="no_validation", y=y, multi_output=True) + + # if is_classifier(self): + # check_classification_targets(y) + + if y.ndim == 1: + raise ValueError( + "y must have at least two dimensions for " + "multi-output regression but has only one." + ) + + if sample_weight is not None and not has_fit_parameter( + self.estimator, "sample_weight" + ): + raise ValueError("Underlying estimator does not support sample weights.") + + # fit_params_validated = _check_fit_params(X, fit_params) + + if not fit_params: + fit_params = [None] * y.shape[1] + + # if not init_models: + # init_models = [None] * y.shape[1] + + self.estimators_ = Parallel(n_jobs=self.n_jobs)( + delayed(_fit_estimator)( + self.estimator, X, y[:, i], sample_weight, **fit_params[i] + # init_model=init_models[i], eval_set=eval_sets[i], + # **fit_params_validated + ) + for i in range(y.shape[1]) + ) + + if hasattr(self.estimators_[0], "n_features_in_"): + self.n_features_in_ = self.estimators_[0].n_features_in_ + if hasattr(self.estimators_[0], "feature_names_in_"): + self.feature_names_in_ = self.estimators_[0].feature_names_in_ + + return diff --git a/freqtrade/freqai/prediction_models/CatboostClassifier.py b/freqtrade/freqai/prediction_models/CatboostClassifier.py index cd7afd392..60536e6de 100644 --- a/freqtrade/freqai/prediction_models/CatboostClassifier.py +++ b/freqtrade/freqai/prediction_models/CatboostClassifier.py @@ -3,8 +3,8 @@ from typing import Any, Dict from catboost import CatBoostClassifier, Pool +from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel logger = logging.getLogger(__name__) diff --git a/freqtrade/freqai/prediction_models/CatboostRegressor.py b/freqtrade/freqai/prediction_models/CatboostRegressor.py index 1ce31b628..73cf6c88a 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressor.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressor.py @@ -3,8 +3,8 @@ from typing import Any, Dict from catboost import CatBoostRegressor, Pool +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) diff --git a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py index bc52bfdd9..a376b2c33 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py @@ -1,11 +1,11 @@ import logging from typing import Any, Dict -from catboost import CatBoostRegressor # , Pool -from sklearn.multioutput import MultiOutputRegressor +from catboost import CatBoostRegressor, Pool +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel +from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) @@ -32,17 +32,34 @@ class CatboostRegressorMultiTarget(BaseRegressionModel): X = data_dictionary["train_features"] y = data_dictionary["train_labels"] - eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) + sample_weight = data_dictionary["train_weights"] - if self.continual_learning: - logger.warning('Continual learning not supported for MultiTarget models') - - model = MultiOutputRegressor(estimator=cbr) - model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) + eval_sets = [None] * y.shape[1] if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0: - train_score = model.score(X, y) - test_score = model.score(*eval_set) - logger.info(f"Train score {train_score}, Test score {test_score}") + eval_sets = [None] * data_dictionary['test_labels'].shape[1] + + for i in range(data_dictionary['test_labels'].shape[1]): + eval_sets[i] = Pool( + data=data_dictionary["test_features"], + label=data_dictionary["test_labels"].iloc[:, i], + weight=data_dictionary["test_weights"], + ) + + init_model = self.get_init_model(dk.pair) + + if init_model: + init_models = init_model.estimators_ + else: + init_models = [None] * y.shape[1] + + fit_params = [] + for i in range(len(eval_sets)): + fit_params.append( + {'eval_set': eval_sets[i], 'init_model': init_models[i]}) + + model = FreqaiMultiOutputRegressor(estimator=cbr) + model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) + return model diff --git a/freqtrade/freqai/prediction_models/LightGBMClassifier.py b/freqtrade/freqai/prediction_models/LightGBMClassifier.py index 69867eae3..3eec516ba 100644 --- a/freqtrade/freqai/prediction_models/LightGBMClassifier.py +++ b/freqtrade/freqai/prediction_models/LightGBMClassifier.py @@ -3,8 +3,8 @@ from typing import Any, Dict from lightgbm import LGBMClassifier +from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseClassifierModel import BaseClassifierModel logger = logging.getLogger(__name__) diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressor.py b/freqtrade/freqai/prediction_models/LightGBMRegressor.py index 99e9ff887..85c9b691c 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressor.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressor.py @@ -3,8 +3,8 @@ from typing import Any, Dict from lightgbm import LGBMRegressor +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py index c34680dbe..7a9b5c36a 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py @@ -2,10 +2,10 @@ import logging from typing import Any, Dict from lightgbm import LGBMRegressor -from sklearn.multioutput import MultiOutputRegressor +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel +from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) @@ -29,15 +29,36 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel): X = data_dictionary["train_features"] y = data_dictionary["train_labels"] - eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) sample_weight = data_dictionary["train_weights"] - if self.continual_learning: - logger.warning('Continual learning not supported for MultiTarget models') + eval_weights = None + eval_sets = [None] * y.shape[1] - model = MultiOutputRegressor(estimator=lgb) - model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) - train_score = model.score(X, y) - test_score = model.score(*eval_set) - logger.info(f"Train score {train_score}, Test score {test_score}") + if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0: + eval_weights = [data_dictionary["test_weights"]] + eval_sets = [(None, None)] * data_dictionary['test_labels'].shape[1] # type: ignore + for i in range(data_dictionary['test_labels'].shape[1]): + eval_sets[i] = ( # type: ignore + data_dictionary["test_features"], + data_dictionary["test_labels"].iloc[:, i] + ) + + init_model = self.get_init_model(dk.pair) + if init_model: + init_models = init_model.estimators_ + else: + init_models = [None] * y.shape[1] + + fit_params = [] + for i in range(len(eval_sets)): + fit_params.append( + {'eval_set': eval_sets[i], 'eval_sample_weight': eval_weights, + 'init_model': init_models[i]}) + + model = FreqaiMultiOutputRegressor(estimator=lgb) + model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) + + # model = FreqaiMultiOutputRegressor(estimator=lgb) + # model.fit(X=X, y=y, sample_weight=sample_weight, init_models=init_models, + # eval_sets=eval_sets, eval_sample_weight=eval_weights) return model diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressor.py b/freqtrade/freqai/prediction_models/XGBoostRegressor.py index acc4386f5..c9be9ce74 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRegressor.py +++ b/freqtrade/freqai/prediction_models/XGBoostRegressor.py @@ -3,8 +3,8 @@ from typing import Any, Dict from xgboost import XGBRegressor +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) @@ -31,6 +31,7 @@ class XGBoostRegressor(BaseRegressionModel): eval_set = None else: eval_set = [(data_dictionary["test_features"], data_dictionary["test_labels"])] + eval_weights = [data_dictionary['test_weights']] sample_weight = data_dictionary["train_weights"] @@ -38,6 +39,7 @@ class XGBoostRegressor(BaseRegressionModel): model = XGBRegressor(**self.model_training_parameters) - model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set, xgb_model=xgb_model) + model.fit(X=X, y=y, sample_weight=sample_weight, eval_set=eval_set, + sample_weight_eval_set=eval_weights, xgb_model=xgb_model) return model diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py index 5283501d1..38c478c0b 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py @@ -1,11 +1,11 @@ import logging from typing import Any, Dict -from sklearn.multioutput import MultiOutputRegressor from xgboost import XGBRegressor +from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel +from freqtrade.freqai.base_models.FreqaiMultiOutputRegressor import FreqaiMultiOutputRegressor from freqtrade.freqai.data_kitchen import FreqaiDataKitchen -from freqtrade.freqai.prediction_models.BaseRegressionModel import BaseRegressionModel logger = logging.getLogger(__name__) @@ -29,15 +29,32 @@ class XGBoostRegressorMultiTarget(BaseRegressionModel): X = data_dictionary["train_features"] y = data_dictionary["train_labels"] - eval_set = (data_dictionary["test_features"], data_dictionary["test_labels"]) sample_weight = data_dictionary["train_weights"] - if self.continual_learning: - logger.warning('Continual learning not supported for MultiTarget models') + eval_weights = None + eval_sets = [None] * y.shape[1] + + if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) != 0: + eval_weights = [data_dictionary["test_weights"]] + for i in range(data_dictionary['test_labels'].shape[1]): + eval_sets[i] = [( # type: ignore + data_dictionary["test_features"], + data_dictionary["test_labels"].iloc[:, i] + )] + + init_model = self.get_init_model(dk.pair) + if init_model: + init_models = init_model.estimators_ + else: + init_models = [None] * y.shape[1] + + fit_params = [] + for i in range(len(eval_sets)): + fit_params.append( + {'eval_set': eval_sets[i], 'sample_weight_eval_set': eval_weights, + 'xgb_model': init_models[i]}) + + model = FreqaiMultiOutputRegressor(estimator=xgb) + model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) - model = MultiOutputRegressor(estimator=xgb) - model.fit(X=X, y=y, sample_weight=sample_weight) # , eval_set=eval_set) - train_score = model.score(X, y) - test_score = model.score(*eval_set) - logger.info(f"Train score {train_score}, Test score {test_score}") return model From 60eb02bb62f5952695a69d9eef531d33d91727bf Mon Sep 17 00:00:00 2001 From: Emre Date: Sat, 10 Sep 2022 20:13:16 +0300 Subject: [PATCH 215/437] Add XGBoostClassifier --- .../prediction_models/XGBoostClassifier.py | 85 +++++++++++++++++++ tests/freqai/test_freqai_interface.py | 30 +++++++ 2 files changed, 115 insertions(+) create mode 100644 freqtrade/freqai/prediction_models/XGBoostClassifier.py diff --git a/freqtrade/freqai/prediction_models/XGBoostClassifier.py b/freqtrade/freqai/prediction_models/XGBoostClassifier.py new file mode 100644 index 000000000..8bf5d6281 --- /dev/null +++ b/freqtrade/freqai/prediction_models/XGBoostClassifier.py @@ -0,0 +1,85 @@ +import logging +from typing import Any, Dict, Tuple + +import numpy as np +import numpy.typing as npt +import pandas as pd +from pandas import DataFrame +from pandas.api.types import is_integer_dtype +from sklearn.preprocessing import LabelEncoder +from xgboost import XGBClassifier + +from freqtrade.freqai.base_models.BaseClassifierModel import BaseClassifierModel +from freqtrade.freqai.data_kitchen import FreqaiDataKitchen + + +logger = logging.getLogger(__name__) + + +class XGBoostClassifier(BaseClassifierModel): + """ + User created prediction model. The class needs to override three necessary + functions, predict(), train(), fit(). The class inherits ModelHandler which + has its own DataHandler where data is held, saved, loaded, and managed. + """ + + def fit(self, data_dictionary: Dict, dk: FreqaiDataKitchen, **kwargs) -> Any: + """ + User sets up the training and test data to fit their desired model here + :params: + :data_dictionary: the dictionary constructed by DataHandler to hold + all the training and test data/labels. + """ + + X = data_dictionary["train_features"].to_numpy() + y = data_dictionary["train_labels"].to_numpy()[:, 0] + + le = LabelEncoder() + if not is_integer_dtype(y): + y = pd.Series(le.fit_transform(y), dtype="int64") + + if self.freqai_info.get('data_split_parameters', {}).get('test_size', 0.1) == 0: + eval_set = None + else: + test_features = data_dictionary["test_features"].to_numpy() + test_labels = data_dictionary["test_labels"].to_numpy()[:, 0] + + if not is_integer_dtype(test_labels): + test_labels = pd.Series(le.transform(test_labels), dtype="int64") + + eval_set = [(test_features, test_labels)] + + train_weights = data_dictionary["train_weights"] + + init_model = self.get_init_model(dk.pair) + + model = XGBClassifier(**self.model_training_parameters) + + model.fit(X=X, y=y, eval_set=eval_set, sample_weight=train_weights, + xgb_model=init_model) + + return model + + def predict( + self, unfiltered_df: DataFrame, dk: FreqaiDataKitchen, **kwargs + ) -> Tuple[DataFrame, npt.NDArray[np.int_]]: + """ + Filter the prediction features data and predict with it. + :param: unfiltered_df: Full dataframe for the current backtest period. + :return: + :pred_df: dataframe containing the predictions + :do_predict: np.array of 1s and 0s to indicate places where freqai needed to remove + data (NaNs) or felt uncertain about data (PCA and DI index) + """ + + (pred_df, dk.do_predict) = super().predict(unfiltered_df, dk, **kwargs) + + le = LabelEncoder() + label = dk.label_list[0] + labels_before = list(dk.data['labels_std'].keys()) + labels_after = le.fit_transform(labels_before).tolist() + pred_df[label] = le.inverse_transform(pred_df[label]) + pred_df = pred_df.rename( + columns={labels_after[i]: labels_before[i] for i in range(len(labels_before))}) + + return (pred_df, dk.do_predict) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 5f8eeb086..afcc4fd37 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -174,6 +174,36 @@ def test_extract_data_and_train_model_LightGBMClassifier(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) +def test_extract_data_and_train_model_XGBoostClassifier(mocker, freqai_conf): + freqai_conf.update({"timerange": "20180110-20180130"}) + freqai_conf.update({"freqaimodel": "XGBoostClassifier"}) + freqai_conf.update({"strategy": "freqai_test_classifier"}) + strategy = get_patched_freqai_strategy(mocker, freqai_conf) + exchange = get_patched_exchange(mocker, freqai_conf) + strategy.dp = DataProvider(freqai_conf, exchange) + + strategy.freqai_info = freqai_conf.get("freqai", {}) + freqai = strategy.freqai + freqai.live = True + freqai.dk = FreqaiDataKitchen(freqai_conf) + + timerange = TimeRange.parse_timerange("20180110-20180130") + freqai.dd.load_all_pair_histories(timerange, freqai.dk) + + freqai.dd.pair_dict = MagicMock() + + data_load_timerange = TimeRange.parse_timerange("20180110-20180130") + new_timerange = TimeRange.parse_timerange("20180120-20180130") + + freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", + strategy, freqai.dk, data_load_timerange) + + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").exists() + assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").exists() + + def test_extract_data_and_train_model_XGBoostRegressor(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"freqaimodel": "XGBoostRegressor"}) From 311ae8bf1f14e4cc80d6e5ec036c942d9af716bf Mon Sep 17 00:00:00 2001 From: Wagner Costa Santos Date: Sat, 10 Sep 2022 14:45:42 -0300 Subject: [PATCH 216/437] freqai backtesting - add startup_candle_count at function description --- freqtrade/freqai/data_kitchen.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 88d841b9e..9168db2aa 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -466,7 +466,8 @@ class FreqaiDataKitchen: ) -> DataFrame: """ Function which takes the backtesting time range and - remove training data from dataframe + remove training data from dataframe, keeping only the + startup_candle_count candles """ startup_candle_count = self.config.get('startup_candle_count', 0) tf = self.config['timeframe'] From d8cdd92140fc908fba0de5d55314ab2181fbc5c8 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 11:47:21 -0600 Subject: [PATCH 217/437] wrap background cleanup in finally, add tests --- freqtrade/rpc/api_server/webserver.py | 9 ++++--- tests/rpc/test_rpc_apiserver.py | 36 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 557857ecc..3fb8159e1 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -200,14 +200,17 @@ class ApiServer(RPCHandler): # Sleep, make this configurable? await asyncio.sleep(0.1) except asyncio.CancelledError: - # Disconnect channels and stop the loop on cancel - await self._ws_channel_manager.disconnect_all() - self._ws_loop.stop() + pass # For testing, shouldn't happen when stable except Exception as e: logger.exception(f"Exception happened in background task: {e}") + finally: + # Disconnect channels and stop the loop on cancel + await self._ws_channel_manager.disconnect_all() + self._ws_loop.stop() + def start_api(self): """ Start API ... should be run in thread. diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index f1aa465f0..a7774c204 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -3,6 +3,8 @@ Unit test file for rpc/api_server.py """ import json +import logging +import time from datetime import datetime, timedelta, timezone from pathlib import Path from unittest.mock import ANY, MagicMock, PropertyMock @@ -436,6 +438,7 @@ def test_api_cleanup(default_conf, mocker, caplog): apiserver.cleanup() assert apiserver._server.cleanup.call_count == 1 assert log_has("Stopping API Server", caplog) + assert log_has("Stopping API Server background tasks", caplog) ApiServer.shutdown() @@ -1709,3 +1712,36 @@ def test_api_ws_subscribe(botclient, mocker): # Call count hasn't changed as the subscribe request was invalid assert sub_mock.call_count == 1 + + +def test_api_ws_send_msg(default_conf, mocker, caplog): + try: + caplog.set_level(logging.DEBUG) + + default_conf.update({"api_server": {"enabled": True, + "listen_ip_address": "127.0.0.1", + "listen_port": 8080, + "username": "TestUser", + "password": "testPass", + }}) + mocker.patch('freqtrade.rpc.telegram.Updater', MagicMock()) + apiserver = ApiServer(default_conf) + apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) + + # Test message_queue coro receives the message + test_message = {"type": "status", "data": "test"} + apiserver.send_msg(test_message) + time.sleep(1) # Not sure how else to wait for the coro to receive the data + assert log_has("Found message of type: status", caplog) + + # Test if exception logged when error occurs in sending + mocker.patch('freqtrade.rpc.api_server.ws.channel.ChannelManager.broadcast', + side_effect=Exception) + + apiserver.send_msg(test_message) + time.sleep(2) # Not sure how else to wait for the coro to receive the data + assert log_has_re(r"Exception happened in background task.*", caplog) + + finally: + apiserver.cleanup() + ApiServer.shutdown() From f97f1dc5c38bd7e3c0b731404040a2a8e56a20e5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 19:57:21 +0200 Subject: [PATCH 218/437] Test CatboostRegressorMultiTarget, simplify test setup via parametrization --- tests/freqai/test_freqai_interface.py | 44 ++++++--------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 5f8eeb086..115ad0ea8 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -46,10 +46,18 @@ def test_extract_data_and_train_model_LightGBM(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_extract_data_and_train_model_LightGBMMultiModel(mocker, freqai_conf): +@pytest.mark.parametrize('model', [ + 'LightGBMRegressorMultiTarget', + 'XGBoostRegressorMultiTarget', + 'CatboostRegressorMultiTarget', + ]) +def test_extract_data_and_train_model_MultiTargets(mocker, freqai_conf, model): + if is_arm() and model == 'CatboostRegressorMultiTarget': + pytest.skip("CatBoost is not supported on ARM") + freqai_conf.update({"timerange": "20180110-20180130"}) freqai_conf.update({"strategy": "freqai_test_multimodel_strat"}) - freqai_conf.update({"freqaimodel": "LightGBMRegressorMultiTarget"}) + freqai_conf.update({"freqaimodel": model}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) strategy.dp = DataProvider(freqai_conf, exchange) @@ -205,38 +213,6 @@ def test_extract_data_and_train_model_XGBoostRegressor(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_extract_data_and_train_model_XGBoostRegressorMultiModel(mocker, freqai_conf): - freqai_conf.update({"timerange": "20180110-20180130"}) - freqai_conf.update({"freqaimodel": "XGBoostRegressorMultiTarget"}) - freqai_conf.update({"strategy": "freqai_test_multimodel_strat"}) - strategy = get_patched_freqai_strategy(mocker, freqai_conf) - exchange = get_patched_exchange(mocker, freqai_conf) - strategy.dp = DataProvider(freqai_conf, exchange) - strategy.freqai_info = freqai_conf.get("freqai", {}) - freqai = strategy.freqai - freqai.live = True - freqai.dk = FreqaiDataKitchen(freqai_conf) - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) - - freqai.dd.pair_dict = MagicMock() - - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") - new_timerange = TimeRange.parse_timerange("20180120-20180130") - - freqai.extract_data_and_train_model( - new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) - - assert len(freqai.dk.label_list) == 2 - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").is_file() - assert len(freqai.dk.data['training_features_list']) == 26 - - shutil.rmtree(Path(freqai.dk.full_path)) - - def test_start_backtesting(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180130"}) freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) From 88892ba663ea8805e06ecd2d101c8982f595ad5f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 20:06:52 +0200 Subject: [PATCH 219/437] Parametrize regressor tests --- tests/freqai/test_freqai_interface.py | 76 ++++----------------------- 1 file changed, 11 insertions(+), 65 deletions(-) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 115ad0ea8..bd921c16b 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -17,8 +17,18 @@ def is_arm() -> bool: return "arm" in machine or "aarch64" in machine -def test_extract_data_and_train_model_LightGBM(mocker, freqai_conf): +@pytest.mark.parametrize('model', [ + 'LightGBMRegressor', + 'XGBoostRegressor', + 'CatboostRegressor', + ]) +def test_extract_data_and_train_model_Regressors(mocker, freqai_conf, model): + if is_arm() and model == 'CatboostRegressor': + pytest.skip("CatBoost is not supported on ARM") + + freqai_conf.update({"freqaimodel": model}) freqai_conf.update({"timerange": "20180110-20180130"}) + freqai_conf.update({"strategy": "freqai_test_strat"}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) @@ -86,39 +96,6 @@ def test_extract_data_and_train_model_MultiTargets(mocker, freqai_conf, model): shutil.rmtree(Path(freqai.dk.full_path)) -@pytest.mark.skipif(is_arm(), reason="no ARM for Catboost ...") -def test_extract_data_and_train_model_Catboost(mocker, freqai_conf): - freqai_conf.update({"timerange": "20180110-20180130"}) - freqai_conf.update({"freqaimodel": "CatboostRegressor"}) - # freqai_conf.get('freqai', {}).update( - # {'model_training_parameters': {"n_estimators": 100, "verbose": 0}}) - strategy = get_patched_freqai_strategy(mocker, freqai_conf) - exchange = get_patched_exchange(mocker, freqai_conf) - strategy.dp = DataProvider(freqai_conf, exchange) - - strategy.freqai_info = freqai_conf.get("freqai", {}) - freqai = strategy.freqai - freqai.live = True - freqai.dk = FreqaiDataKitchen(freqai_conf) - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) - - freqai.dd.pair_dict = MagicMock() - - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") - new_timerange = TimeRange.parse_timerange("20180120-20180130") - - freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) - - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").exists() - - shutil.rmtree(Path(freqai.dk.full_path)) - - @pytest.mark.skipif(is_arm(), reason="no ARM for Catboost ...") def test_extract_data_and_train_model_CatboostClassifier(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) @@ -182,37 +159,6 @@ def test_extract_data_and_train_model_LightGBMClassifier(mocker, freqai_conf): shutil.rmtree(Path(freqai.dk.full_path)) -def test_extract_data_and_train_model_XGBoostRegressor(mocker, freqai_conf): - freqai_conf.update({"timerange": "20180110-20180130"}) - freqai_conf.update({"freqaimodel": "XGBoostRegressor"}) - freqai_conf.update({"strategy": "freqai_test_strat"}) - - strategy = get_patched_freqai_strategy(mocker, freqai_conf) - exchange = get_patched_exchange(mocker, freqai_conf) - strategy.dp = DataProvider(freqai_conf, exchange) - strategy.freqai_info = freqai_conf.get("freqai", {}) - freqai = strategy.freqai - freqai.live = True - freqai.dk = FreqaiDataKitchen(freqai_conf) - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) - - freqai.dd.pair_dict = MagicMock() - - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") - new_timerange = TimeRange.parse_timerange("20180120-20180130") - - freqai.extract_data_and_train_model( - new_timerange, "ADA/BTC", strategy, freqai.dk, data_load_timerange) - - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").is_file() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").is_file() - - shutil.rmtree(Path(freqai.dk.full_path)) - - def test_start_backtesting(mocker, freqai_conf): freqai_conf.update({"timerange": "20180120-20180130"}) freqai_conf.get("freqai", {}).update({"save_backtest_models": True}) From b3fc1cfde94b9b8e67e79d1f35f4ce3f36a4e5e0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sat, 10 Sep 2022 20:17:57 +0200 Subject: [PATCH 220/437] Parametrize classifier tests --- tests/freqai/test_freqai_interface.py | 43 ++++++--------------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index bd921c16b..2a7cfeb73 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -96,42 +96,17 @@ def test_extract_data_and_train_model_MultiTargets(mocker, freqai_conf, model): shutil.rmtree(Path(freqai.dk.full_path)) -@pytest.mark.skipif(is_arm(), reason="no ARM for Catboost ...") -def test_extract_data_and_train_model_CatboostClassifier(mocker, freqai_conf): - freqai_conf.update({"timerange": "20180110-20180130"}) - freqai_conf.update({"freqaimodel": "CatboostClassifier"}) +@pytest.mark.parametrize('model', [ + 'LightGBMClassifier', + 'CatboostClassifier', + ]) +def test_extract_data_and_train_model_Classifiers(mocker, freqai_conf, model): + if is_arm() and model == 'CatboostClassifier': + pytest.skip("CatBoost is not supported on ARM") + + freqai_conf.update({"freqaimodel": model}) freqai_conf.update({"strategy": "freqai_test_classifier"}) - strategy = get_patched_freqai_strategy(mocker, freqai_conf) - exchange = get_patched_exchange(mocker, freqai_conf) - strategy.dp = DataProvider(freqai_conf, exchange) - - strategy.freqai_info = freqai_conf.get("freqai", {}) - freqai = strategy.freqai - freqai.live = True - freqai.dk = FreqaiDataKitchen(freqai_conf) - timerange = TimeRange.parse_timerange("20180110-20180130") - freqai.dd.load_all_pair_histories(timerange, freqai.dk) - - freqai.dd.pair_dict = MagicMock() - - data_load_timerange = TimeRange.parse_timerange("20180110-20180130") - new_timerange = TimeRange.parse_timerange("20180120-20180130") - - freqai.extract_data_and_train_model(new_timerange, "ADA/BTC", - strategy, freqai.dk, data_load_timerange) - - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_model.joblib").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_metadata.json").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_trained_df.pkl").exists() - assert Path(freqai.dk.data_path / f"{freqai.dk.model_filename}_svm_model.joblib").exists() - - shutil.rmtree(Path(freqai.dk.full_path)) - - -def test_extract_data_and_train_model_LightGBMClassifier(mocker, freqai_conf): freqai_conf.update({"timerange": "20180110-20180130"}) - freqai_conf.update({"freqaimodel": "LightGBMClassifier"}) - freqai_conf.update({"strategy": "freqai_test_classifier"}) strategy = get_patched_freqai_strategy(mocker, freqai_conf) exchange = get_patched_exchange(mocker, freqai_conf) strategy.dp = DataProvider(freqai_conf, exchange) From 866a5649588c77ec686ba65e581d1306d8ea3751 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 12:51:29 -0600 Subject: [PATCH 221/437] update emc start/shutdown, initial emc tests --- freqtrade/rpc/external_message_consumer.py | 21 +++--- tests/conftest.py | 5 ++ tests/rpc/test_rpc_emc.py | 79 ++++++++++++++++++++++ 3 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 tests/rpc/test_rpc_emc.py diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 1c2a27617..ae7c1f765 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -90,16 +90,16 @@ class ExternalMessageConsumer: """ Start the main internal loop in another thread to run coroutines """ + if self._thread and self._loop: + return + + logger.info("Starting ExternalMessageConsumer") + self._loop = asyncio.new_event_loop() + self._thread = Thread(target=self._loop.run_forever) + self._thread.start() - if not self._thread: - logger.info("Starting ExternalMessageConsumer") - - self._thread = Thread(target=self._loop.run_forever) - self._thread.start() - self._running = True - else: - raise RuntimeError("A loop is already running") + self._running = True self._main_task = asyncio.run_coroutine_threadsafe(self._main(), loop=self._loop) @@ -121,6 +121,11 @@ class ExternalMessageConsumer: self._thread.join() + self._thread = None + self._loop = None + self._sub_tasks = None + self._main_task = None + async def _main(self): """ The main task coroutine diff --git a/tests/conftest.py b/tests/conftest.py index fffac8e0a..6ce767918 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -58,6 +58,11 @@ def log_has(line, logs): return any(line == message for message in logs.messages) +def log_has_when(line, logs, when): + """Check if line is found in caplog's messages during a specified stage""" + return any(line == message.message for message in logs.get_records(when)) + + def log_has_re(line, logs): """Check if line matches some caplog's message.""" return any(re.match(line, message) for message in logs.messages) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py new file mode 100644 index 000000000..6512ff2be --- /dev/null +++ b/tests/rpc/test_rpc_emc.py @@ -0,0 +1,79 @@ +""" +Unit test file for rpc/external_message_consumer.py +""" +import pytest + +from freqtrade.data.dataprovider import DataProvider +from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer +from tests.conftest import log_has, log_has_when + + +@pytest.fixture(autouse=True) +def patched_emc(default_conf, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": "ws://127.0.0.1:8080/api/v1/message/ws", + "ws_token": "secret_Ws_t0ken" + } + ] + } + }) + dataprovider = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dataprovider) + + try: + yield emc + finally: + emc.shutdown() + + +def test_emc_start(patched_emc, caplog): + # Test if the message was printed + assert log_has_when("Starting ExternalMessageConsumer", caplog, "setup") + # Test if the thread and loop objects were created + assert patched_emc._thread and patched_emc._loop + + # Test we call start again nothing happens + prev_thread = patched_emc._thread + patched_emc.start() + assert prev_thread == patched_emc._thread + + +def test_emc_shutdown(patched_emc, caplog): + patched_emc.shutdown() + + assert log_has("Stopping ExternalMessageConsumer", caplog) + # Test the loop has stopped + assert patched_emc._loop is None + # Test if the thread has stopped + assert patched_emc._thread is None + + caplog.clear() + patched_emc.shutdown() + + # Test func didn't run again as it was called once already + assert not log_has("Stopping ExternalMessageConsumer", caplog) + + +def test_emc_init(patched_emc, default_conf, mocker, caplog): + # Test the settings were set correctly + assert patched_emc.initial_candle_limit <= 1500 + assert patched_emc.wait_timeout > 0 + assert patched_emc.sleep_time > 0 + + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [] + } + }) + dataprovider = DataProvider(default_conf, None, None, None) + with pytest.raises(ValueError) as exc: + ExternalMessageConsumer(default_conf, dataprovider) + + # Make sure we failed because of no producers + assert str(exc.value) == "You must specify at least 1 Producer to connect to." From a7baccdb7df6d620b1d23a846d268611cac3ed79 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 13:44:27 -0600 Subject: [PATCH 222/437] update log messages in emc, more tests --- freqtrade/rpc/external_message_consumer.py | 10 ++-- tests/rpc/test_rpc_emc.py | 58 +++++++++++++++++++++- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index ae7c1f765..c571ac510 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -261,19 +261,19 @@ class ExternalMessageConsumer: try: producer_message = WSMessageSchema.parse_obj(message) except ValidationError as e: - logger.error(f"Invalid message from {producer_name}: {e}") + logger.error(f"Invalid message from `{producer_name}`: {e}") return # We shouldn't get empty messages if producer_message.data is None: return - logger.info(f"Received message of type {producer_message.type} from `{producer_name}`") + logger.info(f"Received message of type `{producer_message.type}` from `{producer_name}`") message_handler = self._message_handlers.get(producer_message.type) if not message_handler: - logger.info(f"Received unhandled message: {producer_message.data}, ignoring...") + logger.info(f"Received unhandled message: `{producer_message.data}`, ignoring...") return message_handler(producer_name, producer_message) @@ -288,7 +288,7 @@ class ExternalMessageConsumer: # Add the pairlist data to the DataProvider self._dp._set_producer_pairs(message.data, producer_name=producer_name) - logger.debug(f"Consumed message from {producer_name} of type `RPCMessageType.WHITELIST`") + logger.debug(f"Consumed message from `{producer_name}` of type `RPCMessageType.WHITELIST`") def _consume_analyzed_df_message(self, producer_name: str, message: Any): try: @@ -314,4 +314,4 @@ class ExternalMessageConsumer: producer_name=producer_name) logger.debug( - f"Consumed message from {producer_name} of type RPCMessageType.ANALYZED_DF") + f"Consumed message from `{producer_name}` of type `RPCMessageType.ANALYZED_DF`") diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index 6512ff2be..f33e80018 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -1,11 +1,14 @@ """ Unit test file for rpc/external_message_consumer.py """ +import logging +from datetime import datetime, timezone + import pytest from freqtrade.data.dataprovider import DataProvider from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer -from tests.conftest import log_has, log_has_when +from tests.conftest import log_has, log_has_re, log_has_when @pytest.fixture(autouse=True) @@ -77,3 +80,56 @@ def test_emc_init(patched_emc, default_conf, mocker, caplog): # Make sure we failed because of no producers assert str(exc.value) == "You must specify at least 1 Producer to connect to." + + +def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): + test_producer = {"name": "test", "url": "ws://test", "ws_token": "test"} + caplog.set_level(logging.DEBUG) + + # Test handle whitelist message + whitelist_message = {"type": "whitelist", "data": ["BTC/USDT"]} + patched_emc.handle_producer_message(test_producer, whitelist_message) + + assert log_has("Received message of type `whitelist` from `test`", caplog) + assert log_has("Consumed message from `test` of type `RPCMessageType.WHITELIST`", caplog) + + # Test handle analyzed_df message + df_message = { + "type": "analyzed_df", + "data": { + "key": ("BTC/USDT", "5m", "spot"), + "df": ohlcv_history, + "la": datetime.now(timezone.utc) + } + } + patched_emc.handle_producer_message(test_producer, df_message) + + assert log_has("Received message of type `analyzed_df` from `test`", caplog) + assert log_has("Consumed message from `test` of type `RPCMessageType.ANALYZED_DF`", caplog) + + # Test unhandled message + unhandled_message = {"type": "status", "data": "RUNNING"} + patched_emc.handle_producer_message(test_producer, unhandled_message) + + assert log_has_re(r"Received unhandled message\: .*", caplog) + + # Test malformed message + caplog.clear() + malformed_message = {"type": "whitelist", "data": {"pair": "BTC/USDT"}} + patched_emc.handle_producer_message(test_producer, malformed_message) + + assert log_has("Received message of type `whitelist` from `test`", caplog) + assert not log_has("Consumed message from `test` of type `RPCMessageType.WHITELIST`", caplog) + + malformed_message = { + "type": "analyzed_df", + "data": { + "key": "BTC/USDT", + "df": ohlcv_history, + "la": datetime.now(timezone.utc) + } + } + patched_emc.handle_producer_message(test_producer, malformed_message) + + assert log_has("Received message of type `analyzed_df` from `test`", caplog) + assert not log_has("Consumed message from `test` of type `RPCMessageType.ANALYZED_DF`", caplog) From c5d031733b271e51edbc54a5f2880f724ace7924 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 13:50:36 -0600 Subject: [PATCH 223/437] remove old param in test fixture --- tests/rpc/test_rpc_emc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index f33e80018..d134a9eb1 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -11,7 +11,7 @@ from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer from tests.conftest import log_has, log_has_re, log_has_when -@pytest.fixture(autouse=True) +@pytest.fixture def patched_emc(default_conf, mocker): default_conf.update({ "external_message_consumer": { From 5a0cfee27e8de330d00168b6de86a2ac84e0ed7f Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sat, 10 Sep 2022 22:16:49 +0200 Subject: [PATCH 224/437] allow user to multithread jobs (advanced users only) --- .../freqai/base_models/FreqaiMultiOutputRegressor.py | 10 ---------- .../prediction_models/CatboostRegressorMultiTarget.py | 3 +++ .../prediction_models/LightGBMRegressorMultiTarget.py | 6 +++--- .../prediction_models/XGBoostRegressorMultiTarget.py | 3 +++ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py index aa5dbe629..a9db81e31 100644 --- a/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py +++ b/freqtrade/freqai/base_models/FreqaiMultiOutputRegressor.py @@ -36,9 +36,6 @@ class FreqaiMultiOutputRegressor(MultiOutputRegressor): y = self._validate_data(X="no_validation", y=y, multi_output=True) - # if is_classifier(self): - # check_classification_targets(y) - if y.ndim == 1: raise ValueError( "y must have at least two dimensions for " @@ -50,19 +47,12 @@ class FreqaiMultiOutputRegressor(MultiOutputRegressor): ): raise ValueError("Underlying estimator does not support sample weights.") - # fit_params_validated = _check_fit_params(X, fit_params) - if not fit_params: fit_params = [None] * y.shape[1] - # if not init_models: - # init_models = [None] * y.shape[1] - self.estimators_ = Parallel(n_jobs=self.n_jobs)( delayed(_fit_estimator)( self.estimator, X, y[:, i], sample_weight, **fit_params[i] - # init_model=init_models[i], eval_set=eval_sets[i], - # **fit_params_validated ) for i in range(y.shape[1]) ) diff --git a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py index a376b2c33..7fa4e293e 100644 --- a/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/CatboostRegressorMultiTarget.py @@ -60,6 +60,9 @@ class CatboostRegressorMultiTarget(BaseRegressionModel): {'eval_set': eval_sets[i], 'init_model': init_models[i]}) model = FreqaiMultiOutputRegressor(estimator=cbr) + thread_training = self.freqai_info.get('multitarget_parallel_training', False) + if thread_training: + model.n_jobs = y.shape[1] model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) return model diff --git a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py index 7a9b5c36a..37c6bb186 100644 --- a/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/LightGBMRegressorMultiTarget.py @@ -56,9 +56,9 @@ class LightGBMRegressorMultiTarget(BaseRegressionModel): 'init_model': init_models[i]}) model = FreqaiMultiOutputRegressor(estimator=lgb) + thread_training = self.freqai_info.get('multitarget_parallel_training', False) + if thread_training: + model.n_jobs = y.shape[1] model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) - # model = FreqaiMultiOutputRegressor(estimator=lgb) - # model.fit(X=X, y=y, sample_weight=sample_weight, init_models=init_models, - # eval_sets=eval_sets, eval_sample_weight=eval_weights) return model diff --git a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py index 38c478c0b..920745ec9 100644 --- a/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py +++ b/freqtrade/freqai/prediction_models/XGBoostRegressorMultiTarget.py @@ -55,6 +55,9 @@ class XGBoostRegressorMultiTarget(BaseRegressionModel): 'xgb_model': init_models[i]}) model = FreqaiMultiOutputRegressor(estimator=xgb) + thread_training = self.freqai_info.get('multitarget_parallel_training', False) + if thread_training: + model.n_jobs = y.shape[1] model.fit(X=X, y=y, sample_weight=sample_weight, fit_params=fit_params) return model From 2afd5c202c1f906dcd5c04187caa5a67b0337dde Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 14:29:15 -0600 Subject: [PATCH 225/437] update message parsing, tests --- freqtrade/rpc/external_message_consumer.py | 10 +++---- tests/rpc/test_rpc_emc.py | 34 ++++++++++++++++------ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index c571ac510..1d917577a 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -264,10 +264,6 @@ class ExternalMessageConsumer: logger.error(f"Invalid message from `{producer_name}`: {e}") return - # We shouldn't get empty messages - if producer_message.data is None: - return - logger.info(f"Received message of type `{producer_message.type}` from `{producer_name}`") message_handler = self._message_handlers.get(producer_message.type) @@ -282,7 +278,8 @@ class ExternalMessageConsumer: try: # Validate the message message = WSWhitelistMessage.parse_obj(message) - except ValidationError: + except ValidationError as e: + logger.error(f"Invalid message from `{producer_name}`: {e}") return # Add the pairlist data to the DataProvider @@ -293,7 +290,8 @@ class ExternalMessageConsumer: def _consume_analyzed_df_message(self, producer_name: str, message: Any): try: message = WSAnalyzedDFMessage.parse_obj(message) - except ValidationError: + except ValidationError as e: + logger.error(f"Invalid message from `{producer_name}`: {e}") return key = message.data.key diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index d134a9eb1..9b14c2039 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -82,16 +82,20 @@ def test_emc_init(patched_emc, default_conf, mocker, caplog): assert str(exc.value) == "You must specify at least 1 Producer to connect to." +# Parametrize this? def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): test_producer = {"name": "test", "url": "ws://test", "ws_token": "test"} + producer_name = test_producer['name'] + caplog.set_level(logging.DEBUG) # Test handle whitelist message whitelist_message = {"type": "whitelist", "data": ["BTC/USDT"]} patched_emc.handle_producer_message(test_producer, whitelist_message) - assert log_has("Received message of type `whitelist` from `test`", caplog) - assert log_has("Consumed message from `test` of type `RPCMessageType.WHITELIST`", caplog) + assert log_has(f"Received message of type `whitelist` from `{producer_name}`", caplog) + assert log_has( + f"Consumed message from `{producer_name}` of type `RPCMessageType.WHITELIST`", caplog) # Test handle analyzed_df message df_message = { @@ -104,8 +108,9 @@ def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): } patched_emc.handle_producer_message(test_producer, df_message) - assert log_has("Received message of type `analyzed_df` from `test`", caplog) - assert log_has("Consumed message from `test` of type `RPCMessageType.ANALYZED_DF`", caplog) + assert log_has(f"Received message of type `analyzed_df` from `{producer_name}`", caplog) + assert log_has( + f"Consumed message from `{producer_name}` of type `RPCMessageType.ANALYZED_DF`", caplog) # Test unhandled message unhandled_message = {"type": "status", "data": "RUNNING"} @@ -113,13 +118,12 @@ def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): assert log_has_re(r"Received unhandled message\: .*", caplog) - # Test malformed message + # Test malformed messages caplog.clear() malformed_message = {"type": "whitelist", "data": {"pair": "BTC/USDT"}} patched_emc.handle_producer_message(test_producer, malformed_message) - assert log_has("Received message of type `whitelist` from `test`", caplog) - assert not log_has("Consumed message from `test` of type `RPCMessageType.WHITELIST`", caplog) + assert log_has_re(r"Invalid message .+", caplog) malformed_message = { "type": "analyzed_df", @@ -131,5 +135,17 @@ def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): } patched_emc.handle_producer_message(test_producer, malformed_message) - assert log_has("Received message of type `analyzed_df` from `test`", caplog) - assert not log_has("Consumed message from `test` of type `RPCMessageType.ANALYZED_DF`", caplog) + assert log_has(f"Received message of type `analyzed_df` from `{producer_name}`", caplog) + assert log_has_re(r"Invalid message .+", caplog) + + caplog.clear() + malformed_message = {"some": "stuff"} + patched_emc.handle_producer_message(test_producer, malformed_message) + + assert log_has_re(r"Invalid message .+", caplog) + + caplog.clear() + malformed_message = {"type": "whitelist", "data": None} + patched_emc.handle_producer_message(test_producer, malformed_message) + + assert log_has_re(r"Invalid message .+", caplog) From 0bc18ea33c4004939acb62997a8e253b5ba2c08e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 15:12:18 -0600 Subject: [PATCH 226/437] call websocket close in channel close --- freqtrade/rpc/api_server/ws/channel.py | 1 + freqtrade/rpc/api_server/ws/proxy.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index cffe3092d..f4a0da47b 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -71,6 +71,7 @@ class WebSocketChannel: Close the WebSocketChannel """ + await self._websocket.close() self._closed = True def is_closed(self) -> bool: diff --git a/freqtrade/rpc/api_server/ws/proxy.py b/freqtrade/rpc/api_server/ws/proxy.py index da3e04887..2e5a59f05 100644 --- a/freqtrade/rpc/api_server/ws/proxy.py +++ b/freqtrade/rpc/api_server/ws/proxy.py @@ -56,8 +56,10 @@ class WebSocketProxy: Close the websocket connection, only supported by FastAPI WebSockets """ if hasattr(self._websocket, "close"): - return await self._websocket.close(code) - pass + try: + return await self._websocket.close(code) + except RuntimeError: + pass async def accept(self): """ @@ -65,4 +67,3 @@ class WebSocketProxy: """ if hasattr(self._websocket, "accept"): return await self._websocket.accept() - pass From 9a1a4dfb5b82677db48bbab6dd1861ed3a238172 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 16:08:05 -0600 Subject: [PATCH 227/437] more ws endpoint tests --- tests/rpc/test_rpc_apiserver.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index a7774c204..2f25f442b 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -1714,6 +1714,38 @@ def test_api_ws_subscribe(botclient, mocker): assert sub_mock.call_count == 1 +def test_api_ws_requests(botclient, mocker, caplog): + caplog.set_level(logging.DEBUG) + + ftbot, client = botclient + ws_url = f"/api/v1/message/ws?token={_TEST_WS_TOKEN}" + + # Test whitelist request + with client.websocket_connect(ws_url) as ws: + ws.send_json({"type": "whitelist", "data": None}) + response = ws.receive_json() + + assert log_has_re(r"Request of type whitelist from.+", caplog) + assert response['type'] == "whitelist" + + # Test analyzed_df request + with client.websocket_connect(ws_url) as ws: + ws.send_json({"type": "analyzed_df", "data": {}}) + response = ws.receive_json() + + assert log_has_re(r"Request of type analyzed_df from.+", caplog) + assert response['type'] == "analyzed_df" + + caplog.clear() + # Test analyzed_df request with data + with client.websocket_connect(ws_url) as ws: + ws.send_json({"type": "analyzed_df", "data": {"limit": 100}}) + response = ws.receive_json() + + assert log_has_re(r"Request of type analyzed_df from.+", caplog) + assert response['type'] == "analyzed_df" + + def test_api_ws_send_msg(default_conf, mocker, caplog): try: caplog.set_level(logging.DEBUG) From ed4ba8801f039401231bb3e6a6cc3f018de41f33 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sat, 10 Sep 2022 23:57:17 -0600 Subject: [PATCH 228/437] more emc tests --- freqtrade/rpc/external_message_consumer.py | 5 + tests/rpc/test_rpc_emc.py | 177 ++++++++++++++++++++- 2 files changed, 181 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 1d917577a..89fa90c8e 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -203,8 +203,13 @@ class ExternalMessageConsumer: continue + except websockets.exceptions.ConnectionClosedOK: + # Successfully closed, just end + return + except Exception as e: # An unforseen error has occurred, log and stop + logger.error("Unexpected error has occurred:") logger.exception(e) break diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index 9b14c2039..a074334c5 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -1,16 +1,26 @@ """ Unit test file for rpc/external_message_consumer.py """ +import asyncio +import functools +import json import logging from datetime import datetime, timezone +from unittest.mock import MagicMock import pytest +import websockets from freqtrade.data.dataprovider import DataProvider from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer from tests.conftest import log_has, log_has_re, log_has_when +_TEST_WS_TOKEN = "secret_Ws_t0ken" +_TEST_WS_HOST = "localhost" +_TEST_WS_PORT = 9989 + + @pytest.fixture def patched_emc(default_conf, mocker): default_conf.update({ @@ -20,7 +30,7 @@ def patched_emc(default_conf, mocker): { "name": "default", "url": "ws://127.0.0.1:8080/api/v1/message/ws", - "ws_token": "secret_Ws_t0ken" + "ws_token": _TEST_WS_TOKEN } ] } @@ -149,3 +159,168 @@ def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): patched_emc.handle_producer_message(test_producer, malformed_message) assert log_has_re(r"Invalid message .+", caplog) + + +async def test_emc_create_connection_success(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": f"ws://{_TEST_WS_HOST}:{_TEST_WS_PORT}/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 60, + "ping_timeout": 60, + "sleep_timeout": 60 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + test_producer = default_conf['external_message_consumer']['producers'][0] + lock = asyncio.Lock() + + async def eat(websocket): + pass + + try: + async with websockets.serve(eat, _TEST_WS_HOST, _TEST_WS_PORT): + emc._running = True + await emc._create_connection(test_producer, lock) + emc._running = False + + assert log_has_re(r"Producer connection success.+", caplog) + finally: + emc.shutdown() + + +async def test_emc_create_connection_invalid(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": "ws://localhost:8080/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 60, + "ping_timeout": 60, + "sleep_timeout": 60 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + + lock = asyncio.Lock() + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + test_producer = default_conf['external_message_consumer']['producers'][0] + + try: + # Test invalid URL + test_producer['url'] = "tcp://localhost:8080/api/v1/message/ws" + emc._running = True + await emc._create_connection(test_producer, lock) + emc._running = False + + assert log_has_re(r".+is an invalid WebSocket URL.+", caplog) + finally: + emc.shutdown() + + +async def test_emc_create_connection_error(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": "ws://localhost:8080/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 60, + "ping_timeout": 60, + "sleep_timeout": 60 + } + }) + + # Test unexpected error + mocker.patch('websockets.connect', side_effect=RuntimeError) + + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + try: + await asyncio.sleep(1) + assert log_has("Unexpected error has occurred:", caplog) + finally: + emc.shutdown() + + +async def test_emc_receive_messages(default_conf, caplog, mocker): + """ + Test ExternalMessageConsumer._receive_messages + + Instantiates a patched ExternalMessageConsumer, creates a dummy websocket server, + and listens to the generated messages from the server for 1 second, then checks logs + """ + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": f"ws://{_TEST_WS_HOST}:{_TEST_WS_PORT}/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 60, + "ping_timeout": 60, + "sleep_timeout": 60 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + + lock = asyncio.Lock() + test_producer = default_conf['external_message_consumer']['producers'][0] + + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + # Dummy generator + async def generate_messages(websocket): + try: + for i in range(3): + message = json.dumps({"type": "whitelist", "data": ["BTC/USDT"]}) + await websocket.send(message) + await asyncio.sleep(1) + except websockets.exceptions.ConnectionClosedOK: + return + + loop = asyncio.get_event_loop() + def change_running(emc): emc._running = not emc._running + + try: + # Start the dummy websocket server + async with websockets.serve(generate_messages, _TEST_WS_HOST, _TEST_WS_PORT): + # Change running to True, and call change_running in 1 second + emc._running = True + loop.call_later(1, functools.partial(change_running, emc=emc)) + # Create the connection that receives messages + await emc._create_connection(test_producer, lock) + + assert log_has_re(r"Received message of type `whitelist`.+", caplog) + finally: + emc.shutdown() From 0a8b7686d68c6eae10768eff8f1e035deb080630 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 11 Sep 2022 00:50:18 -0600 Subject: [PATCH 229/437] reworked emc tests --- tests/rpc/test_rpc_emc.py | 183 ++++++++++++++++++++++++++++++++------ 1 file changed, 155 insertions(+), 28 deletions(-) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index a074334c5..e29419102 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -3,7 +3,6 @@ Unit test file for rpc/external_message_consumer.py """ import asyncio import functools -import json import logging from datetime import datetime, timezone from unittest.mock import MagicMock @@ -220,10 +219,11 @@ async def test_emc_create_connection_invalid(default_conf, caplog, mocker): mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', MagicMock()) + test_producer = default_conf['external_message_consumer']['producers'][0] lock = asyncio.Lock() + dp = DataProvider(default_conf, None, None, None) emc = ExternalMessageConsumer(default_conf, dp) - test_producer = default_conf['external_message_consumer']['producers'][0] try: # Test invalid URL @@ -267,13 +267,7 @@ async def test_emc_create_connection_error(default_conf, caplog, mocker): emc.shutdown() -async def test_emc_receive_messages(default_conf, caplog, mocker): - """ - Test ExternalMessageConsumer._receive_messages - - Instantiates a patched ExternalMessageConsumer, creates a dummy websocket server, - and listens to the generated messages from the server for 1 second, then checks logs - """ +async def test_emc_receive_messages_valid(default_conf, caplog, mocker): default_conf.update({ "external_message_consumer": { "enabled": True, @@ -284,9 +278,9 @@ async def test_emc_receive_messages(default_conf, caplog, mocker): "ws_token": _TEST_WS_TOKEN } ], - "wait_timeout": 60, + "wait_timeout": 1, "ping_timeout": 60, - "sleep_timeout": 60 + "sleep_time": 60 } }) @@ -299,28 +293,161 @@ async def test_emc_receive_messages(default_conf, caplog, mocker): dp = DataProvider(default_conf, None, None, None) emc = ExternalMessageConsumer(default_conf, dp) - # Dummy generator - async def generate_messages(websocket): - try: - for i in range(3): - message = json.dumps({"type": "whitelist", "data": ["BTC/USDT"]}) - await websocket.send(message) - await asyncio.sleep(1) - except websockets.exceptions.ConnectionClosedOK: - return - loop = asyncio.get_event_loop() def change_running(emc): emc._running = not emc._running + class TestChannel: + async def recv(self, *args, **kwargs): + return {"type": "whitelist", "data": ["BTC/USDT"]} + + async def ping(self, *args, **kwargs): + return asyncio.Future() + try: - # Start the dummy websocket server - async with websockets.serve(generate_messages, _TEST_WS_HOST, _TEST_WS_PORT): - # Change running to True, and call change_running in 1 second - emc._running = True - loop.call_later(1, functools.partial(change_running, emc=emc)) - # Create the connection that receives messages - await emc._create_connection(test_producer, lock) + change_running(emc) + loop.call_soon(functools.partial(change_running, emc=emc)) + await emc._receive_messages(TestChannel(), test_producer, lock) assert log_has_re(r"Received message of type `whitelist`.+", caplog) finally: emc.shutdown() + + +async def test_emc_receive_messages_invalid(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": f"ws://{_TEST_WS_HOST}:{_TEST_WS_PORT}/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 1, + "ping_timeout": 60, + "sleep_time": 60 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + + lock = asyncio.Lock() + test_producer = default_conf['external_message_consumer']['producers'][0] + + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + loop = asyncio.get_event_loop() + def change_running(emc): emc._running = not emc._running + + class TestChannel: + async def recv(self, *args, **kwargs): + return {"type": ["BTC/USDT"]} + + async def ping(self, *args, **kwargs): + return asyncio.Future() + + try: + change_running(emc) + loop.call_soon(functools.partial(change_running, emc=emc)) + await emc._receive_messages(TestChannel(), test_producer, lock) + + assert log_has_re(r"Invalid message from.+", caplog) + finally: + emc.shutdown() + + +async def test_emc_receive_messages_timeout(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": f"ws://{_TEST_WS_HOST}:{_TEST_WS_PORT}/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 1, + "ping_timeout": 1, + "sleep_time": 1 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + + lock = asyncio.Lock() + test_producer = default_conf['external_message_consumer']['producers'][0] + + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + loop = asyncio.get_event_loop() + def change_running(emc): emc._running = not emc._running + + class TestChannel: + async def recv(self, *args, **kwargs): + await asyncio.sleep(10) + + async def ping(self, *args, **kwargs): + return asyncio.Future() + + try: + change_running(emc) + loop.call_soon(functools.partial(change_running, emc=emc)) + await emc._receive_messages(TestChannel(), test_producer, lock) + + assert log_has_re(r"Ping error.+", caplog) + finally: + emc.shutdown() + + +async def test_emc_receive_messages_handle_error(default_conf, caplog, mocker): + default_conf.update({ + "external_message_consumer": { + "enabled": True, + "producers": [ + { + "name": "default", + "url": f"ws://{_TEST_WS_HOST}:{_TEST_WS_PORT}/api/v1/message/ws", + "ws_token": _TEST_WS_TOKEN + } + ], + "wait_timeout": 1, + "ping_timeout": 1, + "sleep_time": 1 + } + }) + + mocker.patch('freqtrade.rpc.external_message_consumer.ExternalMessageConsumer.start', + MagicMock()) + + lock = asyncio.Lock() + test_producer = default_conf['external_message_consumer']['producers'][0] + + dp = DataProvider(default_conf, None, None, None) + emc = ExternalMessageConsumer(default_conf, dp) + + emc.handle_producer_message = MagicMock(side_effect=Exception) + + loop = asyncio.get_event_loop() + def change_running(emc): emc._running = not emc._running + + class TestChannel: + async def recv(self, *args, **kwargs): + return {"type": "whitelist", "data": ["BTC/USDT"]} + + async def ping(self, *args, **kwargs): + return asyncio.Future() + + try: + change_running(emc) + loop.call_soon(functools.partial(change_running, emc=emc)) + await emc._receive_messages(TestChannel(), test_producer, lock) + + assert log_has_re(r"Error handling producer message.+", caplog) + finally: + emc.shutdown() From d598f4334efb965605f7af0918d358b9d89ec008 Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sun, 11 Sep 2022 13:28:14 +0200 Subject: [PATCH 230/437] add search share button to website --- mkdocs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index 2e5e0c8c9..257db7867 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,6 +49,8 @@ theme: logo: "images/logo.png" favicon: "images/logo.png" custom_dir: "docs/overrides" + features: + - search.share palette: - scheme: default primary: "blue grey" From 4476b5a7f4ab0183197a8f0479b9e3ef0d0e7937 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 08:58:40 +0200 Subject: [PATCH 231/437] add user_data arg to test-pairlist --- docs/utils.md | 4 +++- freqtrade/commands/arguments.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/utils.md b/docs/utils.md index 5646365e4..174fa0527 100644 --- a/docs/utils.md +++ b/docs/utils.md @@ -525,12 +525,14 @@ Requires a configuration with specified `pairlists` attribute. Can be used to generate static pairlists to be used during backtesting / hyperopt. ``` -usage: freqtrade test-pairlist [-h] [-v] [-c PATH] +usage: freqtrade test-pairlist [-h] [--userdir PATH] [-v] [-c PATH] [--quote QUOTE_CURRENCY [QUOTE_CURRENCY ...]] [-1] [--print-json] [--exchange EXCHANGE] optional arguments: -h, --help show this help message and exit + --userdir PATH, --user-data-dir PATH + Path to userdata directory. -v, --verbose Verbose mode (-vv for more, -vvv to get all messages). -c PATH, --config PATH Specify configuration file (default: diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index 37ce17f21..2835f8582 100644 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -53,8 +53,8 @@ ARGS_LIST_PAIRS = ["exchange", "print_list", "list_pairs_print_json", "print_one "print_csv", "base_currencies", "quote_currencies", "list_pairs_all", "trading_mode"] -ARGS_TEST_PAIRLIST = ["verbosity", "config", "quote_currencies", "print_one_column", - "list_pairs_print_json", "exchange"] +ARGS_TEST_PAIRLIST = ["user_data_dir", "verbosity", "config", "quote_currencies", + "print_one_column", "list_pairs_print_json", "exchange"] ARGS_CREATE_USERDIR = ["user_data_dir", "reset"] From ccc70a21f274a55b1f68b15a6e9ffbfb39844a5e Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 09:02:06 +0200 Subject: [PATCH 232/437] Update pairs_file cli argument description --- docs/data-download.md | 10 +++++----- freqtrade/commands/cli_options.py | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/data-download.md b/docs/data-download.md index b72e7f337..2b76d4f74 100644 --- a/docs/data-download.md +++ b/docs/data-download.md @@ -25,8 +25,7 @@ usage: freqtrade download-data [-h] [-v] [--logfile FILE] [-V] [-c PATH] [--include-inactive-pairs] [--timerange TIMERANGE] [--dl-trades] [--exchange EXCHANGE] - [-t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...]] - [--erase] + [-t TIMEFRAMES [TIMEFRAMES ...]] [--erase] [--data-format-ohlcv {json,jsongz,hdf5}] [--data-format-trades {json,jsongz,hdf5}] [--trading-mode {spot,margin,futures}] @@ -37,7 +36,8 @@ optional arguments: -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...] Limit command to these pairs. Pairs are space- separated. - --pairs-file FILE File containing a list of pairs to download. + --pairs-file FILE File containing a list of pairs. Takes precedence over + --pairs or pairs configured in the configuration. --days INT Download data for given number of days. --new-pairs-days INT Download data of new pairs for given number of days. Default: `None`. @@ -50,7 +50,7 @@ optional arguments: as --timeframes/-t. --exchange EXCHANGE Exchange name (default: `bittrex`). Only valid if no config is provided. - -t {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...], --timeframes {1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} [{1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,2w,1M,1y} ...] + -t TIMEFRAMES [TIMEFRAMES ...], --timeframes TIMEFRAMES [TIMEFRAMES ...] Specify which tickers to download. Space-separated list. Default: `1m 5m`. --erase Clean all existing data for the selected @@ -61,7 +61,7 @@ optional arguments: --data-format-trades {json,jsongz,hdf5} Storage format for downloaded trades data. (default: `jsongz`). - --trading-mode {spot,margin,futures} + --trading-mode {spot,margin,futures}, --tradingmode {spot,margin,futures} Select Trading mode --prepend Allow data prepending. (Data-appending is disabled) diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 4240a8014..9aacbcc97 100644 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -393,7 +393,8 @@ AVAILABLE_CLI_OPTIONS = { # Download data "pairs_file": Arg( '--pairs-file', - help='File containing a list of pairs to download.', + help='File containing a list of pairs. ' + 'Takes precedence over --pairs or pairs configured in the configuration.', metavar='FILE', ), "days": Arg( From 9c8c7a03a160cdaad21b85d472879e5d5649d269 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 11:24:01 +0200 Subject: [PATCH 233/437] Improve typehint --- freqtrade/data/dataprovider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 4151b7419..e639b3ae7 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -86,7 +86,7 @@ class DataProvider: """ _candle_type = CandleType.from_string( candle_type) if candle_type != '' else self._config['candle_type_def'] - saved_pair = (pair, str(timeframe), _candle_type) + saved_pair: PairWithTimeframe = (pair, str(timeframe), _candle_type) if saved_pair not in self.__cached_pairs_backtesting: timerange = TimeRange.parse_timerange(None if self._config.get( 'timerange') is None else str(self._config.get('timerange'))) From a48923c0e43eda833aced9afc8a13e98caa29c8f Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 11:38:36 +0200 Subject: [PATCH 234/437] Extract widget colorization to separate function --- freqtrade/optimize/hyperopt.py | 46 ++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 3becf857f..749e608d3 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -410,7 +410,7 @@ class Hyperopt: model_queue_size=SKOPT_MODEL_QUEUE_SIZE, ) - def run_optimizer_parallel(self, parallel, asked, i) -> List: + def run_optimizer_parallel(self, parallel: Parallel, asked: List[List], i: int) -> List: return parallel(delayed( wrap_non_picklable_objects(self.generate_optimizer))(v, i) for v in asked) @@ -491,6 +491,29 @@ class Hyperopt: else: return self.opt.ask(n_points=n_points), [False for _ in range(n_points)] + def get_progressbar_widgets(self): + if self.print_colorized: + widgets = [ + ' [Epoch ', progressbar.Counter(), ' of ', str(self.total_epochs), + ' (', progressbar.Percentage(), ')] ', + progressbar.Bar(marker=progressbar.AnimatedMarker( + fill='\N{FULL BLOCK}', + fill_wrap=Fore.GREEN + '{}' + Fore.RESET, + marker_wrap=Style.BRIGHT + '{}' + Style.RESET_ALL, + )), + ' [', progressbar.ETA(), ', ', progressbar.Timer(), ']', + ] + else: + widgets = [ + ' [Epoch ', progressbar.Counter(), ' of ', str(self.total_epochs), + ' (', progressbar.Percentage(), ')] ', + progressbar.Bar(marker=progressbar.AnimatedMarker( + fill='\N{FULL BLOCK}', + )), + ' [', progressbar.ETA(), ', ', progressbar.Timer(), ']', + ] + return widgets + def start(self) -> None: self.random_state = self._set_random_state(self.config.get('hyperopt_random_state')) logger.info(f"Using optimizer random state: {self.random_state}") @@ -526,26 +549,7 @@ class Hyperopt: logger.info(f'Effective number of parallel workers used: {jobs}') # Define progressbar - if self.print_colorized: - widgets = [ - ' [Epoch ', progressbar.Counter(), ' of ', str(self.total_epochs), - ' (', progressbar.Percentage(), ')] ', - progressbar.Bar(marker=progressbar.AnimatedMarker( - fill='\N{FULL BLOCK}', - fill_wrap=Fore.GREEN + '{}' + Fore.RESET, - marker_wrap=Style.BRIGHT + '{}' + Style.RESET_ALL, - )), - ' [', progressbar.ETA(), ', ', progressbar.Timer(), ']', - ] - else: - widgets = [ - ' [Epoch ', progressbar.Counter(), ' of ', str(self.total_epochs), - ' (', progressbar.Percentage(), ')] ', - progressbar.Bar(marker=progressbar.AnimatedMarker( - fill='\N{FULL BLOCK}', - )), - ' [', progressbar.ETA(), ', ', progressbar.Timer(), ']', - ] + widgets = self.get_progressbar_widgets() with progressbar.ProgressBar( max_value=self.total_epochs, redirect_stdout=False, redirect_stderr=False, widgets=widgets From 32e13d65c3bbba091eac4ae16259adaaf483a02a Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 11:54:31 +0200 Subject: [PATCH 235/437] Refactor hyperopt to extract evaluate_result --- freqtrade/optimize/hyperopt.py | 49 ++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 749e608d3..3a117f356 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -290,7 +290,7 @@ class Hyperopt: # noinspection PyProtectedMember attr.value = params_dict[attr_name] - def generate_optimizer(self, raw_params: List[Any], iteration=None) -> Dict: + def generate_optimizer(self, raw_params: List[Any], iteration=None) -> Dict[str, Any]: """ Used Optimize function. Called once per epoch to optimize whatever is configured. @@ -410,7 +410,9 @@ class Hyperopt: model_queue_size=SKOPT_MODEL_QUEUE_SIZE, ) - def run_optimizer_parallel(self, parallel: Parallel, asked: List[List], i: int) -> List: + def run_optimizer_parallel( + self, parallel: Parallel, asked: List[List], i: int) -> List[Dict[str, Any]]: + """ Start optimizer in a parallel way """ return parallel(delayed( wrap_non_picklable_objects(self.generate_optimizer))(v, i) for v in asked) @@ -514,6 +516,30 @@ class Hyperopt: ] return widgets + def evaluate_result(self, val: Dict[str, Any], current: int, is_random: bool): + """ + Evaluate results returned from generate_optimizer + """ + val['current_epoch'] = current + val['is_initial_point'] = current <= INITIAL_POINTS + + logger.debug("Optimizer epoch evaluated: %s", val) + + is_best = HyperoptTools.is_best_loss(val, self.current_best_loss) + # This value is assigned here and not in the optimization method + # to keep proper order in the list of results. That's because + # evaluations can take different time. Here they are aligned in the + # order they will be shown to the user. + val['is_best'] = is_best + val['is_random'] = is_random + self.print_results(val) + + if is_best: + self.current_best_loss = val['loss'] + self.current_best_epoch = val + + self._save_result(val) + def start(self) -> None: self.random_state = self._set_random_state(self.config.get('hyperopt_random_state')) logger.info(f"Using optimizer random state: {self.random_state}") @@ -569,25 +595,8 @@ class Hyperopt: for j, val in enumerate(f_val): # Use human-friendly indexes here (starting from 1) current = i * jobs + j + 1 - val['current_epoch'] = current - val['is_initial_point'] = current <= INITIAL_POINTS - logger.debug(f"Optimizer epoch evaluated: {val}") - - is_best = HyperoptTools.is_best_loss(val, self.current_best_loss) - # This value is assigned here and not in the optimization method - # to keep proper order in the list of results. That's because - # evaluations can take different time. Here they are aligned in the - # order they will be shown to the user. - val['is_best'] = is_best - val['is_random'] = is_random[j] - self.print_results(val) - - if is_best: - self.current_best_loss = val['loss'] - self.current_best_epoch = val - - self._save_result(val) + self.evaluate_result(val, current, is_random[j]) pbar.update(current) From 78cd46ecd55e1042ef5f20f10ebd7e0c269d6ca0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 11:56:17 +0200 Subject: [PATCH 236/437] hyperopt Remove unnecessary arguments --- freqtrade/optimize/hyperopt.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 3a117f356..76fc84609 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -290,7 +290,7 @@ class Hyperopt: # noinspection PyProtectedMember attr.value = params_dict[attr_name] - def generate_optimizer(self, raw_params: List[Any], iteration=None) -> Dict[str, Any]: + def generate_optimizer(self, raw_params: List[Any]) -> Dict[str, Any]: """ Used Optimize function. Called once per epoch to optimize whatever is configured. @@ -411,10 +411,10 @@ class Hyperopt: ) def run_optimizer_parallel( - self, parallel: Parallel, asked: List[List], i: int) -> List[Dict[str, Any]]: + self, parallel: Parallel, asked: List[List]) -> List[Dict[str, Any]]: """ Start optimizer in a parallel way """ return parallel(delayed( - wrap_non_picklable_objects(self.generate_optimizer))(v, i) for v in asked) + wrap_non_picklable_objects(self.generate_optimizer))(v) for v in asked) def _set_random_state(self, random_state: Optional[int]) -> int: return random_state or random.randint(1, 2**16 - 1) @@ -588,7 +588,7 @@ class Hyperopt: current_jobs = jobs - n_rest if n_rest > 0 else jobs asked, is_random = self.get_asked_points(n_points=current_jobs) - f_val = self.run_optimizer_parallel(parallel, asked, i) + f_val = self.run_optimizer_parallel(parallel, asked) self.opt.tell(asked, [v['loss'] for v in f_val]) # Calculate progressbar outputs From 68a900a9b7325b0a2b0e1c84f0c694fa862104bc Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sun, 11 Sep 2022 17:29:14 +0200 Subject: [PATCH 237/437] reorganize freqai docs for easier reading, add detailed file structure description --- docs/freqai-configuration.md | 283 +++++++++++ docs/freqai-data-handling.md | 129 +++++ docs/freqai-feature-engineering.md | 274 +++++++++++ docs/freqai-running.md | 104 ++++ docs/freqai.md | 760 +---------------------------- mkdocs.yml | 7 +- 6 files changed, 816 insertions(+), 741 deletions(-) create mode 100644 docs/freqai-configuration.md create mode 100644 docs/freqai-data-handling.md create mode 100644 docs/freqai-feature-engineering.md create mode 100644 docs/freqai-running.md diff --git a/docs/freqai-configuration.md b/docs/freqai-configuration.md new file mode 100644 index 000000000..5190c59c9 --- /dev/null +++ b/docs/freqai-configuration.md @@ -0,0 +1,283 @@ +# Configuration + +## Setting up the configuration file + +The user interface is isolated to the typical Freqtrade config file. Although there are plenty of additional parameters that a user can choose from, as highlighted in the [parameter table](#parameter-table), a FreqAI config must at minimum include the following parameters (the example inputs are not requires): + +```json + "freqai": { + "enabled": true, + "purge_old_models": true, + "train_period_days": 30, + "backtest_period_days": 7, + "identifier" : "unique-id", + "feature_parameters" : { + "include_timeframes": ["5m","15m","4h"], + "include_corr_pairlist": [ + "ETH/USD", + "LINK/USD", + "BNB/USD" + ], + "label_period_candles": 24, + "include_shifted_candles": 2, + "indicator_periods_candles": [10, 20] + }, + "data_split_parameters" : { + "test_size": 0.25 + }, + "model_training_parameters" : { + "n_estimators": 100 + }, + } +``` + +## Building a FreqAI strategy + +The FreqAI strategy requires the user to include the following lines of code in the standard Freqtrade strategy: + +```python + # user should define the maximum startup candle count (the largest number of candles + # passed to any single indicator) + startup_candle_count: int = 20 + + def informative_pairs(self): + whitelist_pairs = self.dp.current_whitelist() + corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] + informative_pairs = [] + for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]: + for pair in whitelist_pairs: + informative_pairs.append((pair, tf)) + for pair in corr_pairs: + if pair in whitelist_pairs: + continue # avoid duplication + informative_pairs.append((pair, tf)) + return informative_pairs + + def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + + # the model will return all labels created by user in `populate_any_indicators` + # (& appended targets), an indication of whether or not the prediction should be accepted, + # the target mean/std values for each of the labels created by user in + # `populate_any_indicators()` for each training period. + + dataframe = self.freqai.start(dataframe, metadata, self) + + return dataframe + + def populate_any_indicators( + self, pair, df, tf, informative=None, set_generalized_indicators=False + ): + """ + Function designed to automatically generate, name and merge features + from user indicated timeframes in the configuration file. User controls the indicators + passed to the training/prediction by prepending indicators with `'%-' + coin ` + (see convention below). I.e. user should not prepend any supporting metrics + (e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the + model. + :param pair: pair to be used as informative + :param df: strategy dataframe which will receive merges from informatives + :param tf: timeframe of the dataframe which will modify the feature names + :param informative: the dataframe associated with the informative pair + :param coin: the name of the coin which will modify the feature names. + """ + + coin = pair.split('/')[0] + + if informative is None: + informative = self.dp.get_pair_dataframe(pair, tf) + + # first loop is automatically duplicating indicators for time periods + for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]: + t = int(t) + informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) + informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) + informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) + + indicators = [col for col in informative if col.startswith("%")] + # This loop duplicates and shifts all indicators to add a sense of recency to data + for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): + if n == 0: + continue + informative_shift = informative[indicators].shift(n) + informative_shift = informative_shift.add_suffix("_shift-" + str(n)) + informative = pd.concat((informative, informative_shift), axis=1) + + df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True) + skip_columns = [ + (s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"] + ] + df = df.drop(columns=skip_columns) + + # Add generalized indicators here (because in live, it will call this + # function to populate indicators during training). Notice how we ensure not to + # add them multiple times + if set_generalized_indicators: + + # user adds targets here by prepending them with &- (see convention below) + # If user wishes to use multiple targets, a multioutput prediction model + # needs to be used such as templates/CatboostPredictionMultiModel.py + df["&-s_close"] = ( + df["close"] + .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + .mean() + / df["close"] + - 1 + ) + + return df + + +``` + +Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](freqai-feature_engineering.md#feature-engineering)) and labels ([more information](freqai-running.md#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. + +Another structure to consider is the location of the labels at the bottom of the example function (below `if set_generalized_indicators:`). This is where the user will add single features and labels to their feature set to avoid duplication of them from various configuration parameters that multiply the feature set, such as `include_timeframes`. + +!!! Note + Features **must** be defined in `populate_any_indicators()`. Defining FreqAI features in `populate_indicators()` + will cause the algorithm to fail in live/dry mode. If the user wishes to add generalized features that are not associated with + a specific pair or timeframe, they should use the following structure inside `populate_any_indicators()` + (as exemplified in `freqtrade/templates/FreqaiExampleStrategy.py`): + + ```python + def populate_any_indicators(self, metadata, pair, df, tf, informative=None, coin="", set_generalized_indicators=False): + + ... + + # Add generalized indicators here (because in live, it will call only this function to populate + # indicators for retraining). Notice how we ensure not to add them multiple times by associating + # these generalized indicators to the basepair/timeframe + if set_generalized_indicators: + df['%-day_of_week'] = (df["date"].dt.dayofweek + 1) / 7 + df['%-hour_of_day'] = (df['date'].dt.hour + 1) / 25 + + # user adds targets here by prepending them with &- (see convention below) + # If user wishes to use multiple targets, a multioutput prediction model + # needs to be used such as templates/CatboostPredictionMultiModel.py + df["&-s_close"] = ( + df["close"] + .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + .mean() + / df["close"] + - 1 + ) + ``` + + (Please see the example script located in `freqtrade/templates/FreqaiExampleStrategy.py` for a full example of `populate_any_indicators()`.) + +*Important*: The `self.freqai.start()` function cannot be called outside the `populate_indicators()`. + +## Setting the `startup_candle_count` +Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). + +!!! Note + Typically it is best for users to be safe and multiply their expected `startup_candle_count` by 2. There are instances where the talib functions actually require more data than just the passed `period`. Anecdotally, multiplying the `startup_candle_count` by 2 always leads to a fully NaN free training dataset. Look out for this log message to confirm that your data is clean: + + ``` + 2022-08-31 15:14:04 - freqtrade.freqai.data_kitchen - INFO - dropped 0 training points due to NaNs in populated dataset 4319. + ``` + +## Creating a dynamic target threshold + +The `&*_std/mean` return values describe the statistical fit of the user defined label *during the most recent training*. This value allows the user to know the rarity of a given prediction. For example, `templates/FreqaiExampleStrategy.py`, creates a `target_roi` which is based on filtering out predictions that are below a given z-score of 1.25. + +```python +dataframe["target_roi"] = dataframe["&-s_close_mean"] + dataframe["&-s_close_std"] * 1.25 +dataframe["sell_roi"] = dataframe["&-s_close_mean"] - dataframe["&-s_close_std"] * 1.25 +``` + +If the user wishes to consider the population +of *historical predictions* for creating the dynamic target instead of the trained labels, (as discussed above) the user +can do so by setting `fit_live_prediction_candles` in the config to the number of historical prediction candles +the user wishes to use to generate target statistics. + +```json + "freqai": { + "fit_live_prediction_candles": 300, + } +``` + +If the user sets this value, FreqAI will initially use the predictions from the training data +and subsequently begin introducing real prediction data as it is generated. FreqAI will save +this historical data to be reloaded if the user stops and restarts a model with the same `identifier`. + + +## Parameter table + +The table below will list all configuration parameters available for FreqAI, presented in the same order as `config_examples/config_freqai.example.json`. + +Mandatory parameters are marked as **Required**, which means that they are required to be set in one of the possible ways. + +| Parameter | Description | +|------------|-------------| +| | **General configuration parameters** +| `freqai` | **Required.**
The parent dictionary containing all the parameters for controlling FreqAI.
**Datatype:** Dictionary. +| `purge_old_models` | Delete obsolete models (otherwise, all historic models will remain on disk).
**Datatype:** Boolean. Default: `False`. +| `train_period_days` | **Required.**
Number of days to use for the training data (width of the sliding window).
**Datatype:** Positive integer. +| `backtest_period_days` | **Required.**
Number of days to inference from the trained model before sliding the window defined above, and retraining the model. This can be fractional days, but beware that the user-provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest.
**Datatype:** Float. +| `save_backtest_models` | Backtesting operates most efficiently by saving the prediction data and reusing them directly for subsequent runs (when users wish to tune entry/exit parameters). If a user wishes to save models to disk when running backtesting, they should activate `save_backtest_models`. A user may wish to do this if they plan to use the same model files for starting a dry/live instance with the same `identifier`.
**Datatype:** Boolean. Default: `False`. +| `identifier` | **Required.**
A unique name for the current model. This can be reused to reload pre-trained models/data.
**Datatype:** String. +| `live_retrain_hours` | Frequency of retraining during dry/live runs.
Default set to 0, which means the model will retrain as often as possible.
**Datatype:** Float > 0. +| `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old.
Defaults set to 0, which means models never expire.
**Datatype:** Positive integer. +| `fit_live_predictions_candles` | Number of historical candles to use for computing target (label) statistics from prediction data, instead of from the training data set.
**Datatype:** Positive integer. +| `follow_mode` | If true, this instance of FreqAI will look for models associated with `identifier` and load those for inferencing. A `follower` will **not** train new models.
**Datatype:** Boolean. Default: `False`. +| `continual_learning` | If true, FreqAI will start training new models from the final state of the most recently trained model.
**Datatype:** Boolean. Default: `False`. +| | **Feature parameters** +| `feature_parameters` | A dictionary containing the parameters used to engineer the feature set. Details and examples are shown [here](#feature-engineering).
**Datatype:** Dictionary. +| `include_timeframes` | A list of timeframes that all indicators in `populate_any_indicators` will be created for. The list is added as features to the base asset feature set.
**Datatype:** List of timeframes (strings). +| `include_corr_pairlist` | A list of correlated coins that FreqAI will add as additional features to all `pair_whitelist` coins. All indicators set in `populate_any_indicators` during feature engineering (see details [here](#feature-engineering)) will be created for each coin in this list, and that set of features is added to the base asset feature set.
**Datatype:** List of assets (strings). +| `label_period_candles` | Number of candles into the future that the labels are created for. This is used in `populate_any_indicators` (see `templates/FreqaiExampleStrategy.py` for detailed usage). The user can create custom labels, making use of this parameter or not.
**Datatype:** Positive integer. +| `include_shifted_candles` | Add features from previous candles to subsequent candles to add historical information. FreqAI takes all features from the `include_shifted_candles` previous candles, duplicates and shifts them so that the information is available for the subsequent candle.
**Datatype:** Positive integer. +| `weight_factor` | Used to set weights for training data points according to their recency. See details about how it works [here](#controlling-the-model-learning-process).
**Datatype:** Positive float (typically < 1). +| `indicator_max_period_candles` | **No longer used**. User must use the strategy set `startup_candle_count` which defines the maximum *period* used in `populate_any_indicators()` for indicator creation (timeframe independent). FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. +| `indicator_periods_candles` | Calculate indicators for `indicator_periods_candles` time periods and add them to the feature set.
**Datatype:** List of positive integers. +| `stratify_training_data` | This value is used to indicate the grouping of the data. For example, 2 would set every 2nd data point into a separate dataset to be pulled from during training/testing. See details about how it works [here](#stratifying-the-data-for-training-and-testing-the-model)
**Datatype:** Positive integer. +| `principal_component_analysis` | Automatically reduce the dimensionality of the data set using Principal Component Analysis. See details about how it works [here](#reducing-data-dimensionality-with-principal-component-analysis)
**Datatype:** Boolean. +| `DI_threshold` | Activates the Dissimilarity Index for outlier detection when > 0. See details about how it works [here](#removing-outliers-with-the-dissimilarity-index).
**Datatype:** Positive float (typically < 1). +| `use_SVM_to_remove_outliers` | Train a support vector machine to detect and remove outliers from the training data set, as well as from incoming data points. See details about how it works [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Boolean. +| `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. See details about some select parameters [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Dictionary. +| `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. +| `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 +| `noise_standard_deviation` | If > 0, FreqAI adds noise to the training features. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. Value should be kept relative to the normalized space between -1 and 1). In other words, since data is always normalized between -1 and 1 in FreqAI, the user can expect a `noise_standard_deviation: 0.05` to see 32% of data randomly increased/decreased by more than 2.5% (i.e. the percent of data falling within the first standard deviation). Good for preventing overfitting.
**Datatype:** int. Default: 0 +| `outlier_protection_percentage` | If more than `outlier_protection_percentage` % of points are detected as outliers by the SVM or DBSCAN, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact. If the outlier protection is triggered, no predictions will be made based on the training data.
**Datatype:** Float. Default: `30` +| `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** Boolean. Default: False +| | **Data split parameters** +| `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. +| `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. +| `shuffle` | Shuffle the training data points during training. Typically, for time-series forecasting, this is set to `False`.
**Datatype:** Boolean. +| | **Model training parameters** +| `model_training_parameters` | A flexible dictionary that includes all parameters available by the user selected model library. For example, if the user uses `LightGBMRegressor`, this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) (external website). If the user selects a different model, this dictionary can contain any parameter from that model.
**Datatype:** Dictionary. +| `n_estimators` | The number of boosted trees to fit in regression.
**Datatype:** Integer. +| `learning_rate` | Boosting learning rate during regression.
**Datatype:** Float. +| `n_jobs`, `thread_count`, `task_type` | Set the number of threads for parallel processing and the `task_type` (`gpu` or `cpu`). Different model libraries use different parameter names.
**Datatype:** Float. +| | **Extraneous parameters** +| `keras` | If your model makes use of Keras (typical for Tensorflow-based prediction models), activate this flag so that the model save/loading follows Keras standards.
**Datatype:** Boolean. Default: `False`. +| `conv_width` | The width of a convolutional neural network input tensor. This replaces the need for shifting candles (`include_shifted_candles`) by feeding in historical data points as the second dimension of the tensor. Technically, this parameter can also be used for regressors, but it only adds computational overhead and does not change the model training/prediction.
**Datatype:** Integer. Default: 2. + +## Important dataframe key patterns + +Below are the values the user can expect to include/use inside a typical strategy dataframe (`df[]`): + +| DataFrame Key | Description | +|------------|-------------| +| `df['&*']` | Any dataframe column prepended with `&` in `populate_any_indicators()` is treated as a training target (label) inside FreqAI (typically following the naming convention `&-s*`). The names of these dataframe columns are fed back to the user as the predictions. For example, if the user wishes to predict the price change in the next 40 candles (similar to `templates/FreqaiExampleStrategy.py`), they set `df['&-s_close']`. FreqAI makes the predictions and gives them back under the same key (`df['&-s_close']`) to be used in `populate_entry/exit_trend()`.
**Datatype:** Depends on the output of the model. +| `df['&*_std/mean']` | Standard deviation and mean values of the user-defined labels during training (or live tracking with `fit_live_predictions_candles`). Commonly used to understand the rarity of a prediction (use the z-score as shown in `templates/FreqaiExampleStrategy.py` to evaluate how often a particular prediction was observed during training or historically with `fit_live_predictions_candles`).
**Datatype:** Float. +| `df['do_predict']` | Indication of an outlier data point. The return value is integer between -1 and 2, which lets the user know if the prediction is trustworthy or not. `do_predict==1` means the prediction is trustworthy. If the Dissimilarity Index (DI, see details [here](#removing-outliers-with-the-dissimilarity-index)) of the input data point is above the user-defined threshold, FreqAI will subtract 1 from `do_predict`, resulting in `do_predict==0`. If `use_SVM_to_remove_outliers()` is active, the Support Vector Machine (SVM) may also detect outliers in training and prediction data. In this case, the SVM will also subtract 1 from `do_predict`. If the input data point was considered an outlier by the SVM but not by the DI, the result will be `do_predict==0`. If both the DI and the SVM considers the input data point to be an outlier, the result will be `do_predict==-1`. A particular case is when `do_predict == 2`, which means that the model has expired due to exceeding `expired_hours`.
**Datatype:** Integer between -1 and 2. +| `df['DI_values']` | Dissimilarity Index values are proxies to the level of confidence FreqAI has in the prediction. A lower DI means the prediction is close to the training data, i.e., higher prediction confidence.
**Datatype:** Float. +| `df['%*']` | Any dataframe column prepended with `%` in `populate_any_indicators()` is treated as a training feature. For example, the user can include the RSI in the training feature set (similar to in `templates/FreqaiExampleStrategy.py`) by setting `df['%-rsi']`. See more details on how this is done [here](#feature-engineering).
**Note**: Since the number of features prepended with `%` can multiply very quickly (10s of thousands of features is easily engineered using the multiplictative functionality described in the `feature_parameters` table shown above), these features are removed from the dataframe upon return from FreqAI. If the user wishes to keep a particular type of feature for plotting purposes, they can prepend it with `%%`.
**Datatype:** Depends on the output of the model. + +## Building a custom prediction model + +FreqAI has multiple example prediction model libraries, such as `Catboost` regression (`freqai/prediction_models/CatboostRegressor.py`), `LightGBM`, `XGBoost` regression. However, the user can customize and create their own prediction models using the `IFreqaiModel` class. The user is encouraged to inherit `fit()`, `train()` and `predict()` to let them customize various aspects of their training procedures. + +## Setting classifier targets + +`FreqAI` includes a variety of classifiers, such as the `CatboostClassifier` via the flag `--freqaimodel CatboostClassifier`. If the user elects to use a classifier, they must ensure the classes are set using strings. For example: + +```python +df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down') +``` + +Additionally, the example classifier models do not accommodate multiple labels, but they do allow multi-class classification within a single label column. diff --git a/docs/freqai-data-handling.md b/docs/freqai-data-handling.md new file mode 100644 index 000000000..7ed51599d --- /dev/null +++ b/docs/freqai-data-handling.md @@ -0,0 +1,129 @@ +# Data handling + +`FreqAI` aims to organize prediction data, model files, and meta data in a way that automates crash resilient reloading and simplifies post-processing. Data is organized into `user_data_dir/models/` and contains all the data associated with the trainings and backtests. This file structure is heavily controlled and inferenced by the `FreqaiDataKitchen()` and should therefore not be manually modified. + +## File structure + +The file structure is automatically generated based on the user set `identifier` in the configuration file. The following structure shows where the data is stored for post processing: + +* `config_*.json` + * a copy of the user submitted configuration file +* `historic_predictions.pkl` + * all historic predictions generated during the lifetime of the `identifier` live deployment. These are also used to reload the model after a crash or a config change. A backup file is always held incase of corruption on the main file - FreqAI automatically detects corruption and replaces the corrupted file with the backup. +* `pair_dictionary.json` + * contains the training queue as well as the location of the most recently trained model on disk. +* `sub-train-*_TIMESTAMP` + * a folder containing all the files associated with a single model, such as: + * `*_metadata.json` + * metadata for the model, such as normalization max/mins, expected training feature list, etc. + * `*_model.*` + * the model file saved to disk for reloading from crash. Can be `joblib` (typical boosting libs), `zip` (stable_baselines), `hd5` (keras type), etc. + * `*_pca_object.pkl` + * the PCA transform (if the user set `principal_component_analysis: true` in their config) which will be used to transform unseen prediction features. + * `*_svm_model.pkl` + * the Support Vector Machine model which is used to detect outliers in unseen prediction features. + * `*_trained_df.pkl` + * the dataframe containing all the training features used to train the particular model. This is used for computing the Dissimilarity Index and can be used for post-processing. + * `*_trained_dates.df.pkl` + * dates associated with the `trained_df.pkl`, useful for post-processing. + +The example file structure would look like this: + +``` +├── models +│   └── unique-id +│   ├── config_freqai.example.json +│   ├── historic_predictions.backup.pkl +│   ├── historic_predictions.pkl +│   ├── pair_dictionary.json +│   ├── sub-train-1INCH_1662821319 +│   │   ├── cb_1inch_1662821319_metadata.json +│   │   ├── cb_1inch_1662821319_model.joblib +│   │   ├── cb_1inch_1662821319_pca_object.pkl +│   │   ├── cb_1inch_1662821319_svm_model.joblib +│   │   ├── cb_1inch_1662821319_trained_dates_df.pkl +│   │   └── cb_1inch_1662821319_trained_df.pkl +│   ├── sub-train-1INCH_1662821371 +│   │   ├── cb_1inch_1662821371_metadata.json +│   │   ├── cb_1inch_1662821371_model.joblib +│   │   ├── cb_1inch_1662821371_pca_object.pkl +│   │   ├── cb_1inch_1662821371_svm_model.joblib +│   │   ├── cb_1inch_1662821371_trained_dates_df.pkl +│   │   └── cb_1inch_1662821371_trained_df.pkl +│   ├── sub-train-ADA_1662821344 +│   │   ├── cb_ada_1662821344_metadata.json +│   │   ├── cb_ada_1662821344_model.joblib +│   │   ├── cb_ada_1662821344_pca_object.pkl +│   │   ├── cb_ada_1662821344_svm_model.joblib +│   │   ├── cb_ada_1662821344_trained_dates_df.pkl +│   │   └── cb_ada_1662821344_trained_df.pkl +│   └── sub-train-ADA_1662821399 +│   ├── cb_ada_1662821399_metadata.json +│   ├── cb_ada_1662821399_model.joblib +│   ├── cb_ada_1662821399_pca_object.pkl +│   ├── cb_ada_1662821399_svm_model.joblib +│   ├── cb_ada_1662821399_trained_dates_df.pkl +│   └── cb_ada_1662821399_trained_df.pkl +``` + +## Backtesting + +When users run a backtest, `FreqAI` will automatically save the predictions to be reused for future runs under the same `identifier`. This is a performance enhancement geared towards enabling high-level hyperopting of entry/exit criteria. That means the user will see an additional directory created in their `unique-id` folder called `predictions` which contains all the predictions stored in `hdf` format. + +If users wish to change their features, they **must** use a new identifier which will signal to `FreqAI` to train new models. If users wish to save the models generated during a particular backtest so they can start a live deployment without an initial training, they must set `save_backtest_models` to `True` in their configuration file. + +### Downloading data for backtesting +Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download.md#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by moving the start date of the timerange backwards by `train_period_days` and the `startup_candle_count` ([details](freqai-configuration.md#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. + +As an example, if we wish to backtest the `--timerange` above of `20210501-20210701`, and we use the example config which sets `train_period_days` to 15. The startup candle count is 40 on a maximum `include_timeframes` of 1h. We would need 20210501 - 15 days - 40 * 1h / 24 hours = 20210414 (16.7 days earlier than the start of the desired training timerange). + +## Live deployments + +### Auto data download + +`FreqAI` automatically downloads and proper amount of data to ensure it can train a model using the user defined `train_period_days` and the strategy defined `startup_candle_count`. + +### Historical predictions + +The historical predictions are collected for the life-time of a single `identifier` and stored in `historical_predictions.pkl` + +### Defining model expirations + +During dry/live mode, FreqAI trains each coin pair sequentially (on separate threads/GPU from the main Freqtrade bot). This means that there is always an age discrepancy between models. If a user is training on 50 pairs, and each pair requires 5 minutes to train, the oldest model will be over 4 hours old. This may be undesirable if the characteristic time scale (the trade duration target) for a strategy is less than 4 hours. The user can decide to only make trade entries if the model is less than +a certain number of hours old by setting the `expiration_hours` in the config file: + +```json + "freqai": { + "expiration_hours": 0.5, + } +``` + +In the presented example config, the user will only allow predictions on models that are less than 1/2 hours old. + +### Purging old model data + +FreqAI stores new model files each time it retrains. These files become obsolete as new models are trained and FreqAI adapts to new market conditions. Users planning to leave FreqAI running for extended periods of time with high frequency retraining should enable `purge_old_models` in their config: + +```json + "freqai": { + "purge_old_models": true, + } +``` + +This will automatically purge all models older than the two most recently trained ones. + +### Returning additional info from training + +The user may find that there are some important metrics that they'd like to return to the strategy at the end of each model training. +The user can include these metrics by assigning them to `dk.data['extra_returns_per_train']['my_new_value'] = XYZ` inside their custom prediction model class. FreqAI takes the `my_new_value` assigned in this dictionary and expands it to fit the return dataframe to the strategy. +The user can then use the value in the strategy with `dataframe['my_new_value']`. An example of how this is already used in FreqAI is +the `&*_mean` and `&*_std` values, which indicate the mean and standard deviation of the particular target (label) during the most recent training. +An example, where the user wants to use live metrics from the trade database, is shown below: + +```json + "freqai": { + "extra_returns_per_train": {"total_profit": 4} + } +``` + +The user needs to set the standard dictionary in the config so that FreqAI can return proper dataframe shapes. These values will likely be overridden by the prediction model, but in the case where the model has yet to set them, or needs a default initial value, this is the value that will be returned. diff --git a/docs/freqai-feature-engineering.md b/docs/freqai-feature-engineering.md new file mode 100644 index 000000000..ebde5aa81 --- /dev/null +++ b/docs/freqai-feature-engineering.md @@ -0,0 +1,274 @@ +# Feature engineering + +Feature engineering is handled within the `FreqAI` config file and the user strategy. The user adds all their `base features` to their strategy, such as `RSI`, `MFI`, `EMA`, `SMA` etc. These can be custom indicators or they can be imported from any technical-analysis library that the user can find. These features are added by the user inside the `populate_any_indicators()` method of the strategy by prepending indicators with `%`, and labels with `&`. + +Users should start from an existing `populate_any_indicators()` to ensure they are following some of the conventions that help with feature engineering. Here is an example: + +```python + def populate_any_indicators( + self, pair, df, tf, informative=None, set_generalized_indicators=False + ): + """ + Function designed to automatically generate, name, and merge features + from user-indicated timeframes in the configuration file. The user controls the indicators + passed to the training/prediction by prepending indicators with `'%-' + coin ` + (see convention below). I.e., the user should not prepend any supporting metrics + (e.g., bb_lowerband below) with % unless they explicitly want to pass that metric to the + model. + :param pair: pair to be used as informative + :param df: strategy dataframe which will receive merges from informatives + :param tf: timeframe of the dataframe which will modify the feature names + :param informative: the dataframe associated with the informative pair + :param coin: the name of the coin which will modify the feature names. + """ + + coin = pair.split('/')[0] + + if informative is None: + informative = self.dp.get_pair_dataframe(pair, tf) + + # first loop is automatically duplicating indicators for time periods + for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]: + t = int(t) + informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) + informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) + informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) + + bollinger = qtpylib.bollinger_bands( + qtpylib.typical_price(informative), window=t, stds=2.2 + ) + informative[f"{coin}bb_lowerband-period_{t}"] = bollinger["lower"] + informative[f"{coin}bb_middleband-period_{t}"] = bollinger["mid"] + informative[f"{coin}bb_upperband-period_{t}"] = bollinger["upper"] + + informative[f"%-{coin}bb_width-period_{t}"] = ( + informative[f"{coin}bb_upperband-period_{t}"] + - informative[f"{coin}bb_lowerband-period_{t}"] + ) / informative[f"{coin}bb_middleband-period_{t}"] + informative[f"%-{coin}close-bb_lower-period_{t}"] = ( + informative["close"] / informative[f"{coin}bb_lowerband-period_{t}"] + ) + + informative[f"%-{coin}relative_volume-period_{t}"] = ( + informative["volume"] / informative["volume"].rolling(t).mean() + ) + + indicators = [col for col in informative if col.startswith("%")] + # This loop duplicates and shifts all indicators to add a sense of recency to data + for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): + if n == 0: + continue + informative_shift = informative[indicators].shift(n) + informative_shift = informative_shift.add_suffix("_shift-" + str(n)) + informative = pd.concat((informative, informative_shift), axis=1) + + df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True) + skip_columns = [ + (s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"] + ] + df = df.drop(columns=skip_columns) + + # Add generalized indicators here (because in live, it will call this + # function to populate indicators during training). Notice how we ensure not to + # add them multiple times + if set_generalized_indicators: + df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7 + df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25 + + # user adds targets here by prepending them with &- (see convention below) + # If user wishes to use multiple targets, a multioutput prediction model + # needs to be used such as templates/CatboostPredictionMultiModel.py + df["&-s_close"] = ( + df["close"] + .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) + .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) + .mean() + / df["close"] + - 1 + ) + + return df +``` + +In the presented example strategy, the user does not wish to pass the `bb_lowerband` as a feature to the model, +and has therefore not prepended it with `%`. The user does, however, wish to pass `bb_width` to the +model for training/prediction and has therefore prepended it with `%`. + +Now that the user has set their `base features`, they will next expand upon their base features using the powerful `feature_parameters` in their configuration file: + +```json + "freqai": { + ... + "feature_parameters" : { + "include_timeframes": ["5m","15m","4h"], + "include_corr_pairlist": [ + "ETH/USD", + "LINK/USD", + "BNB/USD" + ], + "label_period_candles": 24, + "include_shifted_candles": 2, + "indicator_periods_candles": [10, 20] + }, + ... + } +``` + +The `include_timeframes` in the config above are the timeframes (`tf`) of each call to `populate_any_indicators()` in the strategy. In the present case, the user is asking for the `5m`, `15m`, and `4h` timeframes of the `rsi`, `mfi`, `roc`, and `bb_width` to be included in the feature set. + +The user can ask for each of the defined features to be included also from informative pairs using the `include_corr_pairlist`. This means that the feature set will include all the features from `populate_any_indicators` on all the `include_timeframes` for each of the correlated pairs defined in the config (`ETH/USD`, `LINK/USD`, and `BNB/USD`). + +`include_shifted_candles` indicates the number of previous candles to include in the feature set. For example, `include_shifted_candles: 2` tells `FreqAI` to include the past 2 candles for each of the features in the feature set. + +In total, the number of features the user of the presented example strat has created is: length of `include_timeframes` * no. features in `populate_any_indicators()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles` + $= 3 * 3 * 3 * 2 * 2 = 108$. + + +### Feature normalization + +`FreqAI` is strict when it comes to data normalization - all data is always automatically normalized to the training feature space according to industry standards. This includes all test data and unseen prediction data (dry/live/backtest). `FreqAI` stores all the metadata required to ensure that prediction features will be properly normalized and that predictions are properly denormalized. For this reason, it is not recommended to eschew industry standards and modify `FreqAI` internals - however - advanced users can do so by inheriting `train()` in their custom `IFreqaiModel` and using their own normalization functions. + +### Reducing data dimensionality with Principal Component Analysis + +Users can reduce the dimensionality of their features by activating the `principal_component_analysis` in the config: + +```json + "freqai": { + "feature_parameters" : { + "principal_component_analysis": true + } + } +``` + +This will perform PCA on the features and reduce the dimensionality of the data so that the explained variance of the data set is >= 0.999. + +### Stratifying the data for training and testing the model + +The user can stratify (group) the training/testing data using: + +```json + "freqai": { + "feature_parameters" : { + "stratify_training_data": 3 + } + } +``` + +This will split the data chronologically so that every Xth data point is used to test the model after training. In the +example above, the user is asking for every third data point in the dataframe to be used for +testing; the other points are used for training. + +The test data is used to evaluate the performance of the model after training. If the test score is high, the model is able to capture the behavior of the data well. If the test score is low, either the model either does not capture the complexity of the data, the test data is significantly different from the train data, or a different model should be used. + +### Using the `inlier_metric` + +The `inlier_metric` is a metric aimed at quantifying how different a prediction data point is from the most recent historic data points. + +User can set `inlier_metric_window` to set the look back window. FreqAI will compute the distance between the present prediction point and each of the previous data points (total of `inlier_metric_window` points). + +This function goes one step further - during training, it computes the `inlier_metric` for all training data points and builds weibull distributions for each each lookback point. The cumulative distribution function for the weibull distribution is used to produce a quantile for each of the data points. The quantiles for each lookback point are averaged to create the `inlier_metric`. + +FreqAI adds this `inlier_metric` score to the training features! In other words, your model is trained to recognize how this temporal inlier metric is related to the user set labels. + +This function does **not** remove outliers from the data set. + +### Controlling the model learning process + +Model training parameters are unique to the machine learning library selected by the user. FreqAI allows the user to set any parameter for any library using the `model_training_parameters` dictionary in the user configuration file. The example configuration file (found in `config_examples/config_freqai.example.json`) show some of the example parameters associated with `Catboost` and `LightGBM`, but the user can add any parameters available in those libraries. + +Data split parameters are defined in `data_split_parameters` which can be any parameters associated with `Sklearn`'s `train_test_split()` function. + +FreqAI includes some additional parameters such as `weight_factor`, which allows the user to weight more recent data more strongly +than past data via an exponential function: + +$$ W_i = \exp(\frac{-i}{\alpha*n}) $$ + +where $W_i$ is the weight of data point $i$ in a total set of $n$ data points. Below is a figure showing the effect of different weight factors on the data points (candles) in a feature set. + +![weight-factor](assets/freqai_weight-factor.jpg) + +`train_test_split()` has a parameters called `shuffle` that allows the user to keep the data unshuffled. This is particularly useful to avoid biasing training with temporally auto-correlated data. + +Finally, `label_period_candles` defines the offset (number of candles into the future) used for the `labels`. In the presented example config, +the user is asking for `labels` that are 24 candles in the future. + +#### Continual learning + +Users can choose to adopt a "continual learning" strategy by setting `"continual_learning": true` in their configuration file. This setting will train an initial model from scratch, and subsequent trainings will start from the final model state of the preceding training. By default, this is set to `false` which trains a new model from scratch upon each subsequent training. + +### Outlier removal + +#### Removing outliers with the Dissimilarity Index + +The user can tell FreqAI to remove outlier data points from the training/test data sets using a Dissimilarity Index by including the following statement in the config: + +```json + "freqai": { + "feature_parameters" : { + "DI_threshold": 1 + } + } +``` + +Equity and crypto markets suffer from a high level of non-patterned noise in the form of outlier data points. The Dissimilarity Index (DI) aims to quantify the uncertainty associated with each prediction made by the model. The DI allows predictions which are outliers (not existent in the model feature space) to be thrown out due to low levels of certainty. + +To do so, FreqAI measures the distance between each training data point (feature vector), $X_{a}$, and all other training data points: + +$$ d_{ab} = \sqrt{\sum_{j=1}^p(X_{a,j}-X_{b,j})^2} $$ + +where $d_{ab}$ is the distance between the normalized points $a$ and $b$. $p$ is the number of features, i.e., the length of the vector $X$. The characteristic distance, $\overline{d}$ for a set of training data points is simply the mean of the average distances: + +$$ \overline{d} = \sum_{a=1}^n(\sum_{b=1}^n(d_{ab}/n)/n) $$ + +$\overline{d}$ quantifies the spread of the training data, which is compared to the distance between a new prediction feature vectors, $X_k$ and all the training data: + +$$ d_k = \arg \min d_{k,i} $$ + +which enables the estimation of the Dissimilarity Index as: + +$$ DI_k = d_k/\overline{d} $$ + +The user can tweak the DI through the `DI_threshold` to increase or decrease the extrapolation of the trained model. + +Below is a figure that describes the DI for a 3D data set. + +![DI](assets/freqai_DI.jpg) + +#### Removing outliers using a Support Vector Machine (SVM) + +The user can tell FreqAI to remove outlier data points from the training/test data sets using a SVM by setting: + +```json + "freqai": { + "feature_parameters" : { + "use_SVM_to_remove_outliers": true + } + } +``` + +FreqAI will train an SVM on the training data (or components of it if the user activated +`principal_component_analysis`) and remove any data point that the SVM deems to be beyond the feature space. + +The parameter `shuffle` is by default set to `False` to ensure consistent results. If it is set to `True`, running the SVM multiple times on the same data set might result in different outcomes due to `max_iter` being to low for the algorithm to reach the demanded `tol`. Increasing `max_iter` solves this issue but causes the procedure to take longer time. + +The parameter `nu`, *very* broadly, is the amount of data points that should be considered outliers. + +#### Removing outliers with DBSCAN + +The user can configure FreqAI to use DBSCAN to cluster and remove outliers from the training/test data set or incoming outliers from predictions, by activating `use_DBSCAN_to_remove_outliers` in the config: + +```json + "freqai": { + "feature_parameters" : { + "use_DBSCAN_to_remove_outliers": true + } + } +``` + +DBSCAN is an unsupervised machine learning algorithm that clusters data without needing to know how many clusters there should be. + +Given a number of data points $N$, and a distance $\varepsilon$, DBSCAN clusters the data set by setting all data points that have $N-1$ other data points within a distance of $\varepsilon$ as *core points*. A data point that is within a distance of $\varepsilon$ from a *core point* but that does not have $N-1$ other data points within a distance of $\varepsilon$ from itself is considered an *edge point*. A cluster is then the collection of *core points* and *edge points*. Data points that have no other data points at a distance $<\varepsilon$ are considered outliers. The figure below shows a cluster with $N = 3$. + +![dbscan](assets/freqai_dbscan.jpg) + +FreqAI uses `sklearn.cluster.DBSCAN` (details are available on scikit-learn's webpage [here](#https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html)) with `min_samples` ($N$) taken as 1/4 of the no. of time points in the feature set, and `eps` ($\varepsilon$) taken as the elbow point in the *k-distance graph* computed from the nearest neighbors in the pairwise distances of all data points in the feature set. diff --git a/docs/freqai-running.md b/docs/freqai-running.md new file mode 100644 index 000000000..90856c841 --- /dev/null +++ b/docs/freqai-running.md @@ -0,0 +1,104 @@ +# Running FreqAI + +There are two ways to train and deploy an adaptive machine learning model. FreqAI enables live deployment as well as backtesting analyses. In both cases, a model is trained periodically, as shown in the following figure. + +![freqai-window](assets/freqai_moving-window.jpg) + +### Running the model live + +FreqAI can be run dry/live using the following command: + +```bash +freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor +``` + +By default, FreqAI will not find any existing models and will start by training a new one +based on the user's configuration settings. Following training, the model will be used to make predictions on incoming candles until a new model is available. New models are typically generated as often as possible, with FreqAI managing an internal queue of the coin pairs to try to keep all models equally up to date. FreqAI will always use the most recently trained model to make predictions on incoming live data. If the user does not want FreqAI to retrain new models as often as possible, they can set `live_retrain_hours` to tell FreqAI to wait at least that number of hours before training a new model. Additionally, the user can set `expired_hours` to tell FreqAI to avoid making predictions on models that are older than that number of hours. + +If the user wishes to start a dry/live run from a saved backtest model (or from a previously crashed dry/live session), the user only needs to reuse +the same `identifier` parameter: + +```json + "freqai": { + "identifier": "example", + "live_retrain_hours": 0.5 + } +``` + +In this case, although FreqAI will initiate with a +pre-trained model, it will still check to see how much time has elapsed since the model was trained, +and if a full `live_retrain_hours` has elapsed since the end of the loaded model, FreqAI will retrain. + +### Backtesting + +The FreqAI backtesting module can be executed with the following command: + +```bash +freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 +``` + +Backtesting mode requires the user to have the data [pre-downloaded](#downloading-data-for-backtesting) (unlike in dry/live mode where FreqAI automatically downloads the necessary data). The user should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the user-set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration). + +If this command has never been executed with the existing config file, it will train a new model +for each pair, for each backtesting window within the expanded `--timerange`. + +!!! Note "Model reuse" + Once the training is completed, the user can execute the backtesting again with the same config file and + FreqAI will find the trained models and load them instead of spending time training. This is useful + if the user wants to tweak (or even hyperopt) buy and sell criteria inside the strategy. If the user + *wants* to retrain a new model with the same config file, then they should simply change the `identifier`. + This way, the user can return to using any model they wish by simply specifying the `identifier`. + +--- + +### Hyperopt + +Users can hyperopt using the same command as typical [hyperopt](hyperopt.md): + +```bash +freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507 +``` + +Users need to have the data pre-downloaded in the same fashion as if they were doing a FreqAI [backtest](#backtesting). In addition, users must consider some restrictions when trying to [Hyperopt](hyperopt.md) FreqAI strategies: + +- The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI. +- It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md#running-hyperopt-with-smaller-search-space). +- The [Backtesting](#backtesting) instructions also apply to Hyperopt. + +The best method for combining hyperopt and FreqAI is to focus on hyperopting entry/exit thresholds/criteria. Users need to focus on hyperopting parameters that are not used in their FreqAI features. For example, users should not try to hyperopt rolling window lengths in their feature creation, or any of their FreqAI config which changes predictions. In order to efficiently hyperopt the FreqAI strategy, FreqAI stores predictions as dataframes and reuses them. Hence the requirement to hyperopt entry/exit thresholds/criteria only. + +A good example of a hyperoptable parameter in FreqAI is a value for `DI_values` beyond which we consider outliers and below which we consider inliers: + +```python +di_max = IntParameter(low=1, high=20, default=10, space='buy', optimize=True, load=True) +dataframe['outlier'] = np.where(dataframe['DI_values'] > self.di_max.value/10, 1, 0) +``` + +Which would help the user understand the appropriate Dissimilarity Index values for their particular parameter space. + +### Deciding the size of the sliding training window and backtesting duration + +The user defines the backtesting timerange with the typical `--timerange` parameter in the configuration file. The duration of the sliding training window is set by `train_period_days`, whilst `backtest_period_days` is the sliding backtesting window, both in number of days (`backtest_period_days` can be +a float to indicate sub-daily retraining in live/dry mode). In the presented example config, the user is asking FreqAI to use a training period of 30 days and backtest on the subsequent 7 days. This means that if the user sets `--timerange 20210501-20210701`, FreqAI will train have trained 8 separate models at the end of `--timerange` (because the full range comprises 8 weeks). After the training of the model, FreqAI will backtest the subsequent 7 days. The "sliding window" then moves one week forward (emulating FreqAI retraining once per week in live mode) and the new model uses the previous 30 days (including the 7 days used for backtesting by the previous model) to train. This is repeated until the end of `--timerange`. + +!!! Note + Although fractional `backtest_period_days` is allowed, the user should be aware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, if the user wants to set a `--timerange` of 10 days, and asks for a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. Because of this, a true backtest of FreqAI adaptive training would take a *very* long time. The best way to fully test a model is to run it dry and let it constantly train. In this case, backtesting would take the exact same amount of time as a dry run. + +### Downloading data for backtesting +Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download.md#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by moving the start date of the timerange backwards by `train_period_days` and the `startup_candle_count` ([details](#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. + +As an example, if we wish to backtest the `--timerange` above of `20210501-20210701`, and we use the example config which sets `train_period_days` to 15. The startup candle count is 40 on a maximum `include_timeframes` of 1h. We would need 20210501 - 15 days - 40 * 1h / 24 hours = 20210414 (16.7 days earlier than the start of the desired training timerange). + +### Setting up a follower + +The user can define: + +```json + "freqai": { + "follow_mode": true, + "identifier": "example" + } +``` + +to indicate to the bot that it should not train models, but instead should look for models trained by a leader with the same `identifier`. In this example, the user has a leader bot with the `identifier: "example"`. The leader bot is already running or launching simultaneously as the follower. +The follower will load models created by the leader and inference them to obtain predictions. diff --git a/docs/freqai.md b/docs/freqai.md index 5f523f58a..955e49250 100644 --- a/docs/freqai.md +++ b/docs/freqai.md @@ -6,18 +6,18 @@ FreqAI is a module designed to automate a variety of tasks associated with train Features include: -* **Self-adaptive retraining**: retrain models during [live deployments](#running-the-model-live) to self-adapt to the market in an unsupervised manner. -* **Rapid feature engineering**: create large rich [feature sets](#feature-engineering) (10k+ features) based on simple user-created strategies. +* **Self-adaptive retraining**: retrain models during [live deployments](freqai-running.md#running-the-model-live) to self-adapt to the market in an unsupervised manner. +* **Rapid feature engineering**: create large rich [feature sets](freqai-feature-engineering.md#feature-engineering) (10k+ features) based on simple user-created strategies. * **High performance**: adaptive retraining occurs on a separate thread (or on GPU if available) from inferencing and bot trade operations. Newest models and data are kept in memory for rapid inferencing. -* **Realistic backtesting**: emulate self-adaptive retraining with a [backtesting module](#backtesting) that automates past retraining. -* **Modifiability**: use the generalized and robust architecture for incorporating any [machine learning library/method](#building-a-custom-prediction-model) available in Python. Eight examples are currently available, including classifiers, regressors, and a convolutional neural network. -* **Smart outlier removal**: remove outliers from training and prediction data sets using a variety of [outlier detection techniques](#outlier-removal). -* **Crash resilience**: store model to disk to make reloading from a crash fast and easy, and [purge obsolete files](#purging-old-model-data) for sustained dry/live runs. -* **Automatic data normalization**: [normalize the data](#feature-normalization) in a smart and statistically safe way. +* **Realistic backtesting**: emulate self-adaptive retraining with a [backtesting module](freqai-running.md#backtesting) that automates past retraining. +* **Extensibility**: use the generalized and robust architecture for incorporating any [machine learning library/method](freqai-configuration.md#building-a-custom-prediction-model) available in Python. Eight examples are currently available, including classifiers, regressors, and a convolutional neural network. +* **Smart outlier removal**: remove outliers from training and prediction data sets using a variety of [outlier detection techniques](freqai-feature-engineering.md#outlier-removal). +* **Crash resilience**: store model to disk to make reloading from a crash fast and easy, and [purge obsolete files](freqai-data-handling.md#purging-old-model-data) for sustained dry/live runs. +* **Automatic data normalization**: [normalize the data](freqai-feature-engineering.md#feature-normalization) in a smart and statistically safe way. * **Automatic data download**: compute the data download timerange and update historic data (in live deployments). * **Cleaning of incoming data**: handle NaNs safely before training and prediction. -* **Dimensionality reduction**: reduce the size of the training data via [Principal Component Analysis](#reducing-data-dimensionality-with-principal-component-analysis). -* **Deploying bot fleets**: set one bot to train models while a fleet of [follower bots](#setting-up-a-follower) inference the models and handle trades. +* **Dimensionality reduction**: reduce the size of the training data via [Principal Component Analysis](freqai-feature-engineering.md#reducing-data-dimensionality-with-principal-component-analysis). +* **Deploying bot fleets**: set one bot to train models while a fleet of [follower bots](freqai-running.md#setting-up-a-follower) inference the models and handle trades. ## Quick start @@ -35,8 +35,7 @@ The example strategy, example prediction model, and example config can be found ## General approach -The user provides FreqAI with a set of custom *base* indicators (the same way as in a typical Freqtrade strategy) as well as target values (*labels*). -FreqAI trains a model to predict the target values based on the input of custom indicators, for each pair in the whitelist. These models are consistently retrained to adapt to market conditions. FreqAI offers the ability to both backtest strategies (emulating reality with periodic retraining) and deploy dry/live runs. In dry/live conditions, FreqAI can be set to constant retraining in a background thread in an effort to keep models as up to date as possible. +The user provides FreqAI with a set of custom *base* indicators (the same way as in a typical Freqtrade strategy) as well as target values (*labels*). FreqAI trains a model to predict the target values based on the input of custom indicators, for each pair in the whitelist. These models are consistently retrained to adapt to market conditions. FreqAI offers the ability to both backtest strategies (emulating reality with periodic retraining) and deploy dry/live runs. In dry/live conditions, FreqAI can be set to constant retraining in a background thread in an effort to keep models as up to date as possible. An overview of the algorithm is shown below, explaining the data processing pipeline and the model usage. @@ -44,19 +43,13 @@ An overview of the algorithm is shown below, explaining the data processing pipe ### Important machine learning vocabulary -**Features** - the quantities with which a model is trained. All features for a single candle is stored as a vector. In FreqAI, the user -builds the feature sets from anything they can construct in the strategy. +**Features** - the quantities with which a model is trained. All features for a single candle is stored as a vector. In FreqAI, the user builds the feature sets from anything they can construct in the strategy. -**Labels** - the target values that a model is trained -toward. Each set of features is associated with a single label that is -defined by the user within the strategy. These labels intentionally look into the -future, and are not available to the model during dry/live/backtesting. +**Labels** - the target values that a model is trained toward. Each set of features is associated with a single label that is defined by the user within the strategy. These labels intentionally look into the future, and are not available to the model during dry/live/backtesting. -**Training** - the process of feeding individual feature sets, composed of historic data, with associated labels into the -model with the goal of matching input feature sets to associated labels. +**Training** - the process of feeding individual feature sets, composed of historic data, with associated labels into the model with the goal of matching input feature sets to associated labels. -**Train data** - a subset of the historic data that is fed to the model during -training. This data directly influences weight connections in the model. +**Train data** - a subset of the historic data that is fed to the model during training. This data directly influences weight connections in the model. **Test data** - a subset of the historic data that is used to evaluate the performance of the model after training. This data does not influence nodal weights within the model. @@ -73,723 +66,7 @@ pip install -r requirements-freqai.txt ### Usage with docker -For docker users, a dedicated tag with freqAI dependencies is available as `:freqai`. -As such - you can replace the image line in your docker-compose file with `image: freqtradeorg/freqtrade:develop_freqai`. -This image contains the regular freqAI dependencies. Similar to native installs, Catboost will not be available on ARM based devices. - -## Setting up FreqAI - -### Parameter table - -The table below will list all configuration parameters available for FreqAI, presented in the same order as `config_examples/config_freqai.example.json`. - -Mandatory parameters are marked as **Required**, which means that they are required to be set in one of the possible ways. - -| Parameter | Description | -|------------|-------------| -| | **General configuration parameters** -| `freqai` | **Required.**
The parent dictionary containing all the parameters for controlling FreqAI.
**Datatype:** Dictionary. -| `purge_old_models` | Delete obsolete models (otherwise, all historic models will remain on disk).
**Datatype:** Boolean. Default: `False`. -| `train_period_days` | **Required.**
Number of days to use for the training data (width of the sliding window).
**Datatype:** Positive integer. -| `backtest_period_days` | **Required.**
Number of days to inference from the trained model before sliding the window defined above, and retraining the model. This can be fractional days, but beware that the user-provided `timerange` will be divided by this number to yield the number of trainings necessary to complete the backtest.
**Datatype:** Float. -| `save_backtest_models` | Backtesting operates most efficiently by saving the prediction data and reusing them directly for subsequent runs (when users wish to tune entry/exit parameters). If a user wishes to save models to disk when running backtesting, they should activate `save_backtest_models`. A user may wish to do this if they plan to use the same model files for starting a dry/live instance with the same `identifier`.
**Datatype:** Boolean. Default: `False`. -| `identifier` | **Required.**
A unique name for the current model. This can be reused to reload pre-trained models/data.
**Datatype:** String. -| `live_retrain_hours` | Frequency of retraining during dry/live runs.
Default set to 0, which means the model will retrain as often as possible.
**Datatype:** Float > 0. -| `expiration_hours` | Avoid making predictions if a model is more than `expiration_hours` old.
Defaults set to 0, which means models never expire.
**Datatype:** Positive integer. -| `fit_live_predictions_candles` | Number of historical candles to use for computing target (label) statistics from prediction data, instead of from the training data set.
**Datatype:** Positive integer. -| `follow_mode` | If true, this instance of FreqAI will look for models associated with `identifier` and load those for inferencing. A `follower` will **not** train new models.
**Datatype:** Boolean. Default: `False`. -| `continual_learning` | If true, FreqAI will start training new models from the final state of the most recently trained model.
**Datatype:** Boolean. Default: `False`. -| | **Feature parameters** -| `feature_parameters` | A dictionary containing the parameters used to engineer the feature set. Details and examples are shown [here](#feature-engineering).
**Datatype:** Dictionary. -| `include_timeframes` | A list of timeframes that all indicators in `populate_any_indicators` will be created for. The list is added as features to the base asset feature set.
**Datatype:** List of timeframes (strings). -| `include_corr_pairlist` | A list of correlated coins that FreqAI will add as additional features to all `pair_whitelist` coins. All indicators set in `populate_any_indicators` during feature engineering (see details [here](#feature-engineering)) will be created for each coin in this list, and that set of features is added to the base asset feature set.
**Datatype:** List of assets (strings). -| `label_period_candles` | Number of candles into the future that the labels are created for. This is used in `populate_any_indicators` (see `templates/FreqaiExampleStrategy.py` for detailed usage). The user can create custom labels, making use of this parameter or not.
**Datatype:** Positive integer. -| `include_shifted_candles` | Add features from previous candles to subsequent candles to add historical information. FreqAI takes all features from the `include_shifted_candles` previous candles, duplicates and shifts them so that the information is available for the subsequent candle.
**Datatype:** Positive integer. -| `weight_factor` | Used to set weights for training data points according to their recency. See details about how it works [here](#controlling-the-model-learning-process).
**Datatype:** Positive float (typically < 1). -| `indicator_max_period_candles` | **No longer used**. User must use the strategy set `startup_candle_count` which defines the maximum *period* used in `populate_any_indicators()` for indicator creation (timeframe independent). FreqAI uses this information in combination with the maximum timeframe to calculate how many data points it should download so that the first data point does not have a NaN
**Datatype:** positive integer. -| `indicator_periods_candles` | Calculate indicators for `indicator_periods_candles` time periods and add them to the feature set.
**Datatype:** List of positive integers. -| `stratify_training_data` | This value is used to indicate the grouping of the data. For example, 2 would set every 2nd data point into a separate dataset to be pulled from during training/testing. See details about how it works [here](#stratifying-the-data-for-training-and-testing-the-model)
**Datatype:** Positive integer. -| `principal_component_analysis` | Automatically reduce the dimensionality of the data set using Principal Component Analysis. See details about how it works [here](#reducing-data-dimensionality-with-principal-component-analysis)
**Datatype:** Boolean. -| `DI_threshold` | Activates the Dissimilarity Index for outlier detection when > 0. See details about how it works [here](#removing-outliers-with-the-dissimilarity-index).
**Datatype:** Positive float (typically < 1). -| `use_SVM_to_remove_outliers` | Train a support vector machine to detect and remove outliers from the training data set, as well as from incoming data points. See details about how it works [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Boolean. -| `svm_params` | All parameters available in Sklearn's `SGDOneClassSVM()`. See details about some select parameters [here](#removing-outliers-using-a-support-vector-machine-svm).
**Datatype:** Dictionary. -| `use_DBSCAN_to_remove_outliers` | Cluster data using DBSCAN to identify and remove outliers from training and prediction data. See details about how it works [here](#removing-outliers-with-dbscan).
**Datatype:** Boolean. -| `inlier_metric_window` | If set, FreqAI will add the `inlier_metric` to the training feature set and set the lookback to be the `inlier_metric_window`. Details of how the `inlier_metric` is computed can be found [here](#using-the-inliermetric)
**Datatype:** int. Default: 0 -| `noise_standard_deviation` | If > 0, FreqAI adds noise to the training features. FreqAI generates random deviates from a gaussian distribution with a standard deviation of `noise_standard_deviation` and adds them to all data points. Value should be kept relative to the normalized space between -1 and 1). In other words, since data is always normalized between -1 and 1 in FreqAI, the user can expect a `noise_standard_deviation: 0.05` to see 32% of data randomly increased/decreased by more than 2.5% (i.e. the percent of data falling within the first standard deviation). Good for preventing overfitting.
**Datatype:** int. Default: 0 -| `outlier_protection_percentage` | If more than `outlier_protection_percentage` % of points are detected as outliers by the SVM or DBSCAN, FreqAI will log a warning message and ignore outlier detection while keeping the original dataset intact. If the outlier protection is triggered, no predictions will be made based on the training data.
**Datatype:** Float. Default: `30` -| `reverse_train_test_order` | If true, FreqAI will train on the latest data split and test on historical split of the data. This allows the model to be trained up to the most recent data point, while avoiding overfitting. However, users should be careful to understand unorthodox nature of this parameter before employing it.
**Datatype:** Boolean. Default: False -| | **Data split parameters** -| `data_split_parameters` | Include any additional parameters available from Scikit-learn `test_train_split()`, which are shown [here](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) (external website).
**Datatype:** Dictionary. -| `test_size` | Fraction of data that should be used for testing instead of training.
**Datatype:** Positive float < 1. -| `shuffle` | Shuffle the training data points during training. Typically, for time-series forecasting, this is set to `False`.
**Datatype:** Boolean. -| | **Model training parameters** -| `model_training_parameters` | A flexible dictionary that includes all parameters available by the user selected model library. For example, if the user uses `LightGBMRegressor`, this dictionary can contain any parameter available by the `LightGBMRegressor` [here](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html) (external website). If the user selects a different model, this dictionary can contain any parameter from that model.
**Datatype:** Dictionary. -| `n_estimators` | The number of boosted trees to fit in regression.
**Datatype:** Integer. -| `learning_rate` | Boosting learning rate during regression.
**Datatype:** Float. -| `n_jobs`, `thread_count`, `task_type` | Set the number of threads for parallel processing and the `task_type` (`gpu` or `cpu`). Different model libraries use different parameter names.
**Datatype:** Float. -| | **Extraneous parameters** -| `keras` | If your model makes use of Keras (typical for Tensorflow-based prediction models), activate this flag so that the model save/loading follows Keras standards.
**Datatype:** Boolean. Default: `False`. -| `conv_width` | The width of a convolutional neural network input tensor. This replaces the need for shifting candles (`include_shifted_candles`) by feeding in historical data points as the second dimension of the tensor. Technically, this parameter can also be used for regressors, but it only adds computational overhead and does not change the model training/prediction.
**Datatype:** Integer. Default: 2. - -### Important dataframe key patterns - -Below are the values the user can expect to include/use inside a typical strategy dataframe (`df[]`): - -| DataFrame Key | Description | -|------------|-------------| -| `df['&*']` | Any dataframe column prepended with `&` in `populate_any_indicators()` is treated as a training target (label) inside FreqAI (typically following the naming convention `&-s*`). The names of these dataframe columns are fed back to the user as the predictions. For example, if the user wishes to predict the price change in the next 40 candles (similar to `templates/FreqaiExampleStrategy.py`), they set `df['&-s_close']`. FreqAI makes the predictions and gives them back under the same key (`df['&-s_close']`) to be used in `populate_entry/exit_trend()`.
**Datatype:** Depends on the output of the model. -| `df['&*_std/mean']` | Standard deviation and mean values of the user-defined labels during training (or live tracking with `fit_live_predictions_candles`). Commonly used to understand the rarity of a prediction (use the z-score as shown in `templates/FreqaiExampleStrategy.py` to evaluate how often a particular prediction was observed during training or historically with `fit_live_predictions_candles`).
**Datatype:** Float. -| `df['do_predict']` | Indication of an outlier data point. The return value is integer between -1 and 2, which lets the user know if the prediction is trustworthy or not. `do_predict==1` means the prediction is trustworthy. If the Dissimilarity Index (DI, see details [here](#removing-outliers-with-the-dissimilarity-index)) of the input data point is above the user-defined threshold, FreqAI will subtract 1 from `do_predict`, resulting in `do_predict==0`. If `use_SVM_to_remove_outliers()` is active, the Support Vector Machine (SVM) may also detect outliers in training and prediction data. In this case, the SVM will also subtract 1 from `do_predict`. If the input data point was considered an outlier by the SVM but not by the DI, the result will be `do_predict==0`. If both the DI and the SVM considers the input data point to be an outlier, the result will be `do_predict==-1`. A particular case is when `do_predict == 2`, which means that the model has expired due to exceeding `expired_hours`.
**Datatype:** Integer between -1 and 2. -| `df['DI_values']` | Dissimilarity Index values are proxies to the level of confidence FreqAI has in the prediction. A lower DI means the prediction is close to the training data, i.e., higher prediction confidence.
**Datatype:** Float. -| `df['%*']` | Any dataframe column prepended with `%` in `populate_any_indicators()` is treated as a training feature. For example, the user can include the RSI in the training feature set (similar to in `templates/FreqaiExampleStrategy.py`) by setting `df['%-rsi']`. See more details on how this is done [here](#feature-engineering).
**Note**: Since the number of features prepended with `%` can multiply very quickly (10s of thousands of features is easily engineered using the multiplictative functionality described in the `feature_parameters` table shown above), these features are removed from the dataframe upon return from FreqAI. If the user wishes to keep a particular type of feature for plotting purposes, they can prepend it with `%%`.
**Datatype:** Depends on the output of the model. - -### File structure - -`user_data_dir/models/` contains all the data associated with the trainings and backtests. -This file structure is heavily controlled and inferenced by the `FreqaiDataKitchen()` -and should therefore not be modified. - -### Example config file - -The user interface is isolated to the typical Freqtrade config file. A FreqAI config should include: - -```json - "freqai": { - "enabled": true, - "startup_candles": 10000, - "purge_old_models": true, - "train_period_days": 30, - "backtest_period_days": 7, - "identifier" : "unique-id", - "feature_parameters" : { - "include_timeframes": ["5m","15m","4h"], - "include_corr_pairlist": [ - "ETH/USD", - "LINK/USD", - "BNB/USD" - ], - "label_period_candles": 24, - "include_shifted_candles": 2, - "indicator_periods_candles": [10, 20] - }, - "data_split_parameters" : { - "test_size": 0.25 - }, - "model_training_parameters" : { - "n_estimators": 100 - }, - } -``` - -## Building a FreqAI strategy - -The FreqAI strategy requires the user to include the following lines of code in the standard Freqtrade strategy: - -```python - # user should define the maximum startup candle count (the largest number of candles - # passed to any single indicator) - startup_candle_count: int = 20 - - def informative_pairs(self): - whitelist_pairs = self.dp.current_whitelist() - corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] - informative_pairs = [] - for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]: - for pair in whitelist_pairs: - informative_pairs.append((pair, tf)) - for pair in corr_pairs: - if pair in whitelist_pairs: - continue # avoid duplication - informative_pairs.append((pair, tf)) - return informative_pairs - - def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - - # the model will return all labels created by user in `populate_any_indicators` - # (& appended targets), an indication of whether or not the prediction should be accepted, - # the target mean/std values for each of the labels created by user in - # `populate_any_indicators()` for each training period. - - dataframe = self.freqai.start(dataframe, metadata, self) - - return dataframe - - def populate_any_indicators( - self, pair, df, tf, informative=None, set_generalized_indicators=False - ): - """ - Function designed to automatically generate, name and merge features - from user indicated timeframes in the configuration file. User controls the indicators - passed to the training/prediction by prepending indicators with `'%-' + coin ` - (see convention below). I.e. user should not prepend any supporting metrics - (e.g. bb_lowerband below) with % unless they explicitly want to pass that metric to the - model. - :param pair: pair to be used as informative - :param df: strategy dataframe which will receive merges from informatives - :param tf: timeframe of the dataframe which will modify the feature names - :param informative: the dataframe associated with the informative pair - :param coin: the name of the coin which will modify the feature names. - """ - - coin = pair.split('/')[0] - - if informative is None: - informative = self.dp.get_pair_dataframe(pair, tf) - - # first loop is automatically duplicating indicators for time periods - for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]: - t = int(t) - informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) - informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) - - indicators = [col for col in informative if col.startswith("%")] - # This loop duplicates and shifts all indicators to add a sense of recency to data - for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): - if n == 0: - continue - informative_shift = informative[indicators].shift(n) - informative_shift = informative_shift.add_suffix("_shift-" + str(n)) - informative = pd.concat((informative, informative_shift), axis=1) - - df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True) - skip_columns = [ - (s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"] - ] - df = df.drop(columns=skip_columns) - - # Add generalized indicators here (because in live, it will call this - # function to populate indicators during training). Notice how we ensure not to - # add them multiple times - if set_generalized_indicators: - - # user adds targets here by prepending them with &- (see convention below) - # If user wishes to use multiple targets, a multioutput prediction model - # needs to be used such as templates/CatboostPredictionMultiModel.py - df["&-s_close"] = ( - df["close"] - .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - .mean() - / df["close"] - - 1 - ) - - return df - - -``` - -Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](#feature-engineering)) and labels ([more information](#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. - -*Important*: The `self.freqai.start()` function cannot be called outside the `populate_indicators()`. - -### Setting the `startup_candle_count` -Users need to take care to set the `startup_candle_count` in their strategy the same way they would for any normal Freqtrade strategy (see details [here](strategy-customization.md#strategy-startup-period)). This value is used by Freqtrade to ensure that a sufficient amount of data is provided when calling on the `dataprovider` to avoid any NaNs at the beginning of the first training. Users can easily set this value by identifying the longest period (in candle units) that they pass to their indicator creation functions (e.g. talib functions). In the present example, the user would pass 20 to as this value (since it is the maximum value in their `indicators_periods_candles`). - -!!! Note - Typically it is best for users to be safe and multiply their expected `startup_candle_count` by 2. There are instances where the talib functions actually require more data than just the passed `period`. Anecdotally, multiplying the `startup_candle_count` by 2 always leads to a fully NaN free training dataset. Look out for this log message to confirm that your data is clean: - - ``` - 2022-08-31 15:14:04 - freqtrade.freqai.data_kitchen - INFO - dropped 0 training points due to NaNs in populated dataset 4319. - ``` - - -## Creating a dynamic target - -The `&*_std/mean` return values describe the statistical fit of the user defined label *during the most recent training*. This value allows the user to know the rarity of a given prediction. For example, `templates/FreqaiExampleStrategy.py`, creates a `target_roi` which is based on filtering out predictions that are below a given z-score of 1.25. - -```python -dataframe["target_roi"] = dataframe["&-s_close_mean"] + dataframe["&-s_close_std"] * 1.25 -dataframe["sell_roi"] = dataframe["&-s_close_mean"] - dataframe["&-s_close_std"] * 1.25 -``` - -If the user wishes to consider the population -of *historical predictions* for creating the dynamic target instead of the trained labels, (as discussed above) the user -can do so by setting `fit_live_prediction_candles` in the config to the number of historical prediction candles -the user wishes to use to generate target statistics. - -```json - "freqai": { - "fit_live_prediction_candles": 300, - } -``` - -If the user sets this value, FreqAI will initially use the predictions from the training data -and subsequently begin introducing real prediction data as it is generated. FreqAI will save -this historical data to be reloaded if the user stops and restarts a model with the same `identifier`. - -## Building a custom prediction model - -FreqAI has multiple example prediction model libraries, such as `Catboost` regression (`freqai/prediction_models/CatboostRegressor.py`) and `LightGBM` regression. -However, the user can customize and create their own prediction models using the `IFreqaiModel` class. -The user is encouraged to inherit `train()` and `predict()` to let them customize various aspects of their training procedures. - -## Feature engineering - -Features are added by the user inside the `populate_any_indicators()` method of the strategy -by prepending indicators with `%`, and labels with `&`. - -There are some important components/structures that the user *must* include when building their feature set; the use of these is shown below: - -```python - def populate_any_indicators( - self, pair, df, tf, informative=None, set_generalized_indicators=False - ): - """ - Function designed to automatically generate, name, and merge features - from user-indicated timeframes in the configuration file. The user controls the indicators - passed to the training/prediction by prepending indicators with `'%-' + coin ` - (see convention below). I.e., the user should not prepend any supporting metrics - (e.g., bb_lowerband below) with % unless they explicitly want to pass that metric to the - model. - :param pair: pair to be used as informative - :param df: strategy dataframe which will receive merges from informatives - :param tf: timeframe of the dataframe which will modify the feature names - :param informative: the dataframe associated with the informative pair - :param coin: the name of the coin which will modify the feature names. - """ - - coin = pair.split('/')[0] - - if informative is None: - informative = self.dp.get_pair_dataframe(pair, tf) - - # first loop is automatically duplicating indicators for time periods - for t in self.freqai_info["feature_parameters"]["indicator_periods_candles"]: - t = int(t) - informative[f"%-{coin}rsi-period_{t}"] = ta.RSI(informative, timeperiod=t) - informative[f"%-{coin}mfi-period_{t}"] = ta.MFI(informative, timeperiod=t) - informative[f"%-{coin}adx-period_{t}"] = ta.ADX(informative, window=t) - - bollinger = qtpylib.bollinger_bands( - qtpylib.typical_price(informative), window=t, stds=2.2 - ) - informative[f"{coin}bb_lowerband-period_{t}"] = bollinger["lower"] - informative[f"{coin}bb_middleband-period_{t}"] = bollinger["mid"] - informative[f"{coin}bb_upperband-period_{t}"] = bollinger["upper"] - - informative[f"%-{coin}bb_width-period_{t}"] = ( - informative[f"{coin}bb_upperband-period_{t}"] - - informative[f"{coin}bb_lowerband-period_{t}"] - ) / informative[f"{coin}bb_middleband-period_{t}"] - informative[f"%-{coin}close-bb_lower-period_{t}"] = ( - informative["close"] / informative[f"{coin}bb_lowerband-period_{t}"] - ) - - informative[f"%-{coin}relative_volume-period_{t}"] = ( - informative["volume"] / informative["volume"].rolling(t).mean() - ) - - indicators = [col for col in informative if col.startswith("%")] - # This loop duplicates and shifts all indicators to add a sense of recency to data - for n in range(self.freqai_info["feature_parameters"]["include_shifted_candles"] + 1): - if n == 0: - continue - informative_shift = informative[indicators].shift(n) - informative_shift = informative_shift.add_suffix("_shift-" + str(n)) - informative = pd.concat((informative, informative_shift), axis=1) - - df = merge_informative_pair(df, informative, self.config["timeframe"], tf, ffill=True) - skip_columns = [ - (s + "_" + tf) for s in ["date", "open", "high", "low", "close", "volume"] - ] - df = df.drop(columns=skip_columns) - - # Add generalized indicators here (because in live, it will call this - # function to populate indicators during training). Notice how we ensure not to - # add them multiple times - if set_generalized_indicators: - df["%-day_of_week"] = (df["date"].dt.dayofweek + 1) / 7 - df["%-hour_of_day"] = (df["date"].dt.hour + 1) / 25 - - # user adds targets here by prepending them with &- (see convention below) - # If user wishes to use multiple targets, a multioutput prediction model - # needs to be used such as templates/CatboostPredictionMultiModel.py - df["&-s_close"] = ( - df["close"] - .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - .mean() - / df["close"] - - 1 - ) - - return df -``` - -In the presented example strategy, the user does not wish to pass the `bb_lowerband` as a feature to the model, -and has therefore not prepended it with `%`. The user does, however, wish to pass `bb_width` to the -model for training/prediction and has therefore prepended it with `%`. - -The `include_timeframes` in the example config above are the timeframes (`tf`) of each call to `populate_any_indicators()` in the strategy. In the present case, the user is asking for the -`5m`, `15m`, and `4h` timeframes of the `rsi`, `mfi`, `roc`, and `bb_width` to be included in the feature set. - -The user can ask for each of the defined features to be included also from -informative pairs using the `include_corr_pairlist`. This means that the feature -set will include all the features from `populate_any_indicators` on all the `include_timeframes` for each of the correlated pairs defined in the config (`ETH/USD`, `LINK/USD`, and `BNB/USD`). - -`include_shifted_candles` indicates the number of previous -candles to include in the feature set. For example, `include_shifted_candles: 2` tells -FreqAI to include the past 2 candles for each of the features in the feature set. - -In total, the number of features the user of the presented example strat has created is: -length of `include_timeframes` * no. features in `populate_any_indicators()` * length of `include_corr_pairlist` * no. `include_shifted_candles` * length of `indicator_periods_candles` - $= 3 * 3 * 3 * 2 * 2 = 108$. - -Another structure to consider is the location of the labels at the bottom of the example function (below `if set_generalized_indicators:`). -This is where the user will add single features and labels to their feature set to avoid duplication of them from -various configuration parameters that multiply the feature set, such as `include_timeframes`. - -!!! Note - Features **must** be defined in `populate_any_indicators()`. Definining FreqAI features in `populate_indicators()` - will cause the algorithm to fail in live/dry mode. If the user wishes to add generalized features that are not associated with - a specific pair or timeframe, they should use the following structure inside `populate_any_indicators()` - (as exemplified in `freqtrade/templates/FreqaiExampleStrategy.py`): - - ```python - def populate_any_indicators(self, metadata, pair, df, tf, informative=None, coin="", set_generalized_indicators=False): - - ... - - # Add generalized indicators here (because in live, it will call only this function to populate - # indicators for retraining). Notice how we ensure not to add them multiple times by associating - # these generalized indicators to the basepair/timeframe - if set_generalized_indicators: - df['%-day_of_week'] = (df["date"].dt.dayofweek + 1) / 7 - df['%-hour_of_day'] = (df['date'].dt.hour + 1) / 25 - - # user adds targets here by prepending them with &- (see convention below) - # If user wishes to use multiple targets, a multioutput prediction model - # needs to be used such as templates/CatboostPredictionMultiModel.py - df["&-s_close"] = ( - df["close"] - .shift(-self.freqai_info["feature_parameters"]["label_period_candles"]) - .rolling(self.freqai_info["feature_parameters"]["label_period_candles"]) - .mean() - / df["close"] - - 1 - ) - ``` - - (Please see the example script located in `freqtrade/templates/FreqaiExampleStrategy.py` for a full example of `populate_any_indicators()`.) - -## Setting classifier targets - -FreqAI includes the `CatboostClassifier` via the flag `--freqaimodel CatboostClassifier`. The user should take care to set the classes using strings: - -```python -df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down') -``` - -Additionally, the example classifier models do not accommodate multiple labels, but they do allow multi-class classification within a single label column. - -## Running FreqAI - -There are two ways to train and deploy an adaptive machine learning model. FreqAI enables live deployment as well as backtesting analyses. In both cases, a model is trained periodically, as shown in the following figure. - -![freqai-window](assets/freqai_moving-window.jpg) - -### Running the model live - -FreqAI can be run dry/live using the following command: - -```bash -freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor -``` - -By default, FreqAI will not find any existing models and will start by training a new one -based on the user's configuration settings. Following training, the model will be used to make predictions on incoming candles until a new model is available. New models are typically generated as often as possible, with FreqAI managing an internal queue of the coin pairs to try to keep all models equally up to date. FreqAI will always use the most recently trained model to make predictions on incoming live data. If the user does not want FreqAI to retrain new models as often as possible, they can set `live_retrain_hours` to tell FreqAI to wait at least that number of hours before training a new model. Additionally, the user can set `expired_hours` to tell FreqAI to avoid making predictions on models that are older than that number of hours. - -If the user wishes to start a dry/live run from a saved backtest model (or from a previously crashed dry/live session), the user only needs to reuse -the same `identifier` parameter: - -```json - "freqai": { - "identifier": "example", - "live_retrain_hours": 0.5 - } -``` - -In this case, although FreqAI will initiate with a -pre-trained model, it will still check to see how much time has elapsed since the model was trained, -and if a full `live_retrain_hours` has elapsed since the end of the loaded model, FreqAI will retrain. - -### Backtesting - -The FreqAI backtesting module can be executed with the following command: - -```bash -freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701 -``` - -Backtesting mode requires the user to have the data [pre-downloaded](#downloading-data-for-backtesting) (unlike in dry/live mode where FreqAI automatically downloads the necessary data). The user should be careful to consider that the time range of the downloaded data is more than the backtesting time range. This is because FreqAI needs data prior to the desired backtesting time range in order to train a model to be ready to make predictions on the first candle of the user-set backtesting time range. More details on how to calculate the data to download can be found [here](#deciding-the-sliding-training-window-and-backtesting-duration). - -If this command has never been executed with the existing config file, it will train a new model -for each pair, for each backtesting window within the expanded `--timerange`. - -!!! Note "Model reuse" - Once the training is completed, the user can execute the backtesting again with the same config file and - FreqAI will find the trained models and load them instead of spending time training. This is useful - if the user wants to tweak (or even hyperopt) buy and sell criteria inside the strategy. If the user - *wants* to retrain a new model with the same config file, then they should simply change the `identifier`. - This way, the user can return to using any model they wish by simply specifying the `identifier`. - ---- - -### Hyperopt - -Users can hyperopt using the same command as typical [hyperopt](hyperopt.md): - -```bash -freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507 -``` - -Users need to have the data pre-downloaded in the same fashion as if they were doing a FreqAI [backtest](#backtesting). In addition, users must consider some restrictions when trying to [Hyperopt](hyperopt.md) FreqAI strategies: - -- The `--analyze-per-epoch` hyperopt parameter is not compatible with FreqAI. -- It's not possible to hyperopt indicators in `populate_any_indicators()` function. This means that the user cannot optimize model parameters using hyperopt. Apart from this exception, it is possible to optimize all other [spaces](hyperopt.md#running-hyperopt-with-smaller-search-space). -- The [Backtesting](#backtesting) instructions also apply to Hyperopt. - -The best method for combining hyperopt and FreqAI is to focus on hyperopting entry/exit thresholds/criteria. Users need to focus on hyperopting parameters that are not used in their FreqAI features. For example, users should not try to hyperopt rolling window lengths in their feature creation, or any of their FreqAI config which changes predictions. In order to efficiently hyperopt the FreqAI strategy, FreqAI stores predictions as dataframes and reuses them. Hence the requirement to hyperopt entry/exit thresholds/criteria only. - -A good example of a hyperoptable parameter in FreqAI is a value for `DI_values` beyond which we consider outliers and below which we consider inliers: - -```python -di_max = IntParameter(low=1, high=20, default=10, space='buy', optimize=True, load=True) -dataframe['outlier'] = np.where(dataframe['DI_values'] > self.di_max.value/10, 1, 0) -``` - -Which would help the user understand the appropriate Dissimilarity Index values for their particular parameter space. - -### Deciding the size of the sliding training window and backtesting duration - -The user defines the backtesting timerange with the typical `--timerange` parameter in the -configuration file. The duration of the sliding training window is set by `train_period_days`, whilst -`backtest_period_days` is the sliding backtesting window, both in number of days (`backtest_period_days` can be -a float to indicate sub-daily retraining in live/dry mode). In the presented example config, -the user is asking FreqAI to use a training period of 30 days and backtest on the subsequent 7 days. -This means that if the user sets `--timerange 20210501-20210701`, -FreqAI will train have trained 8 separate models at the end of `--timerange` (because the full range comprises 8 weeks). After the training of the model, FreqAI will backtest the subsequent 7 days. The "sliding window" then moves one week forward (emulating FreqAI retraining once per week in live mode) and the new model uses the previous 30 days (including the 7 days used for backtesting by the previous model) to train. This is repeated until the end of `--timerange`. - -!!! Note - Although fractional `backtest_period_days` is allowed, the user should be aware that the `--timerange` is divided by this value to determine the number of models that FreqAI will need to train in order to backtest the full range. For example, if the user wants to set a `--timerange` of 10 days, and asks for a `backtest_period_days` of 0.1, FreqAI will need to train 100 models per pair to complete the full backtest. Because of this, a true backtest of FreqAI adaptive training would take a *very* long time. The best way to fully test a model is to run it dry and let it constantly train. In this case, backtesting would take the exact same amount of time as a dry run. - -### Downloading data for backtesting -Live/dry instances will download the data automatically for the user, but users who wish to use backtesting functionality still need to download the necessary data using `download-data` (details [here](data-download.md#data-downloading)). FreqAI users need to pay careful attention to understanding how much *additional* data needs to be downloaded to ensure that they have a sufficient amount of training data *before* the start of their backtesting timerange. The amount of additional data can be roughly estimated by moving the start date of the timerange backwards by `train_period_days` and the `startup_candle_count` ([details](#setting-the-startupcandlecount)) from the beginning of the desired backtesting timerange. - -As an example, if we wish to backtest the `--timerange` above of `20210501-20210701`, and we use the example config which sets `train_period_days` to 15. The startup candle count is 40 on a maximum `include_timeframes` of 1h. We would need 20210501 - 15 days - 40 * 1h / 24 hours = 20210414 (16.7 days earlier than the start of the desired training timerange). - -### Defining model expirations - -During dry/live mode, FreqAI trains each coin pair sequentially (on separate threads/GPU from the main Freqtrade bot). This means that there is always an age discrepancy between models. If a user is training on 50 pairs, and each pair requires 5 minutes to train, the oldest model will be over 4 hours old. This may be undesirable if the characteristic time scale (the trade duration target) for a strategy is less than 4 hours. The user can decide to only make trade entries if the model is less than -a certain number of hours old by setting the `expiration_hours` in the config file: - -```json - "freqai": { - "expiration_hours": 0.5, - } -``` - -In the presented example config, the user will only allow predictions on models that are less than 1/2 hours old. - -### Purging old model data - -FreqAI stores new model files each time it retrains. These files become obsolete as new models are trained and FreqAI adapts to new market conditions. Users planning to leave FreqAI running for extended periods of time with high frequency retraining should enable `purge_old_models` in their config: - -```json - "freqai": { - "purge_old_models": true, - } -``` - -This will automatically purge all models older than the two most recently trained ones. - -### Returning additional info from training - -The user may find that there are some important metrics that they'd like to return to the strategy at the end of each model training. -The user can include these metrics by assigning them to `dk.data['extra_returns_per_train']['my_new_value'] = XYZ` inside their custom prediction model class. FreqAI takes the `my_new_value` assigned in this dictionary and expands it to fit the return dataframe to the strategy. -The user can then use the value in the strategy with `dataframe['my_new_value']`. An example of how this is already used in FreqAI is -the `&*_mean` and `&*_std` values, which indicate the mean and standard deviation of the particular target (label) during the most recent training. -An example, where the user wants to use live metrics from the trade database, is shown below: - -```json - "freqai": { - "extra_returns_per_train": {"total_profit": 4} - } -``` - -The user needs to set the standard dictionary in the config so that FreqAI can return proper dataframe shapes. These values will likely be overridden by the prediction model, but in the case where the model has yet to set them, or needs a default initial value, this is the value that will be returned. - -### Setting up a follower - -The user can define: - -```json - "freqai": { - "follow_mode": true, - "identifier": "example" - } -``` - -to indicate to the bot that it should not train models, but instead should look for models trained by a leader with the same `identifier`. In this example, the user has a leader bot with the `identifier: "example"`. The leader bot is already running or launching simultaneously as the follower. -The follower will load models created by the leader and inference them to obtain predictions. - -## Data manipulation techniques - -### Feature normalization - -The feature set created by the user is automatically normalized to the training data. This includes all test data and unseen prediction data (dry/live/backtest). - -### Reducing data dimensionality with Principal Component Analysis - -Users can reduce the dimensionality of their features by activating the `principal_component_analysis` in the config: - -```json - "freqai": { - "feature_parameters" : { - "principal_component_analysis": true - } - } -``` - -This will perform PCA on the features and reduce the dimensionality of the data so that the explained variance of the data set is >= 0.999. - -### Stratifying the data for training and testing the model - -The user can stratify (group) the training/testing data using: - -```json - "freqai": { - "feature_parameters" : { - "stratify_training_data": 3 - } - } -``` - -This will split the data chronologically so that every Xth data point is used to test the model after training. In the -example above, the user is asking for every third data point in the dataframe to be used for -testing; the other points are used for training. - -The test data is used to evaluate the performance of the model after training. If the test score is high, the model is able to capture the behavior of the data well. If the test score is low, either the model either does not capture the complexity of the data, the test data is significantly different from the train data, or a different model should be used. - -### Using the `inlier_metric` - -The `inlier_metric` is a metric aimed at quantifying how different a prediction data point is from the most recent historic data points. - -User can set `inlier_metric_window` to set the look back window. FreqAI will compute the distance between the present prediction point and each of the previous data points (total of `inlier_metric_window` points). - -This function goes one step further - during training, it computes the `inlier_metric` for all training data points and builds weibull distributions for each each lookback point. The cumulative distribution function for the weibull distribution is used to produce a quantile for each of the data points. The quantiles for each lookback point are averaged to create the `inlier_metric`. - -FreqAI adds this `inlier_metric` score to the training features! In other words, your model is trained to recognize how this temporal inlier metric is related to the user set labels. - -This function does **not** remove outliers from the data set. - -### Controlling the model learning process - -Model training parameters are unique to the machine learning library selected by the user. FreqAI allows the user to set any parameter for any library using the `model_training_parameters` dictionary in the user configuration file. The example configuration file (found in `config_examples/config_freqai.example.json`) show some of the example parameters associated with `Catboost` and `LightGBM`, but the user can add any parameters available in those libraries. - -Data split parameters are defined in `data_split_parameters` which can be any parameters associated with `Sklearn`'s `train_test_split()` function. - -FreqAI includes some additional parameters such as `weight_factor`, which allows the user to weight more recent data more strongly -than past data via an exponential function: - -$$ W_i = \exp(\frac{-i}{\alpha*n}) $$ - -where $W_i$ is the weight of data point $i$ in a total set of $n$ data points. Below is a figure showing the effect of different weight factors on the data points (candles) in a feature set. - -![weight-factor](assets/freqai_weight-factor.jpg) - -`train_test_split()` has a parameters called `shuffle` that allows the user to keep the data unshuffled. This is particularly useful to avoid biasing training with temporally auto-correlated data. - -Finally, `label_period_candles` defines the offset (number of candles into the future) used for the `labels`. In the presented example config, -the user is asking for `labels` that are 24 candles in the future. - -### Outlier removal - -#### Removing outliers with the Dissimilarity Index - -The user can tell FreqAI to remove outlier data points from the training/test data sets using a Dissimilarity Index by including the following statement in the config: - -```json - "freqai": { - "feature_parameters" : { - "DI_threshold": 1 - } - } -``` - -Equity and crypto markets suffer from a high level of non-patterned noise in the form of outlier data points. The Dissimilarity Index (DI) aims to quantify the uncertainty associated with each prediction made by the model. The DI allows predictions which are outliers (not existent in the model feature space) to be thrown out due to low levels of certainty. - -To do so, FreqAI measures the distance between each training data point (feature vector), $X_{a}$, and all other training data points: - -$$ d_{ab} = \sqrt{\sum_{j=1}^p(X_{a,j}-X_{b,j})^2} $$ - -where $d_{ab}$ is the distance between the normalized points $a$ and $b$. $p$ is the number of features, i.e., the length of the vector $X$. The characteristic distance, $\overline{d}$ for a set of training data points is simply the mean of the average distances: - -$$ \overline{d} = \sum_{a=1}^n(\sum_{b=1}^n(d_{ab}/n)/n) $$ - -$\overline{d}$ quantifies the spread of the training data, which is compared to the distance between a new prediction feature vectors, $X_k$ and all the training data: - -$$ d_k = \arg \min d_{k,i} $$ - -which enables the estimation of the Dissimilarity Index as: - -$$ DI_k = d_k/\overline{d} $$ - -The user can tweak the DI through the `DI_threshold` to increase or decrease the extrapolation of the trained model. - -Below is a figure that describes the DI for a 3D data set. - -![DI](assets/freqai_DI.jpg) - -#### Removing outliers using a Support Vector Machine (SVM) - -The user can tell FreqAI to remove outlier data points from the training/test data sets using a SVM by setting: - -```json - "freqai": { - "feature_parameters" : { - "use_SVM_to_remove_outliers": true - } - } -``` - -FreqAI will train an SVM on the training data (or components of it if the user activated -`principal_component_analysis`) and remove any data point that the SVM deems to be beyond the feature space. - -The parameter `shuffle` is by default set to `False` to ensure consistent results. If it is set to `True`, running the SVM multiple times on the same data set might result in different outcomes due to `max_iter` being to low for the algorithm to reach the demanded `tol`. Increasing `max_iter` solves this issue but causes the procedure to take longer time. - -The parameter `nu`, *very* broadly, is the amount of data points that should be considered outliers. - -#### Removing outliers with DBSCAN - -The user can configure FreqAI to use DBSCAN to cluster and remove outliers from the training/test data set or incoming outliers from predictions, by activating `use_DBSCAN_to_remove_outliers` in the config: - -```json - "freqai": { - "feature_parameters" : { - "use_DBSCAN_to_remove_outliers": true - } - } -``` - -DBSCAN is an unsupervised machine learning algorithm that clusters data without needing to know how many clusters there should be. - -Given a number of data points $N$, and a distance $\varepsilon$, DBSCAN clusters the data set by setting all data points that have $N-1$ other data points within a distance of $\varepsilon$ as *core points*. A data point that is within a distance of $\varepsilon$ from a *core point* but that does not have $N-1$ other data points within a distance of $\varepsilon$ from itself is considered an *edge point*. A cluster is then the collection of *core points* and *edge points*. Data points that have no other data points at a distance $<\varepsilon$ are considered outliers. The figure below shows a cluster with $N = 3$. - -![dbscan](assets/freqai_dbscan.jpg) - -FreqAI uses `sklearn.cluster.DBSCAN` (details are available on scikit-learn's webpage [here](#https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html)) with `min_samples` ($N$) taken as 1/4 of the no. of time points in the feature set, and `eps` ($\varepsilon$) taken as the elbow point in the *k-distance graph* computed from the nearest neighbors in the pairwise distances of all data points in the feature set. - -## Additional information - -### Common pitfalls - -FreqAI cannot be combined with dynamic `VolumePairlists` (or any pairlist filter that adds and removes pairs dynamically). -This is for performance reasons - FreqAI relies on making quick predictions/retrains. To do this effectively, -it needs to download all the training data at the beginning of a dry/live instance. FreqAI stores and appends -new candles automatically for future retrains. This means that if new pairs arrive later in the dry run due to a volume pairlist, it will not have the data ready. However, FreqAI does work with the `ShufflePairlist` or a `VolumePairlist` which keeps the total pairlist constant (but reorders the pairs according to volume). +For docker users, a dedicated tag with freqAI dependencies is available as `:freqai`. As such - you can replace the image line in your docker-compose file with `image: freqtradeorg/freqtrade:develop_freqai`. This image contains the regular freqAI dependencies. Similar to native installs, Catboost will not be available on ARM based devices. ## Credits @@ -804,6 +81,9 @@ Elin Törnquist @th0rntwig Code review, software architecture brainstorming: @xmatthias +Development: +Wagner Costa @wagnercosta + Beta testing and bug reporting: -@bloodhunter4rc, Salah Lamkadem @ikonx, @ken11o2, @longyu, @paranoidandy, @smidelis, @smarm, -Juha Nykänen @suikula, Wagner Costa @wagnercosta +Stefan Gehring @bloodhunter4rc, @longyu, @paranoidandy, @smidelis, Ryan McMullan @smarmau, +Juha Nykänen @suikula, Johan van der Vlugt @jooopiert, Richárd Józsa @richardjosza diff --git a/mkdocs.yml b/mkdocs.yml index 2e5e0c8c9..95106ae1e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,6 +23,12 @@ nav: - Data Downloading: data-download.md - Backtesting: backtesting.md - Hyperopt: hyperopt.md + - FreqAI: + - Introduction: freqai.md + - Setting-up: freqai-configuration.md + - Feature engineering: freqai-feature-engineering.md + - Running: freqai-running.md + - Data handling: freqai-data-handling.md - Short / Leverage: leverage.md - Utility Sub-commands: utils.md - Plotting: plotting.md @@ -35,7 +41,6 @@ nav: - Advanced Post-installation Tasks: advanced-setup.md - Advanced Strategy: strategy-advanced.md - Advanced Hyperopt: advanced-hyperopt.md - - FreqAI: freqai.md - Edge Positioning: edge.md - Sandbox Testing: sandbox-testing.md - FAQ: faq.md From ede282392f1d9b497da91825017439555646119e Mon Sep 17 00:00:00 2001 From: robcaulk Date: Sun, 11 Sep 2022 17:50:50 +0200 Subject: [PATCH 238/437] add a developers guide --- docs/assets/freqai_algorithm-diagram.jpg | Bin 0 -> 491920 bytes docs/freqai-configuration.md | 2 +- docs/freqai-developers.md | 28 +++++++++++++++++++++++ mkdocs.yml | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 docs/assets/freqai_algorithm-diagram.jpg create mode 100644 docs/freqai-developers.md diff --git a/docs/assets/freqai_algorithm-diagram.jpg b/docs/assets/freqai_algorithm-diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d02488e996dd21b321f28628be8a30b640a8406 GIT binary patch literal 491920 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℘-(zLy#Cbd~M$9fUo{2(j_r7jL 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%0DfI_RHMt7xuxWA> zpy&t6%H+=tA!nICR>VBK>C+^ByaqLW0z40P-{SaWE(0a}Zp*hQ2> zBDJTW3ltcVbf2er?8w^xXWyKpDa?NY!N2krV*0 z>9Nrm_dp(*03#Yt`yV`C{JvNturnPn zZ<4X-^7bH-o|}bwV!u}kUCm@;az#IoJ8U9^JD#6QGfVUcFpob0-L5nj`7Kfjp2DxV zzo&G!SiTp&-c0CfO=qYieA5$gaX7ynylK2=dWQ*SZ!h0j_Exlje`iG>U|n^;fI?sO z0~;F${Yjx`6JgkCc(B2gISx_|XS4WMq?yY)OYPGD zWcJcuA$_shcQXEJa;4P{KCBnIbFM)8hS*j4$z&O#$nJz=S=uJGjWCT45YmS#pHT_e zfn>RZG`s+yV=_iF(TBoZA;N&P(2O0KY35K?K?|E>bRBBbBT% zp7L!`223r@*bPH@{`9F?KbyH$%)#saP?*0!;}rs9t|*!sT~#7zvlA4ZzsGwC=*h`naW$<~bmzdfN+xDJ52?QiZDOF$Rz)*40% zg+$K#Jw&n?W<3#n`dhd)3RHs&V0`XuhXXqa6Hos%MT)Y_-bG64IEZlno2(t&KK+c5hFz*$tLNjZ;eRnqeo?^dIS8x48XKu zWKGP#Uw$T9O#*kh;&i2E9@Am-F7=4iD6fO|W9kU9-6OSo#_yQy!j{ZUG`K|7xZ~H7 z7Q8`}V*KTsheB0K@xvvJi_U5$3HEA^@*hbo5JYF9id0e7?4*$k0(>?uFh_23`8F*U zRpTP;ecwPJ7ui{X6|@i9{vv;n@#k)-wI_@YBLDQ^kS>>*>2TA-?q4!qD3 zK?ifWQTi`ViL~9LH-T(jKOW97jX?-CKl%oLb6f9=yFZUNZVekEMo$gI#s!Bwkg?<& zZGJCrL--9#x1TeRAn<)w0rNxatGq9oQ;lh4Qx7DCVGKoWWF{j?2e6BU#4%|>_BDs` zE)Nd6RipW=8=9iVi;d){R;Dpxh;z+K&H8>7vy=evs7m@!o@S$6de(2c0io859)8g% zoNYmLTc7&(^rBhSh`fXDVGZX_aU&qN+0b6%ULo<;d|J=(j zV9gPdcJW9qgDEZ8lzY%gHl}8RMG%3{_t46nxwes<*Ym8+DhN|3SUSm0{nBxAVt8xv zCQCK2PeolR)Ay0Q{}h?QYo5hzS}pyIqD{6F%e;D*1qAOAhcF6}%D-4s@93B1mo1=e zr9TwEOCnvftf^xsywPGcZ7GOJR%&|F5-U{gl4EkOq?<1lOu^ZlLl!WXnk%=HRNt^1 z>+F17CwKp;j*bWJ97@$g?f2Hj+=azSl_Qn_sNG-q$okcu9ZjHquLnzR> zu8a~5!nlh*14KBRv+OT6g~Y%Tb}UTO+m+g@x#l5+a0(grF)tZ0#ZeS{1{3YrLbyS_ zsujp+$8dR>yp7VAKfNi&*VN&M44v&dHIM9pmx3s7&6e%Z7*$-==alhJTp<-$%sxgS zD5dU+W~T0_3= zHz}v3p(kl3_@ZtdIfAik$2rKO!sK+;4iWdTgzAFi?27muyfiC&u3;_=eI6ss@0p6; zDS{<#JC}}jZ%N&Z##p5pf{M3|a3*ZA{b5zQZ%ha<`jB;@;R}YF}q|f4FBZVMgo1 z6Sp3p#ak@m_rq{o@?juT_h{YHA@-US!O%A%SRQgZ>)f6#)MQm3VjkZ8$1$wn>r1_Bvgdt4Ld+l-gLqG8JySK5HNU zJQPJPdxqq>-2#rQ8E)?E{IsR~h~qrb|2kCXIHx!^#=Iwc>;0=4s71kg zmZh*`LI*pnwXI2rZW3nWU_K6?_pqEOnerUUNfURnj}oF75!9;krcnTn(-K$$0k4^& z=~+0>R70h}-{lZ-@U5c>mGtNi&QaM;-Awe9_X8XlLu(n z4y->JwsmFlF*nN2W37^Rv7o?ROZ&Bfjol33cE43d&$jj~-3t8`4YCqJ&mzi}@krG6rTY3x#;UizaZVU$s|A5 zUm>3TnaTb@R?}^*&ITv3z+u7_WsCV=-wM@MbW$ z1nSyxO1L{c9z-LeeBPr1Y>f9*XPk7x4S;A5$yU{AX&a}kW*)0+;l0-brZE3`NdtC7 z6sv#AZ7)nYuMVWgUg+=$c~6yT1U2Z(+k@^6$S(|D|KB!RHVbu6QLm;}CqCv8j^_l# z?rz^{YEZ9+tXC8+J-&4>hhW|ND;5poGGFBKI(MrIO3pk3Ns$S~G5KWGz$~uh+%PXv zZZgAc)p306mMC7!Lcs}LlDWmqi9{rqdZ4f1;UE%-IkBn9@>WyQ(!PsN7E+t2b!gjjqg#?g(c@DlF^FsV`K&@&d1pv^Vn&Foqtz* z$ceeIQ1%q_NW6Sw(rm<~bD2@+o*6&S)slM0USOGvdezgn;scqt_+!I$4DWZ_e25N{ z`$$n8!f=C9cjOVXef2QA^ z4dc;&(te%&SI)M_1hoF-sYCSydY9h2qXAG!-xHs00(h@{C$=?J(5)jtrHz&~AttZj zzU9_1!jFYyvdJFWRNm8T0znmB+qmk;^XjE#|`#2tAGBBcNRWO5_J^7t8 z`;9NBg5g_KR`G+&8qni&o8vMSjl|GXXm`=#S?g*0jiF=iDj_anReOJoTjHmlm~#e8k-0-9g_NGEn{oLoXscD&it`#+7#P zC#|6_@I#@Ro&YK*{qc_G(k2x0_IRh|I~yB!@@NljF7Mk)O>;SaFpiA*%=Gr}2W*)4 zIvb{P3R*9T_C^sG2wv+;7uKYm#)n`Tz!ogG-^&QGG4jo9$pRLSfl_S-C?x`a53LUhse^o6yN3Xc+nG97}(${27 zL|>|y-*;Eb70xZo3@XFF(rVa-5?LaC%w#U#a-5wI@C-RGPCWH&KFQ|cIiy#i8ESBTmET=NYWxq#z6aBtkR^cp6aNA9q1mIlyH%1drfyYY^sPuw^Dxly~a`~lH zTkP2mWbaYG>d~LDe-J7{^j~NG8eT|X>zC*N7+J7*rBm;3mUwU9Mo(@qne%IrkdcUl z3;9`$Oor{O%--+(2DmL)r8J5(51oi$&BM0FD5X0%2prU6J?QVDzX5c|-~8 zLvtu|?V!}zr;DO@BfmI!sl6l}>A(i6bj_f8T-sL|k#+&7Xiwt7Alhutv}Djlc7VEj zjl3}7@%0zdn2aun+MFnzd29IVKDBDN^nG#9mq^Q$c|~7}C%oX(@1J)jH|WQf9-(cd zWzI^s3I5@h^G{|Uq5_d$pWociBpqD(jVXqN2~-=q-N-w!Y0E65v$WsxONSAh6L@i= z$>U!x@-D$bG&`QZm8xX+Mt@J8XU1HpJ*FMfE!X(S)Gq~;{%IIYXsn&P(HfND%F%#E z`S}`{o92~bYM3!%mPVeSa|Y0&2^WS3qI>u?pIbDEJLIq|W_VHsmoxc{Z8EW@wtuM2 z)wlGcBsrc8U6_-t4?3R_);C_`4tJ>VWFo|)MR4WuIcH3S!&{6sG_B1Oh z<%W4|B}rH+XMp#x#})H>(M`a8QUqC}8~L<;XLUI&C49qwZcTuaNdv6LAhJv_nq)XF zN!mlc$*Xl@*sJ~LviVOFTwwL7a5z>wc(?4EZxgc-mv^7hR20GA4GU0h34d?p-Mr*M z4O(+j{cQk>Szg>Kv!$jd$h*3_ks@VBaTI@fP8wv!MJm46eXbTDH0btWNIPJ^NQUHg zJv3QxVNfahds0bwBXf z+j@=uDtshnu&WF&-k|BCcWDBjpz^J_bYnusVp2w9qNvcY?~Qj6F=OrL^VYQE$$jrQ z!{gPPhr;bzMVBlBedO1*a`v?}a~vzym;KXkeqVPFks)pu&)f%Vdbnh7_|7n$GrT@A zbr_aQOCyow$8O&X#7!%-NnZ-S!0Z-CISv3X=cTYixfYca=aOXi!-h55sOE+^8(zkt zq;r3Oxln4-TzoZu3u0U}vtHdP(OU+33>b!XZF2#NKtD6Zii?V$mf(5^^dBx<&i*ip zm(DSvCtK2|^HHs&ViIXD6fCb;G^x+!j(>6%_%0Xuj7JMyGAJpT&$#xaJrEDFGdPJTyMVurNSDS62>@_XwpyPVb>9>?9$M&nga4Niv zHD|Vb(s3jq8ShIgZnq$AZQn`o@2KFbfGv*X@?J}7e*GZT&PAUYf$(+eJGScd%O200 zlZ{D}4Um*0VMqHWI?B>0CQnWGt04EZE7gPCc2y(chA4YKL5$qb@PleF0`@*iJ2riJ5CkY zt-h0l3FEp~7R&!Jap4L3z3R_X0s8aQ_b3yLTDW9Rr!qd!Ek9yt>D(X*xYm~j+9r2c zvf8#rR<#d0pMp%LG?8$-j|NU-9W8V0kA=KK?hGXZ?h|7ihr(ozCKCoT8jQuN_lt=E z2vJ~@@6^28yn3WtP_7;GP7fU@AHHBUTgCNq$VUt;+f#MtVacGrXSJLFKGZZ&t1>&_ z$!#xf(`g5t*S~F#x$WZ;G%`iF3pd`bNhl-LT24<5eGHemq44j!Up@O9J(%FPw0bHB z(&GXk$NQQ1n79+r$DdEX*8J_PVz!0@lM`3``zFxV{UX*XEI(YGZI%(EMjAS#+8RTD zHp3(>`T4^me;)tuI9C(g=|a7^naW*~ZN2-()nJ8#*6P77i}(VPCjWFA&Bs+-I>sUv zeQ3M*d;O@)P4&ef5g-WEl=`z~$P24&BFyAY1_yLPGi!88O7AeSc#a040on#_;jy?u z(@(2aVg;(ic*#t%FO4bxy2bLbrtU|X!evSuuiSW-1yAqo2L?OxO%;J59YZPPvVn*$ z2mc>wQZqxj0u^Fv%T(8qD#0XV-1Ju6d19v3mFNq5 zu=c6ET5SKhaGU=sIvWMZk&dKGv7K4RUl_rVYEakajQT)o1&imsJj5BQEhQIxJAi*g zQvO46>?msscTjPeT^W};OB;bF`z8UA8h)SNq@bL96&U^EW9zOQc`j5J+M8tRXVZ=C zL^1@C{V%YANMlGUXOBzd)>BpZ0BScpm~}_1)7&BzkW-yiGa5Mk`jD4Z8ysvdi6)x! z1o?GThNs$^g^!Bt1-SsJBj0-VW zSyRvW2d(9uglMlSY(5AHToSRK`5r;C1aYPCMPQWZ`%}e5v+CcD%h6i}XxYSH5;F)c zmN4YiHS3aOybRF-i9oe*O^D%;#WpiJ1y*$#t3e&5?z&5HIkG~UD=Yfm zwgYIbs887IgaiE1He+jOx^+imz;+=MBWab08pkjPIf>zV#fj0kXsCyue}G$w1SB}{~g@cLaqy15j{0u2vPMYwc}rkXs9 zlnq%>7Eh?_nx+!B>OvvN2KeG+&Jy!$u21GDT{`N>)-;yu6D~+!(h|sx5fiJ=0?oxw z8AuQ+A2JG+67E0lwRX~SPsI{FNC#Jct%Tc&+Ud{mMAJ`706u~|D2%r{)R*TV%7}Tb zE&Wh(jnJPd%jn|~5dUzF_U;Er5Q{SiW_n!ySx;i!n?ayg!=G+qz07J@uVB4y&cP9{ z4vRm@jiJ7R?4NbxYK|;9_)W%KtwvSQ1A3<#KV4GMcs0H2|-SwBKD_v{5CDT(x(Yn;u)} zWLd}lCx_dO{JPTjyfe!;NEIcOP^ns&G@PLd&SG7pib|Bd5g#GGXCLhq;J95j zhfda;b3lzR8m!a{+}X<-4S|%Ef0=egzCU_DKEMs|S(ubqsY9ku&~*=sm9$tc8Zy=- zH71B@algu%xh(hmG%xmDB330)?$$RN%oN}(J zFHP6Zjmm#=L<;wOA(w>MQQVHTlyIDem;Y?OD-L*KTa-vq_(Lxua2Ru)Q71D`%ey{c z%4T_>g)Mv0eQVQjwA5c`Xr=lvHKSDX9ho?z;gprwB)7w4bjH>~94xsZrpUd9cRi^R zfO-(}m*Jd3=BpQh>IojzJd93>~3RU)-(UH}MmeL%}Rp#m%V% z<|uj->ts}FJaR#Qg{K?S0I}n?ExuH|-O9j`)3GukaAgR!W$3h-5V^dl!edHJOfJxT z*4iy_Pf`m$vV_jF+DGiv;H>N)s#|-{B%`QogrfuIz*grVg_{haBmNzf^Ps^1u4lMy zsful@`*=y>iA-boluxTjZC1JhHGur?_@cAH&3?&^cYQoR${f*HzwD@7L7K2~V`#UM z)5n)%Rr<)cNK3#|=5k9r^eLoA>>HU_vwFIso-Zi#TW!~LvyGxsx4Cz5Hl^8++N)UY z#leb3iHDR>rd!92a_OnGe?@&Ydvc{2)n`YMdh^6;l@WoRj<8j#9`wDf`Rt_o6%>Cc z6WKQ_N#o6ZCr~bw&7YpeiiqX;r)Pn)1n$qjdo}}fPgzd+s)8j4QKj!JrH+92NM!ps zewh${^v3sw5g!>~;+*WktTUoTsci1xobqKz+R~tbxZ;Ey>#`bQ+rs6l-S{oIHb#!B zM2)y-4?bN_r!P{jGZF`~X1rO*GmDH)3^b+#T{<79O}wXImfeUp^&+@Y;Kp0ix+-bR z>TFPIBd_%6bxCT4unh~RWS>QXc`&9TZwFBVr@mPfTtVZ8veKIU#vHA!w|F1lv+>~^ zqE1pqEfY;OP(AXep90MNc^0>BmS;Q2w9cpGzyH;HDz~gQ`-E#CAzS^xRD!;vT;JT= zMkVe@LT!5TL7=n(hxV=^n^p<0A!^A8|4GKxu}vx8*l06G@ix(7*5&Q8Qk@7Ar&3msS4Zt5)*R7nF9Vg|BL@8t=h8sghXYix##PN z!AWTB6|aFThNOLPxrvv)KH2tgsG|APQ0L;Mn;++3$~CXPk5QPnnq11+=CMY^EZZbM zcW=?x6U@P<|CbpsU*a|w1&N>=d+Z;;$If(`$MJ%?YrO}BAFFI%y8Jb{MN6-SPQB(_ z_|DyIRM=hDAL+i^s)n{)qqw5qIzcSwk9Kl?!T#&kzA5~T=HuV;7Isgf^c{AV?!_T) zVv9{MJ}c*QZ4ELii08)UmbszH#XM_o2*^VpULheuxj5YYsPgR{Y{$$(s{pz3y3SMe zXyoW8(Jz9`0Wt~TJq`7uwa-;tEXC;FXc>vC$Zs0E>X+G-2 z{Z_WO7r&WZ7d`$B{|tCO(o9$CkmK**Be<)WxKO=ZWhEZeP zt6N=5WNShU5CmOTpBAEh^1@Mu-MnZ7V%wj@U{YrlhpijYC3!Dgq>@$JGF;}mA65>R zQl4oPR$&r#ZI#RCytQkfT4hQeR8Ar=qPcyaDn)+)>L)zY)CS93F4E>6b67d<_>dAN zTem*2RLvW6+t)_y#N@WLg?}G6qz%Vmps#ixIxkc|Po|NaI;}pcx1i5SJKAZq35k%K zJ7J6WN{Anks_{H6Tr_^+6A`7BJ9Gi(_-?&`M7h!1y{Xvc*Z%y0ng#--d}TZmQ(Ns; z-zOuv;JDdu=*fkrRi5?RL_0Wt@I^DLlnk}{y3iP3?T#4Iba{K)ws{p5(-^r2Y5RL+ z6xmDE4bs$IQK>b!KX0s}JBlr6&KNdJdNBw6X4R&1XMilbK*`fhq?2IRP;~@7ihds> zP!tI1N=)pnEv;+=9a4Y5^hRx9cg^no`S*g6p50$to|5Wl!k(}XxVz~3wo0d;?Vo3|hYb?3Hc6W;Z z;T}KZ`7dL^HRvCZAaG_kia7-t6pu@rv@Hcy6EfmO)QKX;4{Hk4EeQ=!+JK+PX}Lz= z8`0W8N&ue&Bez{?eI1^Csyv6^OxD>FZ))nfv7&49H*R4uLB5Se7+0bjf3yCRXH)oF z{0iA@r^<6QjkGWh*E2-%$6HcKEP%6SY7wt~mz3!_I4{4Jr~d_V1HfQ^ro;7u6-=?6 zZ`@rQlHRhW@JD{pV$v(d=7Iqds;w zJu`74zZEoy0GBnZZ5>))x9%$>lG>icxTi(V$Ax`jG}%>6kf-3^6OIVc7i=MZU)FSR z$e{=zc!)_Oqbni%HFptw{Sp|1K@Ce@gr5`-=6os$$p22B=}c}M{6^#NdR3GIH^txp za$F24y#qlp)dyI(SkklDrjOhyM5X<}48I<~_e3B@|J-~sJ=wGp2$r4W@mFW(eI&K$ znd;e#9)c_OJXKxfldB0ibf z52Xmn5MM}709|pCxx@|!SKDHO4_JKVik2Buh2_c_#DGUxH-@~c^Y?^Tzrr;2BYOT! z{OeXjM`&x@NptPrG!=_eA6f@>*r_hMPoOJ3#NhCh&KsU$E9cKXO>9Fn}kNiB?H-MDawuW-d+ z-PB1ll(gc!4oyt4!_r7R5X ze#iS(12kdj!v|E9E`OmvcWE$#k~ehKhsvnhbGXorX|_;5F4hAhd^S*Y>BPHLr=~BLu>gz1u|28Ju>;#YUOS z2b`BQM9U?v&r=ed-FKUj(tingn)3-gs?UFkg2}>1J&cY53f1HL_Hu>O%w2Rj_Mj;h zr+|keE?6G75ps6#ABzhPwiZ$YOSW$`LxX2#4*xq^B|2Hu=g8g9v>o#<6RSSeOJ}lF z`32@L4^l?#ByvzQ2nxbTYuZGve*Rhi^Z5X)JLt!xQ(3yE`H$FRRqwnkS*kW>I7~2` z#M8gZL7aC2YW6ysF&78U3&4ECfAe; z%x$XYQ=Zyo!Mg6$Kj>Gl^?YPKp<`S#7+wmA?b5L-ry6C(W2ddpA!$B2%L$w^xO-J@ zPQZ{eqblRUT4?X%Tlc6hd85;5g4u@8rx-XTKgeFUa|0X;D?P&Y07jjah-m|AYf&k9 z1+O|+`}&SF;yJ}1+!tb-ah;yxctA?F#w*QibT`4)gw}dxN((1;Xs_X_>A2{K8()Bz zN2@OC6qRwA;7Xr0{_Vt2bKsYdF_7p(BJj{ntE8fCpqh94ZjbrBaZjIRQ@BKb`R5Ih zc5-Pt^tfN*D_94MNu6@wBQj~2?Xl4Vz4R}tI7f_+DV#7)d^{`PCW##EO5Cq-l|SXG zMh>J$B?AZTu@#@TbQbpoGU%FFLv++*8YB)0u#}(%ad5xfts!L*ZFalCkC!i>Lb@Fx zZz#yeiusdK9NcttEBnBl4&!;UQ)jExy`saI6dS?+fY}}#7p`h0x(*XCmw%v>8R~&V z8!hf@@aaEpS8n72fy+XylK90CpNo3q51}I43h>1S82k3P2V#f`Gh#QQo#fwa9*F( z7LFamxsi3-H*u-sPqkDN6Zjp*r2*QX>Q7)74YK20lS9(QTlM>-20Vo*qUmj| z_w@M_?XU$MwfgKm>)l`jc6wv(7KnSfyD`q(<(JT-C2bb+m}G6PHdH5sFRyMukTSCe zP*5&=8dt#DzDQ^6sRQoGO59BMXMVwzvgL2;MC!DqU!;4kI6CX?yw*~gboi>|bwX48 zHrSk6kNf6yxuan;Cd5Ia?S? zHJZjQYVXEJZfuCisLSs$kZ%!ZGxCxC26f^(C>`Qy7mq+}ApQ?~ZyDEw{`U_fN=c4R zh0!f7r2?ZFk|Rfh)aZ~@$cx(qoiwuAYCe80P4B9uHXNxwT`JNqI6Rf5lhRvL5zp>$2UgY$VYgzYHMKr+0ms zG!~C$mD+5M83BoV;IAI~{c!-0HQSP*VUW1n*FGvb2U?pE@dR3I$3ka!jd}V_*htQ% zCQbP1bNN8^u{XRTt*kc}8#t1ZD@3ZV+o;f>ZiJLrt*xyGT0RHH@%(2_{@Ov4XSaR( z=n#X$12A_6pmhuw-qF~G>b$#hn&%;@HM#pl7QE@wa|OLbj)_XRn(J?SGF(U!F<8s! zE)tnNscIHH?%=rav1K%!m%;4(ki$*Ku2+9y*Y)Ra6u9-YyvCCE;>qahUX6%+s_LMs z#ojRUEkdXI02B1#9i73v6bZOJm7z2~W-w5E_2*S<{QK*y8XXTL1Likhu4KxkTwB!& zBB@pKLAS663*mB)P}$kp%wqJ@t^2Y@kbAqV<9Ws|e#?p7BYmYCVlf=j5=B3wDGmrb ziRen2X>xvO``BUNd&GLULWKO4!M`d=p?3 zDGLNQby0MNZL(JWf2+`x%lPj`oQ|Exk4mMA2fEMhu(rpX_T^kSx)ITMH+orpKj4&l z;0a7#mgeWcLm!5SIwLc#Pw~~H5GtH-VbStcQ8uoGA3jP9IYwVy^?w4|HdJ*@mxOrj zTaR^NFby*Yd8s^ok5RSBGTcww@NG{_)tn56YbixJ_J$CHSuT~;xdGaFhe$_1tB(1V z6`Xd*)|hXzI*r?I_HzK_GV472FG^O=qLnDmgo{)y4%YQhNS!T>B$11`BqzLcYa}Ub zw$5odSawsxubOI4$7DkEF4em&?zqP-TV=|UD+og!{K{O^pt~@)BL8!4j_xv36 z$-L4N;V3?sTHDK(<&B0R5>Q(ok11&8nof{xMx+#2!*FG>Vb0xWLJiYZuXuitv$Q;7 zaheidiu4+tJyN}yuEpn!9VIk&$H9&}glT)Nv+Ue=yS-9*V9G@pa~p|MBFljV~!>aI5s8c$)vI2Ui}t8MJ1lf{zK zE6jS2jF@vC!Hz{*lXSe-d@-)2&+U8uc8lKdkuF}4n%^Cg8up-CSzv1qQP|P*qpjN^ zwYFyGD6_E)XeCyU;J&%4oj=DrIjy^vklY;Z0i?!Hqz9Wn0SkrGs|9hj3&rTru@(r8+nT}kTI z6BX>1`YtZKM~5L-Ft5g%L!xy3jWvuc^e!uR5*Ly)$r*wp6U5ushw;rWcvWm2RI%pL z+Yl?iw=9cSt$Zj%br-S9k?mOZb4mt}ZIxrqpf4*dl~{z$HkZ5An_$hx5LLNE)i#R_ zo~HYlWnym3wTIiDKo=Mp_m9$|L*K3+0YmtLIy$kYdAnH_$YHZEdpeA{>7yR!ePm5t zQkY5m6OOkz*WFRhn&Bu^(44_W8%JNZ$e_A2NqEj^D20&*!$Chkvxc?jP5BlrYyt^F zNL%gQV^UZ2p>K<4G5$+f@mgqJyX_nF6$j>c!RxruoNcOU#c{DR;SD#yCkJi96pPyoY7eolHyV!$tvJxJ_=Yg~D=p*F|Zjjx!AT4qG#$ek{mOhyf>urzSkM2QVb;-Z*5aWlRPtXbj8LCF2nwOckbFb&@RQo z(Py=sP6dRSNYu^(X5W3tr60S|*u~1-nm$fEsJ->c%z6F6!xh_^)xbzjq_M`EhLFBf z{O7+zOXt@8THF&o&007DWA{uv{>xu_&ALW?wp!!pph+}k zc;bLp_di<);Ck;Qk6^xStTruW6jjy2*Ieo_DB6h!w6XsP^P5(?e?w#Y{pXQ=%LAJjC%m7t(&7$!$up)mdN_Ks?W;G1mleAB?nn_pH*mL8B{%+!zDC7;}TCkwAgy$?r5WT*8- zbci(69oJ8{k)SBNI=82Gw|DkW4CR2vdUnj8;&*&bK4xKFVY5Fz@1n1U!QQu88_`q~&n%LzWAv+SaGuD~ zdRcLCQ+2_#a`^!o+7Xmx2SBD?S-HcZ*4oL#;R$2JW^hp?*xm zaJ>i6%hemSMP?O`ct-YNzGb?JjlmhuKz{-AmWlppt@KPbC^#(gP0OG|hwM)@W1C>q z0jMyR$b;Yrr+o(jb&lvjq7YBH8b7#!_BWL|`Yo*OH=cjX4}Qtdmkqy*lS<8K>BEAL z=MUY(=KP}6190uH1J`AOpl2U{4g7jYC*}+Il*wzK5)L1){w4T#FsgpQAH$z16(gVd z&APVXwe$=OX@9kS1N5eO)*6K85E`6O=E>a6S@}6!gurrrctuDmtUs8pPn!2BbA+>` z;K;1Zc7^q*a@UfHLhe45Q+I~d!j8@$>#dO)^NQy;z)=OQL04~Jh4ufEEkOUM-={ke=88h(;hXf#9 zpk_ubQkaGR^s>AYsx99R`Oytof+9|YFH5ozEK^5QJM0(Fg1vK|J8}yQ1_eLRwTdaa zQ~T`;^nC>1iy;4SZ{EFW*(85q(LET}QwEB}eeal~S~#pD8{{7g;qB7vS&7f?|K171&6($EJ2FJFOHE48 z-|0}ly*!K{6KheCcH)xVzv(QfoR0s2g0AVKiZM#{>DuJ@|vw6Ow5L!fUlxF_I z@F_~Ri|wePKftKi1(YB`P@=l-U1+sl()844cib&m3#u((L^|gOWUPcHcI_KC?bt>P z^Ahov>$g{@zqT^n_vQcaQG8QUicPXy0f<-lUPD#^h6)-|*|~1ls#V@`z+mHF6gEha z`_s2&l#Micqf1xig(;#*S61$)E5tI7gV{KBci4{V!gn8XPD+pw3@7yqtab#7zbq(w z!#TI0ZK*D~j0vIpT=&4mZ^eJc7b`a_2J^&zg9s-gg_>XbY3LpdvjY!>zt^M(-J#3F z8m><%{3YS-??q+*!iejG!pV*{CSRv(5;03{I8(P|)`XTb+fblvM z5Yp%_ZsH^ZRAKbC_vVZW&)(ff-kObZ%NVVIS@lHxz}xcH(q?acK?pXF;R|k2bX$JX z*U11XianTHOiqEa*r@aV7&Z5x{z&OiKN|e#qryExH&{)U_(x-(uRJT`>Lei87X+mG zJ%t{(h}oT~)Lq(X&YullFw+<9Vscda0s^QDDtl+imFv5EBz-0?w-!Jwh?{W@a9NI< zvI6q8oSFQDXz&ow+7}{;nDwHTQ^)Y$?!7%V3oDNo)BiM=9w}c;L_huD;KhRuuTy2Q z9`*RC>wE%H76b0|75jFxRNq=rX+}MpY3zXJhX443!1vi>$c)D{8}-oV(p!sy?*Adq z@u*XhUk)${O}Q=!vn?yn^TGy=TkGY?TwN^WLMTEFfDNj=L>q^ zZfmNZ_c5eGeY{Mu;k%@TyEUe86lepLfCeua;f%C1w2s?1v;yF*E;ayWXjTX|~6Ps^UE^NV>!!?-T#UxA{sNLb?JUTCfFf-T_d$|vk?Xzbg`ByEY zA;HG@wrG$kFQ)Tgp%xV#i1T_7NtIq7`cYsFAgHf6KJ0a2s^XP>+=Nliin+E!j?d{O zFP2_PodhpS|AaI9ac#{5Vx>4xkrI5813~(b0@vdr%R6CysNW3Lx$)?;l?H)Bo03ps z3s1}I_78#_&|~+%(o$`#Vq}SllW)UJij;d34+6v*d6A2Y8bW}3-^sKr1CzG~zHR;2 zq{hIq?P~ed#tbY4Krzh!l8L=u6W{5UtvkG5n%1vWS8qtgv1J0JkCo;#UYjgh8I4*v zk6JXMcFZI>`Bi~_Cha_-(h;o``#57x{r+kF5``gJ<~`E2uSQpa$EOeyrhx6Q5<52I zS*y}+9AI5McLTF7Yge#~Zn_14sj8g9GA-+R?1)v{u> zg($U522;^oIbNw3UYS#v8muRFeyGq{`347JKh!|$D1k3ayYMMwe_^(jmCc%1h4AOE z<$*5&3+x7VO}4^fuWgdo%l?7|9~1tg-_7!zLV?HabN2AZ_K(XlE{E4z8(UL*O7iDF z*kijKo|8)Z88m-BBcBtF=@9T$S( z?cO@m_ylTq!p9J|q1Tr#me&+4*>+)6<)HJbV>Oxbwrxa!DRPn>a{h_#KuEauSr~*g zSz+cWhEXs*@nFf@^ZK=4o!`Hhz)F`w=Y$s%jx(FX;GC*Ii+sMVAXz6P0)H)FIh-hq z$30V4P2SF4a$*zd6ie{_%f_CIwA$dvwt6Cih7>Z1h*XfraaXE94`{dX6FGJI(lXA& z64I`?CRq-*dWHJ`cW)ns-u=D^4}G}0{2v?p^~zAUWh`CodDma@8~L}1)a@+n=mTkR zuKw?-YQEu@H?Au(BZT<~vkbumT~1oX1K>$VFsC_Wka#^GVA5+>~P>jJM9ceVXIEJEc`UgkXfoP^8HKV1fZrRV%1Fw;<1&3$m@yjdV z{@e#T#OZiAsRc>qcay5!2P<)a-l-UWk0tmg&l;t3-$bQ6$^L)>GW+c8NF)E*O~y4} zYYUYijSI2r9vi2cC<)tSQAvUVyV1h1Rz(B@w-gt62(RvonT!{MIW{8PR`m6>ee+$@ zP1{s%eMRveM-&{GW>DPrc6ga5p9(bIz*<(acI&q z5)?(Qa6%Kds<$-zsz==A(|f?OB}1^T?oi~?B-Nq7EoRZAHztn<%ln;0@SM*PDfT#I z?puCYrIF5=PmLZN<8itSA@k|k=rGE{ANWr)inpZ&jd)}@^MW})S%HL~@b2JO=ZskU znmU+E2Sw5prbrW+1S%K8yXkkN3BB&ErWdv*n@Qd-t5&edvv}$`Jh^q?pi?Fmh^ZJ! z3g{+g5vR(C@7WVh-Z#-^2jSmA-@N+AQ0zY&G;OQ(V;=@-5riZ16$qinKZK|B>%ij8 zRES4QH`{wtjM!`Y>)1a-Bm$A2C-74?~A z3A{wdVr4SFhnWXE3GoCX*)=?DEjXkL+>!I)I2rEj3}U84&OgZ z&wZ>MWViW1GW}&pz*||hZ^|`@#k6_*Z$%*u!^&y{>McxSj@d(*n^qnK1JykrCCar! z+N%0>-9JQQOsx1CMelvQfA*v0t?TLSE-KE%<)47-Jj5NHs{w;;9e+@tZ=sRQ)>@?+ z;+Y-UwKZyo9q&OakV&Yk^%0yQ+orpJb4Gt8c{sB*+mJ!7G`DqrB>|esUz_4EfPF16 z}}czcybJuSR7=fWYQ_|T5x`-_x>_46;Y?2 zq=o%jsonb}n2{&P)~6rNv@`(OQ+p51&m)`FCtbWHGV%{n7iL35PVyIDam^t8Fo`J-XSPswTZD<^B}V zlU9AU+i|<$Us|8)aogXv)S%O}>iCyGvLWus>uelBpAZ@Ctj zC=g!gUP(yL3AHelfuwP6UC7SqB<8AbRnT~<&^g>Tz3_0>iaQM>e_INvrgmW8a#u)j^4m70lO&XKCL7{(1}{O&QZ=ghP0 zXquKc?6+JTtEv6Y8VFy`Bevuup;YTU(uTeY$VlBuFUQt(B8>(8gI-3Fgouz9zHpvR zdfnRIoxeN1G!>^c)p<0Ae2xE0pS`=~#-fthqJxS=Udd>^!lf|W{zq@9$N&HLKfVFC zeQG z+x1fTxQ*|+LFm8fxyxtH?|&jY9*pGv{dlf%q~Oy?4h?jWnl^q6JIUg*@Ut~-=srl~ z9BqEbrYn89GSuEeCdn;1d0*hn74m5&BLbYz(XBV_8o-?;n+5CGPls6a;WI0HoGSop zm0y<&^D_8_?(d{v+7$MwJH5OPX1+{SZ|XXX_-@4+gP=)M=CkddSule!qqm>2X-2}=9R#&|9n-I9%4%WLQW_B2>XsrzS47HndM+duSj8mB_+#KP=U zO{D!QawHW9Lzf+&7;b#A8|kl*hBtaS>B>X~nt}tDM0QQh?IlR8MTIQXC97s@c7C&n zu?zA%AFK9TGJPtiyW+iC7k2RF4+2(68Z!pkJ;7EFR;GL3@gx!?;Gwaoaqnxd@m01z z@Wbi0y?xjy5&c*~OALb-(%dmep5n18Bqh81s33FYFwCIqT$2kBiJa3LF1A_t%av-r z@S}Xq{@1IdUxw@LtuenS|1v$)MXCU6T5fNa1=F7AZMJMS)sthDE$T4mGc@+^p;kRYIFr@F4E90Xf@D<6u2waaeO)ii`9=PR+UBzd6>pA=` zS3a-+y4{^l>B}-Wtvrx6Z_Ww7kb^AIj^rD=0sMIN_4E}srn%&*0;F~sD1*3cph?DS z{zQHvOod>!k>pAA6sa37Egt+)0r$M z)f&yheead~I_mJ<4TLrkyt0xV_qb{mo-MlPGLY!Lg#CD_%*8i*t1YK#x^J^+KQFCa zqX%3hGKzEW%?yx+f9?-{zLT!&GEnCWb#;`9=O_yLK5^Ys;N^HT5PCE zDO+lx)T&5Ny5!U+N;hRKb`xHcn0r_!zx31tWsB#g=j;)9dw!a0hJ5U)61z5jUu(Orquc zZf=!e{h{oHPG4T{63c7fTVuT}<}{*#GA9sP<|Gl>z5bv9=Go^M|H|pg9L5#;1eO60 z=^+NPO>hUSS+N!hANMo?ENyl$ZPq95um5wxTX#)aHQ+QgO%7`*sf9nn7~|h<@9WqV z`L?B~Fjzl%4xK$Qwko6xqaF=k=A<28zcy@C9z_|+u$1~zgI4GNAlNSJ;Ros-3N}8m zx&ahStv{x7_&^ukLepA#`}&%F!l&lNzzQefJY2Q|egD+r=e?ObOAE8eo_43#T9u zao|DeJ0C9v+E8dH;}jC|HhZI`TBC}cGR|o_(^K<@?{-0Lmt`UuI@bGv=syU)dnpM( zPbSd~gi6{0-m(|QWhof}WFJ6AF!FF^L9n2MArZ$1p&rHKpt%KuXI~gzxDjF#=pO$; zkh`GL$=l5IkVJ2ja(|URu4wYA%BTlwwqW%-;B|*+;p1XStEx6VBxTdk_c(}-=BAdH zu5j&j7fo5D?%O`@mK9;%dk%+O_ulDkCUwAN=0ExaQfa+&HL9CKIt_0Ou}*h=Cc9Cb zZDopnX)66wvsX=6B70(a^}d@rqsX_r=?`mfcHi`Ok?o7iRe@r5O9RW9*reO@>Zgoy zKyAH>f?rbH#s_$8AU_=INkemT6ecKvcT$3D5#)t3_3C%@T9{(RR5{git8l1-yq~3{ zpR6>j{MVf`Wa<^+G6Iz8?Q5eo7YNzPdo>@t=G@o=OV!uDWrE1m?|Ft5ZMi6O*+S>D zH#;jwJ+J0;#ck{UoepDLt!*t#M6xNlFPZj`>!w2Dl4tgJ)YC8@80=2UF(0h$r!e}{ z%eyDy`#;8Be)45f!tEdbom9%E%5u<;ouo82Ux#&iKa06;vovWKc=1k^V|v3P>_tGG zf+DCtFwaS`!L~!jsi)`Q)B{O=kYrwv%7U=5qtRTYgH&1`;Sc@0<^TZEBY@Jza(u!# z^v<0lnZz`4qBg0Wh4Fwo`6HSB3^r=#)hVuSJCvIf`RUpGeGFbfr#?tR&~z&Wa4dXy zH|}PS-u{#UI5|jPP(+FjTzhHAmbmr}Y}pCT6c+bHd1{A(HcMp+YDJ@BPjU{h3?mXuI`F!Zv3Lz)pr)Mz31=oM$Th)yJ-G+JWDMi zc;`6UcqirwsXr&;8)Pr)$FR$VKlQ@~J&C0BsgN_*_oLgV7|< zzEQ7ZiuUguA=aMl;9Mc`R);?bOoC5D?H{ULHx&LU&Yk}`pQFGD5a`!n`s#UK;?H-< zc$XOmR6R<_R!#==RY$K#(p)lecJU(G3^$hGg>ujx5C){&q@AF;E$sd9&iq8qLcp8M zG7%QKYHgTFEO;T=a;*V9j+Dn9a+p$}p4P?A7Y0^)F!cEX0;{d_wsI&exn~mmEoA4# z@V+Zdqcm~@(Q6szQ+~55Zpqq91qPxM8(OAL89|8ouk?WCH0Z^W-Zsg zxHP!(xQ6y?iW@5*V$ASNug?<~fS#?%8)OjNl^*oOIk!>R5Ls1|*h5H?)qA&Y5wrQ` zI*>x=V{-N&XY+R@Y9#S70Co<=u^M2b?MGYn4~|#(9;m@ z#JmQTv3*E9#~PxB;FC(ft-RUNV1D+>4?-l$jTNbQ@)}9qfhuzsJJx%_PgN+22wzM7 zsnG&=usrG-g{EV-99I{!mIL5xKVC>t#+!-O5;3yKnRcnl7ZBPCRLvdRqYcZ=HvsSW zVcqIIBLmKKpo|GARVpEOQ*i52fD~a`Cl6B6B}aA1c@JxxXYe6&xxd82zx^W|{uU}y z`7)=8Ws184-WK27amTGOzyR$Xt58e*^1w5%sW9=wlL!Fg;Y1NaOzC8>8{%2Q?>Opk zPXWc#He$Ajgr<0fOZi~>$GHZ*=AD99mf!r0Z2w2=N-N`|DA|m6g9GXG8rKvVHqZdG zNDfOh2N?|~ED!b6y)P)D=VdTk)~)9ICEQ$XH%QvR9_5N_LFaA%SoxZ&@HBv3+dPo_ zxqhHAh;hz-xHD)iQ@Rdby5ainwecgb?<&|b&n0tq5>q3Jj*zs8HS5=dhGq~XD>#d^1{_e?<`)3VN z0G7tvhcgB-8$%L)ba7hXvK?z&z3U^QTk0b4LfTG-z1-gg5J8^Ld*&1Lht+~}qL1MX zt=(Tmk+}um`EQVhGB!0L6?b)xqDI3cIFypivxYcc2jDYz{MhP;WV+@SC1_W2Ow>*P zAegZnN^~Wk=1x*$=g{4PX;;=U zZ)h>BnxTPJm-EPJr*1mwbc(TlqFY$o@EX*cF9MUXWTMS()xg_cM}_0`t7Q@ zerE@Iy=jI>XxqZcS`!)(Asc(&3WnQiwX3Kpa$`N{T0*kUrB_PwB%IYYt9#yJxa&hF zWZ9SH9Hf37_pH=CRmY=gMrnz5Lhpc&MIxqWD>SXG(DEQLvyp_rC4)YHo(@SHjYZD{ zA}N2QpRr<{qwM9zK%PTEPTgf=fX*twsc+yOfnvEca;3tSKFbhR_n7wGlRn?qP@X(= zmOap8oo@pBcK7D-Ml?577few><+|@OR;H@c3e`MR(w|=_xVK;7R@D;X8S88^*7@vq zFM&0K@|Yt2aIURoce3L*YQ}Y@bi0tjx-tS;JO5{=NM-hQ*QT${(_%(&nRT0G*qjBx zw!0-Pj~@0u?Cbw%K9Yay*u*S&q~%B6jsN@b`LzJXybsG&Zp9az^E~2Fd1nenlt-k8 z%WnJl^YW#Xdf^a~DXsp7smXpNXkA!6>+_m$1Q=R*lU@Q^qm4>uz2Ql>8D$}8NCaRi zsDs0caJuE5Y&|PTk8j5?Xe~i$wIna^6eIq>JzkT(f0oU7u>L_nA2ue#MjcP^MMUEf zG6`q_ASs5tvS&^uZVy8nBv9+e<*1l$>2GVs^qWbr>uX>(TQGAIwK&7iD^JLj1TP+Z z2nG32cZAASK1$)8CFjCU)6PDt@PBW-loIzO%J9fPU@uV)-;FodR$T0IJ-R7ipTJ#O zrJEZI!(MsXr*kp#CO(j#$`+~No~VVUQv77T*D-vV(Z2kO8;8Pg?X+t4-TR>q-%P8r zcP1BrpP?2Uqv0Pm;=tPS3G;Jgcfi)&qd}7u8qQzAS`CB@x|fF~_BG880~U+ft=Gjz zR)O{E-e`82yea29$vlIKrA!hgzP+5chMona>p;e;xuIebFg##FGEu(%a0a}gA2^asI& z&RdH?y8+i6e-~Py&^9!j;SE?aPa5LXR2btg(+gx_ zp_y%q>H3bO6^)>C3fj|Q8G4f?KNB(oMRgz^Qj2>q#m#?H8pa8#$W!g_i@Oi}uKBcL z*&7*${WE`lZY^;vo8+rCgBLwJSh}?MM@8xlN7LgZb?R*f6cmNR$LXR3x#SibdgR)TOKzXhD?PB z^44a$=+KW)jfFrVGvB?@m3mCP8VJ5+O-C(GQ?%tW@+TiVi+YvaRQFAu9e?2}^zMG0 zB4xkD`!f3$lkRLv5_ciL>0!<5u;E<39OJFc(lg$@BT2SYkGwKD&H;pNerWRH@SY+E z{iDTzLMyRZtg$C12iB}Y-~E*rl=r~~WPJ(j8N)f38@UMEC+;(& zOKgqfXlj}?>rjSzSW>It_~2l2(MCRPK9f#E&(uRIPV~XLjkA?4tnoD}$8cj@7-g~G zWoi@1QCyZJksT2=U)GX7$jRfREcSS9x8{?=G+VNmOG2d3B>Up?v#1=kMaT};U?_3; z-tZCeG|sBT((+_m%^X`{PUra;d)&lh^Fy$6v$7b}i5b-g1MU-CA-e)B(^rGCjS zE_LJCbZdO%xAZrMV$%VCjp;lFl(IJLrSsV3%-Q1)!Mz`%1VtqzlJ;!a`|?G)(OD8( z_Ak(afAgQoq&!Ph-eK+guu1hWer)QA2f(eLqF^Dk`=IyL>$GYoiOLdHR|Mr?*0#;z z9|W}dIZqSpDYVnd$*?@WM8>X%OBeHml3@Z$u;W?2QA2a0(RvxwD|a1Vq*S?Ppo-~@ z1(4aOp<}m#lo3PUH|_v~cFR_XAkB^@nbSlS!|X)2Y3zWDQ?OGTpzA2Qrb?E+d-`Se z*QqKMYej#cO;H9t2aHWAMyv|!X9Kiker;b4dtgm(f~ox);?X=#fk}aT0Tj8&7pK2% zADm7*7_HLxeIeDN&{<}h8=c#37?P$f^o6GhcK)A#DJzIe)zCQaz%Tf=el`B2={6sr znV~+yxHI7*6_cNCttg88=KR<}u~Gy_)Q71zjdIMql}k+{aKc=9?%uYreQLtaL>9uY zll~*K)^e&@-_){?OIi7dpETSQntRt!FuZ7`sQB`2Q8fIGv_&RApV~=QlwiR2r=vQ# zyFTZ6pmywyY%*U$?DYZoD@ZBhrKaOR9#uCN-BX1bv(WPu_z8DidoCSE(sG|fhpJ6A zdtkCxnXQK9uLq%T2f4AXQ+`2QeCD`*OC zYFp2El|#a39OEL8dvbcbG;SW<9^#d=YKLgOwPE!K!GJjxTU6=TfQhC3px*7b@El&t z-WN-f_I3>g71f(QGx_4?j*Ab9f6x=>I^2>fH*}F={dKlz9(Aq6!c3vYLHgDO-1fIR+k@0!19kj+9)ITV zls#+exzHX*$;elov(SS;<-ZGdpry*irXvU}vn|5#0S}!D` z0m343i-*uHpL6lh`j=pHMAJXMp3mtRS8npn4@R|(bgx?;!mw2Lr(UxQuE_Y~RVxdt{F!{TZ ze$E#HC)rPLDr2_P@zAsf87008+{&2>R?73sxfw#%WcP~tb_PMbt~g41Gl#NDs9T5O zJ)>YMpSCow3^l{<*G@kV^qI;`WG$Fla%bD>f)u3d>qN!{g+8~n)hT~|XOlq`7m;xu zVCY$>O@a{2r^pF{(%%ycuCA3Kqh~CHaBWyE|Ls z-+BRbL*4J_Rl^*;FXkR^Jc&woC>8k7k_oWlys$W~?KV#sPi^;K^cBE)rYTU>uAQ%O zbCXTlQwfEM6`VY8=;Opp^vsxB8BlqA(wuHdK{Qy@JMZX1y$v%Tu;R3Qybd~m<1Jly zvDW){(>khEl+vVQ^JSq7O!=<9RZaHhz}%oykRasqe=Kcn5x+O<;zwk0mQd8;l)}@Lg7|6m)&P<0vc@uO)5I#_><0-0L74R;1j@l@VZ zt;GB}f=ci8mL(*vGVu*mW{6X#UX3F4`Yh)Q*onCnJv;E^qDWBYCKkciV#wXfQoGKr z8kJj5(SEG$;bo>yCWs*?hu5_Q(m*tD5iJrN@X?G|08u84-Wc^Fs*kIdvyBEqj8mPl z6KxU9esnz_j_a(ruwKV~oVJh(Mxy9)iKWZw(R5=8D1IpPUY-E*4+1<%Swb6uHQ{WT zc7UZQjuPI1*|U7~CbY$f1@`T?T3HOD<2!xC`>?$h?c8pwd~-L)dv#W`K?UmSFbu%ZjUi0b?>aAJJ8MRV>h^u|7HzR4t%)s1)uaG#jePGZ zOCl#}Md^^>?t{rB%JPS+rF=GDISEP$JpsDB0L21<#pov8TSF5Ci^<5`4q9eCh*l&d2FnJgxddK?Lz=^Tvy~UPMx9ms8M*ROPoWnDW zf8|;9iT8jkb0Ze-7kWiS$FGuTc_Z zAF$ui>G@x;I9b>8%0WmL-(WLa@rc!YnRTb(PLs4=3e^&H;%l@ z-~`$2(PqU~en3bR?8k&iutV8uzyij^rlq1^LTfUIP{^$?xw6ukDc7c~^o)P=OwjK7EMbS$bivUZ&gu<=kB_tB^~l^y`ETVM7dJYqn_}JZ<_+9LHHFdC za%_FD%-K8|$GNJDRnwR?R8qV{gMKF zn!yEoNcrvDc&z`K;w10Gu>gUT1AK;@+q`ym|;|d4e5K8f8w~ON^laf`j0Snh7b$Hxz22XY6#~~-Nje~Car+%+!M6-E` ztbz74c$uc?hduvjV5*d*6!nJV7F%4GXlct1!P?NAuI9BTdiw(8rDZz#@~8)_O*@Qy zhI6G!9i!p3&E6iCrD}m*hoYRhk44qOt>jdtcWiyx*cwbk11{7YRH}+AKzv#zZJTW% zXi&q@s>W~u49Sv0V(`hR@?p6s6S7xeyVdr==z>cII!m!0Wa%?K+&SVU-7~Z+#uN2? z%Mdo8ZWAE9-Dd07!OA_!$6Q`H+C5&m6d7tCpG5P7lu!I66-+Auf5Z#Iy6-gLz>Z+& zHn_A^n`FCNMu-`VUOo9hXC;*?8o1lNU|QSkG7}JknUUntXvriVw|d@HbbjaudAfPl zirfUWDCi+;)MeeP?KX?k9?HMV992&L@hh<`A~)Z`SJYM&iLK zg!-#&6axy)++!w$8%Sc$c3tp!X~(#2I1*zod0JI6+J&edNVqN#@au zPJ$9VDH+B0IrFRPMxv*}Y?|cCHu46R^Omk%k&>pM3zUtCPAoi`Ov~GW*&aH4{r$ZJBKX zX@zLl1{%YRrv`|dE&P5NJnHVJ+N)tYDC@mRk`>?nD-M*v5&%p2x@`je>SfWLjO)*L zrD4vxD=1WnHPmRDUvb(RPvC8vOI}I?a!h)U)a2A@V?OVG?Aea3;xL@h4p=}2`h7>< z+ZW800?KU@f@ZsQ4GRm|l}%r8T0aUMSt)w?0yx8>$naHJbCpLy^tRj?tPbVB5$}-I zv@f~h8!WturzMfCKR7%IhJo&TJ^{SVq%3*@ASg7D9!t`~%ggDCCC6o~-Jm%Y_jS7_ z22aiHGR4skHrwnjF!L?;e-La9MlJM<+1iUthK=l z9PZRn`KwAvkX{QLH26h}(N^24yR6Z0{rCe~RXG3V!du8yK4*{+EGfzHPC&x>=*-BkJKVEZ=pdN6k>T`5pSx9cwlnzXv{I zDUDzUG_x0lwH)`WqaD<~*qg+HSW}N?9H9A8-xnAA)HE%4sEPqQe(r3Zi`D&}k-cI$ zf7w-GLF4*vo!Qhq-$D)t3kd$J}v@WwbP}Aq> z7~-vHjT<&fDN(2#w2gaTCaA`bLo0QatL&3;eqeo&$N9vwN^=QseXB2cFGUb$46=Q~ zFY3_z>b*;(jA%UNu9Yu+%D~-g6CGIVsI=M7xuPqnkdVD zC|4|K(i3yofO}~-HJEC!EwR|S9IA*6S|#$#YDd~s_VnOl-vtSZOO5CdzH#pSgPZ&&kTUPS$^m@Unw=5cMaIn zJ6IWhjN%{GEABQ7c@?sxBiD2W9+WK2;L-#)n?u^ ztdtF*Hxq)2zkXvraoA5s+xNjd8t@3?H0lSo^80>0Ffj%}Z(R>ePz1BDyw@Wrp9`QQdzKc>YE5UFY%B@YB8DlmCpZ&W{nJ8#p-6Kgg|1 zZ+_0&X;@py&vW51pwfAzwA7ONLWs8!cC8^U zL{x1D-hk_FVVPfcXgN!|m7serS&$B*QzRWrmis=?u&V>Bp-N7f-lr0Pn51 z7;nnT>d4x9-f{g(!+Kp~A?1vgjTp`jjMtR$Dkk+xE>ISOezWm7GcI6Mspk@oPlx5@ zx;F-;IH;zvJdUZCjt*UM21F(N>c!+M&XTjz2hq#i#!OQp@si7KtsVB@KL{QxOH=ix z?n&p|kj*fl>lnAxn*2DVXe9;atgj6e5jYg~Dg?=2owK2YCH*`&gs+8mQ^K%lcWYii z>y^f%#TTqA*+vVM8ikBgW|CXFP&W_($Si{v&XPLAX$86gU~JJ@thJJ~GQFM7C2(X4 zF7Etq?t{xhif^E9UT@`G-!)pxN>{A4E{5>csi}B;ISw)dwDE~<0EXs+8x zaFO%8vE?9sA~qvmGeZ~M%ca*KK(BqJFHs20@TJK}1BTzrqq;7I#vc1oKS5Ai|7OsZ z&7`zG0XEoxNYojI(TN-NSxKkPe1&CWJ!x!ZYskE5Cj?S&rhPGpqkOH`tKDq8(9-0< zGsG}U$KZQYz%K{e=QAuO$8k}hYPLdgaf@#2>)cvMR>CXL2)DzuU!!J=orEQiMrHd4 zY|b*ANq<(8o0hCYv?^ym;@S)Q&->!r|Kiz8p-1R|Vy#o6px2N~SV;?e_70r#ohxLd zb9=F%#;*3|azbke8~U@i$9h|Pz8Tb)OvRd5+e#IT{C_BW>#sH!t^2nvQoMNa;vU?s zxCJS$fg+(;aJN#51oz-=3GNU`fS|>S7k4S{P@q7O?tMA;d&fBEJ!8Lj-1`^gm*>f| z)|zvE=BK&qSmLK9K58VwK<5V6s~SlbF%x=9HE!z=3t6A=!Rn!;An_boczc0n?qq23 z&u#zvx8kMj7j@4+-OGBnSSe0@#JT(2kEp4b&wB=;4OndOj$8g8%HCSip@Y-J8`e{R z)XayLjYwtCluG?wP?yeIIm>}>gP^AWVnAN2{*UA_p`G<+a$t0X+>xJ%ueAdu3jLb> zA>%9A_`qmXSwv+tbzOOCpr~IP_iaPxj^?Kyd#bAYT<2M~9HEX4W~5shsxg{>G4Spv zGgy`duSz4SAEb$$3Djt(c#6lpEsmEfc<8R=dknHQYu3QL$wU@qijP1O%fZ3r^Nbr( z!EP+wtWYGz;mMzwazTrfQSnmJ(u4Qm6Q#4w+{Z}isA#cq_F6R#8rZUJ<>GU;AH2Zd&YPEdg%N2lPi1GEJRa#;9YtSBNaYPF~kgt;W*MGu=`eQol*vdt zHZ1H+)UHfW-@ck_K5v{Q3z*@Sn^v!uMf3fzC<2r4oBP5gkxO(<>}rP?kyKrFN#>NY z3g2lZM2X^xTVh?)k;Q9w&VmPl1JNV^4?c;ZlwV%-#;e5JnMDHh-aqVyoD(7#n z+Zt;$b`g(4s=auT(XhJ4OlAHo;kS2foJ7Kb=7Qv^H|;RZ>}|#=AZ4sMgBPkYISV0K ztE=4h6U>-6w>0^jueS1=nI-7A=a$A~Q^J$o#qkP6Lwb&rX*A{Cz?6kSWhE5L4IO zRrbWBp*@_1T>P4TyA^j1g_Fg>M%%9zj@8q~xi!S2`iTq`E>DnrcvO8o5f9ok${S2l z(#I%LRITQ5rAQ9nCc(zr7fre~<9&E$MnM(rZyH()W2J`G>5|OC(V*vQh}nfBL6E7C zpqHWNk0l)3t`Sf?_Gy+NLL3Q{WrpuxuS0BudFQ4SNJW2!hM2vm}>!5uW6Pa3iA+%@MhQVkVR9UH}OoB)jTeT=dPpSM%j>o>S zeKF7tAWQ$(j2D{%NiUs|(e|}+nUzf$DJRT$T~__ZCpg1Rlx{~tng&Z*|7=R;_@y4S zTI#PnfyHGK?q$&ZFRv+{QJb2^60X`q{0q2O9be}T!6KDNsX*G}sV5^!U2TUGqFgQz zA)HR1jj8QuB)a?;q=M>w`2`uJOK7XlNARo6&)^P`^L-+oW2tJH-aPrVf|T3+MMuNY ztW?sX!OTcmGQt!^zz_$Pk+6qh?cwBlFaZ#_j{+%vSRstR3-jprpE#+yn zyeH|rc5Dq_W(@Hmogzy@u6I@Nwl%-Ap$r3=zCQC#=q=GU!QW5Vc;kJ`-|oKp`$_zW z5Tso3klT65tWz6#HBBrSkf`dV$@gLZ^quRhSW*)ZV4M2$L9k2*|8Ob&`;Ou+s-`I* zAN#T2ELkIGrFaYpK)TEo40EvdzS9ISBM8+yvrM=v*;={rC92iC`=%$wJVE+z6u)SoeCS{P??~tCe;Ok~9Yp2CD20p0Cc&U7 zz%u7j1Ho&O@N9Dlt|F08di2^u{&1{HWEU1RS8wt)lx1JBXc$iG*0B^`vr&|=p{1gV z%~Ho$WdE6Aq{7$4-gPvgkJ6Ke1=4Q;Ww-F>Iwt?2s-)^8UFYNMNtO+1E`=jP#Fj{` zGBiIzZ4TGYB9!4ohc7YH`a}*|qrN3DFKs*7?+MFk`ytp^f2Mr?OK*3oI_k&Ezf4BA zFXl*MY2Pjg(tq_4Uh6Yn{I09;9;Y|oM7&U1`_$=s7T|2&ly~9D%5>x+;)l$x)?zB@ z&HNZBdBm5R6skiP`OLxv-#ze%vhM|7gaHJ{%=gRy<#p85vcWFrP2-N%XCrj<)%8TGF(zwB(!;IXqI^BgrGKj zCvPZJ8y}}lRWWAIJTIW~1VM16Se)2g6)Gn=)=dNw9rb19P*VkB zVlf>{^|h69jqIbR%IO^4U#t?rggyS+pSaUnTp+pA`X=`MQPo22vnsfOX(NzkT~VD6 zl2@tBf$3AP$eR)T+&*SpFzfUf9>$7X_1LP?*W$L^zh;I^g&T}2qKf@wM(4t!IU2ObsoJ6Q^jF|KL~aVwkU$U{q$C5c-O*q=TH7&yuaTksFEb z&K%GSBwcp;61XZ1=ZxO9Y|Z*K`%&j5rXn7?n5U_cu-r40*>Q?;XL1>Ix!YkkWzFO# z$4)2?-&Me(=nCu5ct;5q7)1;EauC}1Ry^tay-WM#eq>h1MmTz!(Ny@$f|dJbZkTKt z?Hg8ak3lWi{P{t38V)5DJK_<@#!GvTZ42B_hf}Q>A6n;YcA`a84f2H)feK-!P8#B$dZLzP=9!k+S&7>ok z^oC$5ER-V`_P_S5#|_$!p|yzJ!~K^xm)*zfZ|x}FC5Rj5$4Oga0Re3l@*V;jdI>7- zY}Xo147>M`w~(ZT)XyPkyzYW(qvkKbEK>V4*vL7})DZx#o+oDfBDpczM8g4K|!amp`A4wmHj z8guqm)4EF>XA*;|f|u%{rb*b>tWzS;%eN85lk8(A2aBd@%`{pBoP*-LW-6T&s9T6H z!nNX4$^AV?!{rTR6?udiBt{a8svdpLs@}&iYP_#+Eeg!8;a268UugZ;PZ&mTH`P!B z114YQ08ReG|8KQOL~9y$BFW`>ZJB%K;%fez@g|YuV#;QEvnx{93SZyvrQ+R#qNT5L zAS@%wh`+W_2d1u1|2;O zSD_(va@}!9`1A`M(?L;~(w7mY>V&z$%%Up|{_k*U{}b&oKW`R_{^1u6EtPXpEuVPN z!eQsXPPy1EvYrnq@d@|*0(a!o=b|QMvE_#xfy^nFbGacY3HXg-v->*csxfMm)U<)A5 za-=d^LS5oCZ9!jtNAc){#eg+f>S$6-GHyLei%KY^KoMe;u2t5fqxto(^7&QGmGPGC zSgsytfnB|Wq7_}f4AFExb_300_am%5JaOGOPb&CTBpxtWTwgF(5P`yG7g{binf7%4 z`-#$K9CGofB9d@VTa=Gd5!zV}4d!aj>r}(Saf8h?ky>MT;C^);J3(J>tMoEreu-0m zfj+tu8ATsU!Twr(s?g-^GwLj~>c`}DuRJO!uUAU-{LQVAQLw2WO*q~REZ-y6uhhaX z8NcU7fEK{=U6zYH-TaVTxmgrDiw`!G$3Ai+8}<(ieaxH_Q;*r{qqNHcrD;7|_Ltvp zg?pOIbdje!2krhGJKZ(qVR2|*JTZ-QBwY&cdq%9!?o)igZT(q4X!DW0APgoYJADKl zv2_YvH$W!T%?VWYPZj}h=`)Jk$Uv(7Ykfkh?*&<(*n53BQeKC2@$dis=kK1LhG$v9 zQY^A^E#R67EAk2~!$08MYi*z4|Ud6e}~<6dqsgj`-7@4}L^7oI|JTPI`;+Kh?)LXd^@ zk2xkjv&ZnXuX`SSuo21guT-Av zI`dDz%6YF~R5ZZ5ukwV&P@v)P)PSFX;H{esQ;}M~p@nr)2i2@SL$PCdS7nTaC1s_%SL$%B$5did0QqY7@zFj)+3>ou^~N~$Si4t7jHz6h znsQL3DKq%j3>~jN!@ex>{*^s_ao6Ri2;n+K*r_!*aLzCzD=Xc|Hrs)MLpKt=b^sPV z!`J6_Ik;f64Txs(f7{2KC>RQ?@hVIE<13^Uz}pul;ee5ZL)S*R?DDu-&HVl3O%>vE zzI9lUpPYkIj50mXCQpxr^||ud+{c;nARhB2k}n@x%>5W?S^zSVlN3QgE(pwYY>`N3 zMI4qICNK~-?3q0p>8Ff0)+DJSRcSqse~M+B-N`Hs7co%X5(xTAX3b#&E3mO`T3!r| zoxoJV+AeX{;OZd$WtQcf%u!U?P*(CxZswhlO3|F;Ox%cDN%`YjbMh@Mjih~y$fDH9 zx+mMCMHL6Qc4FJ5^1DP-a!%oZ)Uf%K9ju@-3@sQlBE|GvIWNT_8$))eJk~AO0dxol zM}n|%2Qr?LF~?aOF-f!ySbA58{UsXfrvi;oPpR8qBAZJ*?5w>rEcPv2B}A1@qt@}@ zf#tvV^cZW<;)8Xc(~$!-bX2%Okkfja{MgL{CX~HuR8GC zdTeW6Hjsly#n&?S>wJZnL3WX8H2H{zmpg&a^keRHCr^)GvwJyk6&-Yz3Ju zyzzr>$}MP=5hPIB=?QS?!4&vFB4Jw!SY zm`_zCsjkMDyXv(nJsYi*BU&-(iRnp#l}OX1C_cM#qT2%>!AZ@vX%?xRqQZ;aG41a(wE1kR@>H?EQBFvIO8iDdJ33Ws|50le3Ss+%#U<}WOQe{liA!LHhG_g z{kEU+SRH*2I`&dzj+4fk=WWkYII;cwyDB!bRI4LWe9L#u^tYETQj0bVq?ny+eMq_3$sSrU>CKV=shypZmm+? zjD3sym&^UL*at&~j;2#m(zPfemS;y*REU-h%D%C|i~uFXS{}(@6<2zSS-#r{nD(NC zL6U_syB9$`2BVS|nSj@%^A9YVVh9>_2ifHkvM}X$dy`hidC#bBCW&l|r$j5-%4>eC z+*AiPTGgVzz3(r+o%-wq^36*oOdkf_rHWQ~HI+Q=S2oGwan5Ps8d6&%X#GB#Ti>sc z#&1I~H`1{K%CgG!Cnqp>-mFF-C^iF)8V!Nv+l#O^qKTm({D6;qEr&wJvqhxMpFy$_ z(QMK)^GwBvXQ75?d4QB_xYyk4sQfIjAmQ9>W=JC`Q{u_{iH7%;(l?a#p9^a%kKhM| z`?W)V*@fA|-#%uyL~FP3ZJR}JxwXPQ7hKST;pYAV?PFCWTE*mRHL3J_ygP~>`+v>_Gd~NIKxgmKtEuX zR!LOUfZzeU6f*Bf}Pxh8;X z{ITN*Y=5m7;QAJVWki7*>b=!e*{z23rwLhy>o%>_HzU3z_T5%BwCZh}yEYf$=CBuy zN}ZW%y%Q9FH_)dyBM_n@M4WgkrrD=*tnWw5z%oJ)`!T>Ws?-Ec!Ou#o4N3n)ueo4OXacoLOFsY&(nu;ENrvV`Jw7% z@8^Nyk8fTX=Z5B&A6%TlRx+ulJS_XxGFzTrXqz=I3zew^)lxMLm478Vu+?M2h$x1( z8f@00uh?R1yJHxn)B^|a@;!}w32#XoYDBUe@CD>kR#747xh2%pW^frTokpJtwVR9y zCFesb%7WD2r6DUHV&*xhOD(1WrZA)jRqNFmoE3^rHj9@Bilu$t#-vkBU%43^O~Ev6Iw;%baPui#!;xn(xbi%G*T_9uV5ktK1VgPu{~~bz#dypa{2{GXh%c=p z?cUwRAM%E=dj-B-n)xfph8qj%41|DuU-=?&90t=;yMIM}Q8w(f?d(*UHDKSoPbd;v zOR*E?ZTXT> zh5ZTMWg|DblhUW z>V4>5+UmTd9tj0+>~~YQtt6~CU5^}Wt=cCFy=;a{vCevZI%JaeSaXU*9TVYrk_!^_gGWQGP^B`n`}TlK8ErK_EBC zS&|8<;r|Xw(a2;L+p_iEV|!XMS{$CGH($Xe=!ZwEP3)B0JBBo3zb+Yn;PK~qa>W+C zcBNN_`}D-j2!ISsw+^bOa?~pZX1igOq`rAHp^IJwLexIwO{{tjh^uQ&R66!tTSP;G z?ve2}zoVf$-5zS1Q(!VhU}*{9Yu5&c-rR? z?nDQkJpO@Ic>UJtbX!B7U;IdgUCZBhg(9hz0vn<^%^ha^`!8I(zWhgU)AjiM!{PjwWf$#C$EY;s6Xo&X~(neeY$W4_9-r+kd^FG-nK|`92 z>`Ym=R0+Si4KWl0I(-Z)643kcQ_oo-7mv!h)QdlgwZol(p?5BnX>r*hKL>R#@D@oz z20MJwlomMsbtO~mR)5HTeo|XhdNZEKm$}G7ga)*sg~4p7s?0;BhELCzhV2TFXb`u_ z{~4#nST(52#)zc9m7742HwI%mod|O;#pL=XEMMmBLwJ~cxun1^C{Hs0878`@HvN3f z3m)nbwlQN3eBR7mw%o1oG?JIswJLhbFHv{P#s*IcZe2 zX`G;R#SqPYC3aH#ZC7l~aZ+D3<1}xj8=4UioqSKTF*uNR&^u){w_iI*YGFp5!wD51 z>ck?~q?5RRLBy(=}J_`GYe8M7A)MU0S+e zzc0`yynSRm-k{Ky_&Gtsr5W}aOOnIhY~{?1i3ex#&jn3~d>`Qb+=j1T$tE#VbF84~ zb0A&5ynrCkfdXWVq2AB(YoJPX*A*7&efZJjp+NjsWNqdRfeVQjg@w-dt2M^ zthcZ^Rw4IdaI$J}vT5@t>O`fQM{D{iTfRaCABI}Tqd_LqujZ|=#mJZFI-X`w@DGGv z1F!O9webR^e!lhq)lg6eAQwn!pZhns4R zz*#KfZ6#WlX0Q5o`5`3E`B*cgavQZ!P_0J7Mu-`0;Y#u{)U)Hzz*JEw9qWc-f|^xP zi}XZWquL2Ya=n(j%Scw-9z4U=F}K$C4=2T=XVREY9Piy$$6%x#@_iG%O7t-_Oje|o zGb`F!BK-A)IAwST2C2pKGy6TC{tTFb+oE} z?%lA}5|7M>1Wi$OacXSlD%YQW#OL`Ye9`OkwJN<(X}0;u``s znw>RB1*!RKHM1T9EyUTVTt{Ig-8YI{yxw-&S)cAs<`trbt{r@EzFt@xRR|1Gt%Yze zzT}|{>D}hC9&!E(ZrT)@qak{N_=v=L<9A^`V>*!Msy$LTa(`PF)L(Ycl-HgIVz96u z7F!;m_|QTc@=YS(u7g!G4urLqo@%@lx}*3FTifHSemZbmQU(Om5IF8 zmh*8Csl;45QIK>}W#yt?(>%l|LKg$m8Lz#R4f*)~%?cjVZA#ME9ONeh)V(B!6)V1v zy|H&|*-BLM1ws0-RFNk{!4|Ok1kK=yZW|}QzL3Yl?BLq9nPY7&qp}6;6iNNr_)a(6 z;vpIvg>9hM=Tt&f2ziu4|!IqAsY ztjUe~VRg`$$?eA`2Ye*nFi(B7$;4hMplI<}oP7C01w=aR7&~W>r@w$c!tWzeWY~VY zB%PQsQ&Tsz7|9Dy;x7Nlhh__kfWM2HhW+DhMmYPEdR$Xl}!bY5UVr zO{3Ir#9q)iR}vk!xowWrtEs%4)JO50B8Z?EoYR}9SQtvX4v?jw#No5I=PkL&dOTA} zjPUPY3VsR9?>rc7u6{E#6Ud=%a=jh$1V`hoK_j#ogoL}{9?ldh<)bDc{h^f zWL47ly=b~g`yKMc2YG}MgZ8@1z9ib4ye~}zK+tujIxM9_Esy?q*zIK^>LTc$M?zE7 zvi?F&)F$E_si@+!*5osPP9|Ejf>elyzI|ca(Eni_5uv=e46coz%Vf%t;JNhJvrj`l z?IrVsL8|oYUb7w1CQ{NRyu!=qj`!T*KT37~444~2WZU24yK>;cB~D{Az>-7wKarA> z`JxBM>e0M#1UyF@*KgHVAH>@}1JOPPk3LRA!c3X?zaT2~z6f5$X_1VcEhfHX`$P-0SzYPj=;dtf0w5dipOW2>nu2N{tA?*fs8 zRoMqP)6+x4&e1s}w{&Da&Y+C=Dg_&#J$aqJ|Leb);Cd5#^l0EoM->*;$pNJtWAFG` zs!;fec~0!tn8O68A2^qco46k$%qaMg0M+dUJIqFRnyGh|9m~!Y6Pws+O68KO*S`mm z;aaZz49x0NnbX19B&47E3|}M2NorTAr?l-8%uk^7w25}&^ z_Mu%(2TCo*#OYDzeC$bet=xp?&l;V*=htylP^6&qt|w1>|djmTL5t1B^S7S)ZE8Rk5H;Hy>4KFw7~{ zf5pXVnjgoGOsdZ@QCTbefb}p$6^Ae#Y&n|N&r z+@d2JzwGMG&rT~ogOLE4{R-l_I(UfKp!_b=p3LHfN$Z#-eg>v_sS{-)ISNO$#eYAE zYdRuI@++XgVDJGUTMLB}1Va`{0-b0-le9AD2}5+Emen7$WU#gu94eg)UM?URm=K5)o;#4Kqb5@ET!^Y5(yg2bX zt3|)v8E{h&Xw5Uw!Fx2l!7;SDHNYx6n(T$DZo>Ah85Tg7>)O7o$2c*|O$_S)ox=V9 zZpr>%tf#22zEdKc$xgk@Cst?2(0>yQ?t>d_cl(sa3;x^RIVVAgCZYvq^l2XQj3N`d z88MwHW0=@y$Hgt~T_!*DaV#pEU}U&A{&M|K&^paPS3kq$i@I-2ExV4BAEF$2^HzGA zE66(Zym%eh(wRu=>53UqmctdHq3~3aF|sA&Z=$KbTyTD8OA7CMPQ~XWZ6U79q29&0 znOMe;feuR(YY#rvcJw?lwmQaW)}1)?OBW;jP}gjcku|=3W}YUg)5w_)EM zklsE1>F~SY_N3|v)*ZwwFBcqO&m6|dtM?97zvYhW zuHOkB&`3&{Zgd-3{EylDB^z3K_PP;gsoiZw^O)$3AH!p5(Sh66EVk0dL(LHEBV(BE zH)FjwQgutX$xohEB@yN=mS?^un*8=s#TrwQ{j7$>FW9glorFb<$ShrrxT)y-%GG_0 z#-A#c(#hpbtNF9*J?%Jk{w65AGVAwXMnR2?iAaru-WXWh5e4d8|F_`OC7+3b6TqYr z-O8%NI9~alkqk_E)Neo%S6G4j0fY2_K^w_6#K%)A%;0Jih=s3j@)wmBLHv9ghczl##uUUNR= z!g3t+vi93T(rIFaz9EBFd28C2jW-Px;Uf*PQ%v?R%()+mOIK2pTLGyXLJbyltBwW5 z6s(G%SQC(j@n{zE`gyeWA#|?K>i`ot?#|mIpe`dRaFEzIB z3%%m%K^U`M5|zW^Hn+g5+VNWJ=G(gB&3+Og3sAr5(kys`T=b(PM$;Qsy}qim$Ouz3 zoUxoud|BD=P+FSd^YnOm=IqfIccPrrqBxncN;xrpC##+{``xs?wNhx;W-34CGoPVP zsve2!XQ@KT!votSseN%~?*3shHsn{Y!)AYE>{kwcitH0AY{QwVW{{t;-rrA}2BYsH z-wx)@ApG}&It-*2bmALF!Gv}+EJwBR4Lx@7U%UWAcZugnY6&2bNT@pfV{lVZTbvxt*oT+^6%Ny zYl1M`?7tPP5;|$@4W_PMKvZVe>hudjcRhYLq$!|=%6UqwAkO)ju|h;rTTWQ*XgdQv ztz|y+p<-#tWL9q80FgbiFZZ41^x!Q!kgphdVyY@ey3NN~Cs^tW;;nU9%JF0NCoQo- zjE#N83YQ(nh9~7be!)pU_n30fg?sqF6>=znv+{7W-BKpg=_DeYquyheYbV z1pA2+2}%D!j*;x+V$O&U!{gd0oVgUg7H@c{tAp{=l)w7AYc9@%9ZGj7hSi74>_|drrE9N99>=ATq|VWmetGM3AM!5P=K^|)c13A?MnQt3 z5*Fo-*+6$t6nS2RM#522cun20ZDj$47&-CEIej>P70cJ}pXRIeb?Bo8)9&8+&x+;E z@UgcQMYfTIY5S3~-!^$!2zd_7_16^ZpB8Vq^WKEe%@YC#?nHa@GR-2dpWeAuZKvec zH(2MN7e<7F&EV$X+PYHBXx2LTbg5)8K5kQ=KAA4xi{J*=#JFvtizrA-gW(&H(!*!$ zqhPYv51X0vZ1LmsG z@5!yrNqKo{j1>v5Ln6Ufbg;``{yeka8q7XIMTR7nnojk!;vtTC?vSeQpyZ8M#!Z6# z`%++at%0F}_I@4PtP7sANX$wUltgITf7L`Nvo=zEe%iEp$eT@M)J%<3Cg6<6QBo{z z8P>+0^0f-_k=(bz<9b)0WVGXchU0C|H*w<(QYFN90hyQU4q8WUp&Fn}ALYNFXa~QG zmb)Lb`MDKeJi=aB^61dg(Hx+9PVd~nceX_^rt1^DJG02$FlIO}BKAYR8ky}sSQ;QPz*`jw5&*d%#gh!^xd;-D$!E%iAv{NTSzu8fIhyo@48 zG@xy6Mj-7M1wmDWv9W@O_Ks&&leMikdP!qW<$)*7$XK;r>MQLWqIg8wtvDBVNXd-l z_3{bZKep}FulhWa?)g+*?3HWCwG?@?AR&n|tf&$MD6pb1eUYTM-{;fgmfek0+WG7; z%Lu!Yjp|?NVNsIBVIlbyxp7f>W@6%1FK&Hf-@oV@`&5N!pzX0zR@*nG$h0W+S8BnV z;R(J(@n&tO+CNLnL7C9zIC7kbb0m#41ef`-cZ~k_ww$C@gK$SY^fNb~uD!*fdGF8P zzt^kucJZM60W4}bo`i-vLQI z#-31H)QX}!v&aSspbZ)MR@;_{Jhph(X@I4e@+<#jXlzg~&FaOwub(#S6?hv{=xZb6 zf17|Sb$#7XjmY z!*p#VfCk5pv$$h>y+g-i9pG2sA7!UE+)}y&ti71D_ynC_bZ-3Hc4`N$UgqZ=1{afj zN{KH}fnN_ z)6w>&z5wzh##Z{2p}OzDmj>@O!-8n|Cj=$-Dh&))r#S$(_ols545`^{gA@B}jH)M( z?(ycmY6gw=;4dpSxP2gS7t-dHLGXB{IAtFw#qBhU=Izr>%(p78FvLl<&6^P++WY&X zjhSjods&W`zTp(1y=WpZ`C3w+a);8RWkpV=+ec)|3Wilmdv;kG8dQa#1g9q{V{hF* zlYn!#`qiNCui|^Bs2g99_(pqY&L{xvs}=1Sj+cYSH;+4Hp$Io3&Qaf#?4(SeNJnw> z&CA?2;sWm1jXEQx>)ap_|HnEfrOeWAoMl2Lw(l+Yg^a0|Nyo|ZBIh+1;I*@RC6ZKa zm%V@{H?e0~dovjUktLGYqu>06oq?$}cSp*5T>u6q4$Lb>O9b<3Jm5**Tsia=2jFcB zp9rwX8T&A_7@&)e&jO(?=i(Umvn{zaXgYs|W{PClUY&yYJ&W9&DD%~aE*Htl028EFsg ze|%*Ty<4`B9&i&l*4_T;XqG<82z~K5$Z2=>>al!A2-0WyKvz$4#MrBjj!MI913TJq z{I_iZxAFhIa|Vs7XFKrJJ9P3pS$e+tzzfxIF_xC?CnQ+KP8z8TptP8i#WsT$-;NKt zE?exV80uN&l?aVS*Z(3hoYGXo^)B-OR0Q4YdvXF)(`HJa!e15`&yWWO@R*L|21H5O zCrX2DCoh~0%gN5M8T-@&vqWqS#Etal&~RsXRJ0qlL>SmuT!T2Bvnr&@ex1$lwdl88 z(TJpjSrRp=6!2P^t`oeM^06LPeWrRSEJ9bs_DFWXZn%%InS_b`JdFsio zp=j7-8B#0>TaCDN*dH#lAEHwcqd1(f-DWl&$ZZK5D|NXg08a6{W7(wKqR`9H$J`Zt zKTC-#Q&WV!_)cLtEw7JBOGccSc(SUS)7EBGvCZi=jg5f`DhK6Y>Qi2ONL60QWahQB z`MqG!n&pLW=g~Pswyl{MNn6XU+91j(UWy&>!+JXHt~Kx}7x2?uHLAh70D@$F+V8E) zxDA-L&EkM8{uJc+Ih_)Vep*QS5-?(`4P33(p&AUF{N&)^1{e}%gB5NRyOnOqPpD%x zhAZaAa=prmAO55WBW5Kg`dNxB+ZK-1r1~zWZ_ErHD)2i(o~%@BX`VGhrD~;!T<2g& zOp^wUDS>*>8?9+Tr)EuU#Y(kY=pbDr`(uM5-z`8bZckQHZDmo8&vL%(3pUG2Q$s24mLRD=EJ*Ip|UV|pV8=k;wpcJOLbP4 zsdO?`6Bfy&q9}sB?EStyASh+S=&By{=`JF_? zoG>)x^J9nAaQ9JxGyDBfrs!v4Qp> zxg1OskCBvqPeQTKRrs|`JHf}t{xg&(Cs`Iz{!=*1Ns?<*xnHGt49aYG?=x1gE zR`2^2SA6-brx~IFE@SQro6g2cWmKSnFPuq{rm}n(Cew33qZy+%BNMT=XS{l=Sk9Q15`; z+?NIj6@Qh1Ve;aGIn{I2!fj2hA8*!%|tL^NK>0AEcEYd1|sX3gAiIPK#C(mXK8ufler~XKXJ_o#9Zdh!m_*L_N75)g|8)S=nhJn)dQc6oX?WJM^|4vEiv<;^?vlHMq`pX!sj z>fgE^nO0zyA%Xm`h;;y1S`3TLXfgn%r1whv zL#WC`sGX3h4}4vLfs+#z*+uPMW8Cm#8t<-nBm3}&1MQn1(qB~iz^JB0Uw0!(sWwyP zU%pQnt11iK7;KP1btPJD@m~8i{}ScC(T7Z4duo+yn=k4;2Z-aggFE`x3O$Nef4xc% zUap-P=ZG0|V;Q2iqmi0RC3g=spUUgo&~<9Xr)TLXvy-BL-KGu0_N#4W4uFz^ECwD3 zd*swifL66Ho@nZmG_hN~m&Tz%*M_b-m=p1ArI`_GW>dI$HMdi8fzXUaSt%=SsZ45d zL7b$|HNT3(S*;99&3VHNQgRK4=Mso#$!xh!%=IIgN=9y{e_S%FQnhnikYugiy0(Q(Y>VT zR#*UuzIti$LTiM3_<29#8Yax{z`Y^qz3gQ%y@x@T6OFii=NV1zwVtVZ&~aGKO=>@o zg>N9#eY)p&v#iO+bf9XgW9xf`t~_WPn$@?(=8&zH-C%4$E6o$#Mfu(rr20mS4&S)xiH+E}C@ctn%@m{+&y58k0*IOW}{w4A~kh zh(R)W%QEmR%Fk!|IUm;Pi%Ss@wCXi&pZ;10sjLd0<5p2j`j&*=?=+k2X=_e(5!pGV z*!RnnWo_3<8MeH5%`HECWAe#gIDWs7d?D7|?d@O6sFDAVAcUA-2CglvFbhD{%IbN{ z>)fc_JSI;uZZvSu+HDe;Gy}Wd@gYth(Goev85ezJAP-^w;-imKs;B)3yfQ?C#L8;_ zIUMv043hc#$*cFb``YyRl{}%pZf2zy|1|O>#>b-ivQEfIa~|tBCOq6STg34#lI7Bs zhVni|L8~ME)ZU7T={o&$cJNQtf1Fa?HLO#%z<)n6>Y}mvp0SXX{@;y&L1P1#taCnX z{E+98(=8pt3CFey!Wq**pUx|wbGfJ<>2O|dBpTd+zQcvzOsFKyS@s5z)^IhLfi z@uJZ&dfBUF4(=xSHpk?3lass8i`CP6%Va~`2!Nnt)61E4wzHAu=9Z?a)=;f!$5!D3 zNZ3tv?NrcZ_67H<=-mj2FF#}4nB=!whv*9*NZ_M8{Xe_O{|^=Ul|_dkU()h| z({L&ct7*@v={S$GgJzqN6sN@$7mMx3oF4R54XBrLIv+M0e7ILkx0U0&^y^DBw^NgQ zjkJm9SBRJ;Y<5ve^E@4L3Zbe1Jv%uQ+FD9D%Fr%+i=}+XP?9lyxvG?9VO||{LHzFuqdIzO< zkQS;+htQ<=fK+KgI#N}ng(ifafMDn?K!Ajf(!0`2DAGG9NJsBCd%tI&=ialQJ@dY2 z&L8KTeP&kHWKFJFlUbQu*Yzvk?}u^XC^CgVr(V!$_mJW+yT|61)_+_~Z-B{Dh=SfA zNGk^zoa$QGpT~C5?*VR!YTyA_8yYlHq*sRk@qVxd=q{Lu95x?Y5j7C!FGI|O0rI0X&j%bUR5MOfLGaorO1l&S8nxo61idi7B{1sujBgvv4|FWtFMCs&Gu6`5j0w zi~41Gh630gD1PaKjctKA(i=&9&5*`fg{i0v2TTQsk~0ui^7U3pUs2F}WeMUEsYD_L zSAaYb>Jbqty55Ce5U#RMfaBeIvSC1hH~TisAnWH#+%3Rc{k z!JcGEz=D{ZWw5bMY9!AzeUVDY1y#fML}-_%*#4Pip2Wp2IZBmqP6eZm<24Ak?0CN= zr;ROE&>B81e0=h!x?fGF-QZCUCRpyseT_G{J3L%!wjOiPvE6~Q5Yl|2Dmz!Ei3iPT zaOeJD?cwkGtHjEHwI^nc*JRsD)3NPALn}FIBwA8?*@auIf$Z`{_yiuW!$4|DW_e9N3F=&fw|Of9QFDR0u!>W}yJJwK2uWF<$EgGO3CfOK4X)`gUsTJyqO!k|eukv~TGX zZ7{n%h8gM!V0JPMpjqeBBlX?ZOmwaV`4F06RBO;v;X1{VYV5yhmEf$!6f=fXV|gZE zbvV1uyRLh=DkfD%%4;y?TAI{FABkSIhu5#rO>6g)?w3UKjyj0bfAK!3oYr~bR9`Uc zE$u_87feMD<1LbaCZ+rIu>=soN;1Sbd$=O0yk?h1b3|KpnlB9{NkXaF9>x(O^Oz(p zU%*f>riIygRZgx|j*K~Q^(59u?f1CoPs9xU_E7x9Uw9M$(H^o_NjRoHr_So!W;%9F zcny~`-AMVssaPsW%;Agh6;r1_>UZw-j+W3!;?U#^!co{;lCR~X4=O5hMI++V zZ-LZB1AdS22LnI@73k>**xLLIBlq_Vg?SXKkVv4qPN99*$R4MdwVLN)5H~Y*uNopf+TP z901zGqGh00V;S>OX3M^YO8ygq9hO<|{8@g@;2Hb`8vSG%i_~-FWg8F)5{+wJY&XG@ z<21XLlGM(N zI0*Y2X-@TSm(@$hB>IeIeMmfeRfWQdZRnY?Y~uW@PDJqN*jTE;-H4WHIkO9_#r~*# z*_8vbmLjvASpZ>I@v+zYg8d~`T-?@-7gdSBl zQ|CJ1mexJJ9kZ(;>8!=My5&>JBd z-qoR=m&u+J7I&ZALHM%wU?j{PLC_|5mw^OhhE1uE^sG;wjgXFE7~uQk+Vy-+MWC-} z^`04PpZMHW7c80R9xq`oYfv6gdf!$Zrw{uNCY9kX#8IhfhI}m{0feZOxD}q8#>l}g z*kUyA3!G5;QuG~8ZY1wFqrm9^9~F<6Lwv|FAUG2Z^+k@&aKTtS3hhh#&H8Dx!a=FR zi(fUI&rkYB%1A6}!rIP~fxS#jFPSaXoUf5X+|^W4H`pTjA?hBQLd70J964LQqG?wK;MY^$)f?AOg* zw)r~Z8xC{{9@_;2+!WxRd1JE<`SQ=NO+V=LIATPN{q!Fvtiv_FVFfuw0-uwZ{e?%6 zz;OqCmPIU$&fnTNnsxl3`9bL!La;r0zuvOD*Y^hx&e4*hA3sjsQnCJa1tR>JfdpT**!1&XL zRJ?#6)o2Ym68dVG-)*n?UW@`}W%E=el)4GxppMaBIC%HL_%3lD^9$lGdqcy%sp=eJ zxio3}b+$xyNuMN)Rd}@G0AvZ>TKcj0ow~i|)DOjq1@MGu$GF4X3pH5Dki4v!>9bvQj(w%ZFQ`{TEHA{&8$_%)ASJ>*&SMDH zT(fQs{icz*PE2AZx-dwD(O7V80@gU#*?}In+*7x{;2D4~#~;)Y8Kg}MFlTKgQ9UA| z?y|1nT?&|kOB~c*$k901P=^Xy52ETf!QA{<=`?_yX4OC6r2Z#8C{;e2_gR&6HeLOw zfAP4+ux?4)No5z!UCbnK&Q+J2A?_*AP($L~QW>bslPvv@E5i~za9TZjUt6}gHL|`G zLkpss!WT2Pwv5M_t;}Rss-IKI3R*vf!IoqmCg2dQOvqAJk@Hkkcc z3k8cn7sMLL`g8TM3i+5Fx9|j<+yoTN@CopW#H6Q+{;owYT2D5@QI6p z?d|V{w+CcY2Y@jv9h}&l?Nye9%S>D2yv%IpTpmVwZa~E%V#j2pW49O!%J!IwTDdlz zYq+PD)Et{S&L9=sE7~mSYnv1Dl#)@G(=$>@hJ)<+2GTa-IIzxA0z26z3N(w$2#+6X zV+V)q-#vSwZ~qh<%tUL%_d!eoykAJN(w@{0k46t#pt@_xiN>?MRi* zNbA@)3=Y+h(v|W{Ba0d&c&HC*oOfg{T&-KYFTqDZW!-G{P>k&Ja|&>|2#utPa-(&P z^r@g&U~NnhzWk7ye+KG%W{1gU6*y^Nq6b`(=umb;O~s2EMqT5cq=$j272{<>lC<;1 zV^ad_0Kpk%!vcFss8E3;r$S%Jr=Mx>kh=@L&dpKX{g1bo1VpI>xjrkF*SPZp@?NSr zWv5T}ceu%{BXlu4$i4!Et7AHp?jELf5r)Hev@$ygk@q``YaEa#rA3-@`AdnBzJARQ zDW15Rwaf1W!RlC{TzXCJOaWZl)i?)eF9lhll*JgO1IPo3NG9LoREBjIE9E=NxH!?^ zX-?SG%0&Lhn1o*x16YtocI8m{a+xda*K42DAklz0cJaAWi#9%XnFMOGqMi5}LD6>5 zPzqP9X78F>;zYlL>iiwbiL1kmSEHa*^sm6xz9%EoZfkGMGLzZ4nssR(b`ja{+~;HslboYYfpq%GkV>2^*SY+> z7o+sqEj@m?+^3Fbp!#dLX_9KUwQ@p}j8!cwUdSzE(7%-L30t`&w}u>rwvXsmsNj!g z5m3yRJK#R<&565x1=#raJ~$-CR71~nY%H!=t~S|C+;y&Y*@8m2TZQg__Y){*|uXuYHt-XNw3tyS|6ps@GEmZM#+BNYVFL zE7hrEyikJ6;$4qEJd*R$dErp0Gcb;OSM^_x= zWoG^;95Y+1KEIbD&F9<7=G^ps!y?F=036SVXi)sUx=`A6XaK7AgI*BBY-T#!q~z6Ik>m`FT6&d(7}){ot$*`^P2Ae5Ms})H*)zg zKBd@|SaDYKqtETG#lVS>mCIEsW)A^Eo@3mSOJoAsBGr{v!LC2tj7&Gp ziKkMC)1&Hfj;6rZ4Zg_}```NN+E0-!EtO15BofR$pfRPwI*Em8E`kWJY!egaaLq8T zpN7GQMlaSS@n5v@3lw;0LKj=jK?m(716qCXKuNXu3aYC8vfL=lsY&+7s>Y@w7wS=l zc>;zt#PYKCm&NYlBAMDA1F+32t$0B>v+GG%ZLE{t#1q14{}1Y5(MrF)^4Cb%b)a%J zy)Ak3D^Qvq%ZO!`pW1s*jBaP1*X8eY`&UjL4!r~uma=lGUX9c`)j||4-*Nz*bf$p7 zl5payN(#s6EX(eX9`lU!Y4WA~pH6tx69;LzVx8kp6?rqLmjX)i5^}LT(FIOc6dBuA zL@Il2k!qIHA`KaDn0vghNKh8An-6&tGb5N2W5b`UE*c!MfU!Jkc`}A!CjxZ;*haO8_d>N^lQqs%A>(tors!?PpeOZW$ zGQzXY+0xX9@ZM67UWRy#c(BipD{c)#YszUj7-Do@W8|dxfp?1+{$h6i;RcHDX^Z>a z7}uZZmX}IZmcvn){jz--hODPjK~yty0e55u>m?AN(0`W7un_LdB_d{Z+e#2X+w3$< z?M`kuK$&zTOHriZQ)-(>Q=6_M7dB9+WixGcxx!L8BaCS`-_^>{mK<6-@zi6ayvlsF8^78{v5~v=p61quJm2FA3$M^2H&^1eF!M2_d9evtxvzn;^S!P$ln8NG_!|!-{hSpO)j_=Z3l>JC|6jq%v6FJFToZT*ivZu*A{(P>W z$*YprNy4;XDb7={!RH`fUH(C0DzA@Qq2TnRqtUF!WMs^IJcQ(=*h|v}c5CuoVgq6D z>XVTFZgFpF7H2cPGN2-Np*(vuVPprQ3vxSQkQALB4G$`pGaRGiV(s zIBuQbJbmGg@$!&D3$g+{PY%@r3qL@upb=HeZF`kyc*-QNzVwlmdE$5{EWV|}0yU$SzN&bBWiC!XU1Rj?;hcmk&Qjw2Bszw* zZ0(m1+R!cmoC#|1>U9+A%K=VGNSbW5)cpV3n;|(y3jNXc3+a=Rb)_!Ko;|-vJ`=N> zwzzPYZmniRR*_ohTq)P@%(s=Iy;V<2w>qwRG9`YES#1HsK|Qm&4lwnxN$#=ah0OiX ziQy%E*9NO6!#~ABw|1+PKYJ&+Xju}ziLV^ge-ZgJjTf7=%Mjh!SyFqs@X|5_FJ3c! zV*WGAdUz;3J8Hhh!B5Q>uwE9KR4Qty2MXY{5!Tjcm&lTeu^d7;k7eoYOBC)vH!8yf>>=|(~VlA3*QZJO(Y_Gwah z*K*I)eduR&C_pBClvb+t39gHyFA0t9IZH)Ij~)D8rtrMAlN!p?f&}cA{@5Cwc0S~F z=F!FeZp&NfM%+Dd%zOy`%7IYx4zPx0QCk{qj+ptA__C@mFW)W=!Gy~zbiy`123+={ zr}sE%T0dx1FPXn_E~^^_c_Oe%H<}rJ2bnD*EW^0!B}8JEM*%iC5|{bhs;T5AK!^qI zRn=T?#_LWJQMQ-D-I5iGa{`w*fJ`turNHhxRU`z?JC*oQt1pQFs!3K%GmD=SfX2Di zY^?Wc56VB2ZxJKYz7p@N7-9AJn}u_nQWg?@^{fc>GFi?)8p*ww>?t|$PIsM*Z}pNX zi~J6^&IpexgrSuyX4JLcwTT@F7LAUY4Yl2#G3JvEGff4z2iEb(#XWlC4j9i6x;3#r zsCqe-InFn#+ne*+qb_i7UVE7(_FVZPjZ(esj+_p3qY^sJ=uAyp4YFe>`O}U#A%I(r&s1CY2bbQH{iA!CTVz#B-N|{p4?Y^ZFTD z8XpnPgL@+O48ELccy+ew+3N$4YOV$<`yDL*GCvJk8oMY8ys-48J@MxeqN?X|ciOtb z6|eR+hCe4uxuw5F3mR)DkN9K)iOa^crCsR&7H+!(2W7{KabjLUgAIXLG53(Wo+%mu zOY(6|Wo4k=jd|-D#T+98UsC7_p9xKlnErEe*`{@v1DKur)w7{teIQ40ENJR{`!#&x zb{|~aWhPHX%IW&f_W&nq2JDdCF;MQwI?>P*n zB@sMnh33+a?n)3CJ8)x+e^1qez+X~S(+5kF+IE*v`=wl}$%(bA0%<{}>ZVw9`X`i9 zg&@neR+WNh7RV&~MIYT;NS2EA271{FNL3j6xWrI~l~022XbWWW>zn(;N7}o-`_(kg zK%ba~mmH%)l>sXZ&(MP}Z~6v8cMb2~)O)|#GrbK3{(Fm;(w)!(?;XUSB|!m92Ps{x2^S<`M zuZ(_^`vh@RT7iNkUoHPhtM2bl|GX*xfL3SU&SPXAk~|#0(onLS@B*$iGq~`dltReW zjdofxgc7oEXvHK6W0u%rII5q$_?wa%d)dZrQNPGuZ5#b}>^xzXI0pmE3xYI_kc|6? zrf*?X*Fs76zdZau>MdmgeTV|bXEn-kn4MLS(EV%pGavr4e`}km^+(nvjMz&3T zmlluJt9E&`Cip>*x;K3!olX6d56RLVl%`B@u0r&8 zD6BHz2rVOaajiDEf{-=JN#{hHx_+x(AUb)eX@4?@O)jXIng#g~P~(z;I^{IdGzQys zJYQxI*tkmdm{vg{Fe!=4)l*1DkC5xND{Gc?_V=w?Ha{K8r%0)WIj8#&}W*v!x@Aw z?fJ&$5+=X|rHMQJ2w*4BEzI1$QhN!(Z@HM)Gr z4*CH3j;0j;d|zG{)}z_cytDJ?V0_r z5IOrJ5v)S|@x(g_jbrW4AJ#ro)V37|&XgHc&KZZpZMNTz2J6=zC??V5>I@iKYdt#@Y>(@6qns`t z+2g$e6ibP%iNpAeR&%CS_@2<5u-{{1Lo&}(=Vgv;u_n*9$i`$+d~`RM>?gJ|#(M!$ z=cKw^It*yG?J0~(*fcPnYa1TbfO`PgUkwqQ#l@pJM#Gh+%|dnbE(sFOWChN%zAI1O;jmAtiLXO+WIzqBNoe`6 z`L;#71ry4wa<<*Gl1gjzq3p%hzUOri-+A!Ww)D(04yve574Sg4!WspeR0VqBOK`!T zj12&geV`z+SLA;ts^bd>G!TVVrc{7{X-MWY1BnqT-U9?!@M2Yz=37%5gYF@SCWA1< zVS^wjVBMa5BC0`z{ROq*tTQSi|DP^6JQNvqegZD6gP~$i*wS>>IR^Rl5rXfS_c5+c z3dJ8DQxEcrZ%9>X66VR4_9u4%y^I&d*-dy#H|-f&s@}VcHbOS&51P}$;w$q!?)IIN z=Fb&}O@6O24Bkg2h9}dy=(9?1De2^d*R&cM@iN5#uH)L4Ia+|WUolTkBBX1;%3i9j z`>L_2JHr;Z`dWsZ$3tg_hB~WzT3q}~4V-KqSI+j4RxPxO-Glk4!i*TM7mXU=~WL2mQl95!|utc+2F)WA1YGE%>8_@eu{T( zvllRBXFwpzO3lRD`THJ*Cy;^OIP&zMLrFu(-x~kCsP4giUH#BUoHxZOYE%IQ}jbtMGms3fk=-Uk))gu1{MI8Q%4^-W& zwa!WH&lg6?8{-NEM&EaT1F8rdumO*rwD{uo#93xu?RizY`3As2k;A!C^u^|pRcV>G z*J1UqMiMWkxJDXUchMxP*M1Om%Q;xj4P93Yo#X-tXRgC)F`k308Z@0hj_5#yNvI@`b{~P`++{q^;zO1|J(h}Uk zmOLj6w;S3Y2(Y~Ki7L7~ zNosJDdFK-Q?DmW-se+^IhR85nFBhvcIlc}tD`9kkspq&M_&ipTnhccVgb z{HxdIjWPrYo)E4it}(M-F8)e}MHu1B1x&Zk8^2YR)${-O+GZxI7*hdn)((+W&uMz4 z#p%S*BsBq4rE#inIOR*h+OADJCzni<3Xu-pHW^534GGlBE%SPEgiSqhW4jv2h@CH{ zecPO^#xq^96keEH$&s~4%V4Ikv7Ab?X;rjZg({>_fi^7%Tw>kYo@`AaVst2+FI%P0 zjCuG;wTG54FzLJO4W-<@&dL{eIhr)oiYFs%kKOgRUTL76P|_U zSMINe*v2=F0KZC8O@n=xrx-oPqX(4uITtF9!Kh($c1n+qmctbr7pI7u^Gqc&H~W_q z-_nKN)uVi^d%iC7(@N}6_zlk-?(Gcr##2MjO0@5#ixVlZk7Mg z;e0-5Bbu)HJRIj~F?Vc@XpZW43;0U(X%~<{L-A)s76NG!ieiNY z?PK{CG4r1y4>+t5*R$jU$=!xN%6B$qwDMUBXOy}r39VCxlLbyn?5yXI90U644t9Cv zPfyPO?O!Jm^F98$t8@@K-lRpuPpKHu4paWwk7s3!2$ zAWYZL8Pz6~#3EYxu9B|O{*&sVo1>ei|06f4pcUu&H(>sO z9pQJZd(#&Kx#x%bCi)-eTTUYe zrG*v}x~nsi4G5IOP8&ebnKsq$;o|UF(Rm7NOZnr)XJU{T|n$0 zL0Ei000Hg{HY&8&0Vvkx&Qm@$JlT;roJv5}kv*hJp^?%fJ=CH<5y?t5DyAG}L}^$j zk+#qZ5oJlUD)r)f5`DZ5@+0DXb2Qod)o77ofbk2~tqUBtH^iLRA-N~=3HCXJu`*r~V(@u{3|HZQg1Id4+9yoUL3`)>#~*KRkW~qm&zN*K6=vCBM#!i*#|` zxmgP9fzt_!ii!C1yQP0qH-8g`R?|O}@7CV;Wzp>!KBRe>^>KL6cr7zciQrqmVf^9D zdJUl3>grJAOCru^Qc|vY9S)P)HdQMr>hoc?IOo(2> z_w2>ai>7;H6GZ)EdWpZp&4ja^+rq=tKhx-J`ujrti|xk;W0$~#iRBxw9;bZr4hhYO zz0+_*p>IV0Zsr8)ysfXTD;eIBku+X!hJ(1qOz))8OH}M{3>QM z=5v|bRk2ZPK3SaEyB4eSVqhIiQ=?qg>WB%j1pBf;jXrX)UG&gV|MBt`0Q6^WcTe5g z_V?cX#rJZ#vNPRseO0qQflD;4?g>r?Z3dv$!y2jmy(x>-#E7A4Hf%oJ`PUoT`nk0(sX1I)0HKi=X?k%6lD1<gD4F z3Bb5#Jd^mwQ}{ZVl0xM(b_FW+@YJRG+}YeF`I#ck?ltka&jAwwRmVG!+~EMaDU8kx zQ-XMN0zD)feN}?Q)so}NpF`6n;f>VUkM}M zF~4o;B*D>X?d&As& zV~)qJ(;&ra^h@6rG2dETBPDB=5m%O$YguIOFpe4HpUQ!zjR$}@3RdP0E9w{%f$w54 zL@9cM*mV)}7V=4Rkov6ugn~!dSz%^UVM4C5WOcMCx>-y*P`ae&#fT5_=6KgbKi%BQ zoL3PQ2L*>6O7S=w9?n^3$?-fuEM2P0ql(>Z?m--4^gc$mTaW9o zIC_Hy?Y~ieOc*JUGpul@(qT_{hkCrfa^mOOADpP&dDe)-c6Z4^PJIYCFo`RPRE?Rw!G4e%tT4=CUP)yVU|Aa(%fMZMN?NWq`7iOXHJs- zdTGdA3Rpc9+|xp;u+P&R+_KN|_V%5-V^d{3Sq)LDfoJ1j<_kP zhr6!13m<=%U|PgkUnhcYt|%x=p-Rb{sI`ng!Q!M%ZbA1++ZrUaq;;=KuA|=vvkf?S z=UIyhPrcJ&4HBgZXNf5&x^d;K2x0w=b&H`X;tB4M?j^+<~~;Ye_?gDgh_hc=azJWgHL9 zS?bO!ljd$r`wqe@)&rkT`?NlEZ(91$_`kvc4R2?%RKhxb(V>6&^2j%qqvO_Q=xVUl zLSv(c`^z%#vmALWcXB_Z!C1cqD5jEp5H+{k z5D&T@N6j@nL*>V$n#v9(d%MjKvP|QPUEd3|nCgIIjLyo$W*e*p8` zC6ElnrdBK!{p?=xYh|{g?EfXsy{sM-ag&ilW!aDU%QvbX?s@+1IlHWce$s@lIf(JT zw4%1gA@t%uy>1E-`mb|F#bED%>w1U@a0z+XUwF=CEq_v{ej8hF-j-`TBGdR|PPA*6 zzS_DZ-I758+Cwaf3@V*?pEI6{VF({0pT<*soU$u+IG$`dHgDV137@`RRbP@3L*Hln2qAqQ!H zD#|J5a=#}i>Mm^8NxKIk&cx_XsPtaQhD zUs)tVs8xC%v}Zj&jut6@wz>E8KC|H$^3j%!r_&Aba;Sn2GJ5J=A7KZVX>duWB1;?3 zZmZ%eoLi}uA5#XC<6s!0hG*`>j7mFo`_qRrr`0yoayTk^fg@RIy**0(>q*76@1z)@ z8SdLBv}jViQ}z5)=h;0(IOSERBa=qT;ye5S?Qssv;PTN?4$Lp-lwZzal_QM_;rKHT z&Hxc>A-C4IdN{6npH>1#^;BUF(@4(YS9hXlj=FTmTuY-BK|d@G41WoUc!n||z!?99 zx75%oZO0Le^joSND=Xtug3b$SnN25_~nj5{UMOqxz zMF_PUI^`*;rnWwkHV`zGxlsiw>;~~h_o-W3-f@Sv;32DjNez1FUIhUXB<48aerrGwr5gAJkF zb6&1XcNDuYItav{jK9zI4j~TsOOko%ObjnFhcDdq3Ff~r?uowDHsax-Hnk;h#gU2^ zrF@F~$Ri|?)iXUw#hKHQ4tOt;lqa|87MlA8-C^fsKCDUNqmrpxF1pFSDHVR>>Vdie zJq?jNF#H6qGIO=Ec_}#*2`6IT6pJc!XmUKPi$g7-%C12eYitI%2Fxpx z(AEuwgRShd2U-BBfz`8C6;nGU-oQOzt zw-l-PI5Lazpo0~s+UX#_Wd0OPJx4s0cAZhx+8!|0!O7$(k-a!-8}Ph$dTs&ca%|jv zr*A&9{J>?;#;Cwvwx|qc1s!ib5LuW}|78S^dQ02@@yy^N?Ru&Fb}I1Om`SwCSml6X zZX=V=eWpNL&{h9;2I-bot>&L=CWW7)Z#={Pkv)R5M_nr zG1e45$QDgHXhzj=Vl!*C{Cv`T7-1Sw0<3o(BEs9HO0kJEBS%mY1I5=xYHnl1yD`1i zwM8g#k?^PfgI=)U86QR@U<^afrgLA9Nd+g$B&>5yKCdRI(vW-*_TEP{PjN~V;IQtL zr9#&t!p=PQw2$eDDUCd3IYoQ=e!Y`$mI@FZV>9U9ZFJx1=Q@$XORjhhx3h!Jw3(qOPSjd6Vr2u5%S^RD{FlJ zTQ9%qV<-Jzcr>9SQm~irDsNGZqDfyA!ZO-jg1@=qHg{S|S}Lt{g8E#otF(rGA#?Q| zC}f4}tQ(1l`pXBtl4(vIiJUE=Gp)r&?S?(}4#Mu^xuCMPvi4$56DmFT%0ayar+|s- z_w&YK?L$798&d0|Kd?0F9J|`889ZfOt;Flf&qcVZM|ay2@Yg zQ+53$Qxm73e*wDB;;Jl-g_opk4!ZD*cD?>)JZxq06~j@JInKccts^r`48JGjkVs#9AUHa3_gmDpi#_-j^1&lR7mT z;l2o7qe?cvP}vhOk^>kUDhCP`drUNw;F=ZymFl4eRlAA3qhB;hh8hgaS!^7Ld(3+d z0INX)mrtuDqn~puH(5=|S8xbV^_cT@L<=VedFV;#_`v3Kx*A>WpSxY4H`Gy6{69AP zC6`>M8bBeBFQ=+ha;IVq{G8a(<$j0RaJKI?0-{Al`I7TLgCRxXr>i`FL`3ZzdYD%F zQsm=E)9j=rc@B-wzsJT_^d^mTJvbktWs@!GuNM&(6>r4;1oN-u?JY96> zkh5Z5D6|9NqOd@pkV<`Cb=Kle<3uiU$6 zd|TFQH>=VhRb>5IL25^HHHO+0Y)_oZ${JNvQS)1>vDrtLi1zb>LVQq_^2#@ z7d8V3UT$~PZ6&ck!e9Y7_k~9$Ly#~m^)#eJAZjpsF^7-`VhEQJgRcov^r}~pGIZBw zEw~W3=Rd%pHvEjBJm)9aR&8=6*f770`9@=*&MD7XwJ7bMhvFC&)!ElM^=2bQ39vd| z_CiCbt{BwHYIKrX za4=5xKxOE5Gtc=9;L#OJij%O0-R7Xr^WL!Zob^vY{%g~$@IPUg_T52U_u$%K_24Xt z{Q@8;!QnDDt6u>%AsV*VhA>BbkcN=C+Hp8@M?zfB1i|~ro({hbr^7UfY%f)7Us)M# z0pHa|kqg#Gt%GnuJ{jpiy|-oDxdK^A@3Ml{WIC$DiI=O~VwtGA5l$jQEZ;cMm8B7N zkU1LwVqkG2q6eT8SKVj;UxEzvu}5rdba_6PUr9A<l+vH0n7ZkuAaX|tjPGy8 zNAtkN*n%s`4aS65o^r;CuqzIo7TU&KK(ntPTgd)jkKeV=D=Oaz9*>)f>5~x^GO^BB z28ZfP{NPHG733BgN&uxeScx6#4ja5UK62oNE9`?35|svC^#wmvxIq-y;`DU4BPKGo z8>!9NPO~BSSsQ=hkll49`vLE@Snzlg=E6_%}feiq?@wzC37*eFtHkP~hZao>q2vK=ZzKR=mu@~h)jv91DI90E>UlxREoOo1*m4#PU6@@N)9 zQ=>W{MYsL@U8-SuFelW)Y+;||TKZ<#sBjJcL)|_8G%~p=Q*)7-#n!N?o|IU&oEPy) zDI_E~71If0734`=q^#D0&DqK6qz}wX*sTV??EQ;KHN}Qi5)jL4vKFydeX!uhRxc9D z8Xq@Pvw_@3h_+h25nt1KI8OM~`IGwgjU%n6w87$>5dh)uH!izcnM~ivX^pdz-tQKZ z_O2IuJoA&18mV2>zC6=%6j*TK#}{TkgA;X(pmk2JzyGa7W4BQI51AV#VRg>yQI7^k zp?lmuzYT}_7E&=9*JzpHvmwTCTls?%Ls3^koFB>XY$ zPieC|`QK=`Nls~E_v06|QyTK1u#8w>u%F^DmqqELGDJ;-+9Ht68mI4fowU7r7P#16 z6`qwlHudr|GYjvT#EqwoVbq_=*p_6@KgVLLdV?O;Ug(&Nf89ZkcPDF!wbK!pWDcTY z$-T_zZ~e)cpPsP$XrB?EnlC&u@jmx3ZJ$J92oyC4;v#dHLzFU8>;A&alWyi12EK-R zXl_-Ml?(14EfhLza}fazv1VVMq={ty9y^rhJ!0GI2wx>(j}@(M!(ffYl`^7^${jd2 zPdBGBb=;4PL!9YC1z#G>M_8K(n^x&rMGf(~Uf4El&FbKjj?Xig&--7@z>Q{(W~dam zl)e&4(7kP3iQcGs;iI_*jE>vlV{tNNkl5RsR*$v6To;J-#1H6n_6&yReqoTTYDp;e zd99}Nvu$b5hWqE%Z|&j2k)%+-bDS!b{$tlqCh^VHC<4xJ_$y&8M-6q}i9QY8N6jqh zGY+p1`4D>d<|os9^v1iPO>O8hzmI(mv~gME^zWT_dwNTxrKd$!rIv9uf~IVT`>dQ+ zhn#*QXZ{C>o$AS`b%iKf@6^6rH*(Q@CPC}Rd=(B*9j%Rv_tHbROMiarcNmwp*0kNnv- z3?s>{p95{$AM?)T*(`}yXw9dJ53%@q3*Fi&64qv4%M?oKmk?w)=JSQ6LF$@*lu@{R zU;@&9e3ogpQDwbD|L>Ou;Onq#(MAbibMr>IAg7(tuc-q^y6{-OA=+2mPPKSAiwB6H z$ymRO<~?Wn)H&aAUzcqilUyCfTrr@(lq0)5GP-Vmvz#(Fl$cQ?h~=dUN))NB+zaZ~ z=Oj$!-2NJ&*GRryY%kEXGFhJ`@6l1YSEy@0fYcgow z_i<5^Cv;8mU8_^u85eyouh*^N>R`6U=ebjIos72*dg>0AZfr@9BuNp_#iBWWPq=>2tVc71R$e=}$b^>fx9m6@L#d|%-t16n(>>jw5TgxL(X#-wt zPFpL^kZb(5b~(nim%G(3#Q!dZd9Umww;$GKZaT0sZ#?%~fd*_) zZChz?@orT%zQmkN^Knz&)TiFMFx@)2(U_!4K+=1+;c|h4=Y+jFB&l3W-5SYvF2F!Y z-@)4n!=(Ix8Orpt{mm&Dw1_M$)aT1n#?hR_5AcS9kH_JM2uoJdRq^t(y@Y9y}_kaGx_8NK%IC8*@SE)N16r& zqmvT*n(??D>p`0!LEexsyK!jc12;NHeRVz66JmbvT)Aq3;Jd#O!Sn^}hHBW54mEzmvXu7i z@p@p#6+ zM&K&-&st!bmIK3;j=Kt-3f<;&SD*GJ7Oe%rY&VUyyoDCe!F}IqtlI%sbzENnoFR!*e>mkrG(!$mG}Nd1tDlstUJ)Hw%L4;RU)qW)AADp2!42< zIanQCQ%!gm=Tw3mVD;{eC3hHcBYlmrDGQwMdM={p&Fbf4Pi3lCE5wxywH^Ly|6GKZ z3(^08>9zl;*2_i0z_@}fw0^}GPK>~TjK8WxN)obeJ~Sv;43ub}9kxsLEB-RAD0t9V zWIEswghuwQ^`~*aEu9;jHGzz3w{C7$neq&#P}Z)|TP1f_EDg;XS)02+StL_7UIs;- zY?&^*cRmpp<$aj+QL^2;Sbk?`d0U;02X$t0@pI%EWgY>l%8iOFosq?(g`~LgWQP7A z_*HHot*zUa0I$ss^Jk4T`n)b*Lx5wMRjPNw!!wx#q~9bi)Z8A=@O@jkesB0RE^MVx z7(B~MH_f0!dy=Kj+@CLg9_PEm{>)J?6#Vs?LgW{z#j~mT8_538S3hOiy00ZlhM0Df z9HKdQvj=~>Kz^En>wk$3;fN_ZKYzzrI2q4gpFVHhmkzZQ^qUmOzft8%{Q_!fc7-Ll z8Ocq)eF`%#l10jPXzvvSG}iHuej09+Yk%?gx^p#lp$BGRydir0x?Uqu|3SDALw|m} zLGO7q+EK3Cgm#r7FekI}qZ)=acw0`Zz9NDRIS{WF^RB^TYVK;3dI&bqG2Jn$&PRX3 z_-E{5jLp_V>>&Fek^t;M6~s3l&{a`0f`G?<*VlR1z-pdCKDAAWnk1AbeO^}F;{=HM z6yAulv)+4CX3A6cnmsQ@4g3%;kfZ+Yj)wo+@OWEa zTAqcn_giHth+d#EkBb2V+j!)oh3o5c<8LolAv78j@*e<4DGxx+X$@GaMKfDCM^oG$ zm~6i~bQaOQuHhmX`LySc-j5o2BrB=6Bh~Tte*B8114r^fZmVdyr8Tbl9^{VAZZsgoF5GfNWX-GRu*Cv zb=UG>aIaLfZ@y?`mFXPTKVSw8ew!a?ti^35vZ2!bb%MZ^S7=e={1SBNPe4(ey2<`Y z>kyApS0dG`>GHPgBflH8`BjaEI7suPc|mxn8Fl}M0JAq{`(zeEA&$Gnf)PWSdXqy@ z`NCt@Yev=O(yED0`+l)(m%C)GUMyHXs?cS}{o|CoE8xrtUC4&Wx1r}jR4^+AYy;C{ zWj51XdPUP0VJTK_c@E0#aMWnC6HJsDn&ttOpbOV0?Tfwv9TDuO@=c704}9)A#Mt-) zG(4Dz{P`em7wGSMO}DuZi?q%Fg{^2M{B3Z+Zdy^xBvr%bNi+s#E0XZv(mRjw{|j(s z=wIg}TWO1govYjj>!?|UaEH>i_6noU*2844xg;LO@Pky=?PA%py6k3F3i;Y z8@AfRE02l)4i&WerOJ&as*)F8x`JA@1YMhG=bceU^Qdwij+)J3?0#XHe8k2<%+h1n z4<@{oIaO?u-CHKLn{7fTn>8~Asuw9sy+mZ)&SZMY+j=edS|%j7C3cHMSy#dsUzCs4 zOvos~{k8mF;r2`y^=#B8KVH)Wn|U`LozjH6tT-mim*(*9U>)=m$HApAtn)ES;R4$y z8f5QXtB)9@itR_~)`Z*|Bmn?b-D5lz5&^baq6O}S81xkuXPIt`pS{bgi6>BN{asp) zXcZBD%yKg{Iqp21`M~2_86xF_@{gg<0^SA*kxXn2CASspj$6$7%+YajF1`=q0osu2 z-FfB{&FF#*Jf`C_pZO3uNh*-eK*l0>3eSo-i#|X5!P@-x-Iff2Y^?|A>R6LYaAN#j zI9JXagoT#EOClJQeP&*-kS?sYS-?z@yy>p;{~|yTdoksF4ewjtbnw* z1(GUns=eM@{r+~@HEyGy#<`Bt;eN(o z`rIV0HY~n`b0M?uo7OK&BlAK@C)6MIlU#JYOJ6)2K(_pA?rdC9>lMKejm(kXTB51l zH!5Xgk?LlGK~&^3X08Ka*p_gCmJ%Z23e{fSm#>J~8dg;oM3x&*Jne}7H0$7-m9adZ zDsuDe4BgwG)-)9tO7*ILuGHU(DIyduqp^IKvLsg<@fT$*sc=b!5IqO|ZR?YJZ=9&a zuA$>A2r^h*eD2pVzS%_9+$*s=e)V40Zfw{P8)M57uwEHy9wuejp>p?fvG z;NpKSQcJr(fpW=kM3YEa&Qv3$=#>zod}w#@?v7~`*baSa)~yR;a>*a>**+$jDzbS8 z@n5|Pz+U+0T<@Q`nuw#K9r^q4KL%Narl&tmy0!EU7KERdRk*BKi0_LZHM_7C#9bV+ z*sB8LMY3j*S$#=ZC&8Y^cBp|h-Hk@T=wXe(5^GE&LC{aXnH2$ zD)80_X(d>6soQsZ0^_t#mRb$`pPLN)0(_l;|J@l2)hx;vYJO8e4 zzlV1UpOPMa^MX1CV_cd7&tO4uJoYau$zq?^_r(9wX>t)opU0N}23#LJV=)w>cx4w# z^RvQf>kGmE%OQHfa%fjxJ4vsPne8fjca9`YipPBCQ8XkDKVB^i%&gu=>Zwn>1vii< z4XZc*v|pB?-cw>Qaw4(zNUexxQ6{+Fs;?E13(iu~rEnqv^CJ&3Hj)iqz|QK}a}n)J z&NtB{HgzL%1~`m0oFS}>YN*zaaRb{qYgQa$e9Syym)LZ@{g6X;uSZk2so$F6^d=ys zNZAn4hAwB^ae}^u$%pK_<&&q#gC2#Bd^K9MpV_72@?yNfEN&p{l6!%fpYuT`{UNN0 zW@8ruvwu;9n1@OvY+3aNzXaDUjhK%n?y`3s0tM4^Id@&CDueuyj(1;){>d{Gqo`b2^I%wog=f+W*4wRRXoxB7yis0mA8ZLqXB85Hq zUsj;{zqa6pZk9};ZN>4;GVvlPQF!>$kHB8KZq=!1)j8P#xtsrrgCP)F;_b}m3?V- z)bF$`;ukp%B4v79a!LEG#rb0%qMywKVd6OE`aF|A=DNH-pfX0JOJ~)$YRHd!)U!cx z+YvwB#c0-NP6HEpRtM8zKRX0h;L8~8LE{5T9I6ak3mJ+3qI^k<>`1CKsj`{Ahqx03 zSfzy*A?OXsp*9xBRaNSGqC-`Uwgfvy|6$gta(%(@&6wWEQ6Yo;52Uc#HIi1Z_pE<{ z)b0B(o8)&PTB%?aQ@!CM(s-E!(J#>A1?FQqz+9O@^1!R9siqy1#|=QaVvw7vg`(GQ z?X7X6T$>){+({d78Q4UNO6-H16c{+fi2uzI`9F^=ts#@MZ^##6B_-uul_6`lll^)U zKgC?S4?DOqyk{nBu#_jHK249gS2D}Lv#Ss;H7ApDa~I$)lj~s)<2N{z1+<&ESdB+o zv+v58$!o~Yf=jjE7k=O?9%BW=H$>NMdOYH0`RiY%A2h=d?uO z>N1BUvKG1yvYqj^>_p_-U=rUC45~bM!6ELQswP^zOJd#TUfgS9{VT>r|1O`x9JO5S z3zxGG8?;>fi?Uhey&=wVH{b63f#~6IwJA38$^Fz&9*GnQ-&E2dA*4*7d7SeAq$g?E zZRf7hRj;q{<$sMK278xX{DwaoHLFh}AHO$3y@SAdiYbX6eF2m{U=8M3BCIk1m573^dkgIFo z6LeO$Mh*#pNkVGZwgd&PF!N{0&arUV_Hu6efoO6>d=4+jxDF|v8~#Gh zu%jg@w{=;0ycgeUj#^ZjuQawZ#Ya`3c72rh6a;VDB1$-7vqS2R|4w(SUu?{=UN*NLlZFa;^4>N-leQ2bi+YHlz|T z(%*`^_=`_vRcGwZWYy_rib%>I#zKRN>WTJaNB)_SPvF7u7p3YZz?^8harao-XG7UK zk7$hi){8f*kxZ=OW6vsBJPFZq6Uu==vS`2h)%e49v*-T7?JQRtbRyrOUu)$|r+r&k zcjQPxuFh#lKm1$f=(}L)&v?so!qCCfhX-pi`#1#e2yHrnn8Pcqu@@IfMCF9v_ATOX z!&Km%eUvl0msfM7;cXGI8!Daj!{^eP&;62=zP#@$RC$eiB1|mfVeI3+=B`~5A1U(o zg*nS#lw#g7l4&b?jY2cIYi1hd884Z>8CyzZs12+ZBQPhWz7_VwpF)a%kykflAr?n#AzH;&?HBPD0NOj;E%VbQ_i&|P#Lg+k% z>scNIIvJrlEaOj1x)=5-C2R^(N#KgZ-11T5slgf)z?ECQtdKLj70MGSJ750Ul|@a8 z_z*nxH_yI)Q8hf=Dvsw;;iJqSj%4S5O6FncV^egPQNsY?U)2@F*uHO_|bm5YQWC$9Iz*8VMXgh1lY>;EYfnDXlH6~8QBK2(?t)rIwa3-)nonZLt(9B*nn(An-=`$ z|H!lsTa=b?^Vd^SjxU_E>_m_S@ zuyPPu&_`H~%x1tLI}7!p-g#mDWU}XT=n5=82eU(J=`r;!7fgI)aQHTj20iTZ&b92b zu69Y+YtNEuDxsXI7p9hnCEe>TbY^AzN;Ui}15jT*<#(vi1KBN*-ybUqR!8;63|f5M zyoRs3GKP&ZvfJfUzx<@%dbM4c{=ok2`kZ-nem46lE%vo&=4-N56DOHhZr`bc72VZL zNm7n{Kc0>7g#y0Up)fnXL*^mKu00%Qv>4tq(XYML=9-)4bBrb6fQUJP=Z2dZIBw{R zP0v|62mlL7Q>t;%c#VUM%rYQFrQb|1sOk*MAn{(wLQMTeX=!qE197MmL@mWBN-D~3 zfsz{Ig=~tpmV(M`EPcs!^oC@^%Pm^*E4>(4afh}Q9Z`6xA}tB2UPdd=pwiP8>j&$= z6dJ+0a&c6-@%-5Lmx+zrtE)pQ?c9=Wl+S~oLLBVIlW_|L=V-sgog~a{GEddldRgog zb}N?^x_%x0TxcGx6+cv` zk;7)7i~UH7n8tD0pwzu!x-z)W6^(Av$8pHr9zj_MLeq-Vvxcfh|H5z=mR31v$pJJ?+$=goRIJ-J9`@VNzMejBNZ(4>i zlEep?9kz=~H2H@#stt8h4gDXArXS2)MwNs>%R(EsUGO!ffH8H0g@O4_gyz}cXx8=s z0LJi)j}NSN(?1);kCyZrqc|)hytIaKswP0Ak*9@!lee3+GP<5%i121dCZ9Y4DdRmY zRoUk9Yr{71chMI~n#=&Vwq#)nuCVbQbJ`#$eA*_2b8xJGDZqexl+eWa}%wEZ?$VVukONY5=?gA1b? z9WJyliMR-XXBpyn7^WX0nqd{E(;t7rY;UVEpu-(A8_WkKiJX?%0tUmTf?H|Ho^ZxC z7CH~{BmMW4v_VX0^Z9jB3$}N~nZ?+7<`tMkIBHArt_*CZ>SZ#~<@~{h8Z#~PfW1u> z&v%jE_d@gx#R@=7F3a%*-es^Fy(t7kR$Rr)BoGs{v8=$RDVKaIvH86!`t#lP{y$~U zRjM zxN43o&?FLBX;Pm}mC#)4=PRV_SLUArKIFHRcGgMJep>la`zI|%_;>|)Wkn{2h-&Uw zvqQ@Db)Jh@u-g?QZ2nP1i)Sh~CIRd97#L2RZErtb{zb{owv}m28RbS_ccXhRtN${C zDv}uR@=fbL5cPdtEEzzIG<`L!PCX&vS2e( zrwW_7euK2XZhn4KuZw|y|HhD2>xkT`M!nj-yHC7p{=e=a>-kwt*)2&V!?tNJm7rs{ zeejQ0LU~%k_lQ=!zbNzf^|2B{4QsumDXP@M5S>M}SIzMrleHmxQ-Z<@3QH^RPCF{$ z{=SaCOGO30`0Bq;)RAF$jMm3q& z@+Mb3_F7*3eKS~;_4 zv`Y0vMRPjUGG%2YBw+O>NoOs@Y>&zO3UI7A!55XV9<#9|M~pw2Q(9kw^g#YqCB}&h z1UEBf+6(`-mMKVhguC_SNINHUv)E~l>wR;YcQv~D-XkmJZ=fWZH(!E#0~~Pbaneh{ z&5R?yGY~WNTRMv0*CI|B7PdYn1)Gn4UI%ZtOZTQI)d>Cgd~fc8Kdqdw-$tj67_#jm z$v|Bk?)e~}cE_x+GL5t|?-L>|xFU8CJh#w*Z*1)`NH$zC9?jKSf&n_-zsJ5yjd4yq(B$r^KBiZtnk zZM%s>YlP&{w}OP#@OBc6!Ll;WZ3DKdQN47vL7PT3n&ywuI7r6==H~)bc{%$Jic zr&?eoPfxkYN{WTteYyEDV41>w&Ts%zH#|8eP{l;`NG7>vif)uUX3V=+bwneB!JT(? z$6FfJ)HJ*UpH91>L+#iMHcp6kGikGhp)k!@99iQ~Tn4U>?QGdNNyVLPm{$_uf;o9z zO;Q#eB4+0m?gbjUah2Z@F_yYcK@Vjs29-O5*X0f<-aZQXIC0MWYV!8%h+^%~9NK?<`<-e3qV!pvCQCFsZUp*I;#j-gCPg1&9v=c( z4G2J!(F$ug6zv3e!T}GUI_alLzHyg`HPm)A$>?jS)65+sw`;K%8GsI7vvst|f(e&j@5QeZ}1U^?Dh0oUa1bztoL2iZ63$MMk0-oGeU zPscPDd6s^7>~WasEUtzC4x_?+H&o*l{!+1(68(N0DsV^U_)a0*+}sWEiv%~E0jQ-( z)AiceF3_~hzr(+!v*afPkrdA3b~rDIwopO#u|db>R1?AXX)yL#^%udHjfU++i%ZTB zd69p~Dx3{KSHCCLhtcYT=~9We+6Ab^$%fVW8}ZbXddUWyYy`tw4$5%TEsU{<`bZgG z&+>|?c+fvTG-blJxH+L-<9>doWnt~7919&yXIBF*N6CYWTc%}#+UFah)+J53vZm}= z>o9~#HMIqq%_BJe&b;P32-e$ zH8XX*=ta#JbHm`r<4zJ}{sq!(B9@sh=JKMzx! z5l?(aY7iPK&qv+-UD{a-$i&IAvXgJUXuqVahw2axPO6gsMjQ&ciiS~x{zxaIizdpz z@J6ZFTK1+y1&^o-V&$f=9nv-i{Zae~^89kVIum~FC=ro-BW`?Sf&C~_QE4*!UG!qGv)a5#`D;V0TEOd8j9HzA4ULf2K=(?p_txG#**uOVIBNvinuZvvFwr$~l|pKO3wNzR|$9q~CeY$!xVX191c{gwR(%ssk#F^AoZv4DgPTh2Y;5T`oH z&%_`~vDu^(By8KF_|6<-eHffKm64tM#=N>qu|jnNGj_mn`*(rEkE-yYln;w8hluk( zWpC5UeyrH=RGr#$u-!`?-i@lnH!NAZk_NYhB^T(ys49;05*S0a0FR+}I=sE+UIxyf$Fpbiwc^b@OKU1XEP_C%jAcwf=U=hf@- z7Gj)G6?)CT9&uzqnq{uE>LEH&bjlqtsQGw!W9yXEsv}>Yt%j2 ze5u*^lg)SIH{g;R)JyjpDYK^UH4XF1TSt<(r%4X=LI02oNMsVzJJ;Sz{o!@p$+b1yZ*Yw8p-e;_qdvcD-6^%44)M zNck3E_AmH@#7BwT|Gt~mIg5!a`FSB$#ApY^gskQ=nt5o1CNkA945*Ak)E^G={mH&> z)pZiXIvXnz4oB5Liegbq*ykt23NyRubFAf#C>1lA$b!PvdjV^*KAQgfc9%QH9^z45 z^1a4%V8Bs})L=`4?SAnY_4+;yK7ZX9tV+M(%}vbml`!v~Pb^NvShjTj2>Tm2Zs7+z zO#07phFgNW19#LJEmy{MPb|%K-fSE-R_zzYDJ$?Ubl#8pO{JiQ6;H<3*M~0kDv+pt zn{P2;#Wk5zHX`9}s-BJhP(r5f^@OZNIJxv$V_+PoPgAS5y_{i!mIsL+sB_CwC11%B zZngWc7%gSKz%V5_VJ+Smb_-DiaFpPP)_>iO8fJFYZ=nsD+qwVJ(j>M<_j11mC|}q8 z8bM!}3h*e*FTusY02ieovbZ`s8c!?gU6-IHO|>|o9%yCQz0}%GhZ+VqEbj_ZCfCm^BUpn6uB;;=u0pYvzPzooyiE;Vpy$^NcnPvZ5B2>8huX`t#20hqpy4(qkJGD+Naw z8wHaOtjtu(n`xUprLY}g*%5QcM+rW$qQ<2!TCO0!lF}33niQzVrfgqBKxBrr&&@WA zvpHNTV!So2cNHA}qA+|}OBm7>L^l?f4j9!%We@3W@s)UyZZ=MVi-y4G3Mt^hCG z%64?3TlbyaJ|@#Ik351j_}rr3Bi*;3 zZbAi?)aJOZ1Ufe6@bepFVjzI>az%@c9dIv@Ff(r20rC=alECh*bM(lk)wmhYXFm<^ zH|i%HHE0F|_qnx-mskT=8&W_QHzm671jm{)U4(G&RD=k_3liYMXfCgKTQrkwuoPsL zDo6-gXVy>l7D;C;3Q6CpI)oa78`%7q(kO2Zm5Hyn_%4=sX)iSTBg1>5!;U|CeS#dV z5ayY_p(j(EB3UI%7@YG452)4~hRJovIUTD!=A5F|Dq%{g1xn#+yFJ@Y+Q^be^L5BBBqcZ8~N`q zWhjhiI@>tdSF0Q*RIT`$u(9*7Lke6Fg|BX4&-i_}wu+$4rxx4|>Z|1b_A8bBgQPTs zTWP82pf_H_>Kifg-f|zfzS%E-<|(5W-OEUpAVRI;!fF%UsE&QD^#uaDIIcGV3oh0D zsuud10FPYi~kMbi(xQL9`=(|)y8fKQ4jgWnF zcv8#dlJS$U$V;!g0}75;5)E}_1aG$U(&B|9nP>D=59K6ZKODl5T}O63In-yPM(h=e zyTD0lyDu36v7g?kf^w%vwAY4s=VwQ<>*z+stb1%dc2Bg+L65&vPfB-eEzqi{JCL2A=ZOZP_e8S`K|p#aNVL zluYn$GL%@2YubQ#?BD<_{TK1bR^x}vgEw2^8rip#7dXruN_6H&0WXsUA)4YB<~G8A zQ698^^o!71ntIf#hBnKqubfdtQ{qEcR{VVI#g#tRvJ>4qzh!cEAxpS zNm7W z{A!cyu{5`Du5F-o+WA$wcP+uHD3KbFA=NR4zSYR*!Oi`_L8~N8j=(){jLvL#yK*3T zp}a*+=@TFSq${@6OgkK$^UfO28$~!Vm!+mFsYl;g=A1$q6W0g}Zgz^`U$qfIf>S&ZGtj-V$b2k1y!pAsSAeb{3PdGf-s7 z{|}d?6=A=q!s@asdxnjDjMsro26L=-diUeQu zxgqgacIMg7>tX8OfQt-2E9?`0=`<*wu^7y`ub7jUvBH3cW22Ay8wzl9S zGaE2u)8b(3KXrls-Ea7}fI2MUS|Bp(1G*O;sixU$=Ud_T)u2tBL}*OCZwPfvDp7?e zvfG_6iqUX+a#MZ-&UegipZ?q6|JD2d4*@GkAN2RGs$nm{bf1K z_#gfB|1k950^+cC-*?_rFn?+p4m`A|?sAB{Czz0J$eeI|Tsto37N&#AWBf)Kr-X!+ z`6?NmCz0ok0X((%sh{pHcOF-#{h~~Coo^IhUA=9-MQRMjeCN>-i1fW&V{Ip(c1x~h zjh;j3rZT2**5Fh{2=Q?ESsSLcn2*4+JNr*Ok2TJ2V_4LbTAIvCKH()+ok9E4U(az< zr>G#V@Ru4+r*EZqD(etH9R-Mg^`d|H2MC$iqNzAy2~^fTF1mUwb$xa`7nNU_d}AHTe06j> z^M%cBF#YmQ7T(@Ydj}p+lLV}BNP%-ALwdPhufD;RPIsj~b$7Ab&4(=V({6@5_E@;9 zwTI8@f9?T?+*w2T{-W@&>8H5Ktu^$3WW+EUI?u|D-MG`KH*7M+m+Xq5gm207+z8sm z4_j^g4J$ZLos0(Ep#7DKGJeo;e(WpInVyb)DwO?zHMj{ z@#X(dTdf@)30z%$8x>cDS^q1OmrD7{I0XRXA4ydr?(<0~?(q=HB9B5-TmmA3IFi@# zgd6?ta7r;-h>_714|!cJ_&G|EGxKZebQ0H(r<2X*_lrcGOa0=7H%MW08dW=$v9Pyn zvwQ`#-zRsCB?lR(Hk>7e5)Ml<<5Zd!+fQ2FMAv!lQnR8)ThjE0D+8 z;;M`{Ml9&D)2wrZdP18q=yjvq>OV`vV;1=MvVxuZE!u^;O&=6_5OiOcs&^?uEUj zKeziwf_enYtEUvod`WvTlOfsk4G-P^H<%x8F>R3SlN_JY^*wYWP@i#g-6`J;`wePd zQBBcZ*{|AF?yQJg)|;pzXa|PaCevP3;P@A~H_QKLPSi>)wADB!16_r0Dr9O5L6lC5 z&a5U=*@Y~Q{MZexGE@7K;)ITxF_>?1Cax_`sdKYq_>LD>J$i4}_$%p)KE>sU;OPpy201UiWM zl;x{Mk+6x~1`u66g1xTYl*1(mmHgr<&C;BIc2UF8W56cx(oN%Y&cRC`7GJDC)W@XL zxA{n5`3o*6?%|ya(BSXAW>Ibd0t4mP9!|@#etdS&$7oF zlg)6z<*&{wI$3(eJFTb)ea-nbHWTJn9U5b25$B@%w(fJ&Nd;`le`I8!q9R2D{v}%q zO(Pj4A6OJXqCx4V)$UKjUzFX%qPh}xO`FapJ72#OwHC&e*q@9?N7MAML%JEhmV3%H z*AHyA3nYj8Y-N%ZWFDLRFrW-!|I+F4zxG&NcL#(7+^WrauD+JGw8CK4@gRQ_WN8WC zKb+lv`;Xjjg|#@-9U2)Xo3J}*vrc#6ftVIW2ulqT!xtk{McV5D2Gn3c(Q~pnI#OR+ zq&e9!BFF>#XgqJyf}L>8(XQ{Q5)h)`d%^oIwdF5LJQEkwdiYprY5tiFt%kXR}Fb9b{h@$;(oY9DfK5PxE=4X@{c}UUot}_FxINx8l^(kea_U7 zJQhK&%|HtrH6wGGypTYc)2|~MBnNs;qD!=%8Yt+>_4-Jrq*%tWa!9ZL-Jx0;?4;rc z5P`#YQ%3NI^RmhY?J{B}5=794&wTUXh{<=lw~B8KC#fzuPmc5_FNr0%XrxsI&#H)E zL1e3KNN}75dK-;o_KR^cZsd^E8Mhp$$5z@|s&g$x#$o_Ttgu$tf`hYr54-B|ez`i1 zb!wN{VK~lcRlp93tEa@qi6#CyQ!6en)mS}v*DOvsk#AM|@^NVjF5SBY){O7!9R0l- z(vVJ=PW~0mTy5TLLGO@>CwNxEoiCtu>EF1pmZb)pqw^C3Rud! zNT?yBny);PG)EfALuMHF(q8P{>_^yHh=!LfX#$nWMfKytL}R8R2p7-*PH9(wpuXq% z449Um1t;SGzz)Ek8sbl;^`Xkn4Hp=}Rp=DmI|n8A*{-zYSeaUyQ^#9dP#1H1p(0+> z1u`ma!?t1XxD)JN-r(WjiKKeg@#5oQaJcGlkK}jr9S!#qi1sVxT>8pm0df5Is;`F? zsIM(L+S-PuHL6F1QZjleUb%&DgGedUYT4>5+W}NE; zmCp5i`^8MrhH#H_3{`s0p>2L~-eBYGC%9p8jLZbqw+6+xmK9#5>bIYf^loZ{)vcc_ zAr9sReSVtVIPcs#3U->e5cYRX9w*vDUwn(J^?aC`>8*Ofntu|rvbvYkiSQ+@)NnUq zj0_kPK<`~?XMEKR)PcS2)`bJHF6h}4sOk; znftfTIY#NWjGjl_=yz}#9SZcbtXSUm`IN7{uX0b{Bsi({HT~ZX!H(S)`N zSlwJ%xY!oWF@@P1OAT(34ZAlsnq~uBPby5ZKk|KlRCqW6w*3_P1>v03h6pIpM_2x6AkaF z*0*dbfEU(QsSniBP)9bf(hHmAZK*h%J=pNQcx1@2NhnLq@8(oNZV6iouQ!unSm?ohYrC`asU1b$uHq?buzB+#{OCKTtFU{1R=s4ns)_^e;U4luK?X}c!I9%pVDgrji z6N8Zn%bnhCu31~!e1)CtYX?$%q2OK)$fPD*B#0w(1J&7OK zW$gt@lHA!>v_-0FUrs-O17w_Dq>vLcWS3F0!Zr4r_C3fh^_ty`Fhy&tBJZ(Z|li-=Sg5@-Avn#d?W z79&^&S1KthjiC163*A&jul%mR*Lys&W4^VkbmUj~YrxY*v`VZwN#EWfI0fe~ia`pBKwaz`PRPAzonEb;p{SNy0}VAT$fIo}CNO_N9V}m7AlDfYdh3 z#a0cN7|s(6yO-&fd#Ru55T?}JB({L zb_Am(o?J$=L4HV)+N9s1grjxn=Iy=3g9rMTsyv;d^ITrK4Re&DjO;Xrj`20)e*iwS zY5OVj?LO;O4auk9JC<}iNbYTnZtac>{!br5L(fI8oGI9Qe1ZR`EZf}<^Ut$#kpsG2 z;Cy9V9&~rI(gLfQxAl~6|B)h`hK8w`+qWt_B`1Y?O88Qc$AOW=cFGFm4=9Q+;o20A z8*p{_?gk;Pv~S&-_wHZzFw+!J9w95-sLvZDs$r{TpK0{Y)7MwHpRuwuUK!S_HaUZ0 z@?-UzORz0BhvWIR%OGicOF~1~KCcR*EK}nF_z82{vs#=PpJ?zK^yNctA#kad^5Ry) zoVrUW8!0v#yPa*bQT0xYilNpU27{=TP?qk^rIsjxOOt!auJH z1CP_1h86LpZL`WOa$WRjVh6erpzBr&u-$G+O7EMu?h6$srp`&Co9FQyE9ENV@5p2f zfAl1VY~DL&-IMpg~KVCSz*3|O78IW zfoYk`rYIMg+i1b>vJ>H|gM>%yiYu?PDRCU{JR(Rh%g-vc;7De{igu1yBGEs3hbksD z^LS8aA$0Ln!Xh$S>752G`ccg=gMAd)`MLI`HCgi(1Ep(2dg>dEeAx?~3y~V#Oo;Az zyAeO*z2TDF#KT;fn&(|vq{M0K!)#yn&B~MQ#`rz5`H0Wi z>hUHZt*Q3uzH`)2|1XN)+RlG+Oo8w!c~TdY3M7&azAQuA<7m@v|B&r`EBsP!2@@H8YM_Vsz^V-k`_J|#FTPVv|kPjW}3a&$eqjdiEkk8Ur`hKDb!i};L z`CMd$EJ`*4p(@m)Y%HOAJuzg4ZB0SYR9P=+w85TVMAsTxw|T-gs%zp_2)D(E0}597 zq}yg-M{xbayK+t`UHQMU_m)wSL|M8hP`JB8;qLAQ6z=Zs?(T&r?hb`R;_gsL;_mM5 z6iz`=m!6*Pnf2DX^ZLCvv(~)1osn@e^4?BdmI|4mQ z5X+xkk%ag_30{JPi-2h-Slt+MxR_DfH&cUOh3*>U_$=0j&Qh% zT}MTaC>0L={1Aznb^r9N#E%?N3S2c>Uw3(tWaK#Oc<4&7R)_cbO5I37&)0=Dd-)VL z^?YpzUbJ<`MBZA_ixISg4t}JeS&dfmSsfSVCknXq?ytDUl2UuxiPiY#;>XQaCBrtd zzAhcG(oz!|1aWhI5)pJ7hp?BBx-=(ZXb|JA>X4qh!`|U@y{j!zc&Po0CMiY#$Oh+50*k_OL+I6Uh%3d!2W<4Q!1zQzE{cGlwEBNIw*Ab zAJ21Or+i{2ui%^ILrvA}>^>^@kL}ye%BYOYDec01^EpT9*E)0)*F4n5lJ>LAY zdEUQUtxbb2^a$V9jbaJ#y8m2)22%6ym7gUHF>pB6QR(%nrNVw-9^0n&we-Cw`74R) ztC6!GGm3+)Z@g=bX9DNZ4?)LH;@JJKr`6Y{vt3sHoHriavGJun$U{Ht@0a^lwz!0{ zp7{xehUX1oOubfq+3s985`32TBZ}QOJ*^F?@3Q-!HG~dr2W=gvPehs$xt7tmK98`L z9j|4Q*_RHUY^DqpM*NWpboK}PVY{@aU}qCRcqe-w1X;9AxNZJ{VrY8=A;;a~pPBNTwIrj)swHL(tH7aw)Y~%(5_d zOZt|Tdk^zu``2lKcpJdCO2dPeLrSq0ooa39-|xO3w3nE)sp-=k?hiK41QH}BN4>9~ z?wnlK{f=R%QV+JUufh!s*jvUI{rT8wb^9;9Rh`YL8iT~FMhgG)*+om1?$Dca?eD&~eR${puc zX{H^!DSm;h4qzuN&ro}S`bAUD=Ms!J-==F_*VC)n52A!>&Q#jega z2;^tZxZXHwac~4}w8cq_k2oGm0-!uY(^ki|wZk`{+?r}wW-ZV-*R^C>3*njyAB8uy zm4BbyG~2Z5Lz8H^Dv(efK%YDbT4l9%UN)JN!_p*5SJP9~lA;Bim66T6)(cR!)xjnr zL5pu$W7)eC*q&A484hHo6PdSwz3`h_&*_(Qz1fh1ha(P|W5=e#RM}`8%4%cOWDhv= z$V)gM0hVGT8VlELn2MKcVu`jn!zIw|a9)S8JU0)@OnYGWnUGbm4rMaNOKS+l0+`&N zM{vY$b?WkhUk7Dp&-F=$#vtW&sEQisbh(mhJstoeAXxp(h%W^n)v(11;;rf?n%#_tb75%t<*W%J3i@c!1T_2e(Vq!TZPv z^F}L)_p;Um28P@L-_wpi3OA#9s6@>joC=mOi?2t~qinHJ;%5N)ztnV9u&K)q(c3 z-~$=`rQdta?rR}23@In#b}QU9&=_FbMg+*m9d$SFwv+Oy|rmE$%#4Cf$W>#p-bbjAxwJx=d% zi~hmu`BCySJI33FH;9l*W7hAt-}MDob9!24e1u_7o^k@ixNJ;D&jr_9Tvr;GRD)8ap1cRp;of519E%QOE0%brd9 z1NM97fBYK#kGUw)pwvVY_0hCmjn~)1&vYe{QQP2YgH30Ox-tIp*KN(A6jpG6W9+aI z5MCq9hxOu$d{SZ12b|s_Iv#iUHIp-fuEm*F!XVy7h&t?ssZQF#|Ic<+x2r5p)H*D(m|E zSUp3fym6>hX=bVD+thGM3(XH2s8u@|>2(th%7ra_q3RAfjLpG4TPTry8={(eW1oIz zH@E4k{5nTT!xgwQ;aA`g3&vllZuFPmx1p;ewse(MmOZIz#o^<{&UUW7RG}z)l)zuA zWv1-RUGt$YDNf9H+u}H6>!{89+g$3b^*ebaivopCJaQ=!pQ?wh5PI>nW+b((1{9|l z2WSmbO7Prxh@;r`E=@;s3;SsmgXQk%Zf7WO;-AP*xHs&FE@0%&AO`odD>VvnX&ZXU zw;1J7oo65}dl`7u^zFvGAlsNQNm)pu0E*y{>AtdMO+ej`iG3(FyEmTQSi z$*GK_MIJYZ9-qzAw|^{UUK>I7%t9}1*`Ijq8&TSbrDWsIY)Ps*oV#a*pVhP8L*9WY z46cScTK83F?VEZvL6CgL?yxgOL+Qg`(kR8V$VsY$MP|HXtrC=fz#`=Z%@octugElU z25-pq3~_p6o&5|UI0t|F!7l$F)#Z@G{t7v>M7LGIv{z!`iWwSFxMLeplW_4uURi*&ytaWBuAb+;DbDbS~= zVt-^J2noYmouT6usGB8P6eOKl7GYfSK|*Kloivdb1;d!fFytQpQDLQOWqz&AM~#!i zY<{cSP@ESVo^+(qT^aKS?4tdxc_{Ev?_I|_+?nvILkf%!hqL11xo2g6Dor9Ai;eO? ztaQy0U7Vc)O&+bZ=gE3FSMNiX)2wSG^{?YB_<7H9;1XSc^+LEIP*&X4PiNMRUs+MIU4ZQ($VzuiSYNm7DC-;O^cR{Ec< zZ88ZMhc^N(&fujVaX9} z*=+j| zd%yb0bYV+AWaJ3%WB4+IUgno4bI3yNIEraHnMdUfaVJS~VBq@WxW>m|zsFbcq7lvt zme{#!0X-llQRDM(gt0ur4wD$#l(j?!Scr4TpsRbwOXw#6Nh{0{4A!sefy}(IZ6v z6oZ@kwSIHyp+FWTRv(6jk*>UqIrY=^UWtoG4n(HwxI(J%>w{&?w1#|szwx5vT}_d$ z@TpVh1A(@?%{5=79N1Bu6wn0rmi9*bv}~Ku`}zoEAWVuabQA=+8tOY&_CN`8Vyl=q z;MbjWri*1=v>q43eNfHXq>H$Nu$rx#z7@3CQ`uj(Uu$cn4IECaN2-FF@O#_99l#|?Y8uIY!bS|}_fnWYuM@Rx@8NURQ$V?@`vMMgE}JJ`AUJkCa!muy{P zI?)TVG#MVQ8N_wOvJB8O1If*&)0XcR@S<9sLg>E>ax#7)TvQ^0vRCt1RauOavdF4iBW>296-LJ)ddy@%QdNJ%IaKY zHYer4sg%l0hTOHb3Up7J1Vm{`8?p-^yKxLg490JzPIMZ@zkg>1Lwb5iNtiMi$|=R$7EJ` z_K*{mxhTa(nfT=Vn<%5=3KObpfQz!Q)RMfB6u6A?*Z;TV}tl0>Y{|KICQZXR1T?PYkOS} zN}dD@PFmevtEESvOSDl|9nk~j>%i8-N{ofdRX5R4A5N~gG93riO*u3ov>2JM&WkPJ z<{Ig@I_TLm{Jmn&kAEOg-C2le_eVwBcjTMxMLop`FUPYQ>VYoq2ThFKErMT_|Hyzc zZ3c1_5hqM6<*R^>fn6C)oV5;gvh7rj^rCx2)w7y^$(cjf1s1tZG;{eNyO=SNb-iMY zHFL>r7_TyAKy>xD@Clk_MX1j$uIxe{uY65G$`99tIMlz@=bE?A9wrH6sA;!N_sM?X zc3$7Vs@js(`~&t8UtP`T0k4GQvXi;>uh)hSrk$F!{T0oWlR1uVwX$&j$h`~|YkSoFifDWxd8=%Xtp^l1 zIQAu6ammfZh?dgx zGOx#Q0qrGJ>RWWtWFt4Fs3jVxK2mGRY-*wvR@d!C93#Z$B8qg+l^hh?e#`lRfF11# zP^h@bVn~nj%@B`G&s`Fu;>M&bwWvRPi_!JjJ;i67I_5cC0kkXvhCI|FXIL&`i5kt$kuCfr(3F$+@m9% zd=-2quHUWf+D#fxOA>01z1b=c3I-^4 zwiY8t0g;M<*p}?UuTZvg(-Z?z z5~Uhyx|i$YE!nYLZuxPw7V5Mx#eO|9>pJ(8QUf~_r8mo@4xtuG8HXGKt%ScWT5CpH z-2hZ8CXOv5pFlL*o+?kOj-1%6Om=0g&>7A{29f{{AO2Ow#=Xn+nogXEq_6veu>y%P zR?wG0nv9F88r^Q9Lj=so{jsSN3lX7%gdN(FeqHH66(!e7MvP4Fi}dp6lw|`?jFhcx z5Ax#Bxti{4GMzdG2`k{ZwtSsLC@_;FQ{CrMgqWwCjUP=~cC7hZGtpt(c}B8PT-VW(X8kpP6{Me;h$rN0POu*LAJL z();fVz_Nby?onmQ9DULsuzOBAW@+8#_*M?MN0IV(P-!_r_o0H$#WIZ9NWO%9D<0Md z6JW`LEqa=m;~t9faB0#m9ng{4>`39z11qG>47Ic_^mp3o48FMVIdCP70IG$O6KmY6 znN*v(nh%)1+9&pty6-cgwnb^WRL4w6@HQg%)hFi zmzb6r*O|MuOdq$B#fT2yUiFg%2)R};2<{4roc5pTu$;;HU^|8-ZI`g(hp`+Nu@m*6 zUdn+7cOE&MzwMGJPU^~bns&<0R>2Lw>??3|e1If`#DI!Y=F4GAw`80SK2I?}e))5} zD(`oVHSwnEH;ets_3mQpRyZLdOya9%}8fC^3oqYs& zAmh`Lj_Aijqb7s-#PMwg8L!U@dTZi_Y$c{lyEWu4+HP9jvjk?8%Hjr>iMERZEZjn* zxZiZW;amkOq@u!ZYqhXFT&@cI%?@cD3 z!0wO^pTq=DB2@EyVxj4-#JrERQYpJ-P1L^fFA;IW8yQc)$+Ph>>X=bBeDkX|uo-;+ z0Pn<&Uq)9GK!ko22`*}t^9@+6Q!}ii6A71>n9CTCvS#@YIdx4Y2Sw#~FeyA3xo9wG z-I=kigp|)&l50GiUoTNIj>Hh=Tl&0kMOiN^cJy2Lw~Yzs9E4OPx#q9-ID1M@8@kV} zowYx1b9yk{A4z&hC1SM_k6W^(ZThOz<%bZJ2VF>p4knIgjd69GL`Uq@6}M5ujHXBC z4obrq#il10<`@r(Z`|gYDQWCQhSl?@a=-EZ=uuy}!MA|$K2S3-G~$boXlwOEj{M8B z$D&v>!-gWQ^XTy1=g`Cyd8SKu*H3|Hs4g{+o4+o?1!Bi;SsK(!GZ|@yw+ty4xe6q5FEu;oRr&)@JCbqpcI(GkqoSS4bBx=3a#tBui6ckq zX7lrK1G5I|eN{I6B|ED1$O?-_=m*}yI2B9kzh5<7Br|lZKUda2uj?PUHTkSuweUWF z=CUocg_4)gfwn48h`bSo<(AgtkOeZ`b!ZvICSFPywUg~}^%7Vr@izw*Q^IMQy#( zx3N=;KQ;qiG%23gL9L;*X5N-FmaVmKJ7K-6`I`B4Dv*=6Eo0`CG25>);I|NKq^M|c zk(n-PI~@g@-Wtg^&KP5H_b*TEsAmpzaw`KU*&4H*?^&6E$kBl%Ts|g@swSyZbKSF^ z0-$qtYD5nA9X!TFn#Z6wCu7=T#FsD`?9zd_M0GQyzQ>oSb1~s!aA84X$KLqK>$x&aK@zQG(m! zlda79zzs#%v<=N|Ogto^Esu?s!F8aG!)JCh$zti>HtZ?7t3Zs3{QA;a2g@~|7sqUB zN@Ut_St->fA8L-+WBb{IjsT9m>6~OD&gWRGUjE2bGQ{YUO<6sU!dpge4Afz?87t7B zC}+yW4+4GesNK7M@?S_(I~`LAQjP&`%_eLHS&jNxCT0~|vfA`w8Kud{80@fXkmB3= zb|nFqf+6AD$%quBU{a&GXx^B$HFYDpMNE6n>Ffu)C%-wvWi;J<0fVlLwOOY&Aygcb z18jIeuB&*dthuqMl(wcSvC&vK@ywFHlE6_uIA4S5u~FrSE=di zV(M5Y`b|@`)aZ$Ps`m5-BV^>}M`H47?@UxS=SB87gIHUINuHiSRc8{X(a|rcZKUq) zx+T8)36&V%gKjv9hbGgWh}G1ZuZyY4R_$Ru*iwN&I=)SABrnVnpT zAwdSw^T5-ZQ5g8lkAe>Os8dCtZp9!KvjAcfdMbWW@U0uMJeiVh^tOfWbMSUz&8FWu zYdim4PN)55UYl<&|LqcZm~TEfhCZmJ`&JD+ly#p?CeIQRpNFUZa5%2LJGCb4WK_i9 z>|sfnUuus_%i3c`U>$0dyyfg?)tX+bb!r$|3r;$~1MBPYUuCca~+hHEQwT_JE}6yk;ptqJv7ugb)IbG9)) z9~LBkLCJXS=S6K5($|;XtU^mi{WhqP*k|Bo@6N0*?aX6I>(C7$SpG%kc#|%ba|!_o zxc~gQQrSM^ar;M2Y-2wm3CEaJO=;7$nslF=8PT?(gZM&^Ooy#ZU*N-! zRiz%+@BaTjDWvKO{MR+DifufyFO33ES%E3Sw$UvJ1TN0Qy;tU6Tf;CVjtOv)DPYluh0d z7_{In^D6ApDRwr-ltK#RUpTR&-J~*tzNTc_NF&&M=QhWV5^GIVWzt5611W^+1ah59 ze5T|khYXQONl#}ycjhkk5SplMtFdXWu1#*27nJ!##=k{lJJn^gOXW=!S9xg5h(j7| zD2-Z6dv(;%!cmazvQ0laUtE-Th%7#eQG&iEE|$;vn49c%tz|h=K63c8BQ9VVaoDCy z?b6;0j^<@W+=#lyhoW2{0Gc|N%UQ7#2}u@{?J0_5Kr)8bNMrKDYI@cp)mKCWM`<<9 zm;k;K1^^4b^WiS>#3t9e=)4ihN~s#SEE%OkMjf8{AFwp?#-i+sqA~YxylB^j&K|Lk zOX1{X1KKGK5qwLR0(`tOJ@#Y~%wOcWI}17KCH*?Yx`C4eNaYpB2oh=C4nsH3`_ycC zsh{+hVn>uRqb$-?>=@l@_XzLa<37kjKM+g8*&6JT-_322l;2M=x+@AzoQL@n;#uKc zf-mzE31`-ssa@}JzT4-+d~Znv$y?f||Bi8?AQmS6^@Ltx!UjV=A1`EJ^xO;p+HD-= z-ZvXZc6#!7|FB?aVM05^&TRM``<+*X}GHoB}7{4&K%yKNnqV*VD!h!)a856{rDy0E?BEQ>JSF+wu`McNj z$XGuJl#=qs9V54ok3K5&BGgmMKeWxue<1%h`62$iM1BwV)afi#`o-@Y=C9I(_5z^t%1kjLEqBDKmynnB zZfS0e$RwmYeWH=1-mLZy&8$JwU6gsHV&e-dvW_T7nu->V(_=+WN%v(mcseV6GW|?% z&9{~+YUhb~W~y|qZwmrlAF@lVgx~SnWp)c$6yb>$me&3P=yp@Of1iTVmrBa6;fmk> zpSBmP{Q*1r`<1EfUcwtL-)0<-pCe7*NARXzOiID3AC-*_cxEFWFkr&|=2^LD2&;Dk zcUl|Davw;bXgtkOwZvc@s7bmY4M`dK{!E??>v|OI_N7+P;G^|IY#cJ1Zdq z=7>Rg#K^gxz(pCcaOd2mP#i(d0vNTLtvVaK>%vkN_keqzIXv57e zVx*lnl|+0&#Bs-c{OgYPIlzLwv6Oy|8Ieyz&a9eOd%flnbTIx00FD zVWtn30e7{Cr-1XhaJde`kCb|P%fhr8HjIDWeRghwtzdQ5sO@7@ zJXt*>`Y362x8K8sRyKve(OTggHmTs~=NG#;vFr0lGHm{Gi*XL@@k~mxe-5SJ$l~knP5bJ%K{atO&OoR3;+P zcs5;`YvBW6@Ildyld~#q#(bnj?FT}qp64I1#~;f|M?SU18`q!Oxj7rP9UX|EKG&*M zG9x@XM9CtJI66p*!_h|-c(wWbKW*vG!}@+Y-K)SGvWc{D60a^!??9E0qXy3|C21B zmR+j%Qgr({P#pm+6B}PK3htHPRl%0e@2k8R!c?@5mz8Q!)P`RCRmhxB)U3eHB=};Q z(sgpJV?cL0%<>fam(m}NyChIk=c`?5G8-eOhl09UxNE;JZAIT%Ium0%zzxlq@@yP9 zG{nQf8Ayn?vF$SG7L1%0_2%F&v94Z4sX6I>y+CW*rM1cGQP!X@!`X)Z zmv^{Ve*a*t$ggVNIIgs)Zf;uCaY z;2k05n=J*;#L(xr(izA9yMM8(QS+OOy6Hk@r^HF6jaCn{23`}2J~*}Szq%vvo*TMN zNN4B8Hsr7dCGDSI|9jbCsoL-l*w^hpATTCWa4_&s5Rgz%;Nak3pTNMtz|p`+Sw)nM zoeOSIza{qlBw>hifG zCgIpn@Sod1W&sJZFBaZ?ih;8#@7lIHOU>2)QIj$re0E>Bed#H*_mnsZfepAp@2;o;T1 zu+|&}K*=NQC5778x{A6^Rb5xBQb&P~=5xMk)W-9!; zCt8&GENp~F5jO$H%>iYL3-ljY;Gpo5ID~3E6A87L)bFLrNaw3!n*5p8HyrBskqm%o z1&o9Ip{RQ}9mu(uL@L?e(E?(39GZE1#x6A_&s`vr&y@-gGPBv_s&Ah=^=bcdI-njo zzbPZ?&4)=_ck+~;rZT0nD?qj@Pd`{|q@*Z2^VAdas2KJdrG#*^?N*;;x+Wv_wdMj>Xo*D6M+3fRsyyO^p=oYvPAH*^bzfOgB@X~jHe5oby2yH z?l`J-K4oP(bt{Um2u>Fnd}PHgVP5r4?3raP$z!1zNGm3V*o{I-JgNhCe^EC`fx#hZ_>p z%vcnPFO23VSxt!oL{$WyS*x@?@Ko#BFpRm@Q%N9M8yX}DNF=|YsjQssSn6>3RiM5l zA?6wBtZm$kILI-CpRtnrADbYL@Pd@K>Mtsh#jkDWmrU9+kbB_OU@=ydRY!DlA(IO= z?FS!Ug+4#;!SD5_A>OH^5?VE|9xB+cA>Qyt`GHvG%sREcITs_2V3l+5D{e=Y5lBsH zw}yc1Z*5QDv4zo2uPAO639#av5IL2e`c%HbY<%&V3VhHn3f%d_V&O2RzUuYNAQTjY4^2-9HS6jYgE{Ry1S;kO`L!ol`ZLo8* zzD(@+7L}f?Cly_vmYP&b&e{vB(iW3d^)7=eu$XU*f|<@hAtECDDcqC6Il8QJ0P|5| zI5&D+x8GzSYbxsN+g24PXNhNrI_CoeWP*+a#UvaV$EX%t17m*i3^b|~#z2W8sWgtm zOmSvtJh_XiZhG??@@O_x$Sdp`v)nR(ozT&^u!r!6?su)?OH>Cc3zEHKPP@%Rxh-;i ztMSR0U|n3Yl(m@pTmLp$EPn}dTx~|IdED0@f4?X_m(^3v8q49OlI_<9WR<{pwcBp0 zmWyEQ`4|-Vn&593xR4oy z_7u(b@&v3p3-zfYwrFzocso^dj>@QL>&Yeyd6ajNw06iTv(DB4sQt$KK_O2XSuB)t z#Z^|s>?v!BCo#}JwUm@2Z+7PMv79#ktMK#y3q$KR^rtn4ytzl+qGqnsC^Sdxh zg0mn+atPPuE10hFX-)R|dQvTQU{{a__Z+(wxP#L&>$acOdk)w~km5=+ia(WHnG3&K zvty?7b3Y1j-t8J`X?g8r6m-n(m`C!8Q)e2faCp_WfUOv;Zy1= z&EkRFjhfn#M@0&}ETG=WM}=PemkB50ou@Nziz@DM^ZkB!?z5sD0!NH|zy&o=fMTex zj15%R0Ty*8Wwqbo&#_(Om2+WD7Lol3blC4j-~A48BNp=)U1?lww)(e2m9Jhk&;0d8 zI}|rt2P`#n?VGs0x2kXU`A=knE2iNZls7Olh>~nzC0tjoXhURApzZ~hgM~N~QmhZk zQ*sRa4nB=#d`mr?G7&hfh&d*m8YaIFo>m1dGqr<>CIj6HPOd*lc50HZaw|iR< zY7}Bux$nd6E+fH+ED_GAzHu&y1ROsVD#gBqojhA5@7%ZQzUh42_0W8 z%lPLVclP6$FDaTp6 z|5qysv^BP-hdpIknZhp@%e|$VJjZVk--oaE&3*>`Xl0JXeu-+{3wm z$&_^Che`U*NyevzA|B#R-8vH@ZP-anW`yT-_OL8G($KY3b^!dJaZ!Tt5X;jvL^gqA(W^2YMrVnJCMKi-YzJHgE$q#CNFD#SYU0#zNR?MB^Yz+tv$>k0_N zfay`?s8YWb%ZQ47E9e*AyUABgi&{~spBE?}e7A7b)6!v&kZD*r#-lZXJ{qQq#yl41 z`y4f#XTvk{X6FRwWI+Q5i%1cGUeMv-R;V_Jm3@`B#_ajEY?&& zY_y3dkufM*EOY83eMlI^28Ifa0_JaY5d`3wne{_Na5*t#6Vqf@AivOK(OH_n(gG=O z(pKf0(koz=gez#tm=j4o*PVKz>sbE;}vY$wOBw7crk`jF`DARBZxk^+g8HoXT*fONonFqP~Cb*VIUbIA;oHKoV#Y;2TPR#bq5iI3r{J9quzMZ)4a;9 z!LhkzU9~HPk?)tqsDZqe3yGqL@J7+o)}z^+f$g)*QUs%{KBQMlY=f4{u`U#6tzQ-& znx}J~MxDI_x1-%3X%$u1l4f}=>ao+N;4v4(nvV(-cR!U8|$+kpj+I8~@r&tscx(er`EAb2#Eo$#l z-@DBFsFn(3=ehX!>cHH(dh<$|aS&tyC*`#N2Mi%B;IQ-It@t?C;5WjPL?C|u2#&j$ z0JoP!3$9dZ#HETlB`dFI;xg zBi0ItrDf)(vk&2X|3(Xel5bQqNdE=PS=yIH`;^!gWOUJN3fJQV2lE@#BBA#>blnn3 zF%wBN4tCDvWv=yGo1>80FBl!~M8r|{DJuZx_~2z8j1H37mfXb&@6C-lU40h)%oTb` zsi>!9dw6)4RvXLv3eQ62L^><&^H-tkzq@Efv^I@NGGGu8z5c1DP3$ON?%prm%2uy@ zyKrJ<@M!u{I8x9Ik#JQt0N0W2=%cU{)kDcdP~&^5lb9z;Vof_4FEp3{Q5DP@8GYZq zs?~TY!_sS3cTskm=sJTH1#Ue$>nZ}Gkl9(NGDreM*JsPvc>{8emp0(uu2r3J< zdTD+jAxJK{5OiY8`eqPvPYk z%wqcOI>tU*I&Pm47Dmwv+=3gCx#(yR$U+7(se-q_K!-Er$GOU25BXPpgxj8*>Qu>u za4E2#G`LL#k;m*1c-0o=461s$8OK5;fuWyQ=8i7+lLGvtTxqID^ zx!STLGl`NAr{;hD-H&9Q7;%KCd?7kUs6u2Fk_U74S<`Z$Hz$ZF$XtizLMHY2cM23` zV&@9;0j&!mhCu@49gQQnmXR^bE@whgSwie^u5iZ89Z8;5enNSb3{~Jwmjm4GaHj+j z3wacc8#qZlK1E4%Hd1>$VI_3v2NUxQUP7+Vge=~TFS(ZSNl!dJpR_Rw8IjdZud!9| zIcUy60h7lc-zqJ@93iji(TZW{7Kydv=Z(3&+*21GOO=4$477%Y#4_MyhV&@Qu1+jL zSTZPt7tBZi83j%#4OL8h%?obYp-wH+knwYHuP|n!2BtZ^VJ>Z=aB#XLpTA5TQBvxv zVtU0u)*L1*=4+#YcpRn?7zrX)F~oD;G`>2u^a^c>C>$C%f*nRakoBMjEE?*w=(AN) z#?AyXzS1yfvAzrMEA?a?rpO#Q1Wkxd>@PgZ8V^y)|3M6j6Qfwp}^(-)bDy697sk)6C9yd+!$%5&;-;`Qy zc{{22jRukiPk~Q}b#Y>gmeAV^MVvK~mG8#%#}HcDmt8uQeB~#^0ZKDBWQFgeiRJ7S zv(+_$BV{aVsVhrC>&`emCT9?|3`F6k+c-|jqA|i>CODGurVVOIYdWi$qsV-hqKZU@ zK)fj--8Hs@z0YqUF|G0Rzu_q zLj}!sIxrW^GFEH>XQYQ*yVdry+ z3>L)nV#{@kunuk&IAcHu&40+70V!yiQ3ea;0F(rYI7PW&O;_(*9=ZUcq(oI|usobFc%}Re9{_4j9_sg2-%kDg}-@mhiP5N#`2) zLh2yfxoHkn5~AG`$okACkqVyq69`&XZulLT8@ZOLPv!Zny$NSOn;ZyS7Y4~i6KojD zpwu9y#1tV&uu90whC<*a7?t;fdHYA(caxGQ>NB(YD$p-uTD6XA*c-$YIO8zwu&O?e zemsV^*~)7|@kyBJIJ_$74Zy*}TA{DgG^**-5AKBWfWP=pJ*52uwxR@}oW?Oub{xf0 z|KGf{VNzuxy?lEXe|^_fs!87UDnZ^Ow9w$Rw1VeM?dyj-_>l}$DUnH~Q~O6gl;BDt zgj^Q#UDe%usNtt(F=$r3$u$3UwmUKW99|@vfe8mQw3csD{R}-o>oPfp(#X+E$$=Y+ z8^lBWLlq-*L~N9*IR!EWuwo34n`BFys9YowxPL$8ZTP8E^2cl@Lff1;2?QnpcweVh z20^J24unOAf~3YD%%64 zO&poOd1ikef@jzFh%hI9z^?R7Ia@2{jnY0|kJu4fzie5*?)ksA2fE;ku+&Q#4x*pE z|A6W6j2MXgh@%%!vds!#J=PEJMDoDD;9Rk-TQ;s4_)k2PlqGj*T_62Qkx~33LL;wr zs>h>8>7YFSDCyAN0PRity7X2>h5hIKjQ^p1|No$M3aM z#m0>%FJ=u84vUnFJ~L!fABpgIxQi_ha1zc`n=c$!oR$OA3yejaIY)JDR6EG{F)B}w z{!?h$dqpd3KC!!25Wb6DTZ09)2|@}fH7Ax%N?TC}4FP5|NzGv6gs9EjP-Z^OEhZXU z3c{h4MRx|Ut}upN#(6DKd^|x7B)u7{(}+T+OFW?bmM0m?coUJ5{lbx{;hx2(#_~|p z{!8TqJQF05XVy>CYw80KfXRnkX{&;gTOZ)MMI6B&&P2Cq&%nle1@Q_-4nZ(r*CUmCV<<*;P%~k`bp$dn zyQd%UTqg~%VPGA{p=;-vC$<&I^^-JkV;?x%9`4dQ)-;Sku zt?}T9o8!Dc<4w6)2X!i~(E@ReA@6>@5Q{G9QPRkHj7h9O2uR-(`!^7vwm0tmVkwqy zp7eqgFW*~bC}15b)c+K;0kiNsM&MhCt4%A$Y@lL1gHH6V9}DiNUb~IzL=gb^B^fhT zx=bMU?{k9w4}VX=__4jKW}nNzza^QT-MKwerywxSrN3wqD63#uRzo*(n#09CiFNdR zdYGRBkO+W-LK#@dt$1IOK*FD_ce7-9zmem?(L=bal@z*SN|GWYSR`hs?%BX8sJT`q z*Yz@kBg&tM=SYmW(XL|-nA7W$=_9(|psnG)cR}OiTHRr(iqAtbTPeq3SvtahgL{{O zfjX2&AKHNbJ}Wc7wA#=J;I=AnnME~7!fhsp7QU*96qMyefF4!v{T5v@7=#`meZP_390w~LD%9q*byqhD zel~eHjE_p5um@}*k1!+CFfWafECmW7)<%?AOx!UBv+D_% zY3I9Li6!8$EyQeK-|1S>9bV?ftI_pnFj!aZ&g@xtRKe*Q{jr!pUoFbkTut{>&sN|McTJ8B;KVh&?9oP+sy69Xr-79{C4x%~; z54)8FFGUu;f$e6BwYx$hZdsdk&om3lP-l9UNP^+QF=|320<@#+k2 zpS%FlIZkR0bm@3BL6JF2*?za?N%)|JibYP8LgpM5s*4%{ihUFk@d<8jUQIKp_T-QQ`YnVT=>2g>N5<Lv3Bzg1^}MG#Csh-l2d*KG_atxy8R)E96f&~7XQ`lWfB zrgwwTY1q4Cw-011H5LAV!PcOe_e;m%IWYol+dv;X(>#9b`=bt*WbYUk0N)7SEgi9`D{$XNacgu|bs1 ztTj-Q3yH{u^`c|DsSorHV~hg(`lxiXl@mjaU0G&q+kyyXx^FTJ5|z-O0VZqIGU#5) zATmc8nHw1dD;2_idKiv3FH^Sa7Uw!jQmgx#@~>`_4E`w}4~vBGmNqu&$Tb27|C+7) z=7u$kmCXJPSxQJ9B^W+Ay1J?_W$wYdE6HLY>K#TtRTSB2hLNVov&NKFs2b|^mpI8S zclo>@?BZS0%fi#^ku$!0q#NC;kfc#(8q?gf`K_Y$5Tt80&o^U{#8I+lTa>Dx5Q+%b z0+n*flq7jQM(}F6Uij2#@J76%XaFOXd9W*do8JjN0SWKmmHO3L3^sUBUkR=qBG@h? zf<=L~yEkhe`W#0vl@jLGa5jBwk#C;dKAC3~bY_?tH4_iw>@0@O)T%}UpT#$J5Uh}T zB02r7f@~bs&BA+~SCue8RuM%tC<4+OO>31AU7Llr$slC5tf^y`ssCEIteSI=V$H_! z>1Mc7dFu?)2rhwc(SS90mDJ9Vo|C`NOlM?ATt2@_CuxXIo{<3~Zv>%|W83yK9Xr&; zc-$W_N#e>knSQRC0c?mE@Hs8SlHN*$=VgxK zTa=UqH69;SR3>vQddZYFX;U(Z3zG#Ocs=Z$`Dh!5k37tgCd>3WzKSylQPCuU-`WI}nBN|z(z#tG$T$={s? zkKYd)k2Fz@>}j8}Qfd8NAw(yqaiZu3GB!1cj0;gwKbK~uZgrU_OS_naY|3OHFgAqu z+?T7rqQmsr%+ZBIaUlXSaycu-rgs#P`&?5c9y1zdB*gaIma2u20dl6Y(-Dr_A}Pc1 z;F#eX)-&4R!MiPjm`m3N32!5MMVQWrG6(o}mA+bK$i9m$M;g{=)vp$iDUSkS2#?i~ zDnm{NltWG8L%xem+EHXOepH3X;dC7FC@j+Tm5UfT=KZc8kqf~s`6A9~}zFW^xyDPxsH`)8*%eJd?SyfMt{%Mea7fFjr{>`58ou!L5~u_CTc+875h z<Ydh8BWB|LhfYwpnwW6HE|4F50Y-U2ADZR;9s+}+)p1{!w_fyUk4-5r7i zcXyWrcXxMp4<6hJ5|SVZ`8ik4z4zSjRlR!Ot9q|$6?@n2q6&KLwZ@!dj5!w!O6VA2 zxoJ|V3?WPQ*EFKnF7zYSeYJ1R2t2Aj+5IB`^XCruo1#VzH?MX1{C4mw8440+9rW;n z$*gI*Il+kTb5i#5*YUcoTif9TLFL)ELt~Y%n_Tx#BX(4IVZs%N_JQ*D51`3K?R_J5e?FhVQ)Y)vmQ@-w_fUqm^hE`= zJ2bmJTZ*0l+eR~6Fr}fI^N`#dOzI8Xqmriu9QE-ID37u+hFi*%mtyG5t+38dGf_)$ zM@1U!`QlJ7Ts{Ak`D#D+c6}Jprv^1`ISy`W7mM!~c@0A746{{602Yx%I54HDrlpIq zSz+l4jA)JGHk9SCXFe)fRDozYm<=@w6HYH|;br*w=w*Xk3p9c6HO`Hx)e*b(oy3~t zzh4-z?Mm`38>@{_+);bYg|-kt3Cbi0VB`Vupw~yqzcI`=VjA!(8$2*^C~sM-WFG_P z$}Vrp2uG_tkY38Ox4@3J%>9P2iPQu?*uQ3Xp{eA}9o?PLVfw5*SKp4*#J0Ml009?m)i-AL?xYUo zB2v;&8Pn$0Fdyb7D`)nhE~@o6Hcm+ZzZREd?&qHn3~r*yUGNH;Tf}v8m8Z)w#OlDS zNf&R`_otYJ4TTY%eRLWy8T}cnzW5t}7N`)J5$d2!waKwZ6G5VyzZZj@>GdntV71Pm z?hihDoI|{MUww8JT4N3REz$M+ogY2_;}384bJy-jlH5{T=5LAKOmt+ntWEYUWQPNn z<*sp$D^Y>My>k&k?rG1$b5I+h#B1aIvbyQ!wd%QSD6Y@+Wy*dtiFV|i!j!ce)&(0Z z^D9m8N936Ofz>I6%+k|3(#TzSp-DHhtYFXAis={lK0l9VR87_|xv$|xh3-S8PLx77 zTn}Eb1(2b*$#4pJi;NL-wU7yRJ06c+1c(VpWe`pcoT`Q=9KfO>9tJ^*G^Q|K&xkC3 z`wn&}dHwNCRz|rvc*#1Zy~5uZ?KrklDtDd}nQ%7Ku4d+ZvQibkn&_7=MOfyK%$!GV za$?;T;c$98Gw_)>#%se}Vguby&xbNGm<$q*Rw0yp7nFQthXq;a5bDq<%4=0T^*Z*M zwN_3Umb7qjS~NbjE92>s2?So)h%ge9dcd*vosCELPuvWMvy|<-8^D1o4}Ro<*1i|k zwES8?z%0kTk%eFRG$aA`pOSl=jBpWUPDEkxpVAeJ zkUGDpa1Gj+O-KHE3-xCtbM);ufUV)&|3eWO!_nB|Xx#1_XBALTHeK$QbqB4B%Lgya zK6>BaK6PDK`vSq`yYg=^ot@fSl!z@fn(gJ{3Z9J~73J`;v|fz-@+aUv~v zp_s>bX&5Bf75Q4eG^5dIAGqo3%~7?d2XOO5%ws9-5cwa-^mm@RFl5PF(vpuAS9dgUxsGk@3uxv>wyAoKL2S$!}CIeGcw=|f$X;%S&qN^eIUx zvF`$lchWVAw{E(ARQuiin$buE&wU9RFF^6cZPQ*XBgDE;twF{;yqo9;318~JJfMWB zeYHqY|FKGrRR77Zg1Y>lzPzVM8`-w~w(%-tbgF%2!-rATkJb4)Le-%VLv5!rrEMYD z>2l|8=ht%maP#zDm>ig!fze6)HW1WK`t3wzSBUn?VCwO|2P8ywg)xJu_UPyTi=#T_ z7XBLpb8D(s%a{AbAMYcty)@k&aptHS2W-Ysd@7gT>g&C+o%Dwsn|-e_`T24sdFgq{ zMC)!gW*4DEx}5W`+ME;Q)ifa_SN%6$EBBoLB#;lmi6EhA1SqY-R=k` z+@~O=#Kl#aUijqzRMc>cVs}ajVus*bB6OC!C#@(O?O6{Hcg0*v!B+F|$?3n%o}(!I zI6roNvAYE*o}zIbiR)2T!-b-#Y42h2ypnQ*rU#EeD)ABO7X!jBtX|}3p_me2(wCr> zuDzhaY-7=Ax9@VQ)8R$-kGEv)y6ZQ91Pkde%msk6N!T>RJqD^og5zmYa>6pbYLT)a zh;ErIRfokoe|CMg38KD&4H$JGSxhFc=h3enlONy)^tnP40#Mr`i~GuZq!40A%ZHkr zU`)}pd+Zc%lK4Z|&S}QJh;Z> zLy=+Cnk1ZAX055!Kz~X;bI(KBl@X&jj(&EFdcN*uxlXXOkNsi7(dNJ$wqsOQoDj<= zSJ{jMxK-ndpJBBYyy4#+)%SI8q5|>JeQ8yOM?eiS?fT+~X;r3?73b8ESybMI zs>}fv`>eFYA6`7%rmLC6cZ4*aIJ}gJ3bNc)!V+5tQrQ5^%xKUM^QdtXG6pDEd`=n} zQB`5?$6YQXXwiX|PZtDXo}kE{<8Pfu2K>&9jZP{>SgUxLd7)uS4NO#avoty@nto(| zQb&&?^{9OBXLtn6R9ro;A{N$fe%g2#f)`TA%f;%a;)TuyBcJn3sXwES0F`NBT#SAa z5fho4XYG#u1}H<>F>~_560Hi+#uLXwjTrMan`T)y>m+Bp|qwLLO;*q(hh>%D%WhKhlKl_wrsA>K6(9lA#Sz&IF|!0&~I5Y@lU?o`8d~1^EjXaEiRMD-Pk+_+kn^rxM_cY-QR= zpRf|9lvF)=d?kjQ_h3@f9?jJWG>FFD_*o^W zsvrZ^W8Fje_IThEc53qmWUah-I|NhVxaNvkgo=7S>qe#ne$z0}GI9d0*qCZsQ#k2V zd%WZQ{t8&Q(ADCWCjFZ|z1Y4)wnErByI;QJ;`GM-$tEpdrY@5>^AnlE0ijteT5U51 z^&Pq??Xb&}t)DRCase)#z&zXZ&4{p#=qdte5C0?rUmE2drJ>{sF_P-?1@NZg-oJUW zv>@C?Ab;$ce(wzOHSs!vh+R6aPDD0|ip&uu{C@VK$A=(;n||9#(mX>>TtaMFm?W4+ zBIac9YuJm4vg_7r#626cK45J>I=B|Y4D*0fd5j(FU0c8NE61tTkyjcjXRJ{toN?hJWW2_FF#j>GGTBbY^afuetM@+t+>9C zgE**YsH2r_UX8Nq^{cyl6B#P7-~sBLirS29b{KgIxyClnZvZVzje+2$=k^O0hP&lM zS?alyYF9(%7R7@~iY^_FsSCS-v4S^ru$b>j?2(|2R)Iu{@*9D4`nPQ5ZmOURxmVnJpC|h{ltn& zOo~Pr#cGr>*R+O#uTUk(2oG31VB1M&Y6LYN37U~vg7y0fB%Nd z!Q>;dCnP9L5yw*XGlo73#rHPJJ_^0Phstb0%bwPnH3N8)#6zvm(6W_w zW2^lnL*!<88)H|yJ*dnc;)a7dBfmiaiv@e#t$BVP7&F}3YfEm&UQezVcP_uB1AQIK zNx(Nq>5BW2CYH$sIfRhzX6gek*i5GrbkBw4)U7haGh9lJZTD|5^OG6|Gav=I9jJ!^ zjunFFsn>--;Ql5_8{c#y(8I>WJ zw#TYvl?ulyPYEy01nG?*`0I2&?96+rUtUFNpvVGF)R~XqFsWFRT1NPe*&`{KdvvCa zXSU_&OsLai+(D<47)68M0LCkNc`?2CyRQ5Jp+Na%+8)VZtL4bWle^SRrFN59HxZZ{$QNaz5ReGt9vPc)i-_CIk z26~72Krc?9Y$h)%tS96U+768Ah9pK7{v;1*Vc2UPVKl>8l2zQ}J#OYfRw`Ak)hy3i zQKA<5=<-+CEvqfDwxPBnIFX9IK8}iFvfE|Xf!^0bm_LES&uprX^!^2(HNXR0l7E0z z63-FS{#Yn3NYpP1L&YB_oF;IwJ((#Sd@I1pcW@tZ151g-nB>qm@n>GK5FDyX?sZ{s z`>Xch<&$rKUGLkL&lDTi30IzD-@6W;|Nr>`lZGE{10)EWAp zl*!nlgo!@l2D8Ln9(BqsZrG5&i=<0Ib}=;~{8t&(0h+x*mQE)mMSFDkLlH)_D_z`i z*K+Yz%cDw3_Kk7)@O^jP0%A%~zGCHmGPk-utmZBE&71NpOu|6aj%;>4>mZacR2gA+ z;aj>+=8huu)o{{wvA)X4>LVqqV9aZdMgdi9$eA7z(CUJyNW9&Gi)r9HfDK_R}nyTS_Xaj^*C3|kwRKpMJzS@5*%JYa+b&#H4J6H z*<`PS-RnU}e-df5<^tD)PH6@Mg)e+Qr6fVjy2nqz6i5aYZCv4xy6I1)87QD;F> zf)$PSUlX`CfZ;B6HrX{S!k8B7Pes>(Y?XlY%bmI}QKfj_hjhSHkx9ff(bRgB(+HRy z>;eyOHkflcp^`zicg{l8-7;up0vk==zo3e_@V76SvJV4*Lya*G01*gN$!tHK&pvX- z7HiGzZXXFlySd48g|l{~b13peW6GGJ0mm>^@qB{<8v(1o?uAzDoy z!G>)+o*ZL*HzIlbSl)h7zmrY}faj6$$TgRlz!SWZZDsi;$fvD3>E5Z=#g-szOkTX8 z$QBXaZ9@s;=Fcc|-;!GN6Ux$87x?|DxB1Ev_m*&eaJV2TuN|J6;-*-+!i$fnU9?H{W!$ok<(=S(%ByEgL>oBOuY*YP7s+34B- z?&dUGOCyU&|C1j@>tBe1-vC$iPtKxqKOeek47-e8eH31Oxtv|;8@-oe#k6!m#d`fP{Fl{!AU@0G-+tIr4v4Qq_O`n zrwjX0g8`}OS=nG{o$HRk(~ z!WKAFe&M|S{oKPlFd@enZ;;Di2WdZ!W@voJRJ0+4Va6}YdUd2eEdRkF*OILW+p;`2 zk6JP|Hw6UX0uXQ6+0V5`s}3}7D<4*TZF{+mi0k71?>$hr9`2`!xTgJ2o#HLypMVl0 z@lnB^GLvulqLabGJp1OJA+mprmc@k}w#Q@N5cajqxqN4r5lT&N-Yb0 ze;F_6h=h4_nBE=A=;c6p*1+eQpB#$$b6!c#KLNzY8;rkMi=f%ajX|{Vo zH{W5K*A^H5;#=r}lE%X1N)|e|4tkW2Va`4lxPaPDlL4hW+{|y+C2@zsTw6x^^ z){XYaILN?X^#%+(H~KmDHA-#XR&*FzsG_*$HV!73lbg8$N%c26rF-&35B>&-D1Oni zQzZC-ukyH)IqlB+_H|ZvL+E2*@EHlR)<+9Y!dla^?Zs7FV&uOBH6>pw!{&eP-qq81 z#B@~{BmqdKWA#EncMo6;U7{oyi4S<8=9r-=)nmwSPuwF^VS4*&pjwKc3Wq=^`-`uf zSZ`53RF*qmf>^97t&V}NkNW>4orQF1)QAfCoihub*Y?=oV)EH>(+XR7DKXVu$=mShLJ`*&30xjy z_f;k;*!l-y@3xqDgiL0vSqF0ZroU>F4pRf|>m7OLTKo$Y=&s(FEf#213JcDgoIcrk z(N>R_n=k=)tl{l56`eEXGREM+u5}E={R%nV>Tp8|i z*LFL*tNxR2DVQu2(+&Sg9bZ{{bqpZc76(2bsOEDE!|{33Mp#9O`!sBNs8LIdNXQPn zh{u5f!_q4cu8!d1c@cn2M``LFPdu4>3GgxkjjZZk;l+!wmmiyxCp7QfzPy#GW0`t{ z#%rVFvK1wJ=6GoivR{)?98j@MuF4IX4d_0`Y>Lbss>S>*+SbR1o)FbY#F*LUf)T&Z zQE`g?6}40J^YhCeFK%uANXk{i9^JR1Y%zWcoEfi@UTDO9As`i9(!%)B5IU3>;msK%P5y=-6wJ!yVJ2H?SdInefdDtPsVsT9IG1}HdSxhMGT)6}2P2-k9IctE zDHkuMV;y8OeH!psoXaaDk6eR1%n5uR5rFKc$Wz z6%#q;k5we8K!|Gp$S!K2?feAo96a13rO-yZJVH{jBl$vsthNpX>Ws3<@d9WIt$T9B zN!C@)Fqe4d#CBpi_6@NN3^dB1t}Y_tbQwWGI!IJa52m783#;Sp)$=1r6V9B+je7TWxRZP6%HxP6XIcx$=c46E`u!qaB6MQ4!-9xiGR%iX7wE)_}eBO5Lg z*`|fV18mN8x@1&YgJ=bxT=Tx5Pt55ql)@oNR&-28vWSkdv&=GAAkZ`Jn?5)nIMw~@ zHT)Xx>AJaBwC9R_@89>DoDR6<$={9!Gz-{JE#(=tKEq@ph91DKS6kLUYDdF4_W3`& zqn?>5HvGC;yHSX{HCMCmj?NlX10qbd*B_3WxX`2**c^YFkLlyfu$%eRB@KF0;E5new%870b!UCec9Z+0b#?H}zMr94oA-@N z6@F&;(SQ$(SkM(XH8S^cwej#O8)IB~66t%vS0wX(tjd7PnXT+y*>hwGJ$B1Tkq=JK zoDYJA=Ie>^8re7mszL5YYgIoF1A~9Cu=JuiD8<<&sQip9YxNf=uBH>l{7&FtN54zW zQ*7_yz@g>lzBx$d5Nt_H=htehvc>QXp&2E;OUZ3u-%&B+qih2AA?)ap)miXIBF_7P zu&WvOvcNd+e7ezwXKPH@Qt1tCC{}U*7jY&pbqSPFJ__n3;*DT;URirh{Wr|JZuJh& z6aUHOM#Dpq&`3<1Xm`Ya;~%AlGDfQuM%fyt;z{AH%Dx-6JY+!KyDy@!q@S0?d9c6GXLv{(%!6fKGIcH@n4-s7+hE`GIomP$y{Ad~_vNqv$G@>0w?>CPX z%+lleKuIa1a@~Cz&MZZR@{HJce26G(K}azN3yC^uiB%xpSI)3xVyHNL?^7w#+(p2Cku9 zjB4WPArhZ!(bKOomB^vB9k%+lIn?6>kY!#taWw`n2^{NPufRqW^qZi&G$sbDaxZ1a zOKae4c}fteHI_#Ox0o5zzDJ1#vhJEGEVgAXju0j`OQ08Nun0IDUM|bRDjaO}yX~juV=j8=CGjv({mX3k#(Q2WNmY5+xP@PGSUS?UQ`b#xkMNzy zna|J{#e3#fhry4<6&@Cw-kf?9jZ(Jp6*yX^oJ_E=ZLiIs!vPsPQ}TT%!X1;n%e7ck zZd80Wka0?AlqDcN2NmMtgeuW=CY&@IAEF3u6Rx*pO6;VKS6g`{O3(EMa?`Ep7&86) zNz+ekNfoLif)9!HY@6N{d~L|C`YY86Y%NLK=T_gmGVg3TL~M=8Y(i}InN2A zlr+i;oy<9om5Q$t#ZD#>d1emm?UIUm17-pLhDQBuxgHoP;!uOKd2M0DARCK2y}|Dv zwxsQe=^-8XgsGa5zp(C~$BkENp~zv4=jFNbH3C=b#4ALCmbRPpV9^s#Uo_umCpNu&5GpTV?cgi4LN zIuDc=5w)&(87EJK#gK{rwK3Z1 zXHmajaZWVc>~?~sr==3<%g5}##t`Ey|5N(?C)%XiOVydGl6A^tIGD8^{njS{c zAq$;!F0vE0vckoUeo4F+IHfoIN;^7BvriHS+IHr2~x=RKg}0vF$O- z7nl!u6YV+>$>=F8$_=EqFoGQpH-WB+xm2Z&yKjtIep+elhL3xii0?=x78FG;dfejQ zGe~n-&Ch%0@vddCk@kp9EIr>PJD?^)b_?i|WS@uM$))>}04<4?1TofK#dmy$mQk9~;@L}};^1jeGl@poat|HT@H7?0G1)Le-pqh=-j=_GV5*bI|bY}>3IcT2mw?9EA z^iv;e&NM|c!m~8zH}9K4NhCEK7^@Ou$nO*=>C^ZD@#Tch-5Y=sI!*(`3*9Eqj`mq( zlc@od+7KP)7*Q=v`ehV?*kwmw)dgth6xusHl2t?f9SfpCdH5-9{Sp4-NHC4p*NP3r zPM*=X(Zq5Dz7k0#HOeEgBY`Bo+0yxeBiMNiZwvRNMTdmdEyl75g-V6GRsTr!^Kdq4 zU-qWXcBlZ!8$mVK<8}fPsBP94?_DuUEt+qawIEF)xJxZfF-U1BpI=Q5jALQ$WY+Y@ zS-Q&kIpZ<=IfzhjsJ-g-aZN-UvVdhlda*EWgPjnbFd$K~nhZc&hL@)#`kpt4SBQ#M zOdRBx87O5RKnngP6a#5CkduP#jE+{8#sfp zAf-GL7@7ISw^{8Rq#I#ZKLu*!gK{zuyCo`u3*WH`Y%p>B+h&2L0lRD<$Q5QHhO4;SFVRgZQ)|2{DW9MNVfQz1+LH5Zzo{6V(MS|D ze30ahD!FP_j&B#~AYRy!iUc(*nRDhj+)5SWeRHmpa$P}z)g*zRZ*An8_esxZ8fpQ3 zzcuRTLI0HBkBUhO*)?4r9gq|8uHiet4U%j|ErP9KoGg7q^d^;hhb5`#2m7C#qJQ$l zqG{%Ocp>lr73Oe0gmRiPd5DhMMwlY`Zny1KF!zhmC-F&=$>pGfp^imbOhU(V5@ow? zzzbdgYE0qDDdvI&iMG8I&*HzIfjI4i!rmvBEL?YMnrhdqlz-cTvxBkwdJvqK~$3 zW#$vF0waE;EJ_PArz9RHTxFz*?wLoy-)QtKLt6~ZC88C$*+>9Km`C87Ydc95h84j! z&t8RS(iO;uM%3WHhaG1~4bO3__B%@(S&2pnAgon3R&1)`GUgFER%QqCN#L!6qOn%& zixQ>j44GES#o3%A*;tc>L-Il#bp4*GPsY*YM-{X`QVY#({e|uEWA^AoF;=24N3Dk& z)w%Ypky{)6WV!qJTG22(iupOJ+qpC-N3tjYWWx@n@0!KGILb%@Q|;W2X}TaDE-Z%< zZ)+~4EfP9Ble~JrIoFnTC(9RHK)}UZLRh_o6}Q1xa!&sn5N?_~E}|bEZZ5b+EmMFL zgN?$Q55MFZr%wWoOnIL!#3h{)nEHX?Lc*-)pv+a2tit1s72f-i=~pSKZ~Pucq_(g> z7jlC&L{0$D#GZw%gKvu0PUY)N3q(gV^ZlM z;iItcx7fnsAHg})rbv4;0G|MOGLZeq06wv-USHNqyvKYu6nX-dj9 zhWePa?{D_11qy8pZH7U!$$0eT-H_AW86zYkNRzD_^%EA(#}#&Kanu6p*A@jjT9icZ zN?S)HQGqa!OgQx;KePpf-fkmkJ&?ag5E$UV7YBX?-T=}*E|G3=%*g_BZfm(GRV z=7lAJ=9CUKiaJEeq^Janxh{KHFACJtoL=iOD!2$y&WMMSIicb@)U4LML6Sm;TDhdB zaw9c~TdsJ4OV3FJ;zm%aq#=F`>$4$q&F_xjv`+cgcpeZ*BCSb;fM5Oh|GKL?>og$P(p$f>du0g zJo9V_7)RkAKB)65p6bzX4XMe$>^t(<;!`EBiV?Y0&B?FcDOlv4uS>%5!Q%(>YvL4# zp1h~_nuj)i>rTb{slSsAK^_81>72O3WfsLVDO^LzF!!-#-hHwC5PGY8Hq7ppH8;2Ht(pvs@+LnXJJ_{eVP5D z=PM|TyXPQm_2V^(cs>(7CYQa969O5%88MEBXyr+U!@MJU7c(!?py}9w{US?wSBJ>~ zk_r*QGv;Wfr6g*UIasb5^hd#m`vhJ6wv7!*lFd;w*O&1flT?X(h>Kw*&CiGUS8v#p zwudC2z5NJrfp+vB)kH-y-YsfyVsbjDM%i|PgJ}muXgf38HAmx}Ov4qnm5U6wPd|pe z+CaiU(rOY_JgTN|mx0Yq`&Q>(4it_`g>k6Apx8Vy#%8hsPk%N4 zMW$P|dMAQ_SG35X3OWf&o1%2AA%+*E+@ok>%;$|~M)w>GUZLhCf*!g1z-x$}^*xYG z32qkGdF0`jD$ioj(eRec;K2pwB;!DiOnI5V01;|MWLrd$>N?2s3x(ak_{;udcw`Yu zBTM-E4X*Q{_O`^7fkQJ%9Ot*To|oE^;$*NmB})Dqp4i4r{Uy>T+X}>%@HS_k2rKF`$(e*3{xDU(uU*RE+s@hq?fF3F|o0N-10{^ zSG2VoG?ej1<)GJtKbD{Y>n*0&w_P>jO)+=9kBY@ca)G&a~Q;=m=T4;R8u{w1_oj?F2P|a zv<0@Xg;>K9s^A()`C%z!m2Ep2#IVab+KOfn4B>gS#fcJw9;e9aK>kl{1z!7+ZgB}g z>BPOt@EKdo$TNcd7}!HOf{LK(3m4i?-$t`ES)==%!T~2nP38Dm7_t*#-?h0|ad7b1 zMMV%}Q=6x*7i<2=O)eiaJ}L3jUA`tJKURfb2m|)zQ_||(lup1#(ejP3i3`Hz`J~h= zD2go#-|+8JDGZ}0z7e0qArG%=iIRkJ_9*E}<&Wu48cpWyl8v)dFfBSm;L$iosdGNmam5i4KK-Cfk~1Q7tD08mo3W?PSkH1o90zW1M|ai zjeKJCqbi+bb|3grW0)|ZdiI+tV{wK2oh9A`)tGzZ zT_W~(5}8KK{=_DZBB2I}S4sPB!nuNZkh65iM5oK+jM`3;2lyg%^KDUHD{-iolM5~H z;MDbDc+;2d1S~mDnT)J_h?UJC9Ip*dELS?X@36t3i3QjDkwZ~OGN!KwN*t6D4e#^_ z?#lO|fJiy8k8M?Xz#}SRNk{RGPlefLs3L_ZDai9X(~r^+dFZ18)WxzS^nQ0S;4VkRb9;nn$2Y1ED|i67q!#oU6yPRFXyDJ@&!!Q{Hw zzjFT+JdKJg?_(TcONB-BP>Le^UOnZ_6vSv=`$B&xPjQHm|AuO3!|I)X{xgK?KJsqjnk zQgwtPW1|KFvwDPq>bXVZ${+BMh?&{OfMeiHxhOYwPACh>ta-pZ_Noz=iWP;uOL9$p zd5lyhrf1BnRTDJxLS?!K_D4!qPwmy^CA)BM~)G8Yc0wtOPxJw>C5B9>BP=o>)TUK5mtjA z<~HR*Kx9pHQlR-*P-6G`A9A$YVz@e8$@bHO#(xl;Nh7*?g|im93HI07wF+`~2f|yNFfwQTHXwnVp zw%wOR@~f(_U4cPu!vI5*mpHXM!khBeuodX8Rw{1n=fUZxiBOa4gMXA03r|()=91i< z#b6H8#3*tI(+{v1Y#-+~Qw?!Y7;ZyE_Gf`!h|>z(mSf9WaU-`fwE>9n!~2SK4Dfc& zk|Oap>#cfM>-_D6GX|3mfq!3?jV5BzIUxbEYVa=MFu!*D!Q+cIGc@U{fZdt5mx`8) zX3~I=pRZ1y&**buEQeVSV;Vow3KYArzNqA#0Wu1ndZ6A%1QNnrdHTM+{G*=z#*R|J z9iLQl$6ZC1uxHv^pAVz**97{0&u;)sqlMSZ_rC~b38ljjQ49g7U@&?Zv)z1h5CF=$ z2pSb?Um&%AonX2tO?#m2R^}Zd^IJOwTJ;#g{yU@Z|6&7wfqnyaVUqX+Qx(HeFTR;+ zhpIHBhT{^BygBvV%^dJ)7?}kYo9wQl(|cprrAbY65vssNWdS?BSuC|7Q0g`e&rnGZ z4Lm7xZa{LIU#LC=i@4i*u|?NFBkoVU{9{dZB>MPsuJ|o$mJYAqslLnM{ghaI8uvD= z_r!DPW%v)=fdeMaB=-=*wlV-jeEjs~yL!n#?^Cf-e?^f|GIsyw_r-;k`oH3*f3rFH zrvz2lN~~l$)whn2+?rsffmTb_N_PkZyUh4dM|6)MCXs}MKuc=@+3`ZkEJ+C*nGTU1 zQP=n)ggiRytSONG(y11ta-+*&8~|$=9P--ZYb$&un=`rzR(>?Kjudz`GAwZ<12_(! zs!t2#ZgwksVtbxXyi*Zu2jn})qe|l5-NR8X)eMXvieZ};t~u--De4fe<9M-|Nd`MH z0EmxJ1CerCqr-UhECe{XegkYWSzw}RnOdqUZt@hyDDRnb?#jzhrxf`hKh+y=zno9t zNA9GYh!+nh;v08VRRz!mLASXSD=!zAdFMMOll86qJ+RP9OBnU3Ypp@`M8A-Bj}wcK zeizIC1Fx@I$%4Ba7y_S?fZVEuNKb?0l@cRmbTB1f2)B(qY&b9GfiLtj=Q*_7ai7U5 zVUEM3J~vs9fspal@aRRfQ%lSc$W-l~Vf{-w?Jvz0Cv&@3|P88?H))7@Z36wFAY zR>W?4y;lNnfCY?Na0nn3=eG6;LpQc_sz);>jxGjqrtU|JS4#rhc{HtSkF^#kTXoOk zdcUQv_WV~N)4%&f&ZtQO_T(u^E5ynCp;J%qEBvz0b;2?82z;ovUJljLN(vMjI?x8< zQ?S=fIkm{3M3UVRh{1_OfX~)Ja$*PoQ6W|OrhYTxZ?Ngu-q6c&kf*{XAX7F&QZVb*(= zX|AEyGs4jwniN7iD1ecKv`)AsyefRps(>}H{1rD2JTG$~47i1v$&m;|W@?lCl;kpw zo78d^u@=MKY207ARz#tUg*ANe_8*h1vG*{y;#Vx8ozkW?BF~mbXSK5T3z0a7C(tm^K%3ZmT_=KAVdTJuZoKPA1g|3MbJ({sPhZ_xHUNP#c5|Pg)`xhh#T-q5KjE zeg@3*rOIx@eM#VQbb@<~w#l$gJi(nwF30*T!9-)<3#(%n#g5{^J^F!gSsl5a zxW!GUs-64l=tp%|{@!K8U+dTYW7-+CN=*)L(5g*5^Ek{VU=CNp$N7*Q;t3$OXlbPL zkr`pd!4!qS)=;nE7wW&$CRG#!w;!r5OO^_p>?C&@Z0IIV-)lRaQS5$s@C6D%^hqEC zTxi!X#eaMa7u7f9X5@Vh`RHCIwo2UHOciRY_(XJvGIAQELSj?XSB^o89GkQ zyp!d+XJmC{mDpzKmD_V+owIU8y>rxfkcY#?MH^Va0m9gH5N8l6!kPlSzfPJhGFLC8 zG?%SVLi?*xPq#*gaHZd0bHjhz+XDFh!CD@Y=RCe95#P#q21PBj@IVBlTc2GXjRJn< zvo5@lUq}3k^018$J3V?F7drRhl%begeiwo*6S^7$3=*hl z7s#^RC-;q#Hfm}*B%2h<-kh2@vULaA5i@^=NN-*~-i;gkw(Yftn%5{f>jE0}7}@@r z|ByU4vK$Ey!&9J7Xz#oqGKiuj*V{`9GI@(z-;%cJ_ixeeEYaTsvIH-u$A{UfbGc)q zCE)!|v|;+CTbG$yG&Bht#r~IvfVB+Gl5YfYY~EwJ1rPMFP;F~3aJtzhtbFrFoR^F0ivafF#Y0&~F z7#M@;%^VXGA-;Ph_wJaXiu$6h$|EcbrU`=OQh7|A^i_7{Mi^lK{vYpYe-KCTfsbpA zKLcAc=!>OA%Om?N2fwNu`xwt(il`F>m(4cPMnaEe?Qvjxz>7!eaVSXnv4_;fHK7|y zVz0|IW5wB07{wC8@)47KV8G@akHrq=Ursm|*B&;NO2PFO!7>2^nJU=2s+w9(B6USa z7&X!|G!8NuN@_x|(D#!aRcRQ zoh_=eJ4%fpV)cTsFFVm>(L93)#>INFA8frwIaB1I2P-Uu9!KVp>v;!H5u+l{l|Fv@ z7wz;o^mnjQzKVE!;jDa8OKy>Bfj9e>jjgw3_Ko*GX71s+m*P86_8tPm%#rKe?X*Q6 zV4f8-2D7%mexg!_1Ya<3e)n23F|gOaAcX%$_^<5V=|aZ%&N0W5R$FY5p1J%f{Y5|< z4OwBblD=RTPcRXQ32 zN6STM?HE$)LUeR(i@38~9Pvfv@h!=~A~9Z6bh;{VrHg;n@Q(c4%iC&wc;`$1GngV)pzf9bCWO~mOxD5z z?JfV(O;9Or?`ui8L#UX&8mg5@(S@(seg8#NV4(uBBa&$#!-$q<85R+x|MM>yB>;b@ z;c_Xp1A^dm%E@0TPPa z>3AxVzPpJQQ=*n99tePGXE+B2E`C;6A0=RGPClA@(j)+P2m8rJ_BXv*$SnWFJSsyg z-N+qR4Dv2Jd)F`9iN_nT+7K~)nEd(jAOGMFyw9;Pc){9B@H&gRdJP?re!aJq3W$Uh z2om#qclEXULKt@=m?zL+@(8~2>PHQ};ehIrb}26`-)sZHD^^8&<{gUmG6N|i+LMcW5z?Oy_qzu|oR*=LvOMXBKTr&yj z+#J<01swp-P3=ORD7&4XzM?)QhfEiv0**$e@YP3H%Zo65!Xh=^4*EodYldeba%)#F zgFw%k5gX$LfY|u5huc2|JYQt0RIq-G&*^a?zgmlry6X`#0~Ydbn)&7~zBy%2?hM(- z!c3iD!VU?2#PibNi~iEg6~R%NShgX|A;=>%RXY&3qZkPxsM)s}Wv44+Cjn6wXji(x z)3y|>DL*3uO}q#iWF570Bv+`AOR;8T{%L5+)B%Qcstdu28KBwjBhpTa$M{Mh&N<(m zZhNsSQCkZU;obtj4PUD0}cOGLcmj%lhfQa=XJ5F$FKSfVRYlZ7WX#rnhs@RYw zXK_xvVvC9KFG`-IjLDlp(B2Is9-r~7=h|9e%-;acJ2Bj7`;My5HSPTm<75`bPHjQ` zALVHbD9A%c+D{gar-oRnX$t>(|2IJKF+&mg>h1CkLg$FN^iJ4bqM}rUccM^TDleX6 zPmotDxj497U`)2nm^VaF0Ob+n4_~3vx@5JmgxtxZgkogxhEm zWmyt&D!%mMLU{)tiv}2sQ6E+|iJ>ehR~kNl!hD9wF0`D@ofE@N&2r!KiV?x+ROum2 zqPft_@N+Dqy6t0u1-kB@Mjz7y8nzhR)FO2rq1)j#S;95UHqh`u1SmLQE23?{1!4es z9)WpP`~(X6eT=B2;2Nkjqk4QPh=$Bz1-`2uZ#RF+rnh=fI5{2|oaDEaDBtpHMro!{ zYQ>4+v{yrC%W2(&BdEr6n)d0BMp0F4(N^N^xh&zYb}i2JdY+eW%$lmbAA;%Wa10Ay zKUQfxppY2wcJwSIy@-jgQ#;lowOLAAsd10Pu5zUuJ$?Sam9HxS1D(<5O&@*v&VF2Y zBDdd460H5!R4DUoV!iRuzfuaHe_Dm?(|Rq%tAj(|P{f&7tnz5=Kq~055rcKoi%*IW z?J6l@VQ}eJlHZR=$+<^y?InWot&L1&=AzRYIw>#8GXtZkcHN@o79SU)l-1b1OgHnE zLeuzUNvIiyd(rn*VhE)-!L5_Fi>^Ww);Q8;Qc{tGZj^&J1xlD4_&$hj7m=Ekj%GcAT*l03D{~v!&K^`g)e0s6;A^|bbt_v2avxQyR%jP= zFj0nF8JP`%IMf9$18qiJua|%g!`_50)$ps?1)lu=b3Z`nPeClSsV+o*$$2FY<&^7`>wRER8;q4Gzxl zDgi(RN zulnerX-i=vWv8bE1}PqL7)Tp5FTNS~dEMDqVoYm=2qsZF;+h0&^mv&J^AcF+n-o;z zHJQ$ty7#JNAMGd@UAthVr1tXV_>#8C_%3N*Em~fUc>}nh5l`!dBSqc`zZr(YTbSIQ zWeI{ehR(Md>WKQk;8(nU{9=iGRf32GVzNZmR$n3ZnXH3k<@l2vpFi!p<6EhL?7fRD|Fw)WpO%uDeq_4zvjL=9_p5+Ib{D0U{+^&r)8Z&(8wfBKd+qJ zRaKQNby*TeSx~5I%lkGNYM8kz%NsQGieib)MkCKp>YhZRD$hc7Iy?$hHjEC*2Bbr~ zh<$I+^z%tCyacKf0ZIn6YC@<)v3R8NTdW5zr+uuWjjZVfIJ#-)uK!8wjElt8*T{sb z*gDuP)k)ZKUVW0rAdG?gRMo>4q)%rI>?*b#-;R38kYm{WNOVsiY>;|7T^`Es9HYRh zlQEm}7Ti+?PfP819pTo^n%MHg@BW!9U(BKGH8<{GVN@ zm|S7R={%M-JD(3Y7Q`<~+-LY3U{^D5xc|BMT$|PKo6O&U6(RZ;e2lj)qaS% z(a|IX+y5o4iPV>X;YO!xCpCY_MQLa_#&zlUL`|Gng0gNvjc9Yl$~BEERs)F4+~zRF zg5vWfdA3!K0}a-D4%>ln>1VUeeZV=^FHR6KJ8Z6FQP_W+7PP0YCLg2*4h)i;elz#_ zVEfts=HQ!Qs+F@=)3D5OJHcJO`D8z*13;!lt^paj_tuvQw>J{ka=>ysHEH9C-k&h(1-Xoad8p+0J0nltrIc zQXUnvqzHPS*vw4J9rYY9I~;((ux1WlIK@pCZ;Eh4JXU18u&bW&l(mIWqTefY2?GQ$aPjX^23& z-&@SOLE9bU+3a}v+8oQS0#*uJaT!{YK0C2w*|%p}>?&SgR#wp3V=Sw~0mJR|*rEx9 zj61vIXqqwJlo+pcLPWUfRQXo}4eP>FZ$TF^3QD{NA7@MS=f{JIm|U6w14mJs_i)0A z$3e7G?1o@-DZ!sdpFXGXKv5P_K#lSZ|7YLgiW3vx zO*+h~&{OEPG^nTQ0eqTv9R_({z`IL7ouql$$%JSJO?vHL2EHD8D%Qq1stwTTseR-5 zaL4FLTV@y0p|khG_x9T*fim%7eXfoVOSE_==Z&zvdqfm}18|k9&%D(@M0yXg=qC;; zarjpxM>Id;ridzk)J$Z~67!K(&wo$D0u6f0h^JTjBxo!J#C=jUmc_NM@Q3r#v%)f) zK#8caDfS-O%6q(1F%bMDE~&U7FGdz;R#Q)Tk+dEr%^YTPI|u&T2*X5yYOdZ3F>EIT zx$(}P9f9tTa2i)HE4Tfd`$TM+xgY^Is$FloJ%e3@kpkK4PFlmI{t4MT5%N6y4-RFD z+O^)^AzvcW1BsxADUI4;h#HokgQ>-?V)noxZ|Lt1-IvMn69;!%UH1gRxnnf3uZeJzk7 z)`-#4XM!F6R%7VL@^34!vL0Y0<#`*lMMv*@#kYpJI|xKQjIKe_fbfQu=KS{(5n)3PlJqE=+e;B-@_HD^bOD#VMT_A5+oI9@pDWG0;pEMJ`x?x&%PBo~`?H4~uH(u*9 z+4`!KL}o#RH|%4@HluSVX6A`{$0Xu+$a#sLKIfYK%}pe07eD#MolgOEL3bB~>@I|J zB;in>&SNHhv#Z)&o?&Yn&6905{O9$l=u43$NvDXP;_G77`*|-iB<6CUGw;E1$0|w) zoi;+$y9ik&CDChmCx3j$PaL0iZ-eda!CwmIucQCcy#+Q({u+mgN*YE)gWsXZHVu8d zFe)-T?X-VEyx?k>-GeVT3OsI7XF!ZVx@g5n=}|!Rx(bs0%!H1)jp_DWCe6XKDFv(! z3mgyj_`LhQg_y&rly8?OGhaa;6#s69QhNkcb4IDfg}dXBp5Ip4D`3pbZZy4w>v$m| z3}3hQMb3XRB#lR{RM*QXaF7xzY|+9D4~qq}lcFZKOfp2eQ>?{zEt04< zV}n-G-E|aPucF_P{0be|xq~lMG5K7Nvew@<@-8K@930DGmQ^8BV;lZd{}LYlcK?q< zuQDb086YDh!ypd84vVFIu={eS3p~r`B~%*ri;WXk-APx_lGeH>BSB2-ubKp1q0muF zce_;4Y+wQ@uTgq#vX7^%v&7kfN>;R7_Qr@nF6|y?5u+G6mw3+mhqYw9JvwVE{uCYt zkM7aQmd04FDICGHGZR{cdeU?frz`RW@l%cX!kR^h7jE3SgT$#?p`Chtv0e>z$<2(9 zIdULsHLpB-&%dQxCD)%b^hO|y-@ki+;BvDz96Sy1RGs2^OP8x0(}~fBBF2^4NBs%- zaOgxWws?XZ7&4tAlZz?5$;^wT_3aM6aGk=(aF-~Q*NM8^qQPB8H(`VsYaOg6CpVN(~w5>f%@^T_S#~>QC>m62~i^d`bn~kugStFvr9CMr(;9S;{o4 z7I1=Yo*zvGJ(Yrm&s)Y3#g~^!MlZJn@#qU)Js`uR9I2Fl`$n&^1Wc)=m9RI`hMus6 z%Jlz99~d2mKYI1N9PsZOO^e-S9!4y1Md(uY{NfeURQ4*e1&YdcRwsh1TT3$`Lm?*2 z9@nkHZi%zwI=To#EpWGyI;}_=okwV?LA8So8P!jc%s6Ef^Hgja!)G2ioMDeDAX1=~ z_9>$_YFB)`(5Qgk_)zwkM}N*o88bCnP+zE{q+?+d-#kF_xIg4;!0TmUfJ#dBW$_v$KtBdHW zmjSn&Ya3I@qWLW>FL%P_)jU+a#8P~!Sm26`ZZ?N@$kCdz`>Vznfw)V@HWz71TAd_@ z-%z?bvi6ouYSPo8an4-}qOV`&`i6mpgrY30b#XBB=Pj8V@}5qP)omE`T(L zc(YuU9(M8&(K{biV+x8Sqv=WT?Ynj7Ev80#N*$;%N18_#0MAOz8K2{)1mH`Yj_@^DY^bU~HlKO^{N(E1%;8Dd> zhbqq(_a*(qFe%^;Y?c~C#w~*)=*v4abXinoLHCs?gGqaleq5&heIi^uR6$SQW7nw)DoIF~gV4VPBtw+WZr1t@hGyDqnBO2<^4y1x83TyOLJ8wx$@qsu=Sq9^J#HVw92m;aJ+=^sA51L2Nc@SN-F z^jqu>qoN*)E*M$> zlG+q@5kqWV7k_5JABLMq`im78QBFd&FMqZuL?DQ9X1q0>$#6r%teBYa6i;?D0)|c7 zN&9JSrq`H95mKvxsr1PEHg37NReJz(-$cfqsjulbIO84RwX}m4x)(NXDbi!5Zw^a> zwHWF~*IO3iH>B9uG9ki73?3zmI`frbM7n9~5t=GU9r~7A(^{vUO^-SUSMcZ)a%6Yt z8V8B-TTdx?S&Auky|i*oyF;j#=2V}A7bR;hfSzB_jP1|X!egmMN!~g*D&ka@rLyBd z5)7)M-tDO<^;Vwva&_Ic~2WBE{~OR#U<@9zw?4~O*QWy^~LjR{DGr{*5mXi;%T2Q zBAQ?JncaSV{Io{6D^p4tlN^vAZi=fH1tie_M?E{yahj9TwZ-|bisnD=e_?~buwes# ziDR5=HbfkSXs-jg~SgWh9uHhlp)$U7z%*3gU=OEpWSuu2lX28<*Bg zGMN5Rm4)VQyQ%w5B-EL!3)Ln*Q*^@*o#l8CnD=(LF2j>kTC)-M8zhcn0z54kGTJ@X zIfIEIBiU%g+KFuHn3Y99+)TB^Y(%BXPJ)NxlG0uAgfvTebH;WEjAU;XEV8zgjRR#` zg7IW9y+q&wE1lqOUr z+GvWPfWifgQmxC!ASt1w%vZyRm1RbRx1>K=*H2Kfhf`%-OdQuDb+UqGU^XVTt22Ck;E=mx^BJvx{ObOBJ|6 zECX!sk~SO|8Lr3k;y`=XHR-ppty7$ow&>-Avg|k)wVowowlo)Izs_%^*`kgPIo*7I z{*E&}msWbTkAm2aoa0@3!SSxW3_Av_ZK*4}ndb6K$-`Q0$Y!}&wd(^#S#I3cPHm07 z@c5(2HcksXgcu(SG{_KW=4xii!ztjavoI9L);KMlTk*{D>WA**M8kxe*Z=I^WPk35 z?H`VWq^pNydz7hQz`R|PZ}{oTx@xjATqOHgt{J=#l^0?AedreAp|>fMZ(YC~6Q*ZA zS&*!UlsnQ))!7vjr9m6_2)&!!aDUTnuHLw)leBLiPlXH!P_35Pw6T5XLSsE|IXpqH zj{n?9wXG`cI3(u47xE5*e*^UYa~A7=pUm3zn;^e>A-?<X1LNY?0A$=#fl&}gEe^D)x;+CyY~KX5$4zd20m)FWr8^U-BeF|m4q%z6#O;{ zRF1=MKEn?U|262=vP6+kv3dH%PvB&KZ0;KB zIp$jQpwwdZLg`TWec|-;)_44LzWrMN8am&3VvsGYTI${BD+F#APDIX6xeZ3?zcBu| z^y7=-|33@E$Exf5D$UB-u=VGOBK`6{XL9{=hcyqO1e`BC18YQ zhfba#_aeR>%|RCMXLl1Bi)+$jg@#oKS76yK);dNS3nqyzJ237KCHFDg1~WeCDO9bT z>o<^*-tQ_IeK~wioNxu}0<-GjnPI8;!!nBrFohVa^q#e}L2UMN+kr;aFPrtt$x3G% z@!m6s-UxZ$-yk7rC5K7m_cGCi`kXuW8e4B5ff)oDm31w~ ziPoC&X(zSkQYlfQgP?vz72jP~6ZQTJDv{4CtNxVtCH9c9s8t0o+s#-Fo#qwY>UQOy4V8Mk1)+x+RjHrVKtw+f!7)8*F>0xR>jf73}UZ4Bthz z9y-np5TJ4j@i*6cEzCO-QvBJx35bY0K>Wxnn;iB+W3EOwQ`$sKev}3fet5&?7d*8V zQCSxK$Zlg%rf7jx=SQ=2?Y&c;A#|RB9!|Ao%fel>=uy<5>?+GE{f0MSuAmL=I8|wF zWm#e`7!P_>^g4#Ci_3t3aWK1L)E9T{86D{-EYN~aiOK}HM}_H z7wMUbyn+wH$xJ*xA)=|BY?dC!U1%I!bA7htmoXJ7Ar&i&6A#l>PTFT6tIn2SgolsW znq#$kJCFE&ETS-<9NnywUd8MXg7G5OtiDW{RsE80u)3qg;KLW z(kJy&D|uHgQRS`2HU=aDa);su?sYD&Jj6nf&Ss7rl@+I$lM zf7e=($}+c^)w94(rOL+0UG?r_hGq(qQbgy{mkOcR>O;M@n7tw#;#OIYgrCA?E(DJC z!KDNpl9+@huhcV5M$aeP)2!15W?(rab3{p}Ny};iyYa(Z$Cr35yqLzW z(6*&^S97uy^i=Pk(NsK1XOSTNT8-m`+wS!3J)gF<)KC@$k=$;DJP=QcLG%@Z_X`*b z0bLjpjH6$>hcEJS$UfwPt;AY)RFvgvh-mc9XG>Aw!hsMwnlwBGgM4^1m~pgzmcm?i zLf%k70u?v)!3Rw_tFk0G;#aj&a(os<2+AItuVPBi+lEt#AT3uqy7tn%>jb|(8a{ai zZ8O($fgD;Woa~<;91a%#`iDk-?3rDq6b*UvZ21v$OD0dNegPRm2(s$r=4JGY2j`80 z+o6~FiczM_tOPHB?oE0AM8CPs zdX)Hb@pB{<>6Q+-_;VYHDXnwRdB7f>6FU(K*w@6U>8ArFz)TXkugR@pr!!}!Wzfew zzScSh->Z1J*uihIMp7uhd?HW!s2&mYt5w>H!!46X=QL7Wl7%8 z;mtk?mcbWso1LwA2q(We{;zJPj5!TpY#5qN@mWP}U#6!| z>ZH(wyMVrYUOV~&0tizX)aIdQ?(k%_;%b9$P*Ces2RIOzTb03&a>f(DR`U9P+SR6J`Owc7_QPMWV7AZey;b!0l>J4aN+ zLLP-?X11Iv3-do6c4-f;jeD&^(l2b;9rMr|Kbv&oAoI*i{Q(QxZ_r?9>y3Dj({Srd z_xfFg_!Ft4^iE2@Tf|UJ8UQ3%_yh9$E|tF#`yk7rsi0XVYU{r@$6wHvEm$5sZelN- z@=aIE^35&1__W!k3rsdZGXf`1&H1n(6>`fkQlF{lD*ESg!c*dIcr#T@iaIhuygbK+JI)V`2HiqI6A;*4Xz)qsr^x%H zb&o&O+!7ZQY*8Wg?W8+phYo@DGoE-mneRR|`lxnTi{%^2F9h#CW*WKt~WUB(+o8^cAu6epVop0gO%eIz%(Y zoU)-Tlx06O1<}>HNT5xL_E*ZFYV|N1NaGL;4~|ElI6bPK^^VD|dPkhJkOJPsofNA* zE49j%k>$HGC-Y|N^IYTO)ZSw!6v?yl%!^}*0$?u98I2~d66VuOBiBu|o;{0#Ggo37 zoQdNd0)Bn}_Sx`9HJ-VN4|)*#vSBmYtpP{TeAx$m?J=VE?Z+*-3~4rJ{9FX{WK1v^7^s&B&?Da z0@u#egx2y_d`3@2#hn05hKhkSP!P*bS>~DuWt{6GBhTi^-m_O9>k@pT_}JYYfBkr;u= zSM+u(3vLyBAt6H^%Sdl^Dy;(iueddyaez@r(Y-&a^Y=-cCc(D{;}>U9Vd^jUJFj={ z@W;D=@Y*khC-jE2^6xM5@XuoSRg1u2UXI5(gEG+&Ma|D6qtyAZ0vWjC%3Vc#&FH@P z&}GdrDe;#7_N)$FD3wIJVa|f+Q0=!~hPbS;8(vDNSiq}A$rd!oi5q%VRoU{EaBb|1 z#gs>}9Lh7QD|48OXN0cI=FI089!9ym51WX| zCKlh;{=w!NYegueHsb>)GHTY;5OO+z!98uV`0N})(1_F0BBxu~yi)$bHlVw!GN8|B z*A|Psv08THjZfb?D88uGCZ%DMch#~8O2*@1%8t>Y40WM1Z4}g|^81c2hRqT6=^Egp zni?|9;V;2bJnS zF#37V30|p~BW_XTW3k-g*kJfNY1t%cM~P z+~20&y^tB2H`8wE5`ZSJ3CAyd?(*R>Zgl=q6*h4GZ9nMK&Vutu5(05#bW%*d=vOpA zSyGMtM@ffT#;wYAq129%*k2>Z`Gbv;-PhU1J{CPI@lO&)R;Wh$*Fn#}tGgo+Qk_Rxdr3uqHSYx+Z&45!ZR8`rt6 z$48{=_-J-I)kZ6jGdEa(67uwu74vgGQNghat-_VBo*Qe>>6D0$B4FnDq{}<|R?>TS z-rc)@1JWxST8~$u%;dOE^I(DgmCsu$zcR@YxBv*=&+9ujyICoh$8x_t$NMjNOcOnB z6osq-hKwTHca95|0Q`0~oF&?-WLGi!l`6I0xm`GTxUN@ab?kO6KoV4U9B^$T1l})= zkbS*N*$g;7R$;l_Y@9;U%YtkOCs%-rs=rO~}a&4^amSxt_mTjgKJ$@);WonlP)5K_zE9~nf(o5d84=+$Q*jNyPNJhOR@ZY#J<`g{)7JsyGnvMsB#mk-ie)tg z7%IBc0LdGDk}Z5_cQ^2e=f^nHwDWDtc`n}xFA-CA@PL)3eCH^pKCP$DS=t@@gL8bt z1uZxn+TVi`zVP;x7e%wMapVwEH>lgG5O${3=H#?mr@!R1Oj>EgEq#t-6#!yfe9{x0 zqjDV;1crrlpU5UhC$OlzD#|RbRpiKfTL zv`8lx%FzaAzkn$5Nb3sS`YH?7RLRYfp{SC9bbi+!z-(v+NbIiT&JJNGHL;p_X)5HhzLNuTV?h)pmjsvz7f-GSEa#58@3^ zXW++U62tW~7CRWnZh5@zFKbd%g*pfo#^=uj(`Bh3L4Bb`29T)BU*yV_6;^fBH} zo<4|8DJNw&iyN1;juXz1%!2285*F3&Os|zPs-JDWnO^)7vl_vkWFq56v*dQTFk(5Z z4@JM+Waqe}6LBtb(QhB6S)%y(zuVv^P$Ebz6#rdjMO!+=20k@P$VeIVUx_Z^RswUv zQcjh#aYPccNV>wdP{fjd0|esd4~#x0WydR&HXpa1FSOq?lqD@1$-bI+)pxg*1wbVX zUMg+}1g&rVoWk$Afgkyw?P!W@0-BsieWus@1uF<*& zXI`m&JnocN@IDsDpsrE5n>UDz?3;? z!RTk~XzT`)9&6mn8!++SsSt{3Pul)~n3fj*VpRvpG^;+Da2+m?Ek63Dl6UrIJT}0L#+EZv+-GJhM`!%f>zfsa zR~D%hcTwIA=6;Oi_hf42J0dxGo>gP}6(eD>V;WZAl@4`0 zJQoKVEpfY*F11*ypl4&ssM3?}Kuy2AS7v3RxgQa7R#b2)o7c?kunn@~TU|KI1NEbW< zhiinCA4Yp%4j^q$PTZ;$Tqrr6O-#lfukre8?8mOQ3;ZznvI%4p>j0_XO`rUG3vz1J zwG1diIY1+lAbNlcpN9<)pS1pg#L#=-IB??F=HIA zyMR1824t(!U4*Rk^*MbycWrO==Y{WDxjy}TRlfX8{NYBb`|1D7&!QU|8)8G@aOyV9 zc#qWZLE-|`g5t|~xk0^JK_@w2{2&i zfzqAZ1F6F@;~c&PNh3Y3BacgIpL{k$cuew5Y0e#zZkZ;1*A0j&{G;*os8@Ji{DKoLcyI8e8%N`u#|T><%Xom98e%UChyEkYLUP zzcn+?pVD{mx!pmR&R7vFD^Qcwd};v=5K)5LnEnX5@U(oiia(eRO~JubU*v91{6t+F=8Jmja(jC|CLym zfG=w54HNQ}nf}fCZv~Yy&)tG7?y2bRdf>chcn3=vJsIUvjeAn|C@1Z=~e+aOiJG$WEhs)trE8AgAjqw-_*5ek@Y8pb7St=gz<8YXPSY)`#Y5oE}W)IvxgrL|JwTPxJ|Ixzc*(UK( zgyB6}B*pPfni=UFl}->^^-K1?8o=F(aj8s?o#e=$x=}V@7bRk&qLY-BX1TGULc`4& zLVf2X*_;D%p|DI}pENFP-Cm4UHgJe=E$5)YC87wuSl?K<8|Hr;5R9QSO<=?Kg6@DB z*fIG%-sTTze&K2rcA5;OU9{CN#6rEw;Ah2H(rp z7u=zOw8TW4aaCEcYD>&4Th?)fSm*A$TERW^YaFCaZXY7;vXdBqB%D}zQRhW@D-4J` z2NPO(s_IMs4H%w{`bU^hRcUB)F=@K6jFVQDE&^zzME6;JPHYy& zUF~JWe8Cm3bHh*p$fdwo!{yp>%G~;tR=Cn%<3=g>O$YTa8h(I>iO+I^mMvl7EGa6> z*#IK$bcB|X*&xX@86bLweFPB6aQ=D!zfVLxP+9ZYlBC5LrgW1SC+#GTXx3Y0ttFp) zv9mKxGV38q>g(8|V?ogdeb~v$D9l5WESMc-9K2RIrG40_-ZBb1T5h#^jmh&)F-X24 zxs+j3?$1(DSK;*0&5*_sfbpF_rllu(XEQFWCYe7L9dD^YF2^XFfr8*mOO}VLz!?VK z$Bn7-nvW&leQXAVbc516O(o?LANH6Fx9`_dviv=bXja^ z1|FKF)8V7Le+#M+4k+N;eqepcFqWF*dOYN*bM^|K8$H>~kP&c-^wNJfRm({opxZO& z@s@tt%|kcuBAJFH&yq|uysU~!hz-W3wjQqT7;*3c6TpzWQucWqYDQ635dpJ=4+*v8 zCw!~D%oU**u=8nG>6omkQ4!7%)tV<`i}oKcyeqfXAe^pW@a0)m?h{Csk_pOZ@-C!Q zAY#v7Q`q~FVX@*eRRn%hHymn(y4S2!6s2tx6m?xV<7K7WH9$wtDJzybqPZ9!I<2^} z#MUd$eC1*yT4+{ys+E9f;bMqkZ?@g0^^5s`$_aZR>^dcyK{@J`4qqa2))klkM?XtP zJ(ME(5}AFP>;L1QLP~oi5jEpo1p5j(+pjuhx^{6popxG1@nSpX?jPZQFsX`Vz~ik| z*W}U@>`^$Vh@e0ly*U{FYgqMWUZOR}uWljDBWQqrdnxs+1iW-As2IfO)_8DT1x zNp2dqQf|kVe2((G{3VK*0+ZRg_32c3)DeoCPmD>FI@9TQ7Pm+FQwGk|ImXwmZM7XK4YY?>u1PqN49=Wq_tepK}irGTI; z<}F1nh6RU`xFwc-)p;9=K&t}^naW&F>+h@B^B0(hv*M*LNs1VDnQrYqPXS7$6OLwd zJXMawAncb2jncP#JFo6_&CJzKyEyTBfezLhHa*c0Pc|kM(NHzFeCdw21rTsoXD%Hl zg>;hGu4h6|Z#{Y}h+jS)WXC+jL{nc#CFJO{u&B&tWH2-~k*sX%cc<#A9;vzQ+^$x- zI)wwB3``~|={}5ymKyE=9Qyi(I16dP6RL7TKsMXr&N zHL5fr%7eB4VK7H|>Y73Af;ovO(aoP4R`41o@gPzoY@5Rd0lrc|JnE@3sF5?3x&!<& z-&(PnYL2qTEJR_OcNH>$J}%|T@0K(f;=acaR$dS&1=2theXAw}woE-XvzaD?fRkN~ zQtj`EU@$B$$*3DqkL~k8%A%Juv*bEL+)OrrFz5$GMfkv%f#c$+rX2cfX-x0>#*etw z-0UB^TV8L-xPt>4+uN>iWd{izES@?L-9vPlZJB=*vVJeY^3Ab-3Ylj?wm2h@ckklM zf1gkIMQo2#OT;O*u+k`aT;)O*^*qzEL*mY;geaj4CS&~6a;c46iK~)p%zhwcTem2g z{dn5ZEfbsjW~q%WRX9aBT~({L?DN_ZVG7LG{2Mh7M6$(*M1qqCC&_iaDiJdc7Ft`V z#sb|ll{VPiyc|YC*-*RV35B#dBiSii?Co{CdK+4HHnT#@Jr-0z)z& zITCHOTy8ZC%iK6hcz!1W`5Q1q`W_qbw7mEQ`Bfg%T2oyjZ^P3UfAonJv7dt4+5JYw zM=76PHLCF_cOJzN4r;DgODGdv;>Y*pTqy{@wHmUscl#shd0JIUO=yFU1I?qhzyA04 z%OA2s0gH*&=4cGi^Px@1wVVlQB=xZjE6oAe^eus>jFXinPH@Q-C`$!~o`aco+2ckZghMuPU-ec!B3IAM~S~Rk9mZ7wX#^QS2PXKmluDP*dXo?tb(9 zHZGs`e({liwa!vAr=3K|78A8Ju-6do*6A}nBpy}q_hAoHZAwfa}vb%};aEeeVpAVu4 zkoq)3l5kS@+*AQ|>a;B-AH*e}L!NTHi6?EUS% z*Lv40>8h}D1M79IK3+YfQ&s+mPsAknJ5k?7t)*>E2ZaNCU98WvVsl0_?2@b`w!s_r zz9RAa(Tn)10H-P^X;%sqEMY_FIf>?7n11#C!}EWQP=3YrOy`luNitpcJC-LRj_&)n zt>g;i8WdwBFStB0%x|~mN(qAQPIZP5Ia&!>>~Jx)b7!(g1+oBXa-Nq#o%ZIsgW$Ia-!Oi)t5|(57>=!0#RV%v}27yUIs2bT&!^@NiMG zp7cd5V@{(px6P<-~=y_@Ssq@JutNtco9IZ%M>Omw|n#j8NJpfeZgwkI|rvGRSZkDs_4#YGel z7$))g@&1Q=kH*Z0lm8-$UWx{I>XHnq{Xk5#ShGWIIk1eWutKtOIXdZdx<-4rQ_;?E z<%RB~1n8@=Ww^0dSXqMuvGc6wcU5jhXl#Q-`kHwb{Sc*Ndd95K-M~s-fKvQ9p7@Pc z-7?UH@Yd9dOy>bBeYK^1e7*z4M#ASx7z&-qvct4D?sz}7eIBUlUQRW?;Apo|v}wln zQ!XW=kJhR#X+cQU^~E2+)YE8JJ>BYFzJvtywdwS2X+6SVL_~p9ca1H)jZ5RX;CqJ+ z5a~--ndZ)_Ev7Oc?@gh3hDMQ^d$a@6dN?#u7GZv&Cf*#0=fg{jXfP1dcRhdNVT@mA z!gb_LC_+cxRfI7)eLkRtQ_6m7e0@B@0TweFaywSxU~g1=Rusu8(QC|Z5*i_EJOm)R zxlcnS2`@l-pNKK0%6ie(YMHjb6(eRp6B72wl`(NxPPUkN!Hb>+JdxI0%BnaZkFEJC zw3bUt$bhHxwb$wT+?k^9l~qycR`q@=Sj)3>MR&nNQ)qM=<^hMY+di1BaqBQvfaTFV zV?4Z2*Su!QJ{-Vylpf;73LN2 zgb%a18RHUExMp%LrpQ=E1kNPK5QPG^Zk|4@o;41PNDYa|}g-j{j5ly@%g+|z0b zBt}o!uPk~8$76VH)RwB>$Z0w8@TRDhC|(&k6dj~Opr|4XAsM^TI3>Lpa&D=}cg6#j zHgqD@hqTq4I|P0WjWk7LPv|Z*1SN$+^^VD?5(>(Kpz4f?<|9N!x^32O$<_v}8_0Va zIUL0IgbUo$_p`W4EvuGTSXjU(aL`nhm+%`cOUxilAM%D$2!eWJnESJAvPx>bHcZq_ zI!kz(m6OT(P|9`}_?BGVr!z6e?A&C2@ekmqx(tHKjpk7TjlL<_A}hrNKRKUzg%euj zC^v@9_i<`_@KS)UU!)<=A3#a_v%v8WrM-Wrb9N4CrA810iE97;J{&)D*x{K(lQ2TJ zXX@LPNt3*mB7^gzEU1nzwDAlq7rrAf5Y!}I5Y5$&co%$@Q)5yeR$xO(JUS7Zp*9sK z35l{^=t%IdZI}Qq(QvyqnLqVZi0RH3u}&axZR#yN+e}TpxNjDtaa*9;&B>yv+4260 zH_O?(aWVCxx6*}+Cl;`DEha*T7upou_-wxEfj7uX_=bascuKwYg(d$6_h++?_T8O_ zY5$_JzO^oU8BaKh|FA50gI875N!uk*3#+oEspPnGqRH+bA8um8EdSUPM6+2^NeFa_ zS2HE|)V?-7zE)k=g|L;87_vvdHE8s-uBN&q2MkqmBXn4i;-1~1UHZBH=-1=?E@Wb* z)FL`Of{NW;1^k)?hY(d*hK9JoSeFI)T-SCL_8@$;sm}{h(71np4MZ{AD!kLhKugLv zyP>;6ttaTE@hYj&!}w+(oqVpH8dY#VrcIDYM4G^RMdyxkPQI=7YTb{YqhZ)3ex_v8 za^NXY3&L7$7^6y|6VdylkRy=R6FoXZE);8Q53Ngyybe920-TYB?tVzRlWJ@|2N9-z zI7L=MOi#s6F96;aC)XPkHKU*CJ$a+2QjRvbjYFsCCb{YP$}&4WUleAe-7FUw^a~+a ze+k*)nVqKXPE#_E@|=-T)9IhMaHN!3(4WJVenXO^WQ*T)s#5UZey1rg-KA%2DcN9B zl!!gh;z;!_aa+yTz75Qd00sQVG42=B3kYz8^w!OST%-mB_{|;w+@0pX(WA0>KHllr z{f*fVH_SDst~m0H2!kz%8RlKQ4JEEGkjoKYMqKko_g zrs=mn&rBpg5s4>n;;pu8y8UXM+PfXe6vxR5C5se+uSSe!1>`doid)!z4gDqQN?ltD z+z;SIi{7c*l2{~)RwsJ7*k?1St0#j%7dbYB75|5nh;zxYT_X7Hy={|T~+_yHBNR- zq&c+A+)N2y( zR%KRUC4y&3LV8Zxy0m(cW+OH&;khYn!37%4e6fWHO@jS*pS=R_3yUmJXb6(R_U5$R za?d)?ais-G*Vz%7@$T%Z944}^0$B`79C?BXgwF=3WWIP#$1$u%N6calyV$l)s_*!{ zU8j^cT~tjy(_DJ}KkQnQHwV=hP!%Q@Uo-LHUOLSPRWNJ1%yIfuBW?fJsx;uFbn>+m z%?i`aB!9%H8PVCAfNt_DDA#85par8wKQuN+7-~61H_wA{8|7)_rvh%8;rw((7H)c> zLx-druf;iV(n|UO#G%&7GV#yZH^|1HQt6A=0^rgQpB((#Cq%q!>!`)q`r;2C0DS58 ze4inuHV$a*N~v3I{WvTvK+(r*tQFg|2~0}@HMWG_SbZN8K;!H9;M-luZ_EwCycE&6 zyo11(#11i@K}?5J2rFNND|xYC){#ujaFOv(ff^pBG>Py9JgUDg+b+N>-HD!7lt?O` zaZ_K)M-%2{l88+jHi3l+kS=~U4I|~hp(Yf?>#W;fUV*ldjT;>Md^7S^i3t!VdA!EQ z&!f>3`+h@PLKt!7S8^T~t@ukR zR}Yvj-Y)wPG+ve;2xB_oI%hVDn^Msu=bcdUrLruN4H;7<-9;u$;rJi%rjy{*OTT^p z-OZ7^MC8oJ9jn95H4(R4n@G``oF%tY z7s*IxuKn6++8QP>&ih==o|L};(SD-3=9%KTZGbfKVnbnXW;$hQH$nLRM#{>yiBdd?^!}B39%c zz+c;uQt2ZXz9h9|#>~+KRT5dUUGZ<fpD*L3K7P-(5ab%bN$|wpF<^*K8BZ*0~EE>r`fU+D3Rp*};|3jtG3!>*; z=NlFdvspka2y22%jV5DRb2QaYQ@mpi`F2Y;>-Vc|(SvdJf=0dbSUQ zi*{JzQ>6&0Ijh5U7VC;Ou&XTn+ND2Y--^&>&+RdJw}_pu28uK{uiX5r1Oeqrm-75V zf|g|3r+!V16?f(l zzxX;VLg5$Ccp+NS`T1ix?&8wALDT_Pft%Y8!#@BB@h$Sai4ytTdu)F5|4sNPbv&oOEKaKxPBRQUnTXA)*mSnYj zCRbNR6_nn(6z$DePQ%Ipg_!RnvKG0H5X+3?YG-Zvg36n!P`@2*k)ow5Mp;ubqI~AM zBq5Xs>+~q2iwT`b_n;jaw`9|JMfakiENdmB8j7DMQV|={wZt1HFRH=zJhg_<%6@0N z=0abGS<&K&uts#L<1X>5`mKN-TLP%PAn>YA`xM*-U;Nl%P0r1l^GdEhR)xJB;}cPA z?CAC}%O!6Pm4Xs0qeM;X*+QfZi9#;s1)pfOPlI26_!zVLK#yQ!>7ifZUpL&+ve?~m zT9Rswl{6tDNtx5k^zW=(wVNXkT5Y`pJ;f8RUh_KHTkFBj$o87aM<{y2{8;B*MUsrQ zC+?l-vhUFjF(B~h!V|})_lQ(hj6hKD%*Z9+rms!r+Gg{T?Fu#?rLpN05aCqEu}0^d zrPEuk6btgEiA#tsG&>Ju+f=1&?c2QcyX&eXfM-Q9E37ImDIh)RNi8cchNRD4Vep@; zPP8lSrjt>`6}>{^fb3-odzl~dF?3silYpC^WG8gM#+YpT#&^biV?LV~&@@W}ri_}2 zYr7cr<^1%8d)95a0<|s^d>$394~{gDI__?`OVxU83~$sh7Hki zx+YUet*}(csUxtCV}bS|E$JGGfvH9j3ZtIJD&Jl$Y4KI<-5BZ{S{K_O@~ zxOS)Xq!hH0jc2~_OJ%G_>bBH9CAe=qTz``&xA9kOvOd_u>r_84Ug~)%cT#*{rzRP#3TaOnuI+r&o<*;ImP6+(`7}p2 zjdRdJm)*vw!;!BQi?dRraIyt`B&17vrSSIPe*c;QkV5^^S6^_i@D_U=cT+NLX?ux8N4IRiM8S$14|(=D~Xzk z-izq5qkAdByb*4ew3?5Iu6eDT;ox1QGM76!0}R4LKZ!GXzgFc><-SjE6j_AkAL`PX zjO*xS%J{XME>`q_l}*@w2JNoXZ>XGe03uIGFuBm7bzc$C+V`aE{tCMATa*+uf>W~-_SuKl0R9toF0ro1Z}NCcUZ3oEw5A*suaq^+OMxEO))c}xB| zifZqA5j%hEA=|Y79zlx|@whb#8 zizUl3TW-u*#eXXhh3i0;^;1UlVjcoM{2WTqzs%e2oT4VXr`|*~XT7D|m>^etl#xD{?b8B#tQFaI9O~Zk;`;_#{{M`@f8HZ>w#Qi{l_4Izh3P zA^?Z8_xA-U8B~-iYHlK?XS>e*jJ#@jY@o1H`HH#mY}@hyBw^F+0a~cg-3#K+F32ti zCKeMoQl;Cm9Av5)_f5y*I~A5x;g7j8bsPJImM$!VtaO3z$qXeNlB)-&rQIuBa9&YK zZB2wAYJdYZskGB{GItzps@YvEdy=tD9_E-r7nwp`AQAVNgGX>8S3Mx7mSZ_ufaG3i z8Y|2AkyLc2w2xrz*wUeop?gXp<_w&It@azDxExE?Z>`hj!wMa}lM+o+H8)3Z%-jB! zX5j0Q&N6EN8Z$yqbm{ZUrq_xZ(ru$ugr+6zN7dQ1=9M}nd#23M+1M_U1j7I;B1Z)# zr^*J^`?@`xrW548Ebdr-d(U6X>nbtYG0Y~OQ8OVHlq*h`aRk8c z_IC89CT?glWC39kmVOj(k&RaBbLDsSIBJum13?ovZ1ZuUU#a1S*|_&Mr|Mzs_xfYL z8n9>+j)~oUL_a#g{m$%V{OC#MQbHzWMHdUHIe&_}(OIAWdX$v4iz0Z7m%ZJ}GV3AD zQlNw!w2Ya+Tfpx|H1o6L8?V$Bhk!5q$-aM{mFZCQ{j&4=WeV|7aX_7L-D$YK4416@ zm+sk?{#^5K+DAsvXDtaE1;pOXYauf~TGv=(Nl|oE?iaY{$TP&J3-^pAWlO-#Wj}?g zF~8P>u6Egg+Vc9e#@pJSzEP4BMm(d;PeEDF3D^bP!u_Iz>)=&UwU*w$k#{T#@!e<# zg2;o*cw6j`AWnm2 zD&U({Q^){m9N*ORgnGQ_YyT)t-P@1eU*r-^Cp7+$01Hr+q(?$mi76xbMMm)dcCVp(Fhy^4X>7uzWK5?cO@Q>;8IF&6!v1{j!svRC>gbMzgwHL)eDSG!L&K{=eSz&W)zBs4- z0IU9NAV;tr##8&}Gfuit;*a@lgSQv}R+6rCNj)lco2g^!jy$hNRpYKzDx#TjZuJF2 z(V07LzC2}nyYq%A9SXTM>uF$*xKV|<&yZ?fq>t2uRhyO_g9cM4@P)R(x?!6<*xn}l zfaV=Rj;ENesnZj>C}gSMUDU59|IF(V9-Pl#4%dpeU)yjw(+IEA5Le@MBuVI|3HSFN zr(y7qi+(w<9741#4PQib&A!xdo6_2~b{LA;*!}V$eOlLvKDKRI`s=^l_9nV{YwM?J zMla&R7}d1s-TnaJ`O>I9eLRzS+RPy$HZo|}IgPLR@@ut*kxN1-kbk4I82{XPc8KD- zTkqh-{F?fkNk31y-17S7>f?^L)C1Rz_%$hF9)4)9Pt`749#hQ>Gruvo+04E~dbF*d zldZ;GtCLl@={{Y>h28eHH^Z>5GwRa>T)G;{1_1m*^P z)b`t`BNm=Gv)QNgdQ@aowQ{w$vqU$G!%K>+VsvMCwcS`U69ilm`Wx5H1GKe>7h6eH^QN3;AndCQE_QUk2wp3dFH7qX| zJcY#X!PvZP%(+x3#>eAo>f@0aK2(TfN#US2=7bDl`$i!zn*6Z*zpy)d0kWTWzBte) zEtuCi$>r>|6l$3GQFT7JWf|3_N!G^sYG+u+aV&^yYQf513W4>QagNT(jI7;ZB-Ge! z3CnAL2I}(f%3~XCx{kp#n(Dn*y523TpsM!SM1vkydGI z?8Xi}e#MoWN6Rn(qQH*KMcwa=)?V8%j>K_uM-OaImG4Rna5N>}Y37e6#Vy6wiy)>_ z>Vomced77#`NFxXa&LJ&?IruYUn2ZnhZhprf@ny1+M*VYOk`YHNq7%!p#nE$<0{yR zsa0&g&DC`b48Us=+t|W)b_|ia0@gSF`&-n3o5u1smdx0NgmAs6J3$bGa;jz+oh%Zw zU~3&zDNt`JLiV^(eD#bTE9tro@$#^el1dv%=G__0?qG%T{U;d)iwhcZ>u)R~S5Yvk z2_CJ-&8(srfswI-A%n+lNg3gBuXGq{$5XS!K^{`0WNnNUO9h+Qn`<=k(+(k?57~o2^O>Qs(Ya#kybVzMapA*bG(n^yk%jnD#2c4j4B> zAmbgyN^a8JNAMRwX^3+Bo-8C+=<}foJV?&~CIo=EYlf<|MNGRH7qC8?bRitugk&$% zh3if*cXr6m7scAmxPb3k=bSf>WD=igYI}(i>yFhDkIN71J&rs0nE&9-zwn!tE{}8{ z3|7MBqlEGy*&v(H`#NRYqjH{FC)lD^* zQ57SV6Y#LACIv`gp-nwLmk{2qvJ#I(PCt62Byl`vE4fxs3pl;LzQ!ohoiW_m+HxofCYPGXHmmpX9)wFF`S9n5HQo(=tfvw4>-7@mn%rLBqk*= zbBd;8vTV$bx89GSwJ^jWGP{Ax_%b#ZGWs{FEHS0%tOuJdU;j21xV??8(2k&!C=8=y z0MU=LfG)J}{2KJRmGjYNU$`{x@4?#69k;acK*v~dKCNR*f?SY~lr>vcX&ee$;o~D9 zCq%*^NQ9JxtI)*d(Q4v{Tv1tfn1PX03V;AXYYh7^&BuCM_OQ zMX1~_L$%HDH63pSJpn^_=#(^ai2Q*pp+?*Y(?(3T!y)Rh|89D7!k{UK+Qw@xt; z`;EJu{ZYZ9DzOmmBR74U%S%s3Lb-#v#HseXGFu4_0KFHh9%L?0G#y?W=a%6VE;fOpgs(huy^%;BIB!G>IbJHF`}lb_z9`^{^a0g_?p!o(6Bra`p zT)oDp#CLN$>D|d2l2`wdJ$=tTYEc~h#6N8e$WLYHQNXnX$|NNc z=bjWb@b^O;6B$jn6mS+_3e!r@tl1dkRF2}zDOR|j+h-8Utufus&K$t|WUTBr z1;AwC4}-tDWG!k5@Gz6+0zb!>BQ%Jt-HCRK9eWepq3aWGTN*5GUO=bSCs$v+rdSgvccw%DRdRA#*6t7JH3&lkq5OBE%^dF?0Ls zZBN0h-}OWaOg1#HN7?6o@Bf2F3{n>lwrS0!hze~cT=j|)Rg)w!$ELc?f2qJVFXy;F zR{yJ1`^v;NoyN%}=AY@Ef^uYYiQ{G-eYE|T4-1Z{qw4qTzcJCeN~KTZXst&?Zd&IF z0Bo(GwlqyhP1Iv%6F{z?_?5AC03&@$wu9^9V^=Mf0N1Ew#;q!I8&^B?kRShUP_35< zGMU3{L`*;7RT=r3Y)>X+^Ph)n4EX!uyiZyuti=A?=3RA+6$d#o)s{$7XMYnB{Jw($f|4AfM@aOXV5F2zE{O z(a&^s+2BrMh};PI{7g2VUi2%sr^y~S%rbvImbpCpYiM;_D@}prT7H9&zlB_LztaKX zrMsoJj|5UM-Zs4@ep_B;*~K_vn9R0p0jf^k2?4~=1bD&Y2rkT#xqw)HjqTnD(=n2A zeP99I94Q?hZy3De8~OXY-i6ujO;u z4r5{Yqjuh;N55(|-@vgJXrmr7sS1tnhuU?7zOIa2Rv(bMmKj2r50{J|!mU2J={*_! zJT0QcaWB~om#xA!^-q_7duRV$`(k6vHa z#}T;uDplnS#8)Ny_&H^Lt20pwP!*bSe9uj4QkwxVLK&UhEkv(8E|IQHvp!dECrqGW zbJ=G2YFt^A)3pJiXcx?D+@8$iPJSg4q!)cJ5y>w{#%}^tvMBqwO4JJoH+zHbfq+vY zOmQsK5t8B*%axAT!#A$7x6SHur?5IiIG9J=W0dr`9ci~gh-Rh+7!D~bq*ZO z=h9u69UBx2J{x~wa+74KQ#*Sd#15`ZE|=OWZ=HKJM^?r8&ezd+?i&4M?9~*U5OuF5 z!9r5@y4gT^72JJtTXDVtrIf||U#|Y5Pye6Z%4P8lU5uVj9gFQ_S#Q{!7Y10ES(j zQ3xei7HqA`#qbJf2M%{aJ;oYgHHyh79Z1D>m9<)NzU^^E=~Am0AFX#I*gzky zXHl%^*mjB9Io^uh?mz;MSqZmdhAP?0$1KBb>*aS*vN&vKBBZA^1$BI@ocic++ixjLv z?B3z6zm{A3Hdf5`^3myim#xvWZNW{xIO*$Orj^l$VTluVjp8r6x_O535bH}ZoX^s| zD?Xr~=?QVkHpUvg!6o+MHGQ!68lLq-vY4E~&@l4L+e80=%MS?rlb&0oYW^7b*!6LL zWLIGttNV3##`@C9n6dW}$fAN?EnB8(!!3cT~GE;woR)pRjm0ni*Kv`%R% zb#9q^jxh7|4?DELCN*=t)b{_tlMokB#dkuR!lbDxn{!QtBPx5-o{5vv*NQvpYBYK& z{gpH)0hsSzCWdZIaz!J?&T-c1KEOc~(P&9_ily&(b-O*Es6tBFS#Rs2!j*uHz(;SMuF#b%-=)##*(3|n zS@9kPo6*nkg(*t9G8shAbtPtVUTq1(@C544& z5?^30`1PL3pvA*7xGoQ?NkR~*advfGjeO9y6chS#!6X*e#*4}cTP9CI8RpUXL~#2i zwdkZ{#Z2HeQyb~{jVDqyi=oIKmrZrchOQTyJW|}zE~FO>#w%1y!z z_jwr^C#rQO!RM9Pg1y>~YlqN)nh}?bY!pkYoj_)#4r_AmLO|lfg%aTNxJGo_kh|EE z_$W#@g7GGcf`86K)ZF4NOT!@i!=^oRBpC+)@JXFJ)2v79;S3tz@9#?CN^z!$5RKXUJf&Zqqszv7!A8|(P! zScTry_Zg$%E+S_*7j>6BoHvp0x9I=lX6%eF$pm9;@)4hgpnm|3PPWBuo0ti6u-?VN%br0z-;F_?M4}P5R37v2ZCQmR3l4P_sG2ulo&EhV5^CTNyEi{eZkAHh?NuvT zNCoIV=VOw4?36w>_5lp_4Rqgpmv{s^@naV2$CFwBGFv^qW_$o+Yg3_7=pXh4>8Tlh zU@Jxw%cO}XB&65rg7=%vz4$GxoQGaue<)uQri=+68vfKfVE5T?oDf`9LEWkx-`*(t z65o99uG1$jny$~6is2fS{%=PKV$fl?Y}}`4yMu7-0cPHi5dym_n6uU&0P;V3tU*@6 z$@H>q^5MKVs}w!dVvInpV%QDMo0^6~-X0co>t@n)q{xBg=r>#`^o+pV(C^nY_O>HR z=wwo#lCJ5@Sa*rcj)BK3)slyBSkV#jwA|CR%3)_&wr^p~iKp%&N_X*8(-EeL0hJeG zR`qh#oSUePm2ua;`@HZUwEkf_Gt^3-uGs1I4k+U6l;&$pgA?eRc)S7*Wg^Lq4;`9U zv~;G67UMo(YrcqEjvAj|{EJ`l2aw`Xhb}Z0TGNw3c~&c;I7*eDfnn9o%52kxkXnX>igdr(N16W zp=C%ek(KzqAH7M(qM`Rqe@>c0sXp*0=D4$EjLdr9=*L#?fT_jz;(q=-W(B3^z9)#L z6OAe3Ichpsev$;L#aKTnVqdU~4%~9Oo9dn{uI_65Yf^~lJXA39I%ufBbHqH4eaMr#(czk7r3T*4!qCh0Cs#N&S0TC2+PiLc z$CvUYr4@U|l>fq_?-`~Vd{1a?a}P6CMk>f(nvr;m_*;emH#ts8I-K5#_j3y&g>;BZ zB#m5-s-#wS%_kg{U^k6hQZRjOQYm(;yLtk1)^wN|7KQ6XU}LE1 zBnh8YRZbc9II3ZELirXa-$Y2hPnUE9)5SXua^WXyloE<}qS1P=eErnKmK|KPf7Pw$g4d!x1v!=uQ%$=IJpI*}ImQ&mns;Zsd> zk6X|i){lJzBe!)U95wHg7998B!Rz{2@C#F&IINe*M$i1_#&#UiF-Nk^Mt>z7qZNB+ zoE=&4Ow+uQvi_@Ri-u-~;@}F(CG|1L(E2@bHF-g{q@pHsS-dSPLZs0yl48n^G^;msFA@Kb!QvzKYZZ&l_Jwn@McKYo0Ts!80%+%iAI}fP2&;k zP*R>@at%9khpDJY5PA6Fusfla{UwRyOBYEuqi#`skuNksAP4%KV=T)v&`f}d-(Rj^ zr*Qjcy_CJ;edc#Rxj4W^T*TrVX&AT~GC>D8qwJ?kG>YwSxw<4c(l~|@mFPxs@#4>_ zeZ33aq?CCfs=w+i9>_8ikJe*u#sA!9bWYGaYGrfT)UW0uis139FXDwf(;8b^%3`bGpC@3i8JJT>nPe14_oQ&6WVK&dp>E-rM70^%^MH~t6EReU)tOG`%; zT#tQ`2F>85=5zHkbSzp*6?Ys|AMvzJ+0jzkHv9e#dJmlWY|cd3#=)(ghG(rVkhmlB z2tQRIZiH2H`8+#YK4`pJ+d}14?sxv~aKgRS0E3Buxl`bukb>@epByQ=&}jkh4nk1_)1MN&q?D6cvN#qyV?r(A zt(Y8JiKu#J=u{2&E-4A2e-&}7XuRh%uWk&?+a4}#82%PNWk62&XfTZ&B-J;v5}6#2 zLd)2WnY9(KsX(ZBzh3w0Ug{VJ8|PKpY79&>Lj>#*P|<7DTDUG{HFg&-{7%g}eORPX zFPpiOn2uf$Xo=0WHMOo+o;r(}6ISok4J2*mbswU5P_HqT3|#J`GN*_ooZHKfd0XRH zMXM6ryu*W14`2)9U2|U+J9alc%wgzlAY6E6+p*A(X|y!H*lL zEP4>wci?U&s#U&;5#zoQV7!Hv`Nn6q(K2>J_Mu4Q(CPl?U2tr$M~Vu9(aLuq_^k#} zWwgk8*2TY7e_l52fgH8N3cqt)dXj6&4*Q{P`hXk61hEniR!bxVOWTy|7az6>+6sth zyoKZp6g>2kHXzw#=|>T(kY8FpbS_WH#Nl!8I2fzk_YD=@ zG8J{Fwi;+_hcS-8vaLFCtTXppnt5XVbOv7A-hy>l^UU2GMbe<(0)Nk7`ohDymyrsk zgSF@TI|XF2z&vmzP9QXVJTuv=1kOTk*H-B`;cZFxff)2jdx$v3f$a)1H1OD5#v69p zC$_6PEg>BBA@LDUajsTT-kjx7Minc+mw{9x$-)E=YI5XP%bpEeJ{=Rjq6F{g+{xCy zB4*=H%K!WW%AzN>wWFOBkBFv+PGK!%R>C%y}$R3a(IRXL`qb+pnG)iuf$ zC4N>iSIOUwH5zq^=R`wCZ%td~0va@p&qYcR^kne)x_edmdun>5iJeF=Ir&EwVaB?B zQ%4E9mDi2^T`~Bm#)k~o^f<)C=Vj0yuW(`-GjC^{YxWW@B<2NOs4l|5AwMtk8SByI z*mnvxRxY2ox{{ehDz1^-;OZvT)p&eCQ3}7~cXT+Bj4CD$GGfQ7v^;X<6-4c{_r>FV zk3hTB!lv8fHX%aqJQdCdV2k_|a;%!(On=1(D>Z=acmM0E)+-v+?Zu~&N8|&S2Hoh-Dx@n>Ds9g$`<5aj#dO`+8Zk$rC zJ*_uP%qioBp;meqxT7P(nD$##BbBAC7UXMaP5VppduMJn!xYiXPcHAn9wK)mj##q` zm{p7^ECIiwQm%9xSrEv|fC#59J>__1eig*ieK=I-beyytUQ$r4?OfVF1_#7fCsyRc#4 z@Dk!A9)n`t4C}aP5jIwDt}l{x-!#Hs{L*G{4JDFi^6-AB#45?ymN zVsnDZH)xKX-hQbWvDO@881a<8Ay*H6|y>2hBEKmuW40T55^WiS+6Ho5(#*A2H zV51FUZW;{JfLpxkRDN)oI}V6`GZv(Cuu2B#)#8-_5)%`(`#UYn6795s>~ghpIz;2G z6vCkWk((r9rWkd`3>p(hBI<|RJpYI)Yf?9PXXeuJy+St&&1|5kjq9d$~{xz`0j!M zl(w|HJEGgSb8-9wfhPKiCtZ0nQNf_Mect%qJSA|d0H?1uRzyBPF^8?JN6hZN@QE&e z=pB+U+ny>gW*Kjs(ZISgG08eCqS#^XYT}!Uk#seYC=p3eqS6h_K0KW-@;GEy%1`AcGnrl$eipc0z5Q9{b~PTfhv%73)D%l z6AJD6R7c!YC8FRue^vgMt@W+_@zhi%sQqt6L7RBBG#GZr`DV^B8!G{i>5xqNwjmX9 z-Of>YCf1?NiQJ+T{91=6NWg%fMouK0FzzNeL+}o6`8knc5mD0G?aa$pfhszyuVtQp zve~k}lU#H)=;?ZISuy@2sIi?e<&98}z0B!S<{U*ezA-VZM72-Lk%{=ILlWb{Gq47e!$MAb!L1ZDpIQ&&clCY^?EIO_thsm#Jn);{}b zX#18I_ipTAs|wEkhS-Ns?blw&BNTE=iT-tUW8~;*=OoM6K_prwk(!o7(npe7smCR0 z@%{b!QmkuALrI#pV3Tv^v^lr@5y7qKFHOtpdtV}Nv)cOk{qGFj1M7dk&zIHYY5*RM zc%73QiT`Qkun|>CeeFycYimX4RWC)hO>ywrdHk#S92WIg=W*y$?bi6A-K%SM<Uh|W(e>^t;|HCFO6r*3y^6RR}J};==V%@ zAGFfZmipdVU{G!|SK7*ybn6g41v1BIEAWMFx0YHd5+hGAjgtyCcj6QHY_#Nx$P}i?va>#oHfy0M*Jo$Co@ixR*a!vT`z@bPpC(%}JlDe5@v)#1;^ zyt$eTw#Cd=rp%s##FY#ZN#=wN9R#1nI4xOkY@N$yvY1u}gW1c3Ob47G%5~&9o}qG@ z2I#gkTV4(KTxnKQ!uIM@dd?P5+6ahBX&tH!c+F;!QP8sd^WmYCkExoN~DZ&|EcKPI#=B{gXUo%#<&+ZUjZ&hnIozZoUpqp=4^Eud%`(Mnx z1yEak*DsntfZ!G&XmJf5oYLSBJh&Ejmlh~(gS(U9?poYS@!}3eT8bA6ZJ~u0s)y%! zzxVyleb0Q~J!j_5oV#bu?49gPCR_5~YpwrJGAbB~9U|Zz0Ek?)9UlH3vC(+H5h*oA zR95c_!*sfo=EGzvs}%I;tW?j6Aan$u{f&rK|*R^dLy?USYCS>0~z$Gy=nc|tqlk`WLkpY!rh98p{8!Vc|Z~(@yf)l7;* zd0fH62b%^RHQ9?3SBb!tgw*r;z4oU5(K3uC5sKX50pB&dFHI!yu)aX374)54HvGj@ zvlF%**;0P({{48`5Km~PYvUFSKx&fq^c4}S8edp4jF8FMK9iSGB)PN3yY*$%6N`qO z-tgG7e>YgEtSP|9pK2oN=C{m;k#e#Ud)M3kX7)>#Bdu4%u@PRt85D11abQ**+hL7m z&_GE)8Q03r<<2so$N6{_$Oud$X=S8>yGeMCA0|Qz_L}SA%0NXBc2!)E49pkBBpkM4 zOHvRC%T~?ztA>~%g0-xWD+5C${*4R%Zf^jcJjH19dm08#eC#Bs`IKu;)?P^lL1{Q( zHxX)2loK8q+Pn4$Z6fA_Rh4QP!$DW zbw(o`)WjAVrW~v2tt(6CZQ|4af+AImdwPSrB4Bau2ATj)17&+_Vf}>oQ@jYvYuCgF zpmAQlP@OC4NqR;}Jz2~1h!{k3kF~7PozQ5N#Go4ht2u!5YQ28Y@T~70sq-8ruYI<34q23-Q0jc6rj}}y`**ZYFEvCJj z>;)=JvY|!-4WXj;uaZw9HDn%?hR}{(&z@ReQZYjFXw5QmI7ehYQU{kkYD&=VkBv{+ zWunlg_}Y(QKWq5f)VkW|9()2V%8K+2nX8paR&(PKG}Wi^`U7|b1TPT*(9Y;}kzOsO zECcL}1g9%)TqzMDXU9Wo@$r(k4!4HN>P9{i&PG_k-D!qf6E=cFqn0;{!yZ;UZ9@B& zc?6!{ovcn(O%P~$Cs#K?Iw$o-g|&aSkO#0SgwSSj5xdvU4I*P)48|Sp_g7}87k-F5 zm<4j+mN9ucK$OY!gT9&Hx?}*XqTCBs_ue7tp$Kz(L(0;N=b4dg!$uuT>#d0{#t&F| zWg8a4Mmzm9GWINlzS@gx?8o^ZPWqv;5Xl5O6Fmw+Zl-lm8GbCL=7U=_)PkaSCUbyy z%LKhg%tl7HRFKiFS>Xx%a^4EXQ|NF~f*1i;VJUu|Lghaq2zW zt|jQXHr-;s%JP_}r%0!>$Vz^R7k%zNysDK1vX1v=FB!rd)S%^W5`Qao<-M`VztdwW zg43|?E-PX0r*kx>Qn)w>?B9CTzqItg z2u@`C(>S6;IATHr?!`WH*HXpNy5`N@V$LW4r;eb>V1>Bl=LYxD^U|hZdQPfE+U*|H zZRhIyQQA2qEni71LI9pflOoE`xW#p^BE<{Aec{S3k$0buXo75w2(^wU+CMmvarp-@ zE2rVR4=t_aG>Xke2V;X<`+wrzuEd`-)aU&k$)6{k|_&Wm|mZ}B@He&TJMR;7y1pE<8*y?p4G+0kmW?5HuG6lwM< zWh|0UsHV(aOo%kCvenC-8tTlTw6sAo+{Db8JgvxHsCF5jqbR;X^r~~H$#qcvT8c0n z6S1yu7Fuimc3l}~7w)c!wzindnAtZ*A^BXAwn)-Y{bGI((%iMFU3WkUIl`d zO4<;tDj0_>%!N(t#H>ly{LTV|egt+!iQ?2!u&a~u`VwDontO>qC3dIpf|!lHcQiTQ zF3)Vl(b$05t=!!f+df#SN26du0OhS1a`eIKpH{Lkv`j;t!&AwbE549)JI-DB#unY~o8#(58T3d4j-#Dn%qlKE`Z$xbotQgN^w+>@frE?_<#)%g>}S2QOxL-@i@D;>;TCZ*-&eYC zhR-vXo5LaIW#L!~sk%_{btK3MrVX+c>9Z;Kd{`-j#-2GRI^EpiZLtT-*SLHgc5{ap zzC+sZmxI~Z?P@Xi52)E1;OJJS)2L@kX|`mHvq9S63CWV&dG-ff&jEyoIqEF*C~n@l z06kzyqc7$?!Q*Ye`vXVAm^!Cy_p|lc8l_xo!o)Hj@i2WHF)6AhrU@H^GOB&ubxx(Z zEcIWyE%~IJr_J*tp;7Jj_bU>#9`DA9lRNQL@mi^^7|iO*|ujcP0G6=8JKh=f5Wk3w=)b!I8q&U&9h ziq8hSgepLbo)hwWRg9KNIv<%lNNqX42;9v#6*DwVUl)xDkzV4A)7CRG5WL}KqUtr7 z*LOT0$)S~>SrZ9rNhtELkM8i>$vm-Hd8MEdUeGVB6foCeo8BV3CR6k?t-~eN^L6g~ zG6@`6f3D2&zj^&X$@abSa2a(J5hw)38#5WZVyxS7Wy$whEk)w8*`v6~z5Y=zwRKb# zpb@kV>|Tpi%1{}6Yiwn!5+c(sgwi>nij>NTo_Pa5@tAtNQdLd?|G-~*J`5ou$HQqz zvM!mm=pb<9jL9(2C_iCym&luHX=yT&lwQr6(QAItUZ5*(T6p8vFC=}d;S3%JVxI9d z>X=qHJG)3WRgC1~=NM=}=;NEM<#hBcBtLKxKQ6CEm`Jf& zW$Y$NLx>1@&Ab^3kfOob&-TafAiHqKG7XF0?9TgkHrkvH(7BA9(J?MQN+n71KoKs= zCED`X{h~QfIvYL6pGjbz={o3&l30tO=GF+y0AH>A6q+sRVatun*HL6L z2ysfQ$TL7nCHch{Zzx=f~=BAIAmLb5z$JaboRlE6u;l#qCLByqUv8ub$24t z7gc~Myi}2Ev=JFkEt6~4TgLefMU<3C2(UROr1XT5wMaC&P&|mwar|`eqsyimuMNH4 zjYdQ?2503>i+kW8H?1O7m{n&b^@-?d=@l(DwcC8-F>+%-n(x>z;#=3^Ey3lAl~qz| zPo9pzS+ZOqVxcicAIY({j&+o#@?#1kRZBl0$U~}bSKtpj0;ugRgg%V=6Sj8*89GL; zr)ib7jAz7CK123YMS>u@XC0jq3zq>1axkadl$C-29< zcDx5Q{XnC^<_Yv0Z1!evXQgyN6lM(;YD7J0wg@N3S+WK=5aRz~&>(%yu!oQ=L1?|h zGUk<*g!fwCxqbH*u4zY<%6%<1oYin_4CSb;l0M-y!%%7KE4Z=~>7XZbL2=w6}=ve2PPhrwdF%1+b_Pp->HqsBA!!RuN3j1=NBt8 zI1g9OwdgpCrl>t*Us}zhy^up^tC*2_T_UZXoYtm1a!V-4#1Z1BQioGdv!pk2b0R53 zBXD@|pq`nvBZ6~$&vhW|Pv4r7z6aiewle#}y%NyUX{D483E01SX)f1iszm{rUcbsq zo$-srJG!o_Y915et8s9Gjb8Pz&(7>snAfD=W!$qEo{uaAI;KmMax>d4byT)c`hu5DSUM~=n0E~1DI*vYiw7m?KG6t_nIgi$W(s5z<#N4Dc*WB0~ z?TU_ah=ng#_=0AIHIe5fx?LRp=q!8|Zo8Tqz#o zFjsnCD9}>Fvn`Jv>_BCk?hvl~Xne6t1ZI#eRD)N!A^)jaV!~M67{?OkktVb zMq%}3!dW1#4jLJ%&6aL8&zhAT-9^J(CbR*xsp8q=gg*tSD9uT-j^Tvdo`Z~xZE99} zL(%%x1dV3LgfL~RG)roYh>vcI+x#qe#N8TFX6Hx$Y=%`*HWxEEr^RA_v_iF4brCIJ zhtMy>B`EiZ$}F6JEXzFC!n2Fpb`^leX%R<}IBCUkl9o~y^I%AK2@10E;W{-`wg8Yu z+T>%7VG_5qq;cRO>fkFJb@X}CDXh+^EtKC0Jnfi(j_(N^2Ez8?%R<+_>$e~l*wKu$ z$yLC|Gx#G*12Oj~vlY<+x55p(V6A)+mzb5{MYgK+pE_-dZ{i3`Ctp> zi1$m2;yBbn&(<;CPoc{zWCwoZjV7~}sBygdIl$SW!$t+tU~9&%ypIFtb2#OX3nbjS zWM&{2Rq+Y)A?{SkB!JkZo{W4THC^v^#9e_WdB%rQt?442@b!A0j zx|0&+SPb!O1u=yI@XpYyC#zxT1YRY4!tPnNyDG7rd0u!)ajUy)e{B{i!Ck9+^)B~?z9Q3RTv?X1{k>Ut9B?@$ z8!qhy*;=-iu33KJ2_aE82Xj{*6PHsVYn(t@rJfRpmuP_|iZ`&^+8#GzH9im0Dk9fah((s%-vnunJg}V- zg*FnJvuf`?O!^y%ehr2*$x+2Yr_yUxj-^=v3q+w``Kg@pSQr#Nn1y(QAtimg+~Xn< z>wMBJBxfeU%XSgas~TJC@F(2#EtPJ*V-KzPww&CKaDT zBX_Q=Z3vd))2yjt+L2#!9Z<7+v|GL0!eydTxja^opUkAa2x1Zw4J!5E5}I0Pj7pE< zz^FAQ;^vy80JkF6THS#;`K= zB#*3Za5#K<@Z!K|cbL*90b$eYhm4DG9jKCmj(s9 zMn>8e(HRIW%1lqUZ(e~LA<W_$ zgLtKxaL;5yq*3SWru0V`3S5HZVW|D*$CkI1OD5vMKe+_g+z9{?;)fsJ4v9o)W6wuv zR^ZdS|0WIg+qeY0B$7paR`=DJb)oJ0A2@~ix3bi(&n-%msA7N`ILDXL;BZU1ReK0jrhM&j zXvVVLm3#d!FnlmPbe!3at=j_exfXil@M?%y#w#`kiLWV0XiqxjW@@igNKcYGs=vtN zm$lF!&4u=X)Pa>*w|Q?a>lAvKi7P(bV7g_kv&onbC!}$rb#`MhKkwJdLU@p`=GrAs4>sI8 z+Z|3L6Wz(O;y2i(d`BbvEh99JAeygxFwGI0F{X3dh|L8g&+8m1D5QO4E5nn=T zIDFydwk9%*vg4(IG!Oh>!|-!SvEeu{X`GuwCNH>`*!4XASUNM%QUEwhBS0c9=1x@e z%$9)J%}K3UWe3m@M=k^*YCSK~@Sxmf%6qTM)See*sc26W%zCJj!7$ng&J5^-e3TAShJkxuO+s=FEHN>LU_%`JeEc<$jqFbKn6Xq6(S6b`Da< zP_lJ*a;nkiJg+$&YjE-c$fmWQ^T9MUw{vCbdCWeq?gWMh3{<68HTLlo4=KWGJL=i9RxL5c@AN9C zzE}h8H^|A{$+Es~yQXHM1}jL#wFDojpkD$LZY9cRkSA>t_vUbe@=o#6>lQyNKLp=D|H=KOWuvxlb^x%>T59f_T_M6*ck zxTs^x;V)l+!}^Of>v~cxeg5C72xRhSW(EeJ27SU58!+kz#^JJXVPOTAM1bfFS=E0{>yRqdRpHhW499d8M3{EIHv`wX-uu9$j2)_dCY{}LxViU6CG|6tDk zuc_3r1qCnUwi<7bhtspop<(mFo%%`~T;WdC&*Jvn#}@Z40Ll+cX#&v5vtPQ=tnObQ z`~g_~ojB|h`W5W59%MSC#$@Pi2(F0h04b_|HiNd{hWMM;!~L|9iAQAxtd5mWaVA`% zd2?|1t#cC7iPbS52LM*%21GO*9fuF)wQa4cX2$pHT%u^(zVF+Adql#jgTJ{3t^c4( z`w;$4)!suOJ}M$#iD-roQ}S4m>kq)~nYn9*VgM~-erZ7l^y0-*1wSg7%JeV3!aQAh zld{3&l+({-2Ds~Dx!V86D&?k_ct)yJG09ZHCMtlp%vF`-}2Lm|85-qf9yk? zF5!ygN4i6j!R1V|j|Nu17n|xgW$tx}N;NblckLv*8`yQmtG*MnV{(-tLNVhi7jl|2 z=8}Ukj{t0m2m$t&4D9py+~CAfgZvODo#lnLu*G~{bVXXkt65U!U0xFhY)>LiS77N_ zLw6fFxrLghnxhIVJR6k1oMbOKz?fXtXe6=-i(c<{u3U5lJYr~P%}R>{wfe@q=5>i9 z1A7r98Y)p!4s+!0nk0E-8nVJPoJ;V_gB`n9)?;r}z3afM+AH6i1tiV{&4qaC9~SbR zjq*@*+Ut)U-MR)z>x?qxTJVP;>5_mNcCOroChZI~jQB1x0?s0_v)JKX{h{V_n2^ar zX{gvKgX_m!7Yqi;&p?(|xijdyP}*uZNV?_#(K7U0v$ssXy?y?nRl1K87CD=3S9ibe z1(RU9tros_$5Xb52aIi!sp9Z@?dP*qsZdwi>v2BY*Bl8Eg7@jc(^iL{8=$YU%!9RP zi=J8KXj7!{j`7tKEzmOTl^UJoHP%UvG0V}y-TH>nYj$Y?>FN7QtSRc<87N^Tw-}dw zZxObjB4Yst=0r299m~{Z`gJ+6=*k9Ao{q8 zuI&HXW<+$PedorsA_!X1S~%tZ2f*_gS@&Noo=n3XzWeQ$3U!i8vF~KTugn1|pCzpuG8G305(m1QTEF z@t_rnXy<&%&uKiiop91pL(Xthh2o3LFtJ>Eu2)ywoZd!yY_Il8n_NUs)^=_QIcGWT z4p2jJwSCj0L<%#LY#~ESh9kppq@IgOf5CA9DcnE$C&mh01=V2Sl_5+-i!A0jem% zISPRypd*Qrg<(qHcLpJ^27NPUgl-)f{+_0|$Yui#gadr&?f(FD4Sou8vbYO=dGV*> z?SGy6kButrDhOgaEBNO^t|+?~_o_ZJ%wSd&+MJnaH%M>Ecwv7(zxO6J$#}829?q8m z8NLl^X>B;PV+y>mGy)*)`cnD1cU=;rh*?5PRAPx{oH(U+XHh~kyCrj<)+D5f#427B z*`3mrheIV^RhOY3orc41ZiebUQ^%vgc*Iqfh+&p=G?oY*lJAy=tI*nw^L)^@zduNL z#79Zlt#OCSVg2iG`a@6G5QD~PlLui;RztBDpOnzQAsa=V{1hvEU5?ntcgXf%?3s{$ z0MeBO1*5)wY~xsYY9&v_<*jvvc+HFR{5x)Vq+vk3<*v$@laB#Gp%h6_>)CdB8QYF7 z^^YGmpE{mYudWDG{E9AFU#b8qtJmAK982q{v33D*ip*;2AYf={RmHuW9W9xM3gpFj zWw!$C6D8QZ!!-OlA(8FX9C_@P>Yz8H%aFJ&DSCR&PAPVR)lUj$(C>d^p4PAI7gI{n zTqz=Xsrvp%UMi{^plL=#PeaL`Q?g2#U^OM3n@%*tB^<;c662}%QZbqTTN%Y+1aYl* z$788_KUP9se*0LlFH}yv6oYkSaHf}~CBu`yC;mqDjDzmU=dyD$2xlfMXCRjHIYPve zbE zzF8WB;!C%f_DL`70&^_p{)&2r$@2UMe zCZr|elYyaC$+=t`oD;rzswd36+r+azG7GqQD>^=`vA1wqT{6p)?9z7%q%d3iGaUfG zVTi($x}n_>ERu65)h6j$hdD~xISBhInYRw~fYl72_r2Z~E?hV*%518GUC%%{m`9CS z-Xf)}=rz@n=YfYZiFk0mSJbN*{Oeg_Dw?6;s%086N1#F`wDGkfQ*3W(1rM&DxT39n zRu3`G9;c6rKmkwYNk0Pp^N@pk0r_AL1a~wFZ}!htud$S-PH{?p3JjR=G46{cXPNO$IoNrG|mjG;vG7W-icEb1o!Y{wR$_j0|DC)sDyG@G#uuZk&CLt$kPxrASaD)b4I= zcuTz<-V3oDB}Pj9&sjyd%IqwE0O`yTqYU{VJFV>G?md~SNi|2xxHk@(cf|Tq{s3Yv z>~vmbmyT6q+b3AszVGhm?+F0#t>64)pAK;!;Tay&Vx0nY3(42Vn-%4jc!n(EO_AT< z{MP{V-jZ}^yl-}4jJ3sUfF5kKIu_U*5>zHm;<;e|Ah+;6(>yCAKSw{KV$bc6L`fm^ zB*8i&9A`lhHe**_YRGA-W1rDkM_!dNv<%OYu3;V6U98on9-37VPk%f3U0yNA%by7iy9le2KJ8v{n@>UDz|xW65;2wHd8qh>9|nKx0(UKGbHslVX+-Opn^;p^U|E5u!)wbN7~(~dIt z!%a*cTn9!d`$xrz=h4v%+ZPRk$DJi5Zurtq@cauhkZ~~X2nmG_2m+5iP++v+n$L0L z60j~r{HWdIci#DZPjdAK#Zw;)H5i}{$x?1EcNMABW6&-E)`TWK-#u$4mDbV$@m(L$ zP7?{7e%TC^MUt-u$9jD$%z{2T8n8<=N2ONcIw14$*u!51$6sYm{q+ZmhEc7TS^ppx zl76RYAv84hok(H6l1F_81M`M;jKTOyjObj2dp0qjTG5mK)s~t+!(SbnaRfMZt$zGr z`u?%CQm@{Bbbf*-$a1N&GjpFszuFDDwthl)|Npa%HJVd>1_6F z_%Cp$$*w!KrFrm7BKu0`f`&Cjd|}rhN4X{My2ah)>lAl;I(Z@Tvf1_gQ)qW!%}i^6 zGirx^%yL#A4LQ}ojNGY{oFn>#4OOe{^|1uAu){n~(lz zKryg<%9nFl6ERw1NsN2q2`pvl&1LV`M<9e7+NQM3ZXD1)0mgc9I^{zZay{vih{9*s zh1u?QZ5GY~a}Cc>QQhn`UCpQbcWF8${1lH}AbW3#{Dl%9-uZ$0Vmmb&Cwb@9hr2|C zE<*-xtSV5=MEWJ9YCp%LXUEeLp64qb2D0a0ItYyMa~bK)bGFY`k7~24JU_+P9J0V1 z5F8S;!%VKW1z3p&X-FCVL+yq2yfo404-879Z>FU4P80&WBTpGNVbKK=&I(z`LDh4& zkQ!2Cd>99rm6K0!`B0nV=4WA_*Zp^=^d#SEg>2#yRrpN+I!5R^YIvf00u0Iz4#$og z-*aUQ)qTENdSpIe8#Re{Dwng(V1un`d-j?dwENpYB$M~)!O$Q-O<#0=%G4dCjV2wn z6TW4ii^DG-HFyc9> zOk42L&1B}DgssWV3%bz#d_xsf_SAr2I_Ks+v*p9@78(97>N9bX`Po5ZP9d-S-kwL} zG~l;a3lIDx2syljITtsQjKoyG`>Y3c$C|%S6~_Byo+`#E>%|9#>Tt2u6!!ok|Fkny7^Z` zaTw%~Og^_*@?zeRm!lfXAix3Mb-@VPu{{V7hHfz3lF0-PE zYEa5*!7oxnA#^S2RE}l4JA|cElC-xLB)4ZZMnt=3sO#mgz#r^)}$@PU7FE_5yr@ z1dtxn{frf$`|QQr;Z(zmLzgooUju~ELMGY4LMZ!|B;?}rv?i6r5Yn2VK#f6G!pAza zQzHG*Nu6ebtX^suS1(Dg{9uQlztdtF$X~EigiSUaxoc5%P%(s8tb9h>$r5Nv)tk_^i>FmUFkLp3IDN1&y zFSR&}bC8~J@I{B}kNUTE5Gr)gbL}m_u&UNxjl!R+}smHanM2x$ZxX1aJoIg zagpfEW>?GJ;<+s~XRtvZiA{DZ*c^yw9T zbI5ceEEq<;^_ZiG@ZjR!&Wm7hpODkhpwEUTTMfyOSs2B)DmImP0%i5%l_E~CIfUF_ zO#NLBv_FAyJPcHlB2iSCZegIp&X!5X(s^Lz7w^?5%|mVARe2HXm4G4NTyPHCEz4=W z0&bqCvPt4s>Ba8ujGS#@Sa3;rPZ;Ani({g|>rPp)U8YPUGWr1L&GrO1(U~Lqa8Om5 z`(5N{Q*_mLJ+rRQR#=t*$ZEW}`s8G;!Yh~IZZnJGyN3Cl&9mb4qo12zcHKJHUh>M_ zK0G6(QLb-I2Y(x;b1YR0C}!?r0(Pjbk9soi8TgDK{Kc|D3^lCWb+STNNL7aC-Y*~j ztKoVjnCc&qL&-D4|9-xb^JVP4HyySgc70h@BD8r%C94dQJX>zb*NSmtht@UNcT??E z+3Yfa=W#>V-G5hJ^rYZUyXi)oiHE=5Q3%F&n1g{(#Ru4}F#z!Z0(H$(s9m3}Mj=~m zK~VVJU!!Wc>a6*J_lNoRibkAK=d@%qvCIx;L(nS{zV3C$t{95VvdW#&kR@nt(adzz zAl0IW$X6N}HHz09G&sgMY-xR{hycz0kQPP|RK|#LAL>I2lSPRRaWzC_;e+cf;ZiAz zV3oP{b1R#>{(@q*WAd@~FAI59hI00`pTUOncA(=GSy3|7$#|JaMF@)lW8(o-TSur4 zIpIQO?w#aY_FdIIQ=br^Z9E=J$bM`MBLz$;?Z%UuT3Dcy^vl^{w4>W;xii|8p0pJm zHJe@{QK(+pGJIe`Af-xTp9#$u7Eg^rrvjsW-^xxa6;7-C6*^=RSS;g*@yfJQ1P331 z(zoh}=SH8`(+iRjm#_yE?7&1kC#2w!c-HZ*^)q+jkCBSmee*wm6%!pumIX;KT&IJ! z%g*knxhc9La}lYZ4Rzql{~6-DF*d4UMYm>!|M}kSe#xaFUpXCBbjbu%PyBTB7#bgG z`+txMX~rB+ThiixNcca>ob2#H)Z%_YPw^sSSrAfv{{?YJ-Yta z0sN+^Xfw;_Rm2Y-_F z-(^l8%Nc^e&=>7hi!sDy%^K5>EaLJso%cF<_ub>?QJxLTuWt@3rn>u2x#b~+M&V9w z&yC_Zvr%ovLkY{(VR|mn515P9T}B2|HEcO`YR`ol=PZvyZ*u`5M7Gno=Z_8~7(Xrj z9wXmt4s2D`Gg$xt1gyTb1|71g3Q-;^C3!jOMG29cwc-k*=FNCxUX|_5b7PR}qWreO z_YC=1;}i*^4-asGY>l4ho_!~WrgN*IDJU3Ngsw&a=cyjCQJ>8&{-?q==%zq};MVRU z%p6)w{7ZXYE+dy7km#)6a%WAkRYNP``A`P+LNbV}Zsz{kYd(=dRRB4~jV6~AfY5F` z?nLT(4ajY82B?zBqM(RMe`K{tl~_RRX4{6cFdj_~w77#4=VVK4qAUx^*MOTVI!>|& zb_h9s|DuwnV`J<@5fO7V=(dWgFlh$nkFoZaA}9Q&VSA0)I?^QzDmk-I%`Aybr6Rq- zzYEtV0@=&f3p9sTx2|-;>0Q|?RSG~oh+4;KJI)gZ6;i0ryGpI$ryUd`oJyuuIw+OX z>Y?;QgowYv>`F?|Ko*|H(R&eH$;QbL(OrC<-u9YX@$+STT-c0G;?gHWm@|`kyZ(I! z8>_~b1Vmt7X7%AQsj2_UC7e9<+s|mozNS{ndY2|~eiYN! z+1DTYOzdd_1yG>1zLc=;H~X@1xszDG4IFpZ`b{$Eth<-P9y`K`YyV^AgIw2iP)EHl z?MD&qq6B57@s~+;wC}9$6OKT{Cy3IwiF|Ox=p^7yWhFNG4iM0(p68~ZRKzMq?iqn! zP*c`dhs@~Q5!v53e|3>j(UGic;!=`N*sAi}{_B94aRQ3*e%QYCy`vNS&LNtHmC)%< z_{I}m06oUc@} z^MccCw1qFHhJ*O=eSWKJR6S9`@029mxF!Ic_;Hp)oY4z&ZN2z+rFwRzBWTRN?nvA5 zUv65R?EU7aDx1d}?vGN*!$r3Bf8S!NxiZ7fVg^(~jTh=x)5xk)6NMEq;O4!}E?!WZvYfLr&gPVdp{R6na*SYR0H@kj%c^N>% z;wju|!AM_B_K&0Ea>sRg8Q(xI&AzKxwA!TkdgE0=@qw!CQ_v7&BKa>k5S3Juey1At z#S15_4XJ{D)Rx2hBH9%VQhPF&I{$&HE|ZHAV2xlI6=6>(pl?5l=)`hDBI z;n5qD+G@2lN~_?52hDpyh^#bV0EdyQN))i}*ig_%I<{?jN@2~S2=(i^jB~b!%K4$< zm6^QihK2xCO(AZZwn=6nmHgr63&Z#CX_msk{Zw=YZELlwQ;zp|J6CgAa0|FYvUb4J zig|y5AFQ9AHe4(W)r>~a5Mbl^(l=P#&9O9rEVpe&K$2%SHeQk?J|$fgkzKmtV=sBRTKFKK;`dh*L&lo^1*s@NTieO zLi@W(+)Bo2s4QcY)hHX$Yd2AgG76`}LHZciH**yhwq4Fpe*8SVCG5*ezHlXHTa(vy z$VErF;nPTE$}vy;lD!2bLcQwz?UJO-ucJ{O(?HgAa--TenNT&s3;PcGp@fTy;tI>`OK4sT0Nuw0QkT+JFdPuYKdFY z+bWFPDmD`+BLT{Z9hMGrA<0?CW+0wnAU?z_IGEj}HpwSDA|oV!N8L(4{3-Ex!Ja<=f#H3dcRLr!1KPU&s9tpiBH#D}0eD->Z%_iA*6JMAuku zL+oW}SI9Cddi>GPnxSj=IT9PR4-1?9eZV%zwnr%avM!9~A}^=K8}5qpQW27J6?#6> z_B@uid^ohK(3mffcO^s?D7>V`gksd!0w{riqGrVxTt^?>yaFlcs3EIF=HpZSn9X~t zyaadL9BlR&6w67JRlh72!z(cCq_JsGM%0uan+V2-?Xzy0VKVP9+s9+9Z)ppvK1MFCdjKy@UO};L~HxO zZ`_OdcT1Bh7;Ho@<#NeCuU5$K9lDrQUvj-T@KRKFZ05S54_%7qrk3Q6^KD6ZiLr(lT3evieAql!dkelLC23FCzX-kw>|9)xJ6j z|5&R|ULE_-r`5u3o9R!mAI~|Nje}&8bNFow7#yaQPR@7$ATa7x`=R z4+PpcX1b1$h$RQ8QY|sUJveI9EcjkEX^5G_Q>O7d zyZM5PJYVe>O0J^?ic|*%=V|E@_l;grYT-BdXxJt57guRPgHYFri=YI*tX(x65Y8AK z0t=&Eh;%H6fjFXSjr8Z7U(CL^$E+XiXB$!;|C{I5QHy7?3Jll&Am^-Q9K(^7#P*n( z`QG>gD8noJAJUHlE7Qz7J+YGZdg6Me1bXyiX^Fynx6Y#hztUThD11_SZwFQ>jPe{k(1bl>GXi zw*)^_`EBI6Kgu`gxO#aJVTSXT%T;FWwGoA)eRBEK4q0HLZe{;$)wd4+V3gPQF24rC zkg+T4R}Vgj8O011SHFLI43;Tj>xKs}jnB6o$rgBgn?vQb=|1PxL#N*6o=-RySy=u# zVf)+Vmhmg_>{k$Wy=NQY>z1SdtPR4=Kf2sVrYzLftt&Pe_DJ(fp*9m9G4Tod7KD;5*S7AT?7-WVx2u|>3Y$vGna(tT==ltX{bsWfRpiBb18-(#1paG4Yu{7g^+(4Ko9 z8GuU^)Z@8e-mJ>PA?S|xL^+ewQK=(}MpTly+qj#`nlh~umW9h@M?0F=IAPJ7@Lri2 z5<9C-R4Sx#Qv&s|V zXTy+A+EcNLC#ck+`R*u*^?}v@{UB7lm84+EN>Y81%;_2-%8wfKKVN&QV+>Jp-ygb7Es63c(n;V-3#|WIOpN1%2Z=hWJfGEyA(js?jt_U=O7Cephvz! zR=-`JX=Bv=r{8j47M57M1IK|}tZG&v>I@16>@JCVzh9)sIHvUzk9nb%tp%HPl0rJj zld+=o#m!sz55(!dP)lNaL&4&fv@M@;O~Vnmdk*gmquNP55_HN}mMNxXBjzqGWLB`S zMB<^!Oa_C`GHTeD-S0k>4qfX~z%OfvpH=3P7en-;{{Silxxi;~!n9%+VZquyUk${nfwsGV?uoT|n|So)1+1wSmx{q~=jmoNAJk=Fb)c_p}+O5A*)6E$h_RLUid zoG@BBAna$R5K%mDdK-@L%U|xE(Z?W7W(IwUFyZFCV9SIGuAje$QU%UUA}9uT&d#5F zM}phS+`LuU6K#Rp%1VSCpj_K^%vJq24m8E_IjuW~EesR=xlH>U8b7fBgz3};S53Sa zCHWuheFs=mO}B37EkJ-!jTm~6s1X7NjnaDuMF9n*gMbuKP^5$Ojuep&f{HW|MNl9> z=q;$Af>aeNB&eu>cPA9_)9*XyKllFk-1|I-3_G)D*37JT)|xeIW|AE(@a59Ou2uGv zopNHitUC+>Si$q=r|5RQe-oMrYTUaDldy&yvy7r0o@rvalV*Q&?55wXT^`h?OJz7l zODR9byDx6C9hPB|cjK)rIFwQrDjXxArU1UpdD2Z-PJ$`x{2BKgX#Ctex6(Z<#@yeM zUJjm(D~mm*`i}eNz4rK$dy=Q#>%`}@sxMgcR~Z}^5IV_KeO)k$+e6M~KJLMb?1|`C zg7&kjG%xuC93o~JqCYaR4JzdqU8zQ{Dl6@D?}$&L?^R8OH!;#Qxtrgs98rH@Cd(S+ z(_MMc>0@*@jZd-f8P&HB=R9;C+my%6o4t$3bFNvbxt@}*+3m*e>s=(5p_R+-Z3w;_ z5%f0SXI54HDYGv|zSPML@Z6JvZiaQ`3grf^XFidmqiZtk#G9n+=`H2 z{P3NlFJ>3*d+G7SoqO*-BlW5Ajeh@BHef1N!F1h%-EZQea_%YKSR|yu{P@!5F6GzU zv0JJ6`&D>qe9lWvEiN@4+G7wy_&*y_#M!)xXOHT$_6=v~73;pM6(k}fQ(Z(W>&#CI zaf~f0kyoWM69PvJVtjLI2S^1r-CF16WHN+#o}bpzQ2jb(BN>tYI8$My+xeKqr0!vh zL8I0#-ODA$^VD~{QmK_V+34hOSFbl6wBF6XSJ5g%;?P+`jVInR{OzIi+sz!lv%2t1 zZ%e%hLo8KSMO~&(V@aLcDbTGv9wudxk2?%!ZPP*bdhvMQ--$alb+e{2T*wLaZ6!UL z6qak}ZB}?;8GHxBb8Y+O`2!f)mwPW&n!Qx;yH{bqedXr<)F*oEq5?Vb-;N{(J=gSQ zevlDz&fGZuf%~z(jG4y~-oD*t$3wi;MeL?-iCk*34`8xcv8!jjks?^c$=vPj;H<@8 z`g$pkCgv*5?mR{9lbIYcJUeZggN)|sdwjWa+k|IYGh(H<3J>(~G5PiyNZt@GwU@sk z=r7oLz*8HN(rG;P;wHUr+YZ`&ybk%7%{BJ#KG7}DdicJ-ZcW`CmM6C#JxusMd5&AL z+MHjvGpyk=*Hwj~SGlC2uPY64yl8flVza&;+qQ?)i{gacW4Iyg6C$1L6Bic04D6fp zJ}b(rrw4p>q;JNBG`SEh%Rl3QZ7u-;@5@OSc!T&&FYoHqWF_cjH466`#sogIUU|_( z8?8K3`SQd>M7bG*psrxewHr3A(JXpbMG(I@AGSCJwYM@|OvMNEp)j@G5=dK;RYwYrlS20_J!TJ9P5hcZ_R z460hx#lFQxe9RBC`QH5IByr}Do91`xt7k*3#Ew&Su-T<|Mc{YrIU&&{9qbzraU$B$ z3x4qCL9U6^%Y>wc(VCv2AXE{b_U1+!#ZoSH2&=i91a%#w%X`Gof}*Vn@o*7gz*`xqM=SHI0)%#I#I4<0R;Q z@7~u;pKnq+UFmm~&uh z+B2f`f{-yiU#Q%^^Bqs)CO@`B>I9QfiOwUZv?DQ>X8KY^>! zI=6Oh`={Uub&x!lIeo`&6V4Rgedb^HuKu#ujUJqt_EQ_qx})dv%}`63Dm8`naIYHa zAfE%*rIZgFdr0AKF~r0((w6VsR2+qZ6e@V%&#hOlgi`)Q9~G_zpU4gW6m;l4XOQAT zdg)NRjxUm`v1w{Pzl8BweaJf>`)AF&RCRBO)k=Y2Qa?cSG-J+HA0bVihp}%?e(sTp z*XX!G4Ce_gv}b%8`|4mN<9@Bhse&^X9V=Vlv6;0I!#_Y*Q8Yu$ZmbrD!aR?sN+lSs zI)}gMp)+)S{`8vA-4nYN(qtVzUNStW9sbTMUkGDpD-6MPmU5404t4F(jBrgJecOk4 zfEf|{DtC4v<#6|jy-i&fI@{xU`J)?)D1{86-Xu@91BBG& zxxEbOQ-h7iGsg2&C&I} zO4EVWwq2faXNetR;C%klLOm@!#Sg5;GEr!c*vm9^qX>4`Q2g~1S-Cp~(PCz1ZAPE; zSsc^EPZVmiYH`7|RD#tmiJGg3#&VuR=b9yy-T9RZH7>it>c7lFFrhSu7l(gnrOmLsDe15#g%Vs(2b+C9s)4l3$ zZ4weIqr`($xzIs{7vSFpi7QFE#ZfYkJHjQ<-I6{T_M%77G48cQPY=Xghe0A-P4~cF z)%oM0?T9b-lSozd$_6ISqXv+fo=d{)JA(}c8_ffmsSwf&(MN}}9*8F&J5`Q5*VOFF zFjjmsVua@uqqA7TzTi~-Rq{m+kmt~xUu z$)MLOzESX<_Lc@;PY|~9+6Y8Y+TD5l=c=w=uY&ogDS_48BAs;-xT@T|TXiGM4xM}bIQpgHxBCsweD=aJ@{S*r1n;`CQw4op5i$~r zu97%<`ZgZ(S)8@E_NlK5|L*710Y5+^NUDnsZ23Cqyjzt9Ei$;!AeJXOKS07hU!wfq z>|#)K&MUU#jI5A3L;*`RX~n&kn37=-Xs%V9}LX5~8o# z9mHQdHq_l({89wD`^Di}_^s_rOH{Z0QfX|0{UMFj2fzbmAo|xUzO!Qo^H#R&;v{H8 z%nj+bGYz9hTb$eYcaG}7YFZkVjzVN?lbYu^9#Xi{kk zPcQ^!B#Y6QR^PO2>&QW~UaZstp$xxpeaZ;tYWvDjFvNJQN>w9HcR0n3tC#Dlj0sDW zZdnAiX_Up0fdl4YiY@&)8UE7CbDW|j1I^YjQ!Wu7rF((mXPWep&8C(sy^40!2V|uL zW}K*kbjq1EdM%Grqi@L8Dl*h2$Co;XpN0!3wTNI{x>9ewTxy47hF>6&`IA{nj!@R; zW4osnRce(C>_k|0FG$`qx%tM0r__*C~c_e{;uK} zH3!2)@gaT{Qg$MTB|#Dq2iVLamQiZi3}NbzUU#l6PZn5|1_EK)45oSUQ`|<|Qzt&CuFNv727&VGxhC z{;-YiS!99H+gV9r)tgy{Ba+9xu^cz2@)%6zxRSkGqz{ z5_kKWNM6#+zdRD>b4~k}KVmBDMDG%W%d1d6-%-`U;ob^*qh$m}IrGN2Sk~uzRlh-8d`ck9w`}^0w?T9`4F&b8DjI z@Iqhkopd>A|B4+@8Je*IMXI$$7gn-NMFp*h?k6z)7#s3ZIU{o)Kxx( z>NsTZfXAIVm9@%DmnGthm#KK3H?n^iCvN?cx=ntFObYp z&jEEe@fP%V%HE%88?M{IS$V?3*e6Xt_q2-JcCN^1b87RhhfifyQ>zJd61-uz+pOp_ z_&dc2wTM*pz1edN#R@+_^5=qHW2(&S7(~A<7>`dwA4Xk%Jy+)Mj27KrFc*qHC!k5o zAy_lWbe`AYOle%i+oIY*D_M)Y)A2?_veT0pvH6+pFAoc~9gF0)5d)Urs^H4x30w1Y zc!YX(Z8xHRR7)q*PUkY>i`bPsgS^H3Y76)kGjtHk&Qr9_+|%bjSiEg`5Bz*}AHHtV zyTtnWD`}WXmEI0yB(9IkE?Q40%J7!;MW><|r>6lDpO~7}t}0H1SQxI3-ZaeCFgfa- zOFyH55m+fGNs3(vm!YAZZn@;5nfo|N6cYDT?|RSdTaCmcoj82F;c;buF_uqB+||V; zIyak~_P{UCO(@>uIL36~y+$jS@bD>trkz?mF)Z^=d#QxYjU=pdHMsKLUwLohrGGJi z#yI+PMD(>_>5xyR<2=;ggv_1sf!C8;Gjp`;2y?Ytg&pp@*-+ zu7>EBFu_uL%=m@%U0=!OvOCEJF{Hmp))HM0I@OkZtUDI+IRSerJjwUQ&8Os(nB{)z z>-PJAkH~)bDtSB_WPSa#qQj?sNSj*-qChgn@r;#3zj5B>N5*Y_bQ*#YWewGSX#ry0 z(GI4%a~g2F>+PaxkE1gj-s5PhTs(wIuf+Q8bX5}%e&x5b>~K(6QSE!vvJoDp(Q~pa z{8S#&I?mTrJ<85)$ClbsgR^=L4i9AZm}uv)NlpZ->ma%$v@!V*9p~Xm!?Zle-pHnC z_CD;{*~rYt6(8O;Kfmg-sLrx`-q^7ft;J%)@95{09rPfK8lqIoz-pIsE~MDb(p~5g z!n%^}vc*c_0l^m$w(~O07n5b_k$HP?tVduDgWHNNlXg^Es_fP)D-hxEiQ(%a}lez`HIKzM+9i63B!{2Y4l|wfy0X;vj%!au%&ZX-$PYU;wF=yxy790--%6v}OVItc@bS|guecMA3ct^_k9#robEU~KsEA0i zJ8*vZxO|&drsq=TKR!r<@{o=BDz-+p+wrNIAyLTZ6OV- z3;fO}zE9(B54T7!DK4Tb-iK(p!M?p(IdjizwmW_I@xQz&TM{}V%jx(_-Hx68dYjq~ z6og(ML?6q+;||)*_@Uz0+g`}H%$BpvTpv%WT#1h6W2Zj=0|DP+>tg0*6%~C^^Xj&t zP3G5$Z8xlMevMi9E|g}oBxzw7D&;o5>+UIiJvj}{qy$7!Qk>1FT#@#11a#CROyDD?)WN#3LtgZG{ z$#+OLb0S9TmVi%&Zmz#Ff%71Pw(<0%Uf9%tv=8j}pqDbdxcMUu+;>){?-H0!92N^+ zm3;8nHN&+)#7BIW>H+?jDW#Tn*}clWk;k4}yV#x0?-8qH;oD_h$RX2sNJz{y2Kf9nXCJAU7mt zf_hJCU9FNy>@y+d$GL}{^=>LlP>+Bz#E`dpKzBn_dFt#;j#n_Lz5DEqL3;~y>a|#S z-e?bR$uTw%7LYu`6!&fE>3~PHF00sJdAm5RmFB#`xZJ#-Q051(5|=~D5B|khY|96U z?}HPO!89vpYs*iWKmK`*kVZF7@i^>*L=ZLXiQ+=I9NUXd|<5z}qmY`rY*cfR(I`*k17 z3#GcEFtVeWV%vKWenGOuZZF+>4iGHG9O#}|k2@yaXtlXU@5`dcA?=eGnt#;os$y=9 z`JQQ%lbvW@c0^#?=Jyz;!*5ZE>-i0xqpcgs6W$wtk%id2q|Rp^5*mMOEQCL!Abievl5TQ$Q=HO_jd*8O`)(=?3B^!_$FPK39Nxn3hgeR} zJDK5xxl&t?Wb=eMs5R}2Hj8@(DIGF;^WLa>UJe-(G?l&T}BQ;`;mbsXFI?lg)>SFToGP~lvaA8MnG4tc%*6!E0(LYV%J^%7$ z$9+BKxX(fkoZPd|Z_r~z(g$S~W|gOoYWOsZ`aQ0Y@X%_#Hw%1MkJCB8#b9U84i`4X z+UCa-Z=srp#S|~|2TbO+@(n#mO*Dx(I2*$5B(C^w(NyFS}sCJyFKmNvfiK=37#ew*$hL zYgcpKrnO*}DPDGu2kIGyR)1Us^KGw+XgcEf7ygi!c{Vq1=G9mar8Al-XM-lq8hl|c zkJ@D4%#&9&77fXRwaQ14SF6rB47;AZS5Nch(>&B2TNcaAO)V>AAk2^f@^o={OMl|{ z!XDbBD}|~7ZKiX%nD*P^R#=rU1+9s@L!^B@1S*p_Cb4Nk$JE`!+p=_}Rh7iz7>m^9 z&-k%!dmcvP<8t0t^E`_wUDw-}7ERt4Ls@LRwYCWvdSvA8M8@Ar?4&>AkLvF|~^-+iYLO#;1q^w~y5M!&Z5oRW^tC zL=;y?QG@x%=N3C3Mi+f`pG-TUJq)>!R8amTW0E_#jI}GQHRZU~s2DX%66%(;ke-Zb z$Rp3E$x(R3PN@5$eeq5u)rB2L)WnxmM|5_T@*KTMMGH$Yxj>j>sla4qBdZsp>9aJ8 zzLivErpk-o9(qjsG1lgm?ja58M<0~^&me@ev!+X**%YO@IwySQw;nc`YaRu&9M!aW z2F%XOMPIp$NFi=aLa3+tmyVXT9`%fleDwTc2p4iVv1^P!xl@NmjBn%`dQ#a8XZ3xj z!aH>zlZ$gZ%*3hgU3d;L*pJnmQt-dqFlWf4!;VREd!@%E$Ip^U*f#J1YB$<7R+2i` zR4S@Q5IvMCB4&`h%_EPGTj^d6PWB9U)M!+K$>SpDX4U52WHz+P3ad9CHOX*_cGf{+ z@TLuPjx~GYTM@^i;tSx};P-dsjY|=u{R?st*SaMC97z}43F7!Z0P>pG_iR>Z)wkwkwiK8txnq zEKHz{;*FHlNtYD$QOeE_+m_L+k(=@@ZhRubtkzP%aX|v%SXELW_|=Y}1@1BCd3xUC zI;2O}(ZvbwWITy?J$*y7>b99sI#aYU4_}Q3|1&DEs3Gs$XiZ}ok18gMsp1z4$+9hK z<7g*~nDFiQLYR<`i-*uBAlBH|BK6&^Ef){uBL|Bn)0&uH&6II}7310|&g#@GMyxp# ze@bP7>6n$iX*MtV<+#J{d$z@|kpp*5o@EHHP}lwte*q+?H~BQd_f&=au8iI{rh0Da z+bl29JJmf-RtvH@+c9(#Rq!(Fjv`KF+u`<6FWThZeo$WcQg);#ETyYNRr7VMVme)O z!Fvt!=S7Or*@@+*J4d9>VHmkEB6MoH&c{JshG(jb>UBIPhhlq2p9ZPJY|sVIh5S&o z;_upSM_;|$A9nru@%xYCwl||@Wt8c{Z>ttH2=KJ&Vgu{@HE{xmcTRJ76jwXJaBS`; zS`3=rGxIawMa4;Q4u?vvc+{J}_?-QDzguvy2aB5IunF*BC%v!6d4>_qp$=0E^5aEi zm*LMtPWaZ!9eb_Jo1n0b2JqWs_7>TuBK*IryPLf`+@p~rykwmn$ElfneM#YSm^E+Z za8j*s8i!xnD}*1GZ3(j+@SfGK0g10P%!jijqW7kGus%th$Lv@gREtqw0!4Wqgzif` z&d!s}vC|#Hy}MHx{NiB*%gc5Ly9r`rQQwg_%RCF0)SspC(QY60>oQc0Ik2nRuW59O z;Oo_KF6EQy$ut<2Y4U;GVSH?{SW)DebmGPB*7VdLZQd774*LpU+}s8^XERo~VlJT7 z0;iW;S{>9?bcc7U2@sLU&%%=3S#mxRqf#1~zGqX|&M`u=`xnb@Lqt z17Vs~d8)eS7D#R~Pu4D>QaMaNMfFm|WP_2onX^4S#Cx#4W5BZ3fWgMuG;%Jo`njB~ zO^~X;b{%4%HeQei%<~x^9Cy~vWX4PRT1pr&wtk_q4l!0ZYggD$N-?;2yM0jTgm_8rk?TVsj!sTv zOB*f=wQO#hOYI!HGP4ej*>P-(&NQdW_!hmBZce<1u-m4g^4M!ry@Pj;zNw5C_b)A! z3ox^^?JUg_KT-Xb3Yb_>lSa&z~Ophh9TVwHNh^rNK8;@`gr^Z3su8`Cy zYKw4^dOfrlNtq|&!=6LR>}ig6a0ZSVBi(Y^UiRp-ovOiC-cF2x5*r+OhFPxa7|b^A zO}TI8!R&i)0u44}C>t&=)0A+IM71)Wxp9)pCsK^Bet&K5t%wGsLpN9XPE3IvN;3Qs zQ*`wyMF{k|v?DYiZFm3!F{e5HD1Vs0t*B>Tw0+H(YJ{0j@jOHKu`cNL?mI?Q*(ji!HX~ug)o39C(Q^99k4 zN%fkCl#Ge1M260)+EtCKl87;5Sx=h?S9eREYh=p>z8`Kc{CPySSH1X-*m3cmn}Uxn z7^!?3G9GXFV6uzrmi2ADo72!zqgS%Ay)~M`+Y)5vlV-nH9azj?+;+16Sq^h(><3W4#IK|j-I&_6zNArfSeF#7BW@%qg z6rb>M#2dIM#~y2uXyO4*#IUnSmN-n2wd||ssc*IZ%zQ1VYGkG7zTzZF=qE{7WT_k5 z-Ya_I0<`&g4?s?G@z4Py4&70fwk+2J(H&iBIB1%tvYE@`ZneP)^6H{afyMV=l1jl- z4w2qGt3-KkuFu#U&OsV?GkScqg}^o*bZ%wzXf#DEVGv~X#^OE?dv*HUz}fdbhMPBWLp;tB4wD_NP{PN8c#J_k%EL{F$}k>aXG3coWSDSw^o` z1;Aw^FX2f_c z-Cd*it+(v;?ec@|+?}Ba8#a1@cChfvr(ArK8s3q2Ay!8p-!5FLK%Xy(4pn8cW-YsM zroHg$gK%?xLOA4FXD325?dEtS=SM!@8m())y{h)UHfdFqH_FI0tt2+}UG{&Pa1cF{ zF}s>@)?cAT8Jy)=R-Z_!+n;*hvNsUDm__ScVmhs{ET?|Cqe{H;*fNMtF@4W4w(aFR z7eYl;Ln^MK$V88&r}WL>HBOPtKt3ViI?Ei+V-s>kbCrT&Bz75X7fJ1_if3oqgrD?x zM~?6MhDeRPyxa8Ek-U#giXL=olm6p2AEAqwsdII8S2W@expg5eha7F<@geu=`-^Cy z0Xn1Tdcv~(NY8`UCQ*IayRM#~B5^k&Ul_9)PwH;l)59@m8Zy$142noroa$Bm_*{?Z zBT$oZh@h5d&43bg^P79d+g-`OU65uv(xo&rwQm2MeE>wo&M&5~BHpLdzFmBWw!f)n z6Mav$I*IatnqkMR;$5Rlv)an{PgG?707<h0L0)0u$che`Xow?s7i0(es zwRnVa*Oxs?b4H(UO1-{IWIh*Q-Zgec@WSqzdn__8-vpHp4km!Pzn9s_cw)wHvwRJf z@x~Lb8-IQ6d$fS@lFhLUeAupv5QkvGlQ@;)^K>0nV?2fphm2FR3&Ml%?Qx1MI}DBU zjEv_kI&3oBZkySA_&yn(iwQ1CYp;6cGEfxI3L!~w!I0Y4R zmoQ}~y|^Q=oxBCemg%oz5F{}w_SR}g1^(^Ax8;C`{~eLaRI_^lL7#3i-V*AM!7udY z?OTzvx@K;|k~(kQu#ld{czljMDa!Bqz?BoBGvCYh7G)jWQJWjCJ6yc8!wyt+W+(V&-Fm^qh2R4$Te{3 z!jGpQFbx%m8bkvEfgq%Q?7tNLMe@zM7fJp5@54Ote+@n+{n&YfUwP<50L2!14}N)Z z@xKs0e{7h4La8twK{CKDu%Su4l-o{!Qa=<(p$Xw5_9JXBp$6JPQwczp)FzjIi1c8l z*D#Zrq$RFZwU*KkeA=)7Ah}F4#*hhC&@LLP0`sKgnE(K^v7X&nR5QA&A4cj&dUrDd zl*ETXEq@!560n3=RA@i4kQF_pha_yFBtBdwy&xA9Zo^hFVP$%e-gqRrsx}}IN{*}t z6c8aM0Jr~$s)LWHj-C#}8i%5c*+oyXZWbpO+(1RHk=#bjM(rj5DkUs+Bq%S6Rzw$V z5=%>nga8~2Jp>DF&;ay*36=fG%5HQG9wvBp{N zt7-=m+W@&BJzKCbjc57Gi3vwdy+SF0hlCbB{@1{mdvC9T0C;<3ba zWUx(G^WE6Jc(6C1bfMrHN-h8k$R+(AYTy1PaUE9o8e?lk$glt{{z-`k;_I-sq^?td zOj_Tm7+{DRC>%TAbUd7}o{l)I@E2k!9sOU79=QQBtUe?ucH?WfjN~%^povyEaCJAb z8bFML)sXoj2V%I+T4eJ|tSZkB+o*F5n;sdK5IdA$fC5G`jtxWUSPCqoNJbhu42lu! z*^a7Ff=q`4>H|n?d9%7Lkw3tqj{}%M4|QXv+n~69kTNSgrvE5lHz##Py_qot9Bh&q z4b-rPsu~YR^&$6mgJsmwmF!>?Fh9~^k26DufQc-YZ_r>J5I2Ai0u?t=q4rEY-g+qGbz+S+725^9fR+8I50G~z$-nNFd zv4yDWN9F@|U`>MnTq*tQ#(j;Nuz`!TMnN&?YguGm{d_n!v@JUX*G`^~*8(v-a5KK1 zvSu<8u%s?5dHx_%Dtz+6k`mB3z%cf~Ht7FhY_%=tb%6_T*hCzRh~F%LIQpBo0F#01 zMtb*S3xdf~A%`Cz6YqY6rwZH?x26_Y!a6KqsFEpg31qz_v6FKtuqegW3U6Hh2y32! zLb+}Rfw;mKfT4t+#fh8ZGHl@!(uaFTA*$oCdA-v&oinl__77chnkOT^<>OXwx18LIyZnB>- zNFOyFf*LZw3K_s_)R01&fW<&9^dqL45tSiuPz0P1O&M8jsQESwiHdKilicKd;L*Ys z7%mnzL60T$p#eRVX-1G`^P7n2tx|E}^EvbqadWCLj=?LZomwm%%zLpn;zuT;Y>9BB&i<(u7sI1fPsY zPi(>}RKiZ{p}k|Vp_kAEHPPvKU~~g^u!9&5wFT^`3JMa7v1P|V7-0lzglRo?n#?W` zkTt-trNANpMabNfMFXgdH+e25Q(#E?7+f#9st=1>gY}eFxP@=12bt8$mlVUO#0*Ym z->?@zrCV$xP@EWMTiDMi6OL7hX0%ad1nf3hTHTll156Y*^&tl6us?P4pv-1-y})*J zVYjFV6Jt{xiV%w!T-QR3bQe5G88V@dwWfup0OmaqN!<-oRODOeX9Q?~#@4m4pdDlr z0`p?PR$oHabb~7aUB>^}i6@r<#MOf##ff^8tAMTJ!c&y84^UHJrL^Wc^p;a9 z)Cx>0WN}R~LKc`IDm`Em3gtSi!hWO&j=U=N>;{wYFd4u<{RP&>Ttq2D4Zw;c+ouHs z6ak2=iK`dv4aEE5>&&fbA>io#Qu_RVhA^X;JvKDTVZ8*l16r5CHzbJ$r8KR3$ zZifOi6q|wYh(R}nK{qJ>-ewf`1D-S(fVEjWSqp#OlAZ6(EI?YDadKo`3n_^}udGo5 zu%^P`)9u)W4vb9CT7h*f{G~93`WIM#k=B-mfr4wM@YfmuSO`yjL|zbWiVkfJg?>|7 zzj8{>+X@R*H8>;kvL8 z^SxjK4$`7eYt6zZqzE>`L${)$Y;0__6)u$zxS8#6q6*lAGH(E=00jWNM!;yLu%O6X zb@2i^nAi_^|5(m$7~sQtYz{3z2W2RG51wtvYG5@T3asq5q5}Nmjh6bcLx8aQFo6FB z4E!}z=4_CB1ICbWQO`JNN-GQimJgr;%*rM7G%E}T#!j&V#n)vu)qyf$hjD74X!^m^ z8lnJazo6QjH-Hwyfsuvv06c9#mnZ`NgRID?kb`aDN*rvy3nPtZ1X|ye6%yD^sqAK4 z=*3Rrku?c`D1Jc|{1X-84=NagYKg}HvjUC=JADaFiiZZ1QT^-)N_-s^F&GnS02fih zG%La;RS-=P>#`!x8G2+DAQO`ZDZm^suzsloKvfB>$ne-?JgmAGS&0M7w2)=>m$rVQ zB4_lHvuoBXqM+(S2Z1ro!Elv0^iV&aG_WVo51@kDfHBi-*g`

NzSV0B|ifX(iL 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ⅇ#XPF*z`q>?}LiJwiLV_2ceupuR|T zWQ*Uyx!2FMFXy9|F7hr6Wmkos8?8|PnM0Oc7wIzsr&GI{tH=fw+g8)KzTbG>C7#f)Y^5R{yCCcIAcGn8{>dgA@e zg0JT#Ac6;QD zdH0M}W^iRaL!r+bL-(F!U-~*bCyQUx+^S_s`{oM2w-^NdcwSZj32q zqttEg-OF)xXsZrd2-TYfc2Go+XK~p0{HPUENFSa}5~O;u6RK7IHLDEdHJlJ>6B#y= z>o_hlqgwGu630607AZghK75ZFBIGcO#kGwDb}^z8p`0OolN*8evBi`xXmtm)cGfdlpsFYdTg7wKDsu%dB2A%aAIV@OgZRH9clj{0ZlLlltR z_#wq*7B|0s#T;ail6NgEBqIy449G?0%@xsWPnT6vj<9k|lTer}jWy?UjjDXLdg3To z1ujk;(pHu-WUTWPysz^Y-1ou9;yQP7Y}mG6<1YRI37V0B>w~ma@#e-TV90R1P{T>M z%vZSr)u;Yy`WfmZ_O!Gtu7X(_kww`;687@1P_boe1v#=Y&2uc0JW;ZvXh$!?c$G;q zn_3iOX=^Dx2(Zc(HC90*EL(YTO)<6iZ%HMB6PFH zyNDoY6XQ;7_5!XC994!AOMlKps!I{pYFLZ=I+Wv%UVRJyKrGyI(pO9z9WF$b6|ZDA zovYVgHBzkGKPp~TL<%0F=%jpBo3F~>rt{zYg=sJ0bpY!zX zm;(Ef0_+RfDEf)t3V#?sRAo)FSneYe(%njrjDg}$`1My)gu57MGj199)rk^FSjdP4 zP{V6ST;01A0}Xhl3WMH#P8M_|q%>UW>Nf150PP{)#myI|vY*zgZQNFGQ~VCBjg}Y^ z%gu*8FwMVosP(jbZAlz#p*vNoHb~lgxSX=^@pH-nc*Q1Pw@aso?&!6aVAX-zpu)<` z4A!tbY{>I1)d$j>K}zf7XN$(xb#-Q9{?j#YBpev5zWj~t`|Ju%`<+v^Seo|3AMb{q zrMHZ~PCK~PXI#T|@$A|^Y6&NuN#ZvQCXm_plZ{(Z4^%|MjD_CDy7q$@Zu5}kI$ViZ zQ0&clS&~F0d%K6)AiXxDMNglDYYhk6&!huocx-q$7vvc%IX)L1nr|2 zQ}Q~eG+%@(DH0JH`SM!eJq3urZK#vm4AEGM)4gcT*+z2X+cI|MN~G$I7@JFX!+qh; zW_|cr(JS>D1+mJFJjV+QWQiauV@4v6&ByT zU#f1U-4tu$Q_|LnDtzI6TKt@%#+N{u2zsiQDUD*^^r>~ zm5Xr3f9Z0*%j)qjAppK2YVZ6?>ai{;DbP-i^}tQZPoTt#H%SF^t_8RZ+V9pIqi z_?8`XjfYJfAU!_yVg2Oz>31MOno%tTO2B~=0 zZ{%7vf7&!Fj*@$tw(k4uZS_N1Qj}DIHI;6vWz~lgoG6ma+Cpxr4Yi zLro-9q1?{j{EiWdWY$9G_b=(@N+~$hVZNu!B13RSyt2Q|lEZ9t24pYpgRd;NZc)}f zgd$;>BqkMC@K7?NevwI0(|B({KS@aA?BNiDaH0m;9a4?h^j%CCVnei0L)BFKOOfxr zFgHCY6UK1w*$9f}?So<)N{QLjt^;^{r|Wu9?F3YtzW-tBtf0s*&s+Ks(HXxHFEgQA zGqG&8kZ1OJQBlW@7W77@1s|9fV1c|S?wlJGnzzdd_Hb#fqe%}Lw-fg zlDM(`9v&qx`{My^&zp|`dw@&kRf#8%T45=%I44ya?Cij+?|=K}8(Eo6fKQt$I)+g( z$E1d(r}5PSC4I!jiv1@N!x`f!I+o3^i`aC zQ~r>8{BXSQ!N;hv8)uoV3f%4z)@|kYc}pT?qwNXAi|($937Pv0#JQ3nhyDw)Uzud= zZI$X0AsLKjo4d1EG8X|()xJ3bp2bcOb>FJ$RaDHo8~-2A)&mT#M$u&Lly<9^y+H9w z&J8}#qkB_W8WCt=o0K!ucnX%D{W78 z-1Vu%=Jh2tIr+lMNHdbabOY8(A_r86mNA{TJQTb^5TWo#PN)x+Vpvg|lX{2qkFbam zy}V6yHhRikQX&(RUPp>PIsjqzNWF;~e6R1)5%F+g(C!^KOHrGnig;-weKrd!l#Dz6 zdRDh6KYA8EaDZHoJ7EUyq}cj}fj?~VL=8Y@d_{NQ3vl|w*k|51ZqiNz4klzvQz?4x zfuz>GCKCC$+f=QbY^%su6lM|8-r27eir6G0k5E#(>%RjH|87ZdUa~Tc4j=y+EK{IN zZ7Aj7C_=fesizS!S#pG+sUw>C zA)y-{J5RSv=3_95M~Y8VuNB8FS!k1nux~xZ6PU{@+V(EqS<{g&{rV@V=-)ZWKb{hB zWMO854UeH3*fMP^kv;zaj_>}&zQcB8zky0&@&kf%!X={t&#qYx_#nkSkK%^R3+|~# z7UJ$}4Z|@h;`$%H=KT>29FMMHe*Cw&I(?5;CVGILl5I4xj{99s>{z;hs#c!RwWEBu zC%&bAZWSirbyb#YAO2R1P2QL^$DgoUJ-?ue1LkV@V|BgGgEm5f);F9|wLb%!)r2@3 zNQ;lu4ntW@>~GzIZ8<}$Bxt^}K2hv#O@_s-*w?qBy^lN03u@JqZTgAjwmrDTA%fsB z%D!Qkn-H^7$4@ZVRTZzc9gAPSS{}5D{O*zLG4JU2Ox{1Q|1#dianApbHQrxrOa74O zEdA@(CcHXc{MmHrAn`{lIZs`tUC0r%Fw)a9<&JL(H+zjxMdV zWf!bSnWgFVY%mezlQIXzZBNKPeqhedIrm8wz+S?gimP0CO8f5iHQ29PcQUSKtPGuZ z?R?h3;^2yK4je*ku(PRU#QxZFI_Nu972M~MDvcuR1?&6fZT@=(OEp8xBGh&)-(fmqV7f`vYomDU zW(qbJmr_HIdxig_rFs6`<&Uht2s<4n|DS#Rqx|RYEwyK#II7XZxc}LJ$0jrM!C*fs>aY6g5qNdL7jzASemzQVHbA+4V@XkeC+lOgTgl2S z(^n6~!Mpr4gG6z#AW-SR+*) zx_)XE?0=2ELlL|2o`B_KdWb1h3fuPdUr0q41teeBGn&Bh%%ZtMrH&&xoJk%nD?ACP z67%6pBjM30Rpw16Tfnl3$Vr+m6)RA6P8@=FWb{;5EEPR(sKV}EU~E*o%T@jX`8~wk~MQRVkOs{@W^H>FFOl9 zAB7vlc_B&>sQc}u2))OL<-p$@0qGpDlmxsdTltVV5{u29ImCzP<%hSX7_fd&(um4gwqcNg1)^9D-s+4Ea=kpZ_Zr&Rvj}m0)Py6g?DYV?!pjOqf(AL&XkNMA@b8@%Z z`2^^dL`Cxg*q&qaH4}(QtvNQXr2$z4cgk*M6j(6GIZ#A zAqF4*))d~Sfcq>RUIQm4&M>kedVuM?m`%BKCYdG`edG8Zx>&6Mr+hy~$ACd~TW?iG zyuo%dnb}GVXy(1QEXQpWHJcH?i+c;*I1*Q|jNLQfaec?#GoyV((-tgXAEeI`%~Vns zWT^=74P2JN+%H6tt{;+TrEc@-1WPVC(P#Fqd5FfN(M2&@mo&!3y$)~$m0h(%Sf@?! z1QhFtV2q4JffM`W3tu#q5=*@?n36cGfCx_0=yKIHm_8}SzXDXh#f_bKV7~2f4|@c4 z(B57y0EmiNEzrdVp5>B63*yZ?0{xFjq6_VwR+!0XSO_r1jbod*1XnWj=2<3JWO z$srz7mqUe-%1fD*+}mml@4L-utSqd4DG%OF%;llA26y#wnweLi)U>Fc*d=?sRgA;E zVI6!x?OqDN7y+gmXa5N-<`1F9x1!>+C<8nA5~mJ+37=sAb^Mo6A7i%HBQPo&&tFH& zxw1MDsNyl+`~QUE{x5N*Hmip2i&mg!mm=C!Vx95|ZoDT8s|Sgy)a8{u(wcr$;j@@z=kdRG|2U0qTFHi){cP5N`BDHdJRn3sSihtu zYx>oE6v&2DOk0|nz!CIkZ@ce4OaI)+iAxKW3@1tbCG`B{W!X&Eo6u;j66PwNd8XD+ zQfVeq-p?SGS_yhX_vil9(YYXwj{!Slnf;#uvf`4X>I-I#@h&E%>JG7Gm66mdtn zzXt35zXcxWHjOqYIQGl+hDo1w{DU@T){~~a7AMQC$ysUb0##=rE;#~4=db5ha`qb( z(QW8v2XWh^m)r{e1uOhUvc8}+rEm{bl=)Ncp5kKQ*!0tokq>K&_OFVPL$$a}X1P;S zy>~TG8jLG=G@(v-O2NQiR}iUgIq67CA4QTKTsOn^zB-QdWF4oOMuumEG`GKBABVky z_`YCCP`@lLh5vFqQMP5$U?Pz!hSiBzp417;fz6|G#8`h5G|#p%QD$zT>-knCH%O$8 zYM^-2#%@MWm(X)9PQVo0!AK5Sw}a#J+33yz$fa5%V7#UJy@+vuw|9Ee z4&(F34PD7#NvIAik7XT*RX-jWEhht^FZCCj0{uUAGGcAr!&rtZg+CT&kTF*xp7ZAk zQnqA`(`zU>o4n+z_(Fli<88!-XrKbscnO~FFG7|A`-u7J!BvKBgU#97EI-TDMl#^w z>n0#2<7FGomkctL<93MrAc0}s)= zyCj}mzeSNF!B=J`V>*cl8KtFEQ_S-aJ}ya6iQd;{``y&NDyn1)-Ul!YMS459KV#2s z!xL_-;6UtS(BeRb;~}fHy>3R}fh%Y=NY?Z(Ld>q;DKE!gKrcthNKEr_8ZuKn7_jAU zlA3=}(I5cQ(lkCBl(gIeAb~JWMT~u)7}F@Xt{J$Erz)Y%4xRYPJ+Oq@wl+S&3pEiV zka(KZ;XLmrz@I+-o->X8*_$eie$`HY*bQZF8GbPE!eZXuiflp=c_r?)ZzP72s}+~7 zaBcg)?m}rCxf|~jmhp*thn{vsbbczTl%@6Z1ljjtua}XDncqg3--saI#yUHhvaM@I zV~@K_$9ol>uhQu1u`RwZf7G!?94%h`ZQJun1*^soP3p)4&ygQg)7+V_BcSIItmkt_ zOmJk@qi<{{Y|9jbCL}o)5y!~wm_VlZ_LwbL*h81#v9{g;=Ca-`b}9d}g3i~Z6|V|A zd<_bny=lj5wYAM96gn%+*6xib1UqHnDXeHEAvWqVGGeoQuPp;enVKBbf`fn-uI z6e)5-DyiNJ!Gn)A9ZwMKx%VGX?ix9hEG@_zGI2&5cJhL`OhkRiv|YcdT{^SqmvL^A zL3V`?&rlX*y(Tw#W6b=6?55&j!BLk5&%ZJqW?RZTSfj&Viyeq5c@7-MKymzuP>_+( zmnpaVyWF>nhwxD!03PnXwYS3+l`?rRqs48qP|j<)v+V;|XgLG(y8Cy)>Cb!r`!Y6$ zp^EnrVO4~$VaN6oYsv^^3l<;F4F33ji`$!i-N2K81n-w9r0vu-{?$JW)~BqWb)S6i z6>blI74Y7Zc5BNQ6X={4QPQ%fH-!6G>PRn4EWLaBdg5soAB*n|u_BT*d3mRce!luE z0qI`$rnjP~hnjp9e*zXXP+PSg|!C z@t3i^TlxyfQFMgM&^mj)jGJG->QzKR<-=Os#w>4t9FP_|TLS3EYaQ`XZ4(Bq`l zCqAz#aIzhM{GBbO-ehQCyZak;^B+&$Qs9mr91eHi0Jn9-ga(=XT2>Pw{y6OGAAg}M z?Enc{h5|7s_^2bn`{^!{6IX$kbpmQIiD6N|)dohIAtvtOkDRc-?Y%g<0&-qW075!II*@&X;4tG4J6U-iycM2}q*1lmO|3$_rH#3HR9jtw_3pPAkJy6pCFQpt+3!kdZz+bIng!$YiE&MI8uHXd9UV41g!w~9z~tdigc=V(RmtO#qoDDyI_#l zT=}KjzskS5!;N;UPjjTchT$qcixsp|(c@>|4ym91EQ$Dj`r*~%tN-`qk@o&EPOxG6 zmv0h#!Zgm=lMdj-%c&VOmz$2Y;;hi{wcQl zH_y(0zw%alM9xOB6J0KN(ZfIbg?x-jUc=c&;|;aYhkx1k{g!ae`0$A6AL`TlFBdr< z(5oh_Q0HO#lt~W^{--kf;S8^?FD*FISLEVFAEkXfVLAPD_+>11qjFP9}g?RvNaVQ~9 zoM`qsz+#m7?>u{r({P=7<&rzk@MrP0oIAL;`rOLPU2gn=Z+763;`7dCnbAa{FIN8^ zh>{@7>n2fe5bf3Yy{sm`1e9PL`KwVbOdD_}Q+KAmKdXFm+-9hqTmSx(gg|2r-hu?m zg5!|`q3kw;H1(tNNwGc-nQj#-bI1_cXg=?R+|#CQ6OOr?m@7Nc*(i_RCT-)T)e^WV z7v05o)4Pep7FIZ=El$%%37s?~%Pghv_5gK8R@ERR=0Rbpayk`IRKyE^^?xj`Q#l(F z!%HRMabWx>AEqe4zn0MVE3@ya%tRN|11B4y{)-(K>hh%Gvspd-(_V%KDv@5kqhBFd-jH)25Q*vF#RsdvzwfLIsq=1C+<`%3oxP^W1f z4y0=`#HDU`lK3>??eyaLAk`!jhT3rGbo_1NXIj^34r0(4k)bJ3RrIr~Q;4YB$<=6G z&(Nbd`nR|!FIR(&shSI-xJW|6<|rJ3rHSFfRefaB+&r+>qd>ce1T=kB*=~?QYcETs z-Z9!$ZD)Uk^rIp3dRG=B7uc5wiZPb~B{jjD%;`b4jt=s%{>mjZU-4@2EP7eIX^9sg z>za}UQP$X^=8KFBwbRF#gr@Sn0kt!8$YBP6K4&lW3Z6I%i-9JTFwWk!-ls6JDfkVP z;C;mu<7!Iv9RJ!Z*$p|P7D1NBn6kmtxeX@Q;L#OKGhLtoGF!D7y2hRNpJg24%_od2 z2k#lKOR(amx2x*D=hwuPr$Q2UCxefC zi3cBGV?!rzLpTw*@|&q&;%uX3!t*Hvm9qG%EsVRE_)wbh{J#Uk1aj73fNW`WpBIV_ zrRYkEN|y1&W(BZ8=|=)HgQV{3oM>LV^h%VwO9PV!Q4*TW1I{h&m=zW?VzlC;OOP|L$C9V;k12a)UjYk{ zuS0nDYSv@s9>lcEtUTOF3uBG)PkUi3{HKw7(~}qyTe5ml;K6;h#H%kb47LlSw_1+Q zKE10I=Wt)nrD*tir|!Q48=mnT+SS6BDL{OyU5;-a3@*_C*tuLIbTAnWu^aK)=5Bzk zu_U?2BTP=0hOa5^%khkIQiZ^-1(Suj#;BTo1;yxWG6v7NWOkiHc7 zED3#|{^^b9!x6nJ6F4-9*Sm-!(_=hQX@=}=gwNOhWbA8WHFUi!KaV>qQh9T4wQ{7s z2|kjb=e3v}8DE~e1t(BYc_&G*o*77HXcv~D0I&U?VaKEa`?nI3TldPTI8~K+vdAx% z!Qw}EA%42P6PBQ8ZBh%L_B+B&bOLH>slQF|9vRIYMyN!VA zFhhRK$1Rv?ZwEmax&pg1G|W98mlxJAc6@_USN{5tJ@tD2KJpn5`VVDoq{S?;5Da5& zUxaWAB6+s)v+1{o*#EBqxBnW2JGxwy7>55TF}uCtg&>>=mKUU*N8=QTiXZ=Ln!+De zM4^jEu3x7?0|m~=9%sf-0R+)D!lQ7Ih)T5tV0{kme^w=au&UBXT{O<#6FMZyc_r?d zy|T!{Ic9SgOI0H9NYNXH0x`Lhy(MW}XOJJVI~-2rX2X^^fhAcz`gV0H96m`oSiJr8 zPA>t|Ts68}q7v8rgSU5s(Q>tXMxa|?uzJ}d$+ zq`SLlS|}DBMIT(v42~4?f!r?R86cFzsw)8uc7RiQ?Wq*24~SE!gD@p_CGuG@JTxZ9 z`mG?%4o$y9lB~Q+bq7_)q>WI1P>f2vUgnh$Fk%-Vp_?ZgJ`{nH%Nm{|qKo|_kE4MT zr-N^_jN41>*T#Niq#YWXt^5#~Y5AUi1T}8TOeZG7qJxab&zFFbFoEha`%Hb=#5kdXEnHaN^6Zb*ScX;_S7XG4#j<1vT`wEmIfBmEepZMX_Rw z=iylmB@X)1_tnkY<=QI^26QT4#=TwaqdC7>xH6sqEKYZ4=H=j#(1~^Qd)hZdT96fz zlrlr@0{yk0>wS^b$toeDPF>%=a4w0H>eIr!T#BQ7%0eVYhPSUYV~rco?AK zJSh{b@{e8tjsBuXsqI;QK4^6kJm2uLg^$-h6e?kk4Z?j_vl~DQ6hLSkU3qfq!xJoU zLq3sfhA#y6M-HAP9nrIhnB^KT?W?aa?x=;~9&2s?HzwCTW3?2WQp|Lz>v*_p5ZnC! z7<=!aCbxe5`%Xw85CQ>0FNPu=q<1ku=tX)HFjN8QO+?fX2u(n$bPZLy^sa_p1f&a6 zq$(gFU_&>$U!Lcjv(MRQ&VJ|jS7tJq$xLSDyY6+Z&vjiGXvEXVN$#dsncAjA>LrXd zBC+zkJz8}wCx4&&rHJrjmWDH7Jmta2}U!UUzdgMuj>heaPJ&+V^ha?=*Shj@!1N2rUayT-H6+LazdHB&XlB2j)AMa0-Rc=ir_IWe~)PK*wnSo4o}i4=&D9gh(m~3 zI_%cUtj~_~T!X96Wn|Ps2-Y^F;F#}|S?`U@s%?9iRTkCj-3oE;i3{QC-xb6E$JR0} z9m%%L?sejqV&sLkeTF(^nKMG&Y*p;$NRvc`OwPgxe5Y%-#`6VDz!qVA%NB5R`=2B) z)7<)-_;|FNuu%o~SAR~Ci(yA%Is@y$I0kp{?Sp#mv1hMHEOdnj#>%GwIf_VKJUn6F z(xrHhl2-z=DyG#IFyt!du^$lN6qd%0l3Np|@qzcFS;i90(E}LsdCTmU5WMg_jRh>U zAHf&JYgR7jo4tng>C8_=^aLOR%gT&RQj@52Xb-#2R-AA5FYAu15_(o1UtwjA>ZiY&g3Z{s&M0EdF9CM6`dgOOcwX}# z=!GO7u*<4Mk#^{N;+P;cWb*Q!xf~rYE#0{Q!f}}+!K|QQ=g8W&^=df z|7T+Pzo6?#T$d20y!u(>CGMDWd!4x4Yp$HJWfHrG*NTz_7wioy&<-xcF|YkFXA*{g zX*Vute;vBk_+^rG)bJ|m!hnC@&?8qGS#C=Tfmv@BVq%k|dfriW<7;qKcrOZRMT}C2^Rb>t+0WPeTULlvMR)(s! zR2ce;5z}yji$+_-+gb-LtAJ#&ix*kWFJ%&2EBYo?86Gk*u{FHqbzvtRx4)ga45Tv| zQ>+D4*Z19sVG5P#>i5>39nEckacznOFeT2}KUyDF$U78MxHT6S?90|#1#?1wPJSjN z$)FE0L-MO5^)Wrzui)2e8Mu$SlHF9X^3A+ukAhN3k64q0JPefJj~-ag#2|-Ka|Za0 zUs}aTiivRg5w^gfnY1lX6bE1O9#oEPz;0vcFK&oL5Ew*Gp37`wJ$Ay`lU1FjF=Exp!`z>3$?- z-Z1cG@roQifSsM@}BE77JwdKnjctR?NwyTleLRSK6#|8d4?T0sXZ zh6w%2bC&}g7^oCRRTE1@eN=cSDi68%ND5UjJ{<7|-6JcfX%dm`u!h@{-O)MP#z&p9 z_-vNOByiU&GeUo6eA!ex0c+v%_SQT)kHJh_KOyh7Y-10&1ErrGan-)X#EVm42P^5z z6onV7N~ZiA)3OvcNlWGIObBp zfK8@KZc*p)MdK(2#_vfI!Q(q0F*XK5ATEe?-rNpIb0WuF-fhN4WpbSL=R#)!eNOcB*HTod>JH6P3i$;I=d zyT#HI)nwK&avlEZNm?XJz>*ss0(Qi7si^Zh;t_$5X5 zpp7MN-m&p&_N@92sPTLz zYz12kA?2KWd40V|OOufTIeg!+Z2A4H-;0|=fYK4aL=%K2&tCB&%hU-asJS5a^&@YJ zIcD7=huP;I@Rk)UJxU?;m&ZyX=VSt2^1RM0=n6uw#YniA@e2Jvr~&sr|7W-9zb+Y# zqj651scm}xUuLE^EM56XclhpQy8c?dawQ<<%!x96A1ynShXN>@ow{|@BlsrMG@R@21EUHtA_+zWs z%v4ngdkUV9!-GD8Ya^DEpo;i?0O08I-UvC`Jdvty=)%ldd2y^Z%yG^hpC>eky4gXP zN+(|F%S$tHY(Mtd{vrsyrD9qt3RJ`H>zEr{348$gs`)&y>a3R`DV5QSJBU0`kzr*H zn)c}#5)l1ZW;vr~Yw2GR!VMzT%g1SK`9U&EcAo=l5HFTuv}hlv*)7_uQ_AYVNWTSF;d`Ngz7 zD!Qs5_E*mtlQm+EEZad&4gR1Z17U*fVS)x+Y6A zaC(ltD-erPe|K%k-r{y(w<;(g8Jb)Jm}VN*R3sUGv`%0($ddYar1{6?n_lwVY^`dA z5v}#lM`q{>Z|<*2BusnlKh10&P3{SdU@BU&MDmw-7?@|a$GlT5tmV;Hc6`4F>Ut?D z!NA8XpJ)62x~`6iE;umQq`=ju$jSo${CLxd zM+r_2k?Hz;&BssU@J34L9;_#lwm1?ES&jc}a*x?nWw{b6WT7sW%lq@8X+1sjM4MH8hEvUq6?JRXAR zo-yKJt{nhE2GGio_}XjM<WK`nvg86wQQd*rf|uB83c_6mR0Pqa&P-a1K2=s83!J z#?i^o4&r0>emx2SQU{9KG`E_+hioVERJc?xHUsHV$VAJ$R6~T#274NJ ze>>0paJ=tnU(}Y$RMR`i0x@f5V30Lah?5e%XqD_^fpUg==GVs~6ze<20{jaNlsRVH zWjud`yWGIjkibPLIfQ^;R=X;3J38uLko*mUlu8V07oxuno1tj_Gv|5#)%v*x^wc}w zlaI7WkFs@8g2T^n{{_DMN44Iez%Q*fGX4J*GWz;II=0SXwcc+pAv7MnaipUwy-}mB zEH7s@`( zZVps5p;ngD)8TU0#JZAnf@;S`V4$dgc|qMbkJ!uQE-U-JxP5ro-Ngz-s>Lg%!YLRO z4p1wXBD+)dUer5{RuJ||J^72+20ZB^oXedCDw{2l^^WcrrC4bMiZS4kC<_j2osv9E zKp-uD*-?=uo=Tn;NBswnnrUrwyP!1x>CT-rK9D&(=*e2ufz~yZ&&i}z)5mw<>v8x; z42+d4Zw4Z{#k@s?e|_Qoh{rf2O?NY2HHX5x=Fp*XB#;n48>1h}@geKm4n-S!fPfE9&Y$uT#1} zys{^Z!*LXf_Z%LtUTSnsu9~8CT($V|YTm}yV{HpB#`-1XTaZ6^KvDg$WwL+uiuFY< z0#trRk!m)j3|nDs_iQpL67<$@?dqq0N8Qr!{WUUkBh?F+zWl-}_|gp-JmC#F{V$;9 z-$|Sq55H4x8nKK-}l75ZD#xMinr~xa(Dny>HYAgV%!8`1;mt4dtuO z@~dBJshQHLpT;SyQ@7ybse#F9hfSO>^hvD%B`sJu!;|P@7&t*Qp=SLZ;4LcK$ZJU<^0RVh-v@b%LAa)aw^be zbr|gaN5V$vRliO6=;D(*Iz^NnRKa9$tPGNJlrqd?!<{niZb#*pi*-d`!xg=u72U=R-fh&?yCkmH>SgOxvDl&FOs1Ov~#^hAWUnfV=dzn!SoAPwDe*9M8COq$pproq-<^ZsV7C} z=It42)`!pjl|Y;%9BWSgBn`F~zBtOy2b%_{v2Rt@Ci}Trh)TjXo;FM>)n9Z{8Jzu_ zjxD86nd55k-ebZ0@3x94_t8GtC6u^00h?i%6~d^9=Pe%(MRl!Ak;#qN)W9SSbuw zaCAez`2Ve-{;$Ll_r{1{+SXYQ3a5!wMq1Y2$3HwSpk8}Q-=lSQmYJZp z!|9M4q*N;m+PZzkq~hSQyW3PvQkgonZ-fj6Tsk|!eP(-Ttibn_W^yc~|4XrGUyhyR zZx-g2PZ>*%d+%~mG{B1_w8?n^pe&b)X~!1_rIla*^w=6n{frh%W1Il<7Skj9R~RJn z#TM#?QeE$Ol`ZMe5w!jP^74pj%KUJ|;tzM%jewA{QXX@L-W1E`F+vE75Z36wm4si7 zG9a$(8$0T>9Z}mROl`Y5S9DI)G9x(78}lNau{0}&GWFY%>yB*CybdGLyn0=n4iO2K z!e4A5@5PgXn5$X9)>WAhM`l!=W|KP_poGwD|1vYIe_$qBx18e>`H|i_l{<8ZTJH=~ zpHE5?iOmzLgG4jR9<6!>1#VO~~fOE?&dfuzZdWUKEEeT59SMHMwVRb)7J927{zoeh`q1Y&D02` zYmh%(mxl^?Id)UTcm-5aBrp;Etm=>_6OWa&z8V`^M9qXLq49{Zd!7&RGTjzeeKjel zV!LYtxa2Kr=!#nHZCu++duSrR;I-kxxVhDDMsiUm7vv7aRKG;ImwIFzJ-JldVd#Gc zWG)tptyuUL6!S%JN=P@{CaX}th$(Tuo?*ZJ@yAZ2x-BB6uktsWu@D|l60TQn(c~7| zv2u%{QCjBoF6Ux1+lXPM`#`&p)Vn|3)oVJ*Bj8e&cM4c=OV@4jvQyw3{CQQHYUGzO_p? zW4tUUcWg|$<{c{2Vh0#~{H!*`U_E`Qkmqb%GBxeCH2^dWzctkG^mU?!1L8TYpvwKb z@yX!c`as)KR*qbQOU@Irz8sColvT*GzWup9JVNJN24%C>#ik{otCKZ}TLC)zBBgYb z1B!TX4X*hTYm9#_dVO8Z|d5IO20E6Kk5JBjK%#Zr|F*?F{W1;(Q=&>(v8PU ze&D5&o52$_@#%&H8)|N5TJ-)6h5-4fUTxk^g%H^w`dpp@s;iV-_G(0%+rFQ}nJWDl z#D!ko(@fmR{45&pTG}7VB`oorE0}EW(av}$C`5Vwrr%QK8xheAqd{+*i3}}&_KVI`YVpbm&#w_WK!q`WUpi`e_J@qFKDZJ@Cq7z$gfd=YPt5=7 zZv#x4qHF{gi<%se^}OhvzOTJo(beMbg=4OUcjV=Am!48K6mp?dbnTjt1_{63da75km($UlaE;7_k! zefYOdt5KuPKRN}3l@+JDO>)jx@JfvAoCQ*AqI@{L*HX%JBt3lxL*4NGF0FGN^n+Nq zR7icNet1HI$Jh$X?sqFwJF3KhkN36K(6K9=PxZb#J#g7OZ>qxA@zfQ=OB@XjReo{pgC^ZOimK?HIHCH}p>c2gt1)1B;cw?Mh&WlYt1$Tw> zCx6abA6qLQsTES5u!eF+)BDL{I8_`xl?C&3glob3y@gIkP`~8Rm0{4?^Q!hTG$O=_ zCAn}rX}ap82Y|0m$3X@`#ZOI=y^4-h{IV?sgperxuAsVL(|G^_zM%LIa=*HTt2rjz zC5?vgDr7C?ZN3x~UiCXA|N8H`9$U$#`9FaIAEhWXvo$`W@zyV9N5$m1@S+r#k!~&x zUK%jezI`|9r^I@A*_F(`bUsUZ*x5C!$)e^VZMjePSxf$y=;o3L2nh;0>WT3w3pYDs zm)bjsH*HR)-b~qpU)JGJ!8lPIsYTx?P7!b8J*_VC<;Ni8_3OM{nZRoj=y;!F`JeY5 zynFm$@vkfEm#~iyDv(-y1%}D0;8wKCQ^u$~nnFci8yk>SON-~pu$~5K-;e2%%@?gg zGh{sA!y$Xi0Mul-vit$1wyO7jpS7|_7jnk^P+BlLJxOA=6Z0uttVtubv5+Al+BWaz z==;u+Z3^l(wh!dKVO`;x+oXZ|V}nH3PU-lRWc~*}l|-pI2FCXZb^*7nR)j)^SnW<#!^v0K`nsM_dczn`n1F~Qb*)p}tu+)k1B#$h0=aE@{(hA!U1~X`xTn z^;(eLBh>;kI|g!rm1PsLx^<4y4102u|4sF?2jyuT?Li3@jq0vG9;V-Z!M~Ke z&GFd&Ej{K|xW(nG`V(^|rzz~w{#(Zma3^kfo(iRJPDthrwH$ut;@kYHf|40-9}fiE zo<}x3Y|pziT=IwA`61#l3MZlD343L#m4 z{JQ=R;%}sJZ9GT)B&Zq9X^Ck6S?^4kSVu+ev^(*&=v}}+RD5AeNA)dw;L_)~hY~0> zxX(qJAw!TD_65PSi@glO4U7(l;t7w$Ky`791S)N~2i*9UQH3)Z#YEHDR}Ft?9$lIe z(^BjdnzVb=rKJ%rF1~h3&A*GYwdjmatjnn?YgdWV6lJIXIUHV|g4Zqw$q1p!ivrE( zXNH+(YtL^B6+R&9o{)vp2)(O_4?giky?WuI+nQ@1 zlpj}QCN@xS$cU)~bqza-%qQjCpZEzvUeeT=f8q44Lb?Hw=Ggwn1x{yg8%u0>aFky3 z`%p7g&HUdvx8t_c6eg-Z4#aZ|czcNU_HTrdl#O<<~KR#W3+hgcW~uD~Ya+6X})h(in zZ>Va|6q8}xL788vX&!Puv>Nxnr5A)kwXyXjuiW$cEyduBM$g$OdmQQd=_0mOTz4li|d)-$WA1rFgff5`-{K2v7t3oRUZ%WsJfXx?*AUR4AxvKFGJf<-O zJWCW$4IjTle^Mw1O_yI&)fAj^+c+=ZZIB!3WGb}Dq)-sB!uBSO=P6P)UNFX8>l!y* zs;(HB%^MbzjVw!k*)FjGniMH#h0!&-3m}mpU!~SwYk=sbC`xH^EVlT@**_9R5M&7C zj4VfiL^`#zwq}s|Fo~oX`6F&Clc{2uiYkoETe@e)Cc-`EB#8Y@2S6B9)EdNZl6irH zBaWPxNf*MhR2FiUz0c6|m59M)>sd<$Hm-B?Wvcx?ze{Sr9Pjd4285WZ6>N0ThVu%F zn8honRjzuoK^>CZDPYQn{vh=0S<5=dnpTC9H!f)Mrm2!ijloh0t<)R6%gq4bMw#`y zVhhA_GqG(e>Auxx2GDP+^TL>d&ZWv5CBVMcz>k4_Z^@)> zVRzxRtWKUH=^nW1mhrMltXKPzjGrbK(K~d4x^T;zo9ziw6Vy|33`zNVLKt9FtGD@7 zcn5=6N@?HE$|}$wnA`bLoga70+D%qdIP~XWg>SpJ?)%_$cGXNaClf* z%B>?^6>$bDMEZ=X!*w>SlZYnroAP2p!`1+vI}Khkq3k{RgF+llKlW z05U^CfnS_IUvbGWqJIa3dY-nJj*E)2Qqr|WVUEe$7rW0l*?3)9t_%Bv4%)prks4r>{Rw;*Js{>Gz1AXJc0=PBQ`6!cQZ9I{3$NWBor?xpYL{*jy3;l2oZqZb zCTq#Ms7{SNRvz%Sc`aEV7|EEjflD%UqL!XnPbd@g7N3iSYMue>Gf^06CjB=&M@gPl zR(GmXQb{}8A|gx5SLL5@mMc6D>^abOtg^YmeKZV?Ds~?^0RngUpeMbezd@p&;w?A07r&LvWAl@D@BQpG%w;#^eh3(L$m$ZBvZ1NLeDTAT2+ zjY_0F6ig_2>219E=}sHh0Rd`@=sx2j4kabSPano!)3C_G^RHz!aEwFts>GwBoZFT3 zRpO?ZZK6=L{=1VRp!2`bP%!5}1RLq$Nal`*Q|kTYVO0EcW9Nv@LD;u`0B&wxr3_9N zFZay zvM?8yiuH=&>!pAh_al9i-Mk0hCf3m9LarpV5lr7vRFdV~eRkl{kMy-7ALs8zrfL@P zQ8!gS?6Do!Bq3h?6d*H(gxHA~eqx_&o`5>1q8At=$m`|((-UlZ)93!#jp3WZaS zJ&@`dvY(*9cp=7|FB+$6Ibbgm`Hbx~e$mn4R!ITMgfrNK#QsuS+J-^)oa(fit2eGF z7JvUx{O!hH*BNJzqS42qJYpmOA1U2B1|}2AC)tS3yF@Ea-;~|ufr5+*Bj|Rr=}V)u6n4cIIU(5 zx(LkL*OtpK0syoizF3~=jRM}&VP3|vq=cGLY;qqLpjQodaj74A>B9hb<7I`u5Ja8rx_GPEcvFq zjR|lIJTC(?1#O_!(n0$v)m*@u*Cky`si28!^VE31f{#1_oX;0PA_cRVP zJ2&(_QwVta=BgNbG08Wj3L;R3^+7~H((sG<1SeeJZRR)JF?#qA#I1B84(+lz?TYda zS=W3%BMN7q6oOB{kWv+aeZb7T9k;L4>ny;$4&^cC9)6T0kr)jwv+mb$PGIpX92nqw z^iff)F}0IE!8E@8{gRKOm4sVN0oZhOH1V)izF3HzUDKZQuV*j z-^^U)we+uM8>!nv0?BK}M5t&N4&CMKW^d>wqZee?r%NTv=tuXeVt_d7-&4XTpd^hq zS8}!_Nyg8x(}?~gn9Ez6zaomK+B1}?WOLVg|E>YV(L36Zv8|L$FI*~R9%soTuUdB> z_uCUGKNfz%G}|`C<*xa|Sj{O1Zd(oQ2tGi_8-%J!IjS@{k6jY6_dE8iEE9>54MIv+Cz(6SFjAxMxi!_u&#V<`%mf5 zKI7`qAc~yh{G%_Q+QYjM+sV$?DV9l4oA8~>1I1U|h@=qqC`e~?%3D-#O^$8+qU8O{ z>v7JV-?#=xMV(NpB$we=8EU<_ISz(Of|k$szyhnCNVY*nM5mie19X1bO~sJaZDmO% zn*(-x;2GVq*b7liS-*xQ))nASpiQC?r0W^5Tr+m(kdEN9F^h9Z4Q4l$48;1{Uj0V_ zkIDZ`V^S?)c4C5AB0J?FB2xN(=h&7MVWzi7gQBy8Ijz-8u(h>t<#Q~@Ees#Wr3~`8rp!-8>`3 zUFNy@0%_R-w_H!NwN;s^=D1W(4&dbQOse5>v%*Bj1V!5|I>E6hI7i8h6&S zFdQ23COl4Fb4k3prY-x02AyYydwlp68p+Ee!3<6xo~T=;o!>CEW28{2Zzd9&|0jo_zuUS`;ZQYTK?u;oIjDRAD- ztITjx5<|0lW{HZ+8)}h>Ifv#I*x2RdnQ$FF^IDOoYl^Z!fAm7Scul>OQH}Ozl^^{S z{oG>|fv9LF07xV*3U>fFT^#lBf=Wc5Sr&`}>u4JkJwkW#76zsqN^2SoJ#R86NLNAjr|rNfItkfg?@NjBD6Nc4J|t+X5mb zVVc@7%@}r_Q*mzFv1j0eCMS*Ak6F8pmz|0DntQjQWn?z#c7(L&&pcoPZK zNdcfR+M__a%Qpvj)oW&bXEyItu-qGB zk|G=Olg^I9sHI-CK~6#orkdM*Vq&;<4MbPrK(e|oPi@4r-7~5OCr5t^Uhe;$HO@Y~ z(eTtT>5g@J00w68`IX&9lx3q84X`P<)&@=%4O6i%^W!PdqZ>K{*KYM05b$ui;$x;4 zylb;?CS2xL2|XoaK;&*2Xd{I;1tX+OkTvyTYA)pD5uv^xRmR!Hj$?K)T9F~5BHJ7n}_ zbU@Lsj&oJ&4_>UviBuZHxuufai}VZCh#UD8`WFZKRI(H@yY4jp@f)?QdJAjKQ-NE7 zF9SOEbRTB^ZOz@AHeRWy(=w!0ed91!&V|ko#~^mp@Bf1kb??xB>dxn>JF@@7X2^k$ zY8I2RO%|(9H%yC`20zEVcMq{4N?V^;dbLkt0^70eFmza}1`j}{3A-s-7k=+O!ksID zc}ACd1Ud`S)4XS>b2C#hjeW0DfQIe@8`2m#6J;LBb%eccE6g}L*{ zcDO(_!-JKuv8(4LgV2 zjBM}JZi3C#XuKXTHY9hp_+-`k5*2N|Fo)3n|DK8!jS>P3{ov&Iq6_hrUDq=D&Hab; z^Ml?mS#d{6;#WBIWA-qDsSh<;&v-n0wDc9&h(qo>PJ(^T-S=FfoWM6ppb{YwT1}dusB*HC zTg&^|e&+XN-l$al8_1-up(tZe2(xzbTxX znN@luq-*1ho(jnE3(xFG35v4(Vm+KL~%8`!(jOGDE$Z%C4D)H6Svs zKbs?Fr^4d9n%>k!gDj@t`pI7gGJJoRn+A0Qkw#P97o&!>%!S-(a#(QhKS-gqg3&Xq!z6u1*3ipNl#LW63rEa2D)al(qNuj)1~l8j;X6ON|loV0VNVJDek2tTu!7VDG{m;A(=jB#H_ou#0R z=xU_Xq{Jst@?}89|;xlcv&t|FXgLh*eM-(%&R5n}Ct@S7j7y?;g>)E52 zZ{@|sMT|F*)}3fE%?@Tay$#v1tIn1lL_n0%?*|QazqclZUUc@WI92B^VMuepV*W$7 z!Pf0PXpRH|ptg^>W1MwjuG~qN3tSB>k~Bw~%qnx<3K#~~0HK|~r2Lsn zH2+q3vQF4jdMu=Je%wx#I4-M8G}p#}M0@>r_AH!39)u>v1cF{a-r!vcO!E=nQZjE5 zQL1CQ*K%*7U(|+1MI6M`EMiG(ubtTaD=#5AxUBRko7A^~8)2)s2}(UkEz};VH705b z4sO{(kSEbsO7m`;`LmDTDin<@z2%~kgB^-iqI`#p*%_wR=Q|UZ$HmytK{CMyHAuDs z=4-W+IkOBY-_NU|KX-#D4Em24ePY)+8O^fZ7S?{apo$msfobXYnJM1uInG6D3CA#w zYr_fzK`p~!QOKW@1Tz~)(<>vrd7^;a4K;fMMqMd$-jNUxX9y<8>LPC3t}5%!4_l&g zT4&UCSjOO`4{K8mN(uBh)>HDqTd#gK=0AbJ&wm5@B1=ErmE@hmi+;(8cB#3Jj`o9> z1$#@vVzMYm6&Lq%a`1*q3Yqa0ON_50F(CASnFeFIF@qt#qK?;UX50Yf^E}xYB&@Cf z2yt}sR$Blqg>coi2>4{YYy~MDk8bh^;^F>O!eWb|&V!crvnz-el;%Y{pU0!e;LZ5< z`LRn!pKw+v(b z-e4qhFue;a+7`K7SjWC5TYfBUAC4D;rax2v#|cB|>i5qP+|>XA*B(zDz1yy>LU6I_ zC`i~jmfLVrCi#-&+MikNK&=4FK3;tl8vczxVghtfGqehgQ|&I750g@XXcyjxKDIW| zLMs=eEK{{((r?W3kWB&!BjSeHP3e6FfktXB)bx#VN_{rTb_sa~j zL@g`L|MyEe?V}vv0bh3NpFr#X`GNB{iNONbR%~BLUR%!7;7bfJKeD`Zg?^ZKK2`#^JO+?Y-K&MzI3GK#R=gBFChLk*T>Sr1c!*rv`Ti z_yM4}ne%Kmdz{Q81K0PUB?dXZyuED`nx{~Zj~s>jj8U%oAM(_=76mxXflmHHof$6_us@Xb813z?U59HE`ABJY{e_1*Z7?X8i+#o>Pz> z@jM&>WS-3SIffTD8U0$c{X*1^5@>YV6LACeftRT|RfS*v3T2Oguy2KZd1mxW95Im( z91_?~@6=+cH*Hf#w^N%QD4?mmYR5QBi6;|*E)5?lEq&Kh)ibJf1{r8twRdIm*iwhdc?cNERqHoBPi*3U3j zxi=jF5d;WIjS^n}3<;&?fi_x-rO*4sq{;K+HYpR`JSLSvlYW=lmthIx=ueQJUvrOD zym;CTos8?1O(-fwr?ZigmJ6w_iqmuxCm z6gTtbxF|*%ad_$3x(Qr#I=7W&*7%y*)bv2MHQrBS8D^;bg#8RBSu+jKdr#ylcW&OU zr3=Gx*9c&AN6*axJU{f0tk`U%FQi}U>x&IUX|+!rMB0r14fZ?9(C8y_O7B#@$h|E9 z*9rk7C~$n}7Q_wRnh&ArtwTT3H7WB&1l3@)(B5LG6eF3#ZE-%$GjtO4ey-g=Bg<}) z^)Uw;ebh9)1*%5|#8KqlK)V4jSBwOw*@7P@oB^bQv&#vo0Fk_&r5HKNRfU=HLWwmO z*%%o>US&g1Q1P$@xsFSd;CdE1;C9Lq_#z~Yqh19jQY;zXnFRr%`<;CRVJx!kIv?d= zav8Si!7sG=`@kj~?Lo$LD9&6_aQA`>zl%Qx&ht)l9>ka?vb7=i?h2({h4Z)}s>{EC zA!VTV9kn%A`ncQG%rbPKvvcSKLJ2(^u+L2WLg`N+?w^=D-WCNcS%z6eU-&8eOT4V9 zvrwYVt&qLPf#18^DqM1vRiLpD#SySltvO#<#gXGx|6}HN-_{m9&-N|9UH6$W_@6LG;m0mOT=mTjp)4Q}9`0_XPMX(apM?;`(UTtxvzH9iiG*kuOd7}}vn39wNbtwi*I>_GQLO9>PeLe~ zFKdGH==impD=M^zR+lM*J}@CEtVb<1M=kTv6bjdddVE-P#(iyV2c-^L(YoE0ENpXP zbBQoL*pp$uPknzo*PcOZ=?#9~<9IUi1oKDJ%;}R8&4dcX?N@|?ZX5un0{tYjFn<0i z3cV|~e`ET}t*^8N-Y_OsMxv_FZ&&uwUQ01?dFv)nDN49Y#Qn$HgJ@nI<;%s^pu+E0 za~=g$=dK=n{@Wq^{|MkVj|DG!Aj+WNS%zwd8!dw?uMCZJ9=AhCUT3fW#qB-e%Mn)k?!Uy+2 zm;lOmYQ&~U2gBDpH@8Ac7V-s3oM(PN)Bf~Yd;dT9(ECR$o#dI)`!jzO{I$`vDvDrc zG;1k`+q;D+6ceLjDG2zZgpmR_{SETW^O0r)#qbKw*CeAd2Cl7%lTCx0CXW{o98S5+ zVT(^YjxP4Vmrb)zdnJn=9o2xIIxue6rPZ4(Tf{p*T9 z*QfskVA*i+YQjlkU^R)t307Uak$YRCQ^O|sdJcW_yGy4au$MY>ulZwDl_>rlnT|_O z0On=G4VAOAzX3YZ^2;KZ9LHGsdaxAnOHPiBmi%5${Z?#iG!ap>RRZOR(>Q_G)O5a5 z#ME_ajihi_nJ*k-fG?ixX^eyCV#PB|GpD)QT^;qPoT5ZL6 zi^klR;nKB8oomu^{yNn?Nl8CNJ|7wf7i^O6-1(%zaYy-8n0jPTi6~n_+)zfnY$imT zT7&8LrGJuhqUslz&{$E;fM@rABq>QF#S*(EW`BHN?593d?J|S15 zLT4=_NPO{tqHYStO}eoc_CWE{P6Df;%^n(h?alhm^B+6UbN|z$`fK#?jn$V|RWdGL zIiK2Diy9)s1oD2xzWE`|{ag00)r48UDDA!l-zIWK>J)#$(^52F`c_HpeDxJU3ZC-f zU0{4s_PNYdE-)i5HwFMV0$m1cL77tgmD;Q!=PZIxwXop9D2OB8AP+(b6EiY3v*Kqg zZg#aHkutC1C;~TJS8~6Z(|l@C>))CazX3uxGQH^e6EOG-grNGK0q-4_{v5FSD6d3C#^vx?NhE|~8VAivTB#N!7+Sq(UvLTW6itNUe=C=<0 z@{N-db1&|k>}f(+%anR0Y?y#{Ug-Qi&6XWwr)CxT-9Y|11gWx2J_y=+;pW} zlTP7lLBB0Yp(8@D!-$HIHMart(!g(LG2UqqmcSzGU<{3^O4_->rZX!5n*tIylF!a!kbc)W`+a=(ckliEb^U++&f`4JW36?pWu~q(XTIWO zBk!)Qxx{MIM>m~(l`>bs1}fT#sm>Q|Mi!m7H1V#n(7Ucu_GurT{dy*D+p7Z)H&}V} zqOWD>T-3UixMf$;?+*~m(`s5-iLp4BzhPcSh2{f0`jq7Bqa}QZ3(v(u>NCleBxNVQ z^zM*`Ul&5Nc2luGl&_Vb`l@^R7#jO0i1_Y?dg?5rU68T|GpS9L5^UE-NCu&!S?(FZ zuWSDi7rzU zlYB?EP@SbydWIayT3eGDarim=#z7d}G>k@{8}zZ%wgULV-)lCN1_)I~vCB-}cb1)| zOa&@x?Mi-oMaMS>%kB)g0{u1xTww;)7tAjYCORPFLP}=y8|eV^b0xw_WF5p>j#P^i z^b&eKy*3~(n>2rEZz^KnxMO_+bBz3Oaa+G3*GQUppJp@iTxKJSN%RLt z1iW{ZbSXP7>D9|)T{@%?k(Nq_1-9Zzuy`#o7E?~lk{;H-$6q0Vp2dlBEZd+4@v}l& zybP1>A_Eht5LOw-$o!{xgOX&M69Qsi&R1Ko%CWo;2vbvGdZNPAaqY>)Uv_VQ1A1-G zP(66lNL8*7qOe%Aa)e_8)bbPD_S#@rLTuN6wR#!B48RHyx}Tc9XRaEpOIz9HV^q8a zP?C6%D+EE%z$xoZGAr?s67Y{CmI8ruwYDe__N)2ksBKYT}EM8q|vWb*cJguYaE^$u()IbjtsSJTyddRpwH$8 zKi>QeQ2qOs(uySOHn_VD3uL0H60i3`*Jg{|^R?jWbrT`iTWY=x@~9vlXO0?=e!Ihq z37{~e58E&*XXI@|b}Q}0*BXk~jwL9vHnYiTOf4{%7+GJGOT-F3Qy`E*^Mu>+cL8l^ zp!~e)JsQ>FL;j?E`?@#pPVFq^&fTjqt#OX;v`>u69eWHuVtL~pTSvd4AGW_Hf>pG; z+CwjhF$h_& zUDU!;IZ&Tl`IFTvK+U|h_k=*|XXTOM8OmPM0bk2DnGDrfnd zVx&)PX0##}iFvg9q_fzts;^hTNS3SfRC{&_l1{%2(ZdQEzPj`B4LoH_Y1^IyVF?Jmy@tv{RY?NqMP;#N(XY+J0+;OdeZ#T^v_NYCvB^wH>t zxE6314F;@6m|ob-kkygylq+!|o4e6L@B$j4#iRa%TKo+Nuofnh9ci7bMYsLfh4;gj zwG+a>lMvrNR>*w39$QE)TA6hja(_u|ece+p5F`;EZtgDs@dGEbN49MvF%A2Ft>8g_ zUlgu2GEqYtjJ38;>?*opX&m-*3!4KyOQJk=v~H<>-gbAo2ckkl`KW;slf~gZ#@3N~ zzX6Y9W>ONK9hKnaC+R47EByU~wx}e3EXV(cbMoil|6H25Ou+>w{{~2Sp)x-^ zqrNT<$u2P?{F69aZF1EgajNOR^5DEQ8Rra(ilu*%Kxb=JC0_Z8Sq^pARQ3h9BXo#e zgP)e&v9lnQfjx(2*?q3NOlm9TAa&_LYmyauGN80d4z(1yrERJj7yxdUNu8co5WrE57M%|BfxF@Z5%5$Ct0CGKs$LtrlIsRNhemcB=xO$nD}9 z^bJA!f_qIDO7>y--viC*^_M?3x3&pwZ)PKDo9 zTVFZmNC>${LLWO9gEF-f)hy?!qR(NI+~0XE5L^%2_zlQQn*92|e60UMzqvHc{!Dl0 z9{}c`Ji%PHWEeDq+HKQA4sSu^RXj^s(xLh~=-N6@JBQ~(LRPHy&#_50INcZR&|fnT0qugyPJ*@b`a{Vz6YIJv8MJ{mgQ>hshfs9^y0 zswsNlVnEsp+?v}3IBk;jka+!l@s)0(mdmTJoaOo1SenHc9?}R)u9sK~ve>kI_w@J# z@%nJ8o?8Z=PK#7!0#Fl36!_%xO&FGRe$;f(^2~@)6Kj`9o;3wQQ&9xCgmC+gcFxy@kKuJ1;r-vbKl8bw_59G66JYSh)qComV?)|sae^2utwwPpr7r)eGXE?lS z-$|+jLYx8s{FU^!e&Z1!7To>*JtU2(q>urd5s&~%J-P`nk#HM;HM2+`Ekwmhyn5!H z0DS#tNtv?Gc{Se`n7B*;SMd`4O?6h#>Y< z3;PioEf5pt!BABt3!?spWIzkuE1?eAIjv0JXorCM&j;3*giYAh?9nU=jcT>m!ASG7Ikrg_wlIU`5U_)27P!Y06+6n1cO@ zE9ZZr4d+}VthOao-ZCHguf!)P*}X=30waIoRtNj(DgIhyxwy9e_o-`!BUIOW%A3C| zKJ;v5p)iSbjX1~-&rqwh*fkxd#nxg3J*v~JNB!b4IbzJRl4*qQ=P~ugMTI?Yhh~be zqKRCWQnMS;R|7(vY|NHnBXPlDoHZ00G})(Y@n)!xur-7g88A&SU)_u0S#eU+Q!$)u zdRk*icXjdjZ@?riHbFT~r!HHIU#Gkpz{{mDj*$A6Qm$>of95;JBaEC=O{JqqE*>_O zUdrMLzUA@eKJmw%zmlAWXESA3kl9t&xH?1{3w?%5a0L@O3EbM2Hk88NLT7AZf@`oj z)bD>iiSn*u4MBv120`-xpb|J;jME%S0SLQp{I{FHy}nE;%iAQgGXupC`-lr~ad=_l zeDErc{Ivemw8h{xTGscbD=Kb+-=^Iv8S1|h1w9VAdBgT*ig^I*S5cSGVl zvmT$~=<~{98VMpJw%TS}5L?ggzEO3AzgSQ@O1in+VZBDt9fAL)agzV}$#>-$vN1K^ zsML!T1&VsC`9gAAJTg9uu$H3UWcZEO>q0(1CRK9}sbH4AX8ae|6tuKbyR_#{x^pN6i|?ft%Ix>>`}ZqZ>u%;*;7 zD5;Qs$L{F290&AVL-lZX#Y}3k83kKI<^#J*59yFCtI{4*ZBpNv3@u*7O~)bvCb{o; zc)(AvI8|rCU^?@|2(bb9Y+02#`ooLVTh|R@Fb{SjGK{NJX+7T?MOAAiS3NDYQE*K?+(fDR}L=zg>U?{GNx$dP8INB z*m}=&K+1f<_3Jm__21$+Vry{U^eR-7uI9;JjFG)>`}kaxBOwzb*>1~EuG$p2jE3vBQoJ#f$8RZ;-T};his-6=&l0n)Pj&VWNzt(h?phO`N|P!;l4M zE5|IPTMcDWUiq=}Pkm+U`F~2=KMl_{Op;C>eQ%b@1_#-8Ne2^V;|QirA#blccKvE~ zjm?VxSKWSh75w{x{e10@Wsf-7yI()OY9SmO!Fr!A)V9hxvJ@X^aMf@^9JHJR(jR7T z2o58-+7&zQXtqi=0yYAZ)F0r^Cv+dBs0aLIOr7xV8n@~RTGyJVAT9R2lMHm!cbZb% zE8Qk4!5oz^9jx5dZaRuQ-a)9S24`3lFD}7&wUQzUTq3T>@8GdF$>fHet?Z3V)6jD~ zBUOSh>&wTHG%R}^VbcB4DH`!c#}p_G{Qqw4iZdvW{cL`w}8sBsA0{NDR!>8P~mI!bQyc5zsJ4RvSt@F zW)Nt*YnpCqx73we>U1~Qawc^xMB{#2fMdiDaU*wwELm?%F$+Q`#;qU#p%Y`O}Q%r0Hqk*FOt9}FV z0zqO_MlBcA2NX@O1=9^jcj;h)WdRYKcP(Q~9^VAZpq)!+I(s2_;b_+T{xRYgMqZavsKlA6(4@qimL0z;@vG1yE z!^u%lS~>5@#ibF;gIPl=2@Dq?;+C_4A%8?`og~OIrpJ~S=DtE7I&gl?nZhW*qMY(p zdZs9b_NoMX1c0k5*+0gG;8;PG!=dkHc4m&EiO~l@xeaRXD~Hzu{1u*5qtzqG!3$)J ziE!`Dk4V*o-AtT8X8iu#JLi;3+Y@uXtl(e&v`_j!WqjY8HJ=2S*w9r62#_pCwK`G& zP)#?#zYd%5n`8R)i}PO;2-28io!vqZqWa3Vfipg))7TK>mjCM)R9%HBt<@mw!D#Gm zy>=nY`1x5VC*3D*of+T1hPg-SeFst(O&h-ivJJfrSU?heft+9d?G|=!8&laG? zgnEnf$(^6yKfihYfBn4fbo2zmY2)m)u6wC+Z+JKVp*XoyCu^HK0eHrxvvQ#!Hf%Z| zKjk+`2DG(jHjC9eEJ`D^u3gM8J=ukS_D(~wHNW&Jq1?4LLLryRjenL}g9s zUFGAditI5^u`F)zj&x+iX2{WR!0nbt>4~?gNB%V#9l*FwdD-?0hl@SzT=HV#XioOb zU&f77I6|vY)-#epRIDuDUb4%1&D`+c^X*`ifnqHg**BgP;KX%;WVQO~Pp}aMn%26@ zQAU&cXjT#hiL~X9k}TCK5Y$clouk4=_ttmYqT}jza8LwsZ1+U91=w8SPW}4(nc-V;F+!aWdzUoTEs#KY&Dm-@U-~M z1d4TFOeKjTBx)!uw1Twf){{n$oHT7a)|ssU^Da8Z+!tqS?;{x3jMA|c46xVI4uynF z&uk&)Jr`#Vqil&lM?s0DEJt$%CH_|O!Sp2l$x$01d!5UZmA{*0Z{~xNKgOLS0alUj zA5b$)0QV=%E}Hw?b2N?6Mlxvyv|3;GmEpuz_okL6lRS;2kpl{ z$AZ2!r*R(je3c=Rxy1yg7!H{Zot)=&D5YM?J$*g3;9R_n&}iqvRZE%!(zB&5g( z)qh}Gld2^P@316Qq)phR?as5}&^Ae+WB{ex1RP&2(k0EIrDp;0EPmI@8<-y~yB1oh z#+X}jf?XR<6$l2~Y}6qfP0HZ~OOVR!VPv^`t2Yv7B%AM+tjy1Bb{m!?#50pX=`zN; zL3d`Yr|@WM18Ys7fWtmINSkT+o>BFM`t(?lrVXho3ji%^ zB}JiTPN$jqVVBq2!+e6?+0m+^X|&f6+oEz4gRZlOOPt1=Zr-6)<(K~ zTNKYolJs?6UlORhKc(}qAit34hI)h+9R|(}l>{g%PnqQxPk6>Ec!8t`frAKzni}O> z@TZf1a&oiOuvTl;!G>F!afs+05KpS&!_7oQm~?XyZ(#c5Q&e0b+N3_7q@zQ@Z%+Ca)a zz7D9pp@Fhr03Pd8nbm#)f0>%~Et-YaajW+!7_IGs2!e(pjGO?9Jn=>8FD-AVUF;Rf zZtil9GtJf4<<3K$6gz}lk=y_h#*z9#r&=Uk0RB|V2)P^9F)_tSG3r(_di(9#3#oU& z6~NI74aL%hv2O>gXid#<9bqWiYY{?;=(U;6c1O^Z6j^4i{(X~3?2Dml$n~7lZ)q_I z3#0;4)YVTUKt$4&6WjoFx042Fw5YW7&ODLvomz&H?b3s|qjq@$8y|VYwBnbu6gM_~ zJnQ-EG&Og00{U`;6d(0tPG<`$3*{*)zcqnrImc<1E zDuwT8c=b^f_#Ti^@VaX+d?NV~;5k=F?fgSfGF&jrOsVy!;@6(bG_?PAvo{H4)k=AN{$(&V#8Ftm6Gy9Sw7U2EKgs98t`-DZ@hx9Hlb8*)^2cp!mwu29`NIJ2Vqo+SPAwQVbn|#6i?oZd{W`6EbqYzux$(=9Cd5gceoe}OTpYY%&aV1^*9FR@&$Dcp z`9X$#l92#4T0_#1jyix5Mj8&R6uTBxiCE&BI7g@TkD( zlxjMj#;c7C005xB_zWb$<_lA3l>~V9lF|kwCw%GNRQm?Eys1;}bW35OZ1J)5adv|b zx=*FYf#|KehMlsatw-WOl<|#HXm?5=g}#-ZIAeRgBX=9Sjivdhw6hA%m<~gpQed%7 z>^>~2pinqltlOV$>NIhrgM6eFl)(|jFV>8Mj3@yBGI}{``h}N?=;PeG4vt|khF`}}B0&X=(Jb-6w^gE}`v97=uzEKUc^{rqqLpcxOrXylhCK1yz- zCDh2$kV`6v(b7;exDLNJpqyD#eZ=LG>eY=_QW>+BiAY!xE}DR%W|zJ)kUPOGtePm zec+O4O0Sot#av4Q)76Z*Gzkol-g+TN(tb5l1O3g{agqvQ>O0u^0NW=IG!OQfltSgM zxh0>7B(#F{$xzpe8mmq4&na8nCSV(5^b45h!>XoD8*i4x1%~xOM)M9{f$#o=D}&FC znxSi9ZZ@#VTVdd{xm5xBN58(?hkSUI_Gz|SK#6#V`d=7&F#C zfCS(v5X^Oz7}TS7A3zOQRr&b(E9h}7)$p3`=a}H4*F@Hr)?%c&2KrkQPS!_>TEU4e zJ^j~#-ZY^2xI5a$C9<*h{|0e>kO|*;5McnC$-B4M+{T!E%S;OyL&NKWT)=E~%?xob zB4$^d*?8IGxHOz(zEA_|naqc-+EuXdexqmNlKqPUKCj*9-_K-8`_|a3C7==Aid63$ z(ad-|P&k8+SYnyhPGL9}ouw5g?G0doz2e61FC9Ee(i72CJx4NZG`|svgQ0*zaP2JqyZFH$#sUBZqAYTyY*= zKeTS1LtiBvt81uJuwUq(?F$Oh4W+951`yl%J>uH$^A1}c3Du@@A82SMhE{%wZdB42 zdtL*#$m=V7Qu&L`)Gn&b@`paXAbC!kgFSw+U@3_NK0kx*){X=X#grI~Fz3#eCR_iyz;or)i*{BrH#gcmyD^ahm*sP6l{@YZxrb7CPpQqbF^e z!BWNU@21yYy_B!{CK^T3MG-lwbmegj^pr4H2+c`xS#!b{u&?-a0?bB3qzV zS?4lQkUyOkL+!`dXC+b0vT$)jexuKNEu^IR%Y#nHDYmh(#`5q_oNWUb!JxtLIBhL# z2*=`MfMhX>nwO(uN*n$Sc)a@ki2cdT?2r2ai{GyOS9LEY(9-1q$S*1!-@p3{U+axN z9U3p_^1JHe()=4hr@jmq=;UvWaoxm$=V63q9yRs( z8*+n!x*NdV$P#~(S)Kvc;xbF8?8T)VW$stD->$;8L7(kQr8R*+-k3bx-A%lqegcYr zoS;U6i`*|4bLI&-m8`E#s^G=|Sg1Pr6MhYLLxuH~HoJkl?l%BNhST#C-_Lw=?4b>S zBLeC5m;uwT^h4KRFuRF&2r|a`92bsK@;wbk0Wi9Na5$?HVAP0*rS1Y31`UP?g(-)Q z@49Nfb9GpI@_V%-qZxpLG`tJN`nXAK!!bo5dQhl)%X1r2q|V+pRwJ-D4^d{jWxaS( z^GMS>9Xv~zHj@De_mh&&pApl~i&Z}4->Les^{22-B1;Ms$6e1y8);!3kM|CB7^L&PbB=YZ=FViUZs=UDn4gf=p#DoH7 z*_WGJVB81#1e;H;9`hhRQm4@oFwb2^|G}g&uSigPj5fwyyYIS==HiDpNhkl=guZ`l z`l!t@VfE~X^e*SWn~gyx7ilReMg_EZR-?4@32Y*<_+m3nW)^`HLa2|E{J;=%2!dP` zEO)khaCj5VMzIL_HX$eNG8%Kj9nwmyV&IFJx?&qp@p7P3La%#0CY68nP=1UAiOrbU zdT4Yj@&3Jbk9*ieeH6vEU~$CQBL64DDo2N!5y|)iN=N&&*3ai@%HS6)JjgWAjE&$* za&!-Z#*s0O``WR`4N!6eTXuafJU~|SI?3l8Z$iN$X?~62ibMH{_WKF150H_37& zWzH}@8 zRq<~=`U{ozVNMR|u`C^5c)tb|k~BfE$B@w$rhVCmkSzL~q_BV=zGHx!p+>0aFpT-9 zu<4Zfm_cAvvI4KIAI+g7FbcTD$N+DZC=`5bl^MkBEEtkPJa}2yrCPy2`Gvi$9Y~^u z6=hiOXNCvt;!ET&v;2~;i$w;ICes{%ylYB1vjt0>*OL+_7)SvCAee_;l-2~6;O6ev z0%RtpTCgeAAWzRYl=v<2dZ zlyy>Fy@jBs#`R2yjNyS6Qb>k>4c$YqQJ4nx`^NjWuF9yC7q0z?`&)E6;ZlXrMv{%iO$*#zSg zsOoN+*`ll2N6hL(UDPV>Q21hoyHWKRT0%!6hCfgv%kSf)a6s+Zz7K=}|t!@h_nO31cY`nh%y zO0Mv$AoIAq@Eq8SVaR%UB239v-ZaAZ(Bpu*#A%m2U)=(u7vGelCuE%y#LsdlYw&3_ z7*U>Vl7x#*lF#Me10gKbI*F*B2<_Bhw>YY&2{n?XND>X<3QHfy@oR@0c3_AgL>(jP z+h3RMY$oPJaJWkij5VG=5#H4;f`8h}jrR`FK>Lo}gx#g-1ft2?_vLIV_;Lz78HSw% zmwRG?AvjPnCl$96x6dnJ1aJxbm$oR&ybK$1mtj04Sum)sZ9nk+NN{3F)YfSk02kHBUs?TuevK-ehI*A}lZu8L$KDA%l36f=D zyi6(2>wjE}`+TeR?KKZ$Asmr?8zgtccz}(zt$@&*pfi0&;9S-?8ea{bf}D8*c>*nm z#jwcSrNB2pj>IG+C5v#5RZk{TKLS-ExE0UzY4s&*}$D zHE21?ouPLf$X|sur3QXsRbgLshIi#}HjjXkb!Au_pwtHp0*hQ^ zJ4r?j-SnT8dKjAo(`qQLhm4$Q^OuO-O&7PaqH*dYf%3>y#XeoIhP=ti&~eIN55ZI} zP*8kasuW@_aeJ2k7ic|K;vRNLa_-Y20t0MhBTIztBk1Pi5DAY~g*zTz5?jQ=(Z$i1 z6ciyV4BdvNh>Q~w{;}aPSYjK|rgpHHq*lYrB>h-@mw-q33&~Lm|9%+>G z(8|13cd00KmMTgJPCdsylJ0ZP&Z5&jsVz6@IU+%QHr8?;H~svh%0G~9?^)5@#)}Fk z-tWysUwv{(q6sL0G-lD0H9mGF-u5~s_YNYRs;mKwA4RLgEBrN$U{Ff2(OLGIHjOy>s5!bc1MDBlw2}NQmg}iX z#2j^j>B4SyJ_w-+zIk3=!axI(umFziA(N-nJwU`39TFQoxdq)qnGAef4Lm)WFrQqZ zxL?}i@~iM#V!qmZfA@XLH@8*9;+}aw0Lu0w#WU+dslGz3XecwyxN$s8%U=FmWC}7E@0_=?6&R+-cL2#lXqMrD!6y|YIX^Qk0 zqNv`s(Xb$s?mH}Dle(RrptFYs4X6F^KPl@stFMLWD38?U zBZt7F0sZFGFL~BufmiPTb?_VDIpTJ?c-SE^fq4yn`)~0?JL2y|y9+ki^PdR>wQ|+| z6NBqUBsgx2*aFMb4+y%!ZZ+1wre3vxCe$3~?#3~gYbG2bzfvSQm>Scd7D(zWswv@}>Ndk}iel``YrYb^B0{Omr}X3gAI#(P zgBRiNe-+Aq_3C$-HLd#%2!GtAavF2j>58?a^ z7|z6}ZMPM|TiQw6N)V2XuCumy)}Y;TXxA2m(ZjH;9oH%wm>_CAF;+pB7_m?Fe$bVB z+J5jOI<3`B#`1l172OKsEOXnZ2Nsj*IL#0iU(GsmPeQo!Z1ZzbvwqT33HkB1!>Y1& z#t-I$^a8;q>SICUZtJ`~mf0($<&Hd~i8x2m-9U*}e;Da2#kgF-aAY z)KK;r2jca{65^f*I~I?QS&~s-2lnk1%c?zf7NfYGeoMPfox9k4ip@?5|F*!^MfLTb z0Pb;y*4TCV|KAcn*AJ21aUu5SnQOT7T*IRt?Va`$z;Qr%uv%-ceG{wy1^_<-F4nqT zc}o=)ipj_+OLPodYeUvaq%<$tQvzTuNW_JrvELy25u;=?O*aAkMLe;{8f!-1EG`6N zVC-yXkFLp&1lDkQnlwC8rJSgEmD(?!RW5bU$E1~e2e0`i)mTtNY6}oxDAmP2sErZ- z*w}i;tq6RmR_RZA{aFReyxL)vxJ8CKN0LSHP=t+57urO_L1urDEP;g5$aM6ILJT2| zQfVO{YG5bL24#fUFE$xJL-MbE(29>r2)cF9 zI1~?{G6IH$1H%l*3g2w~NcvA@RVxF-(H8ql^}M2n%koW3EgRW?^1qj_@vKy4pl*ZJ zTBzSXkdnXsey(^roh$t?76ZUzCO+~N@7-E&+sV!5GC%~lZJARMFlYAyPR0DD+1<#(*KzTPqcYq{?t6 zjg}uXF{ug(n*#kh$Q*Nmfahd)mWEkVe0*&Jgeuu}_}EE#`ei}NZ3}iwR7H?0yzai5 zKr)Cdt4838eUMJ59~hEok-9;Orqvmtw49q@oF^+4l!1|-k%ubCs6@JRyj8`y=5`N+ z;*&aDd{Wg71DqOUBW?F&dzKVl=%*-|N-Q{yE28hyka|=+tkH@UW{mcwRO}()w(x~c z=?o>)YMr5+`Y1ps6nSef{PmI6_&J|?Gv>tPs&gvdc=w(Z%P_B14N;}t&~vwKDfiVXZ}}-8nt=E~U*>TD zT8> zZSYBASHv9zh3_m|tE3PMFD)fZq>?$(@NQ>~#dH}%V6cPyNP#sW$%^Q((f!28v$dP5 zGD<(yUJ%b`YDKWV(X2I-ly_lVwzH?OILe_TahK1U`)Ln$jVGNuT!wHiJcN)Jd7H_n zaYGoWtZ<=UkF57C3JD*VBrY!g;#at)DF@PLgru0$04`=J-gta{MRGOReD85UsObHO zN>=vz606`uy0_vItt8r=XB?~Fc0w7e`7c_z#r9PwW!s3PgH;f6vdvDi%${V$nYEq4O)XD-q&pkvGCLzsgQ#O#Z`8 zAiBFkl_iwUVDlZW;}0Z9H(>a90>B94UyM~GJy~t>t8W>1W)n?5 ze-Qbt>^ETW*I#M>QVIQM*5Z%&!jBUT6UDJm1zvOVSs12?DzQ~r8>(*Xn-_^;lBZ#iFCb@2g!3`z~%bEA8Ycf zSgPWSW%&okrq7)?zuA`^-0(eMGJ#jBGNvf+(^af+crjka@8&V1$F8t*3s{$d3>4~V zx3AJlrs&l8p_@%clwN%CSis?9Y@CvYTszrxbx;FYnGr8`0#TG_WA5bpS(7(NUffrZ zdj&6{cd^tRqc}G^%NJAxnVG&`;J4t#|jB3w&T$Bd_&X}iJ|35_#5z- zUswKx6yv$-Q=M+|(8^GL*UE%Zo1K<(B!DQa@*#Ub!{W{!0HX}^B7DSbo!@H&|c^N8z8_SgKoTc1gux(y-~ ziLV}0buN>8lYln;ErlWlML@mFJH780)lt0Y>nHz1o3*Py)Q!H3ee@d_?qz}uPQ@HQJ`clSTh2Aa~4It$mp3`yw+f zEL&4faaIYY-9^Uk|1k?@0xs9!gHB7HAYMwbhOOIP`zPsS?6^;=Im&`$bW;7{)y`x@ zf5OD7GD9M;ld;D%mc5-Z=W3pM^9T461^)t8kG}Hav7#-*tGhY&98Z)}0!+r@d*tRQ zNO64%?C(}tePaKly*_eN^S@q30Xkony4O~YgMdMq!C}Nk9}*xQh~;I20G=glwN&s< z$ma|}$~D_1T6Cp+s_~d%)}_DX802ukS@9oqeqp8!4~q*JTmY`~x-|EA&GXUM)5VlP z>W@A9IVUc*K3#8M!KU~x-lupU_>hAePR?iF*S#5bm^Sbw~qF@q)b4fCiZu;c7( zBCwW~+})?rEj-z=1|oc|WhfTrxN~HtpSD=l{E4 zC4#?RpW|6)HTsnLS`wrz3{b?U9ENs@Uc>pEEGNYDu+;FGTQV~Go27=8vbFMZ7g=@iYY9|Lzw*; zbNoODDP@R_k-n=8FLT4lI^3K-K<{UKAwkk?d#raWeE@RT7)Qn$q=AaZqFX>nm-lzU zXc3QGEbb_L9Gk0hN!+7tIIc3bYzPUze>BsN>P}D;k0u!FZ)p&R4Q{a4) zn`?w~TM;>ox;bGVr!@T|2cW~|#$u9%x5-KFC^tAoIR|ThNaRf}RuW2mq*2puFe+ds zC0f+|njWjRN%{RK_fSGLm>bINqu=h6+OhNq23?qL5An03gQ?O0wGRGS4U#ucVB&gc zYO^+Gt8qHKT?#!v4q>|msPJI0=Akh@E>r6ffh6qci{d_L+tZ?n*=3%LZeYF(bZ@m+exTzkB(GZ))ah0B(5Cf8yB$Nc zXt0ClggSIX=Oth@TCT4RsW3`r&*MlZDwMy;GRVHa(x$+oH(OjrdS*@n1S!Wm_bm=Q za>n!?Wsx?(M)e~b6C9VRuzMfDYM7l-=*zZAGg<>ZqMrSLF{;c2Y816wNpIRzY|Q1# zr6pWw^ZJB749GCAJFl1ow`!MDpv!EcdZO+j?KIKwT~yzE=`PJfid%A)k!&wAO=~%S z5xZP)-tozzhlploor9vmDxO^~W~aubdp%IW6u^(_jueu&tzv>46kr%9H1C)A(UQfV2d z`Gtd@a!3nMqX}7M-@c%81hKGqth0EB#zB}w6Wkyo1SO)tX)`@COzBC{MZSvt5)Y^I z7pfL8kHk+c|Ni}k_Wd@h7b0rk?AXZ;1L`+v;*99oc%;)*At+@uxbuF%GhTKaeFeM3 z6TVP*Ht8iy0KLeq(o9Wp?mo_s!cs~aV*Rl%$`}Ww_V$_7gz(RjGp|%=a01=8UtBH; z!&4w&za*>TVk8Oa=;58h9pzt-1^(4wreWOt0n@s1`SUyD-0L!om72us~#ylXSOIH=Q_rJ(6cpPVR819x_PhbynLXZ&;xaHgSGt0a@L z15a|4VjFQ@eJAPvi84W#-mFk#wysvk=m^`P{fU7Uezz!ltEu$peAAAT)8Qd2Zu4yJ-}C|99!i=?3mDl7JawG{eYCu73@L*08uHPx@{-ZLbG&_fSBp?B#` zz=RG0h7vkRm5%f#YUmxQf`A%&?;S+x(gj37np6c80YyYbJe+r}z0dQkan{-U!#l=% z-cNTjGBT2pnfagdf8W>jy9_#jPf1*j&D8HMYB4k?9=@T*e5Xt5d2FDWm5$A=NLSBF z)9qO~P!?_|eLR{+w&ks6;d7KTx-X7$$-exEr^w27(TUrz*hXl+%MPL>RkrFkGvz+g z`Jr2_e1OQ@9|CwTU$u^wips(4FiuTSw~+e!J3S8Y2>4ZfJRxn8>7EJrSFo{a%b*3- z1xduXi+Fei7!5tPj%9_adu@lsO__7-ntu#JP>nhZ0}}>5{Xjx{uyDgtWshBT7P=3c zh6d|5n>jE$BEWN7*4qqW1;xMK9h^EMkw2qYL$6ZFy*mF_ZClBk_2u2ol?Ozr;A?re z^kwj{Py*#Ero>N3oX|2cW6tZsD*(6Ax9daG4o2W1a)u?QNMnaEUDoDcu64{dlvc-C zn^suQo{uZ0I}r0$R~_!(~RQ;;y3~<(pe5%XKjsY+#C=wP|DjZn*veStA=o=G~*z?p7lb)0P2pjmgbm9)s1J0w^;qtn=C+Ixk#w>?=q@m8zv$ZUHX zY@TLY@Mm>r;Bc7W_ZG3CjDioOHnUXJ8E5o6sd82DPiDU`GOtGe-K8S;ttpvBk&Mgr z1cwgk*Cr{nUu(cDYSSv!4B&xb0VC;e9S7jK*bPPtSK6mHLn0~@CnI|S6T)X^waD~D z*C#?(R01R(OcT>sztxu-Aorj-Hn$;$5A-Vc6utj$7O?T$JSVNKTKZPCYlwRH6JO7o zD5m($kK6D7cl%IK=y#Dqep?t zGEReRed~hyuVWx=Mf^7&y8CGhgEQ!YRIwCpJe<|d7HoNtu%u4Q#a&{MTWwm(S7`Sc zOt^JXISTnfOrtJ{88tf6oR8*PZ`;OX5#8H^?GRUN4_p|&s7+kz|H^yY8Yt(D# z78ONQ4cbOwc4&YDsrCJMOnh(iS!K(9)i-OmlXFhhgE8+O%a|q%)87JrCP+ERq-a2BuTiOfP%IIthFw5nJ|ws_yAI`VC9iOe zI)H2%sP2(q`niD$PelW9*sOjc4(Aox=Ql_LAq^9)FJ^3#jTBYKsA(UPP;#nWW$p;v z%i^hh`93eu-hTONP}&{-r>NsI)`Q+B!`3yr46$DWg8_0k!L01@J=5*m0f15yTTSU+ z3DweVP6dJJPAc#mYODZJMsO=Y^_IZu8WO`{l2b6*u}%tpq^o5R&3^%(Ph@KbZx2E?XJ zfZim7bo62U(5*vNo7^5XR!Md&<;LNYd<6Q*{!@)0&wE3^XY(f!qMca_Z~+S3m^A*yPX`L5>!! zvZAX$X71bw`2z@mZ0h?`4d5%Is&6x~KUmwWwIK9_*|HXUc9rCc_|zPIUlqEqNUg8h zS3Q7U|0aRQ8M3dYLtjkM-oKo>)Nuk0`(*Bya7IUr*)v|dhtk6q;FEtRR`_}An|Z4C z8cS?lcPd#WP3jmuU|GRRjTOXT_>py=U#~x}iF_U0L27ZNYe;|vN+WaEJqnVas zRao(zBH}cL=S^AU>apCh>CK3TT~9vBK4kd%6b7O069&~JmvaBS_{*Q-vK<-1J>pkj zuyee=r4;WbKRP@0_A(el-;O#D4se` zfm~!#f`^+YLF6F=In63#8akFN2wK#>oOX0zF`2z=E59t`0iPoR>m-BVoyZIi$1tA` z8jMAI-OUy){t3TV6iW7Hz~@e(j2JWI`;gQwyaxsF1?`78Wt$DI0yU8p_HGx%(j|vfmD`RcEG+lzOfs+!Tkq+0B>(AA zH-}c8EOxB2sORSVnhfrs`1mgP^Q+4YwuT}lTI)4l%UFrm5;f$*JozlojEqB{%dL#grudc|vSoe1*>1L=+Y>T%auce-LBMlkwtl5sZXw!Zbn?~vf>SgtTsYlEQgF~7@E~q^^T7FjjL``m;d7aU+HXl2wgkzmv!Lc` zInLpc<{Fo>G7m1E=V=SGh&jfIcZ`N1_#E9_iQQ8b^DJ?PJWL+zEP}=i;6n=m-hG%o$udTM(|qtcf9TR%pmc@Y*V3Z zPWe}BX++0oEjDoTC(tMwdaZ!rg_5+pqEW{B>%LWG7G|@1=j+Kl-7g-#ViC%-x9;xf zdCzm$Yv^|#Zg>T=N?P?a8VeV2!x1Ma6U&>1-Tz`Nkf`66!sejz_N^KcpWW+`#j-%j z0;4F5h~4zL3Yu*(q?Hhoc((wI6_JrLCtY(k4d|l*4dh>m+xvQ!9pT89;sT=cXqW4o z7KkylAxQR)KBcN=X{~J0-HT?FyPmlFnXW}9YMw`Y5(Fb)L3)DCa zs#1!HH&q6I^cN4RE9Q+%HAlPAE6#6hxxDgy#Bx)iDrw5!Y=`&bgaYNm>YTnGuGX=U zIvepid7B{w37M*mI(YA2aAfW>enQ(&@YW~bp@rrrXh6}eeq244#M~U8Ub$Mc}8?;da zAwYIW=`j6OC!f6%aBT;T1c*P2}dudLN7guBm8oJx+B@xJ$SJWH*XGwg?^dpcjd0 z>fab3_0cAIxCv*qnm7(gjwaPFV@CPxrY*EA+pXFqf}OK8dSPui2C0bM5p8eHbjZ9e zWwYmqQ3p>I)=iOd1g#-rn1s!ysWwPAi%p}DLm zwch)n`OK&-h z!>Wd?r~52t^DEfHiqMf9xDspD_F$v5xjO*~nJZ1T#YMV7gbKmP1Q}Hm>(v!j-E6L~ zuG?01wGQ(GLX)mzyac8Y7O>`66jT!>To6#@CcpqJ)p@Fjd9&ev`(EpFK1h7)XhBo~ z7kOtQS@uXC1J!3BLJwD!H#wBVlN!2S+BZ6AW4MSSatNDq334cSq?bk3B*NF7%tlxSe}&6P20$Q z*wW_JRe!~*%Uihw%Rj(x7$R)Y9@VAZZ1q`YL={Fs6Le+%DznC?YY}I^|FM`)7m<5@ zQ4MZfp}_vLyqHp3!{NW-*CK<_UPsLjuLzVJX*Y|5_^+}wY9TO%24Ju`x{RpFH%10 z;&vZ^!L?n5pf1&3^@(3N*^BL3IbCd58F+?F;<37Mozzvc;{YrHO&Lq$sW-~=9v*tu z>(Sy9VTnE-@(~p%boUr^#aU&Viqo=l>8Ils;MY|IY2>-%ob9dO%g3rYx~)J{Z@sTj zY+WN67Pj^Cs5Q`WveVbk8_~*UyvojgX)dF_q8@2bDwbJpP1K)aC)>|ej<#fN(pB(7 zW}dw^_u|sF1a%2__W5^l_mTKjE)dwI)Ze*l+u1XFPo23F#^+!t{l`b2`jT&ojZs7X zH=f#{u}-uc1vr!4$0&rd5Lkb<*wpKrdBh`9bV}O`QEn) zj#mX=d#yJX7{9H>Cs)+?crkAXG7crUQ3Xkr6f3uV^rVRvin4;=+L(MtqKQB%R;ymC zyyD1j{DWjBQ(@|Qr-Vk=D%V5=oN=Y30k@MBDzMz>AeE`Z#soBW}s`5JXJTWgKWx1#5o1E`{wrSH>fW z4oZ~b38|FFGq)}-qaQ)X*F%!TJG(Ng_A<**VK)W*vH^jLH$?@+LfPXL3}$soFVMsu z9rOhqWyD=~-_!IzV53QYO6nStc$p)zQFbYq7T1XKQX`q=+R$J03q!@u(z&*AhLx!Nxom5`9ytI>RiprU~9^QmEP&In4c zCX47J5s8Dt5sjpJlJCfEmcDP>q2vVZqmZ>n4U`-)r_*^f-}-l?IvO8i#7>&F;z;bA zd92!8_teqh?9)g|fwD%0W@9wB0D%QI*3BR8@)%9K0of4!fw1LK8-WwJ94FMFfB-U* z#zsB4zz|z#@0X7m=$);0MDt#1RzM}pXB*5x*&n{${TrMHpL~T?vKATzwyLw?_(`OV z0ucwSu!(n)Vj14$-K1cO6s=@Tbf34o7|qW5obX!CXD6oz=~!%I77i?bZiUVc`kIAr z5cr8wUWY;SU@w)HPMqHP(*&CUH$lLtCLR8kXFL z4_Wnzc73V!?wOO8xTaFap8JIlL1{+(@80EqUBWP+q(aK@O9d23&(fTqjgSdeUpNp9 zA&tisX-916Q@zepyY@9x4~!i81m}RVUXd+|T3S|>PWTzIyOG&TWYj$+$#*fpir{5`z&#A= z*fz6%?V;onYc;uus|KoDcS3)2{yP%;zXa>OYqePn>de2Nb*aH{{3nj+t7<~uw|#j6 zUuD22YxGt}A~zdTb>@zq?SL5%)qvaJAOc%dBP-8l=9bxUd^{)QtL5P4*cc*)?xW1z zjxwv+IvHZp7x0LTbN1BQTKX=3AsGIWljk6OW^g|;?gWOcZ(jbl1U2Qll> z%lU$fE{^^+wPRYlOCWM0p`}K_ILy;B;{haw37MOR5#@Dt3m4&6VU)@(f9lUHk zK}fW+;jG_~9k?I2{xc`u&eJ?LgW^5o%Ufd1%-!0;w^Gk+MKtsX8+@M``$~AT%P&WG z81NBGo9kgp|FLAlB4yVZN&t&mPuccvP4XJX2}CAZ3@eg+{8;`qa7wfiXj`<<3z(9c z^bw2T;A@?CUJT1{MzWr%`{Q%_=?&ty%4#p=@?`ATIBT1xk!4SDJWf3aL=SJJ{b2B9 z^_F5!QJ+X{qPcqxLPTrbgb6M5wp_`t!P{h7&ckZ*!*~S7j^Ja zO8!TDnu&QLH1`;sbq;cS7a)X(c@MLC^*U&<&R zR_n|=N)krRi2Kj1@#i$%m2{&c_b8!A?zLBJo@8-hbC(!KvN z5#^Sv>6h=c=`_V16KXXfV0=ro>~zicF&SOWz;u@c>m4}GRdHi(%+}G32asJRRQdJL zLJsO4umyX-=yQoc-Dp1-7HL^Q7_w4kfx=>XX-J2>`kloG(I58^OX|B!P~am$*2Uh$ zmX;1z%ct~vsvoQwiQ84UrYMM{MG44B+v$_6^^Fw=0ecU4AB^s#i(0bEJ>xR2uGFb= zV(@4aS1=?D8jxHbj&A|0Q(_k-oD47S$Ngh@d_~4b=+spZRYUCMs@{om+G7S3rAZ@* z1Wvg|v#HU@?RP!!11i}lC*w@{VF3jI>4m~Dk8r%KUxj>BMw##dv$h*~8XxBa#D}ua zezYLjK!M3jhWu{l2*!$asEtb*VOz2lC+R-kK%k{DY^;t{X(g?aC3!LcO*#7(qt~!+ z0ej)~UNol!WLs}Qo#;3OEsh4;=6FFFw*p-6f`x*W+?aXO2)*H>kF#9j?7E zfllL(d4n(#%F0^~zsi5bZKFf{nql0*{#E;YACsMJ6o^r@u>eCPNJ9}kT(l(=^S60r$X@luyZZZ_k>;+$@heFRBB>Hi z-(imKa_aSFUSD%rw2c-*9k1(EVSA`ALnQzr04;$|f91+6AMgG-H*>YKhF}hnt^2Ga z7${DvxihU<*DE(O3ZdHe5gZ^q%2QOv$j|sI*C*`zFiB!q|6e% zn3APeL6vk%#sy4vprruz*oO=SWPwkm|K+0Fk@;^uoSu5Qp^A!i_&Otg90bmFs(|bf z_Y5E>*O_BZxmlUma!s!{JzrHF(eTjn5fS$^z$o`5zb760#D{^dXxcSLj=ks*hyziS zx$W#OjVWkCcMtoNue8c#*#h?Q^uYQTReYIV8X}{FQijfXO+neLD!16tQ@akKy)I@U zNCZgh*&Dy^q1P!9*m%_Z<63>9DDC=f`z8MA-q)+qAJxhXm!38(R1xK?E7*;UwZpll z84S1NsWPykWQLSQc*;`Vdo)(XZzOgHUJGaOj+)P0@58Rs=W67ur^$jvO_v3?9KEx* zt!Eci!=$Z_vkeiyF|)l|a`?paO+_s`x?(cfMYk<}Qg+bkfWLwUg0_Su+NR)~Bz>FT zI}$)DK;>g!hCJ)*T?Y|H`98np2vP9Tq`8|l?yoVZTh_RB`$fEFFEPZ~?vQaVjj@__ z`5|mc2HEvnhmdy@9|7RZWP(jN7%8>-6AM@yYGwFrZWtTNYZbEkVuYT0*^zy->G8Qu zVMj3%Nk6mlQX!TLvfUN{uTgaQd3`LYBrMdZYY%j zF!^hp;%^k-#Wp9X##>x_$w?Z(6jg}n$4AARoFUi z4_Yy=FM4SilKY%$)${Iz%G05oHDGLmYLu-crB!I@{RQ1cGtLO?j7}l1N=|X27@lp( zs6ggkBTW4AK{)`5AFfbxl&n{7p{bdT{{Vd{j-0sHVhuz;Wv>HZ=ejj(H%6yNPBh$S zpX`(r=mD|ZmOybrWTT#H1cyjV3``sI(Vau6RS&vJ0eNA(BO3GQUaPhbQTO|A;{r2X z1?-kbehROdK}f&0$6_xLWV7`uA7e;E<2QWHn?BT0GElO=FeNwhh2D3$I!ArPN%9}- zId8j~{x23c+SgWWX@_zqp7SlUr#r8dYyIvNq-6ND1xg5tHQhmcn%?>CZ-cry#=Cw! zgCf9vjstM(zdC%(?`Tzv7nioUJ0%bM~$Wf#f+ucv_0$%{0D~81E*qz(-I@sRQ}Ud_9b{zSS3`I_NG0dUXoU93JH?ZOs0dZUIw9xs`7BEiu8I~9Pws5OPJ`$g zRuL~DO3&KoV@=IbGaKIh82gR540t6ZWK)$b zRJH!g@Z(0eAg5CMhA=V`3Q;HL?XXxqp%;vK>D8Wqq;5($DavyNqRnMw3B!188rL1t zIYaR+cx}LN^0tu>gRkJ!Pj%NXJP@)sGvoLl)=wcYey46t z9(>(~;Nx|vu3C}PEYc|q64a$ApZu4B+rOuj|AelTu zzvLjau#9Pj?)|~4{!TdjF1h&3?UC^=`raPWX)rbvTIZ|S=L+F&$zt4O zC(>7(-nE&pyO29g!d3i??=r{<8PrG!#Fraeg?P}N3t1h;AgR+Ps5bZ-K<0 znWk(xrlLt=G;BLdvKD@>!xTdgW8bNh`m#hL`8lC6+Fv`}9gquGmT|op1_5?R?k3~i zrYYmRgE6uNBlCDFyLX87Ti%&ou!k|n<8hcp0cnFmOjsuaR?SbFR2DdOq2ljjyp$ud z`2T$=CwV_hhlc~8(0R?m!a4Xz->cv7SnGHjSD0H?r)FTcvHnxp*x$D@m2brqxa(w(Bwy?o>Uf7g;dFfvG-0-~J3)hLXkPHF~!t2#jf*HwX_Cc|R~> z5h%^N>c__E2Ka4ORaILaK6ra3`j+=DP!Vyvq!CboLujo0wj1l zHo5hUDX`TFhydJhm+Z%av6N6Y+VT`e0kjD&m$-U$jDa$;#es*LSZF+b&euT1XhIoO z=G`1S)oa@>4Abn;RzqvcyxjloX;b?117G49_UX*oKZcI?N6ENg30h_J^tsuf0zF)IRq*6&4r%k31V;s8k00F5M{`n{1iXtH-n z+i#ekRSKSmkNroq!S{dlP2U?dSiP{PZTNWYMon09MuI@PVmO~)8&xFXe+EZv{5yHf z5B(R#QCM|@(VYJ00(X7&_MfI})6YJA_33Zwfj_{Ek@C?E{6EAAXR5acOiebDNi}4C zY5te2-yX&B>0EWspn~xK`0hJwi9}lA&v3oV(~|~W;R&RQjpARgb!JSzE^iCs?5qX4 zWuE7tR!}3O*p$NX7=bZiUvMkzFkR9`XL#9f!)*z zg6r=S#Hb23-+5Ww+EN12#n&^EFYcaQH5qgby}EHq9P6p;r>Nzib;|sAImL6xj**KW zY;#XKCjj7xq)?B%YF2bk!JpUh{HkNQLsGlI%QFLTqms~@DO<-Yg*RchlR4uAjQae@ z7Z3s_fS&^D9j}vmr#qMa@sTAaERhz44WYI!y63#4ST||gx!E?vR&s-8h?n$hFU81` z2k&mMbbrI`?kF-7B+5y?^O{x5L)wbn*j0zHR)RDM@8J`1aj9hp9MD{C%Ij zxhx?VD~`$reV|`1%aL~-`*2lvm#0>L)7x8AlHbuVm5qv1BSr@Y>|kX#lW9v}&;?hb z&9=tKNCs6dN%fGCEA73Xq+uzBW!~QcOg$s~PJ$ZG!F0={fawWS)Oy{A{24W?s9<9m zIkwV~Y)zuZ`G(DdG8GLi4Qj0orN=_}B$o7Dnhhy`hV9ToEY`K>ND1)aVIgX%epV!S zIw1;;-ySL!JD>Gq+}!8;@1@gRQqfONvi<;~NB>|8NHWZTdsDEa2AI8HM*o_~{J%+I zE>6ylzC6JJSBjrzi?2%V9gZn%$~HU24vXmLT1^?0uXk)~(6Cv^Sng@hm>jM?%M4oN zNPq#bc4@FiYIGsRPD`hQRY0&)O~hzBXjpz6u}a>OB69?%4hY!UVx##8Q$#5d&${Yz zdq{L3gElB$M=|QJ*nR5&3gwi(tobTaOQE%vUCWa1OB#A?Ly~ecZ#KO8dm`@EK?lh%kp&WGACvcC0E-Us z13jTrgue}%D;#3DuQ|c1bILXpR(%;HrlTid!qGec>F30YqG9lzSP@I^APIClK@#?o z(m9Q~LY%u@*jnPQ+)t38+tx}5s6E9@I}_fefoRb*DU1P?VwR~4iMr!M8SqKPyqHsl zUS6!pJrarcb&s1F2fU^e7)kQtY3M<1Onl`>LaIj9&!0odZ#31k5YM3{qg@5rz0nZX zH?J4g^F@%^m)SAzA1B8(!*iO_>}Sg5KTPYsy${&bKaqU2jwDWL;EI&j6E8r+6SJ06 zr?}neAdhCEi618X0SaiIaibY@WjjuWYI&qOZSwX$;vYA52xWa`p%*{pr3~Zu0Yac8 zBJEe7$GxX??(=u2SukME#w(Y3s9(tf=P=vTTBZBxq%0rZnv6C+u!}n zqEff4svR^MzN1A?j9cBN@l11a$QCJ0$wPta!!5~(bL^t)dr5hGkhAR4UnLOcjIn=%e7w2c!59e;ia@5dyx44BtUxj4#QS(3#}|B(a%0c&$B*i)TXgSBXQhOw$OTsZD@ZCBAmnZk+lY# z)@Yc1CTbrPU!@jwomH-#I7}Mc+s6<^>~alovwoRa?+329ig>M$)E^D|0|cq5^u`WG z=^h9*lUbidWcirlR6EQ%`veUq^;m_U{P$8i+9dmN90*c-d@HN?^>Ar^5V@aUO zj`@nMYp^PR&UmRx!=Q?=E%iv5<&u{gx9QU>IkJT0p5ptQ|0FCft7M-_?QwQT1{cp< zWlFg=AJ+Z#N!|H}>K6+8hg1I-J&}(pQ`W}YyrB3ya`4}GkVZU9v_D}#+?7!8+v}Md zcTj%wTPB7=Ul0||C2)SpQ3lx(eLIUf?24=gu6BgOq6NWf>2#f6Ln!<{6q`l;0dD-& zwckc|zB2=EC@=KiK$!hB?T&uzG91t!;_+oxxy3P9Y(;gSp z996~XRI19eS8ow#E@4I0c&9lfGJu>!+b_Limd2bZ2mO4fxF{-TQw0wqXSq7}46!Vk zM|%)T4sg?k{;HioAhd4UrzcBM<~AwiSC;543egkPG(5R}^b%L)@CPV;I-q2Y!`$AJ z`lo|<*uRhD+cgAVTTzH;2aZD42u*CJ`NB8+$JY<9o~ryeimy{?pGBbGfwj?I#Gypi zo;Q8{o!^IS42ws4@($4iB8XD$yA_mb3>m!uw(!3!rsFJ|?O70ul7+AMs?pG&zI|bp zr{^vrH*J1|uVpVQyL2AQjx)yGYF#cKoV^W;8&%Fi(nd`HFeK2Xy)uYg zq$iw45SDhf`x!px!^swl8K@~D`C?rK$`Niq8v@wY%Tk~-%}4y#}dEYi{jXN}I>shld611T#Nuq_W6foJI%Ok(=qRHFo~r8P$i z`7HC6lzsc31Wfsze)cs1v-0LF<+JN+TU)t3ErW-m)3Wo9}YpX^S%EXp3kvR%vrEIe8 zyaf-b((spwpknTo9P2$}D3O04&&l){GH5~-yS(h!9KHFh%1B)?EoNWXm)njW%Mwdb zuL(NMMwn96^tF59)5m1%^~5kfO>!j(&!lL080PpNps&sV^ECRQS0APh0`NmIry@vP zgyz00UG6K%C3Q+#by}TNKe7I20A=YtvqsCHa;T!}P*v5}FNIJ4$-7W@THZVwk1qI> z3wK++%(zh=y7OYUCiiTb=kGj4 zHQcaf+#2Hx_VEm8_7m2UKZp7Yye*POA4gsL`OJ4c*w|8{BVDb);&(+#@E0~?S|7o} zg7-PDff9IEgt|H)Lrx_wm+N>(ps`!gT8TnNMT1kDDate=yuLWw0N>IQ!kG~3x_(Fa zQVy@F|CVutMF?s~>KHzgxS}~5+t+-`R;lf-`)OKH=`8nahg#XNZV)BU%+mEiwVx!K zRS|vSk5tVQa`-4>ux5HuUcI{~%pJjOtW$R-DFkMW2DutKmXD>sdcSOt3;`Q6V zd<8Zcq{$XXTp$~}&+WxVw#73v46$I6CmCuJ2h3`~%2cG`F{U9%E@4ca6%i90?NI_1cy;y(^1m4_} z*)jS9u(@Mmpk6YgZ@5Pl=!vKDE zsYh#Dt#8YI+2cU~5&Uv|7 z-MI1T^1Ih2U?Cmskrp@Zn%!6Q+xGsEs5&#@b{`k0sw{EiJ^zEGf3iG*CttHOg<7f? zPLp!PtULX7#{Yd;w;{7nb9kn8B166SOr0DnC{q36K<>YK*Uosn;CRFTjBZdn?Q*gg z*Rn5wqIn~g`ZE&tY?J7}WZo=E?BaUme<4gbbm7)^;Ln`sW>TCju-GiKQoOfN`n?Un#D)-zpHE!Xy>DO{D-u?AA@$gr= zX~(OJh8R28)r&^~B3zYlCV2RoKf{|PrMjbxJob1ycXCxyJi3ADaT}DlHU4`0-EWT^ z5b(8+@!jdK`E2@;1d~Am0CEcSSn{6Yr?(WyKi7r>`RrM;p@1{2iX@-!k%|z0A8t^M zF)rbqh-at(y1*wHo-?)kN9=n{RN}!ezvpTxUrYEUFH%jxH9b^lg^sWN)N7^^JR3zi z@T7a=S5Q$==|s#({dVRJ7r6J(TMh5w-ix@?9=661$X<6-wBlyk8V5-5<*3Hnf=%tH zw8tb#C(E7iO)Uzq#E7xjmq)_*x!c3BN(#c3`@7#|aJ2C6jd_ZZNHvC3l16&9!&c1g#R)P5Az{>&D$ zkd|;nWh>)Jn3T&W3*)WxtxC3aj9Hwpi@*ifNZiA+S<_q6kQXV7)Ik`JNeRF&l~Mu5oAJI{I96^nCGP|Y2d zjzR}|T^r4;3SW93Xx35&Oq{1kFwF9!sSUwUvYuaX<$L_b5R;Bah5&K|FuVl)z9fdv z4VGLTxOn>4WA2$YIzBrJ!cZk~8~+HC$MG>HwI&!>&8%v~8(4$-NCGc-)%4|`*?BVy zXosV?xZ`MUpVo@MeKQs?j9(}O$k_|w`qofGlCHhXpp@c@$*l7%JCrsE?G|zGN6sXE zY2`vj5}AznOw66MBb`f&hIJ&X5U}JQcls+P$ONQl_^vNrbyt*G z+X@G)^PIW6(5B8r4n*OG--(hY_dfrdan(qS?I1n9rptH#4{?4HO z!euA84_WPEji8e~Jzl!1bAc1EmDB&94E&B+T2VUYJpo?1tF>A4p0Xd+lsIKm@#Hyi zmY?3Y+>b*^`yrwVP3+dQo-ry=QM-%lJOM0kpvl)A$0gwk(CZt18;z^&ekAr5Td^8X zG8WMl16sYzmu!9J(%6R9%LHj0RT)PgjvwDzF)k)+$vT!Gz4+KnW<4oFAP+4htC=^n zLdv#{b6yt%{B0MAs-5xv?vF^Q%2Z}n1B-d5!XVzDwX9- z#0p{=hTED2FUmX1%G+dcC_p0I#kemN28IfIHS71lw$_n0;Ivdqr zH4_uFzTeq={I{iL!fS~(LcSC-vNyXfX;tR)db2&|F#9rqFOab(??QYFPqroxn_y?R z8jw~8j3(&RTL|kim=OY<9Ya}zxu_OfGh?m-VpFYo9b2LU6)7EKecGM!gh`JAbgdFFa2>5P`^y6s>)r%I9}sLbV;`Rm0?Z zuqhDPmBcvs7Iu=@Ri`gBFSz+0c83E>`QZ9VpmIr9?qR(Ny-pteJF^$PR?gq>t65K{ z(3qY<61QAy^J^FhLr%4eCI){fUhKo!n$EirbVd}bkx2q+VKFCs$ zF=n~AjMFQsIT6(qRbEkmK`4m6*`8^>f8E6QI0)Pz^KkD7uK=DPwR+4!Bf&;H5i!>6 z$fZwt$T&^rW+afr+>&~z2X|eENR0JXneXItm)|1&kelWq&A^KGVtJj)x_00g_AoJ# zJi@aqgJ4;xFZ6ASe_|^`S2U?RjKC`Mt!$0?th3rnE;5d;r3{ZV!%N&nzyuPOuH8}u zr4d#4C5kW-ovHN(&q(8#=4Mc1`8U(pOc;)%CU-96Q{6I;bB5M0z7#*u4?GzoQ;dlP z8G!k2{M6L(^S=-ue@(R_bqGEQ$A{VxYmfv{JyY>Ef8PD&M~`q@*en0<{`dZ3R6Vya z`2_S2AKu2w|9&(ON5v-Zv+-{W-6vVbipj472&!?ktH6NPE(xjN_q*V#+eh-jAT1}B z>qZy#R__3#eRIb{Wp*t5b)TwQ^+SEm z1e~hwFn42xFqcyUe>&_l@r)&o`no!AdF=G-5D20s7n0`hrkxqY2v)3-7W&3Ab@#Au+GG(>s>SPwz@YoZ5g`k`Tyn@vUmK8M z_LV_JPh?tAYrb3~lb+tx?6)C#C0kn8y!Q}?%{BOeEPI=4QKu7)?$<&K#j@(_adPp? zW@HdS*4vhj6}t`zHI#4mB%h>#+`RbRl_Uk=Txx==t08+S^-tZoos4_{VExxn-G;s4 z^&mOyecrlS1m!!FY8S=MPRLy#0Qv^UL)A{k$n~Ycp@9q%H~oY~vCojs$&8tfUkpTS zCDX`hbM%{CLtP9a`oa&ml9NU{}^TPa2hMB}WLW0wYz)0ydLrUb_dLo)L zZ8JiNV*`z?vSl6dr>6h`4IcV))`|WzCvGrv*`i{@AgqM7e{dtQVYeXzm=I|)%0j;7 zN=oOoYQq;*OfN!;w$@%-Fkq5>Eih+GigYWH08~hck=iEm{*CJFE@5__s-mRoJiQ+- zxmOK@3Xk4Ooo2ByU1i!CS!99TO?#KDPhUYm3>Xj5PC!jpG;onxIroSc7nP<-JIeM=SRl2g`0hUE_a|Ai9+#c6~+7V&y!UWi4z(04@&5}Dn%5f$X05BjJXc5z8zbl^;T6 z;Gaf|I$um$5aQADsv91wPNvG7xu%g_HktB>#Ymn51hV04)`pqs1V+7dLu8(Gpc3~; za?4y}O;Di43&wyy0D;k@MzH+N>{ri^6jvg0B15*0poixw-5Zy)rlJO@jNhfts(sQ( z{jGv%+SY^B7FnI?Ea^BC&y&Y$o0Oof$Ds2@%cQic-Dd@gFZ4e2f9T$6=ri1))cQG$ zJpwoaNW+BWho%EUuB5LXs^$6hm6ymyH3WxRAMfA%_70TG*DN=zbxR3h0`HeGkb+&hp2MU1uM9JL zJ-rHwC0y(YC^9Y4@)rl!{<15(hf+P~GkFGxPB#4y*4{cOuI}3w?WP-O8f)C4aktV`t(QmOfpR7x9V{|<`U!^6bPrrWFf%H7*R6||~^X$gl6W#v>fIDUYEF(mgk+$f#I2bXR zzLF7(nf(A6>irV&GceaiQ>+8!cARpuH>{dW#5&;@l(i5phD~z{u2SPJNVtwa1$^xy zjyP!rJV7|<@+sSXe*!ZERIdVU%KXPX*@`9D0~&RtI{nGC+qXHn&Um5Rv87n)?wYz> zBr>?&xNnG5*{arIua$z78|6j$ZQ^Oe-FHu2Z877}iuc2Hj@`{uL#@jj%YIbd$l~?K zI2no*&X5y1&!isaVM>nEaTJillcE9NleCe!b!0Wdwr-OMMFwr{q55F@4kX|@jVU?G zGbhNU7H~!rI?t4&p(2R8CzFhcVNf5cW`KvAk@L|Dnj#r3XN)`dA`5>-yhK%&vu zoaQ40`2ZcmvE7SnDm25qLOt+~MB}RXa-fWE$#x5T=h-sCEh=y?Gs9h11 zKu`|u5aTa4IB<~GEPYz*B@_ElQ}F3$L|uTa2*kUK_2>~kHRwKg7Hh_q;ZCw0ZIag# zas8)?xA8V)Pl#m3K!xIU$!En8MPo?=oZ6B-eK&liVQ>2N1Cko^Z-dBX4ir0izpI{Wrtzw@)#=F8^`xJhiqe zD(PciVw@C6P)UPIRZEWzI7o`%qDb3H)uRVkH2r@}o*unDfP2w3vBTcB_BwQn?Q;cP z@kQ57h;WS}42gN0DpnFc|^SUeHLk3q>3&*5EE!<)# zZ@*lEYVjLwk>ZsP(Sz!D!{byOQAt(GH8|zAVS+KGF$3~9TAiS7t2Zl;NCg!D4KdPP zrrn5FOgnC`l6QjyJvtFib1fV1x(s!NgH{whRG#v8c!A*@D;nPN7&eup#$5>hy(1=a z4q?yC&$g$c>HYhR4wfzrr*Sd0VM#qgCLxmx^&oWUB!q2geNvpTvR_^}@+RRhwSi~I z!kMGj8ipOiFv*;=7(4UtQ268$9EGjb+(1(w{!ZWwy$&c$6Obf5f=xRa=*GC>YOQfK^sU ziMfAiA<_VCk53p-cdt^nXxQio_6r#H;avZP-Z(Z|Yb^B8C%#>T{$c(vKz1{d(cJHS zbRnh_)@Lr?B*pY7B5(G=SCERSXKHs1HWP&q4XUHh}P@y}xTPx96J z{sz_YI7qabZQ`-bLiD)!M2H&xcEYz^Fje5Rl2Qe@`3pM`Gk~b^Vq#pL|Errjou{g+V4CGM@NF5aCOZCf=k~=GuJD zh23nzrYG~TKKEUk2UKf;TZ^&w&HEn1EL7_-4f5)w&N{IQzt)Js@~QzGqHzsvpYDg$ z)~)|?7>c%mW^a>XYM54HGV(NmE=FQFxnAZ(0kbD36uyX zRyEr8eF(k353suXHnD%x`1wTY)2;e-j@FIwY$(;e@tKwi6-AzOv-b}sAbbfI0MuO^?_X8w1>c;L@Izz{PDT(bF~CmrAS zEkEmx?<=l4*~QY2hf!Szl8SK;>6mdllG(%V0*X2(m`-!oU8o1sytfsGL`}Ip_uzsc zX6+derM}Gpf+a;pxszpD%~vUDfB+E_!w~%bKRz$E+>>FgBZAbiYf@e`YUsB1Pn2`a_fKEN1F5Etkc=g_2ddJF#+zFvOiVKvoc0!zG=)3#Q3X} zL@HIF!Kv|z59^)K47;|uP10UmSSs;EDNeo;#bk`W$e;igmXRM9OU|RE5{S_y^G2Ff znZFn>y95MI6Z*Q3hXPQ+T5xU~zQNxgsRm98KB@oONf}^8J(s_|`bUM4zwZFgBYx)~ zHu9&-YfG)gT93SqQ4WjNGYwk1?hxUw6*CT3L`P^=?#t?qGSD(~YFzJ>J*P_bE&gGPt2)0NQ^69sh!${;~|4C{bZ;lts?U(~w*fk{*u6rDChVX+?dh zJos~0r(h()SQ3_f0>G?{J43Ics)--l4~L10T;2Z% zHdpf;fO8w};1rgbSog^o5EQFB9CC%`{_2pyUrKHz%w^bndo<4QS<_>th`7L z&Td84E#BA?-KTy#mk<`UmE|kNoqrZ;Vw-=*>uSgV#gB8E*L{4-;i1QQLuU~Kd}S60 z;THj41V@!z5y`RPnZQhzfT($+Z(d8!u5S{u?W5)o0q3FBVW_0rI3i~S0Ebb1)BGd; z!TR;DfUl2S_n&3xS!CXFkeH^PICU1f78e-Dz7*=aMJoo7sWSx1Ecvhtrq51|vnhAN z;ciaX(@lzJ<-=Ky5VF9X&iFLw5Bu~P2nHe4Yk!T7Wv(+?`sY7YL*wj{8KaC2Rfkr8 z#5q>x{R0zF_QC#5Q~P zk+i#5ql&RgTfi=bx|Ua)V3S4~*>kg+EZmDi;>3r$0g-ob4(A*G&EivmQ5RwfaEO8Yws7k zp{Eol>qT=*xw%AdL_Y2R`giKQE7gg>M3zdFhKnrm{5~QQU3(sI0eTP-(wi-LDex`` zH7nx@&y|zY_zU2PVmwYwjzex!wEymE;MsabeoSFnvYsJ%TcTXWoeh_pt$l(St0Tn# zpdm@go_Z+?;6^`k(PKjEgdljL(z!i5;|a;Inj9Kp3ix!1$*gxlh+5=_e*6(OjsP^A zNnl2ic2aL^)Nmt4;HGiBMVsn?356?I54D1kw~Pgtxe!9m`k#dTKv$PLL0Q%s8(ffX z)R4K#GZCjmct9D4QViSLKA)3Ns3YZiaikTt2w>oChP2@g9s(3GRk5(mi%a~SI=oLhxJ$(Mf=%Di%hg7dEA%cE2jz|tv6IJ$7y8k^EI%VqdU~-D|nF7IeklU?s*^VOn$sjs4PN)rk3rAT@)3J4{#Vvwf^kOua;seJsf47 zMCBDh##tX}6%|`QX2$eh&f$Z`?}i%1G$flFTveIiUuG{;Z%4w(;`8ZeexCmYNZza4 zRGEtZ`7U_-Pn-){oDH?8k1nRMWkz-8t=yj(hAotLQfgAlt{O%SlkC0RY?9DTWpas^k*-biEjy9V7)WXWKb zOOnP+OLjB6iBAK)l{k7_{iV_JBRiWw1QnZ2sCIdasYRp@WI9w*_SM5_9%tZ@63sag8Rw9IDDChC$4tv{+meUCO4z z=w;ZiIy5*~*7^czA^tw*1-!>_43}JXfZ+BW?h&Pucs1g)1UmO2Inp_+Qzp21#ne1^_KSx=dJ7#G7=S~(M>~_k2 zU((!)r>KF5c4pw)sS9S|Cw7dMUFml5X;U%3u2QEa>T~KESrj88OU@a9& z$y~eTUCK=-rO;B(;`gnSa+#r}D3dl*Q|gD}d~zZ(BsH;^C0t#YMI+m57ZXr78#bfo z_)JZ_GxLvAKV!2;`@p=Z5~BERwjbAKb!i%t;NrxqsX6>5G)e{)Yv&Y(G!pMJJ^g{> zwfSQ)go^%S<@|CFj<;nBHDt4xr7BVY0@q6+#kBx>TxJR7r%EJUw8i1>RF&}vi>z(V zFLI=%0xy4Ac!oJY~sqybby&xr3@jRWYZ(@#~t3xuV>B z)O1GON+8qN*=Y1a7iDp@p-ThB^5`4`U`(s&dt%%&V--?qO1q0H>ip1^MnM|q-%_$8 zPc(t7J)dTu0cnn}f2&Dtpp9J}a9)r(#jJdZtAX%4odU;BtQ^y|iKA9-EiQ~!qeqzk zh?Q8xNfaYEV#GUR#-7s=0&jgX*_UhXDIcC^mh>;@6nGRZvhHmCBO(cA!rAA}&l%KMTv~&^(K= zq)M`3NFc=#MVDJ?0k*=k{isTSO+~5igHU)>%!>Xy zk`$PDG^{TdlS`L!7U5;~!+Xva5d;*-uBs2_3yutKVvSw8&QoA%BWHGy!6JD=K%uw2 z)O<75s#sf~jv+7=@!>6mNEMAqA->#qK#Aw)S;3vtoeCbuAq~HvRPRhAs){YnK&rn7 zHw+9hrbWJrn;>_Q8Fk;@3hP8eM`v107#Yj?5FbxK=9sv)eST3IHf&tSG})9%WgDtY zQ#biZ&9Xl(##aCnRaZU0UV_mz^qX2tt+GLI>nzKC=~6%;l~|Ysi&kJ{!2L}j*T)Gh zR|smRY!!mt4ITXB+gsdv8`gA$B&GjYSJp#cOqYkT5BS1V95Stu6vdQ#_@mCA?M#KC zi)dqnD!uy zHD<4ba9r6yR}8P>2MUctc}2{$bE^XJ`MukFtB} zz`l{D@1Iz?Z_>|i?Hm2?8FM~A?|U5~b3%U?`L^5DPlCD5^f*k4$rnJ?HJBue;-m4I z-O4P3o}Tu(SKU~d*pqHYz4#JC3BW45f+JxX^2Bnwv^L!4sk#DsMNsm&y2qYV%>xjU z^n@^!0d024xc2)r?53}B*ytVCx`M?|IglbUm0&ZK1Q6aUMlC8zTuFK@C!K{472jnu z!wqeJ_s;5lP;~_eHe25_@wlFISI z(1`e=KDW6Ea-=u-LMOjAEp}D=ELwGx+ENNG;|SitL`$T`ZBA>CsZiIk4s?oGoDJd} z%A$_2AeCpf_YUw7%Bhu?GCo~Y_&4a;}{)S z7U{gzmqbw^E+A=vYK>GJ_IR!3QWoVHl3)jM#?Q``sw8xc0U_85h&E%fTtY3C$E(rz zm7?v~1nJTGJi_uW0lvgSL)#-dr@%?nrO` z3rfEP_M%1eJsNk#I^J^-hbb38pAX$*<$2j4ecj&G5@Rjnm)cqVP&}Z4Lu5bCgo$r+ zs~>dQ#2$sd`$#0WogF0P;-koa>Y~qXX9OrQZE*JxQ~p^v4D5Iz_*qEMNBtu5Vj}giQ)@f{Ak1*< zr}fgST@dqboj>2Ip=Bzlg_+cuuBH{irvgi%A+6_qgkX41&y5KG1>iwca^;>`Mv^)x zh0&r`WGI1cwV*Z5aFlTX1tuyP=cxf_NB?ua;8!BZOPfZ2F7eM{N<;3kireB+?n0jj zlj0J!h2q`Hg1{bgM<4V#u-s4qn40omg@S&iobrB-RN6%GfUEud{0~PE^4UGnSLACj zqW37x-Rxbe;)CPOv|w0I@k@^t3%UhEO_Iy*v=bF-cn9iGn%}}4?yZ$ZV_w!HpfxUiX`%eaAv?XjK zeu<=c51>c7YL6059C%kL=>@l-YGahWMS9SDq|GZ*cZuYWf_4H<85W{^!iN*I>gREM zcC{8Y4VkgKLV7y3g2e63U~O#v(V{K*ZFy+z?QhWx04y>9d7lzvg0IRnvC)tXCIMg( zq&?&LK+UI5!+8O-E{vWY08Sq!?OMDJt1BXTD&Pp0a(~|b1PU|1`YY|eN|Oo4=C+$0 ztXj%WbX%SpV+&MaM%j;#{Sns@WtLZ)1tP4pm!T=gu6tdc5Sgfk{v2fkqgYhj(eggb zaNp>qIN9@l3sGY;h!15&ECL>r&zmwRN`w$Pq}#(tztIRq0$f}|ez2%FF-Pfr*rKx_ z+b^QunBO5TK}in8U<%`b^&sim7p5*V%;+<291*o|-)`ug`HvGNUH`=W_+v9hx7J zYWWQm4r@HwV)FhMT7Cx$Yy# zx1R~;0XKn-c z$bWCpJ@UO&IBbjc8Hpq8njGj$kMqD&a;|b!d9X62B0?F%J1|FGvBc)W zj^1yA0+%zI$(X&b)>wH$WkRdf4^eVM%D#M+-|0&(A;g?5?918ILmwFc4&9?LqzINf zM4!pc-?ZVD33FiZpaq*HYypkicRFcp1c!-1VRYMb9!(6xp|VkC6n%fVNl+pyTG+!u zKCI3utg9J3D*c*iM8j3*#t`>B73jDCe1mBUiaBM|s%R~7T%w_5q9>`C3;&|1M6Ps1 zJnb?I2KU}F-}1dGMF9jJ8CQ{ABmIwuNSGzdf&|a1(s7!PU3=_t6@T>4cN2*N^M`QF zC7cgXrXU4(eG461EH+D*`X2O#SQYrx%wK@StSZT1FO#z!91^72hUXbSd@HfmQmae0sUS z^K-ihTZ6b(on}n}UIz7CuVzcOnf_<;sp!qUz_MhB3sH8xxIClQe3i zas{WC3)P^vkV+6pE_yc#u=QUyc@)tu9Tdo>o3A;c1Uci_X)aWMny`q`e?)0xnzJHJ zL9ZD!qc|>ieM2XR+~@crRM3HIofav01Rwx#W=72T4{RO`0Wg!w&=w%zf-< zWlCjILNKsv^7F9h#m3n1^Z9NCJEQ+7)uRFGk0t*+rK#z!9$l($l)si zLM)I>7H;)W)uT_H#dWWEmCa7ULg4XrU0_Jg$tcjj{`H%FUs`rS5j2=rz)7EU)u*qG zm+D`i`CDKDijxL`^ZMc^L>)1N$5YRre5#_NGQ*6yR5NYNCF3mGqNr^~yHCL<%sF{8 z9e8qG*mZx<_+IS4E(kiF3L+5+iW*u3zHFw&6HUNmvsYfr&-1@8A4vK9`t<*G!D!FZ zj*!Db#GAtP>$&GHM|6hT#qW7k;4|-n@OJz6;ZwsAI0Zh%}}KK)Q8z`>r#{;uO?UJTVP$d(H`=J%avk2C&pO~joR0DoGVT9ukM&t@+J_T1 zl3bE@Mj>Z5^e>+|C)5wc28=y}5B>R9e(~I39d}H1&sYHe@Sgh$!gBXr>9-5(v~Y6` zlnx+zR-v}rXZHvHXe|BRf0dB#WdYI;I(nLn6<7qa*~ zmMNkVOI9Yat=E%3(axB!iH(?H@=WCyWFyfjqrp@YqOFxImpb1|aCxlcOwE-nEMuOq17itjRT2#dO_29 zL9|HuyhMOBo&`uz?Csl9k&4)PBu_kV%Pac7k17xUZ=@V`t_LUiGF;aJ=FJ^kFL*1?nV+L#g@R67iu|ld}fsLQ-UJWMY04wYW9B-UofZJ6I@Uq*F@@ctSu{ejkh- zXoj+zuSOjUqz~2aE@XCZym-P$Hpo-PeBd+6z3cRXa8blUMLeAPxfkW@g&6f-Cg+BW z2`3GBcoS-+08!gt$wSbjy%GmrQ1v#5nEpVYpiKNaHPO2br?NnQe1(SIPvH{56U!|6 zKm;+!(rR?vA z1%+#e)z4n4|6n7~Hv{+#K3IA1$pknF1wNEylIQ?8z-WTLEdHcWT0_|?$DO-0kV>!& zCJ8D9pvOOq)HW&&eO;0ig_o=E{(2g4-uJ1$SdSK|JYy^c^LQtuPzv!r$1)Y!R9)_t zzC8ZELARvk@P#8HcnJ6lmNE9r)Tp^UidOfNsw%GGLEYjnbA9~-I8}ik`fQcgcVa$* z@?YYX65)H!=JB^mP>0=~SLru9+?Y{=!fT0@DoDM(I~M6vkoACH(XHWS9J8vvmig)X z7I9h8om-ptJA~ga4jFzthvSV%h79Rt{aVflzjEe9VH z%;n_}04yn97>bSIG9j!em=3N1a$RQg=GvmAp1i#TeiTUe^gl3jGjY@u8liqpYPtz@ zv#zoC2uRoHdU^!qGfWJlOAW|a+Ey`bQkQi(e)?>)UoZkr3%np+tD7ZR!F_o7UiF`# zik(^i=HJzb?=Bb|@uKe8Si)h|s1guO)Fi__3bhFUK&+0_`RM&- z;w6T_f=Oyb@S|Hx^o8q4zUM^>M{(1e_xk0<;Rt_>PSb5G?5TogZHM<0YZGtAimaqShL-Fm8m4QwDGCg)wW zz@ec@{rv3hZl*QNs@~eVA-BcmO==rnIyjK$k+Blp&I;R+MBDvx8C}s+`GXrE=RFz! z%!^pDSF~^BFUqC~&y&W+>}TBo;WH&PCg+=NlWzpw0bs0JAi=Xq0*ukNk-Taz96RqN`eK zB!Zyc+)a_!AOOQW+aO=v*@ywlDTQD9oOK^QGsSK@a+2gJJlQ-*Ta)P$;uk6;j`4UCSC?u z^+w0TeRO#VKRLPcVqr$X%$a*Z)$FQWSw;pJ6kYsi3}@mm;7Px`wE#F03gRPHA`Yp`v zMAhL&f#IJJ7N*CutNBG^Q*)T$F`jTPx9YU}8K}fgCbka2Ld1P@H9pDff$zORC(x zGKKh$=g%uydeS4KFG>dU!cWdh{bc)x6)d087!}1mr>6d@MH$dBqO*3{O{0s__r^{T zG++-MELeNDar5pUfTFKbWbq_hjkOr>5DBH*^(CkBO{IYLMXK-wy8yis<*YgYpT;6d zNC~1`_SN24@KNsE`3p8PkuZH!Ix4pQxurZqnLHoY4DrZ28y&1)3Ch>9oB0&jH20To z17VvrP4dM3jl{Sz>7mm>n=dRh(z^Kk$ASY(h+N7s*7%<4$r6-cNy>^bZQzdrAP=OM zFer&+(wob5r~&Pu79V=}$5JjUbIJt0c)W5kgY!I(VO9!BycRNs0qaOPU-+6^Jh>FW z;m64@%jSz}5X;C3+G|H1?#fJ!oQN}BS&vwKFWO1aYch?PemFOu7%`2hmK4y!hNxgC zFTt2BkalXMzxFcBeDmEhR0#yqjgr}aBMCF>YPGUhkV-nlFhZ5o?#9<#=9!*VmQ{S5 zv6 z$DN_<<92aT%HySiVW@wV-?|=SIXEGQ7cYZkESzckeR)eB}QnV+E&R)tvR1e z3%t!%-<^{V=9wh{B*7RYMIcuh!P89dQHYMm_Gg3kSb5e$%fRRHtwSt2MA3z$)pxXb z6XS>RA1$(7!z#rc#Cai(x7I;QZN$v>)PsXcxXQ#82Uu#_$vPU*t#930AgzX+@m%ig#b zz9S-ja$0dB++y2%m$XmO8Y4^zJq;iB9k>I>UYwRt*n?3h2gI&aS)5YN0;q8?NyBnP zw9@17RBta;mzCO6QKj2CgBOCwUgMSKVIxo3NqozO=91E)1;yyYUh6=8xY)lK0gZxn zrvY)UG(;y2Z2@ji@g`r)se{Jz69TzSI;wlhvj>+_x-e5o*Y0V#kH%iB5%_qMIlO@U zz~2&oU+6c#rS+P3B^6X`Tt+ZN<~OWGsrW9p|JrQmTU}FxF`tc+VV$791d=nleplxG z5b7>UX@tsVRx6F|CHm2S?BhcShgp`%QD? zIsiFp>l}Qy&OaYhiPl3S?RjL^&EBS3EGQ|IFL6*DB`?&mc;Y6=tA8?9|q-d_aj=n3lfnWwX5nJ?4fiYnl>wNd@J*DwqM{t*(Y)F zi3nd_5=TU#sPs3PIT$fZM9fvXR zA~+ZK#=N`PH696kT#Pq=!QT>~0RSkq5Ko3I{zyx6QxM20^TjW+>tsAE`P#B~_LqMF zu5XOa{$#reLlChup&t^+p9yws7s^TUmr`WujZRSGx3}+EW23XocTH3l;FyyI5is1w zzY@rZ9+j7Af*x}6UDEjSF#tsX-|Qs4Bi7FX{aq8ZGyK9{rEfY;m|dlQA7ehOqCQNH zQ!7t-9SC7Q$7B^9Tu*Q;HaI?UwP|O}O27Z&Fk7aONGbR~Gj<}J zRIn#iNi;iaoPYr++mzU`Xwh#$non6eUuZ#p0jY+A8=7iomxkG-?;`Ws-zLhSPw%N? z#>dhTw2%)gNVB(xjf~*>qetD`o1`(3;_1%NtfM8Y?5fp;eXcb=`GMa@c|B?lK=Q=IqbP|wtIsO%G#DyO1H&AGlERu#0ps)!xU&|q5E~v zev|g1I%AtGQn(~UCM7@(UABcv{^iTk!>83Crzloxda~e0F}FE9zY4e`w){dcnl>)a z4x#*M^e?_sXLG%(KT$v-#bMh4^)=w?*P~;(V1ZYpUji5w#ag->X=iLo1nho1>`!82 zyUhwT23}l#c=7~=?YwO6!A0UenzV=PI>awlhbM4FAi}Sb1r)6&Y|8W0vS_e*s2HObJTLzXnO3J^84+2#kA{M%ghsrxPb?S<~D0 zC|t){(lsZ71~Do=chpZ)ZY+l*l^7~tGqC@@+#&9;*NV8}qUd4K5sxgexE%Q83)j-` z$;VC8h}c3~M|N=2zIv*7aXn89^R8z5Zdc%Yt9kRlI?=TP!}_3Gom9F;0+63Ni*`VB z?-1UPhB+w6v0LFN``S6BV`h^17<4x*kdZQc9Z~_|aeC_jWa^vn<^~+I;1Uj%<$|MI zUzRbRSgb=Sfn_zlG%x!PuLl?r%Na4=g*7}=k)5RlFO=beY4CP6fgKrz(XyKh6Fky} zZ}LUKKka`Po<7ngtrwjKwf_0!`^fb4>8I4^hl6hEwf`T_vZN92`EXr~nRwh{0Lu3h z;x9m8MtbrF|5^%k|9@`9XT#^jJ*fGX{MWtfqpv&T;M@VI0<=~qLbH8SNX;7N;u5dr zbPC&U+JL)RTxe7ImM}>E^t_cV$1^N_aRR)+(2>k$Oyaz9AIIU2OzukdJzGtmY4^-7 zEeRmtxRtc9B_(P`P#$qb9!nL*ZQ$}99GLBf$fqVS;eghvm)bBd6!1qy;$4rMV|fo8 z?por+pdqZkDOolq{kFba;@03GZIO1< zV7OdqUXcC$=ReP#@fXC68xNjO`W-*~*8iU$NB?$IQ8_~7@H#3Ve8TD%JWPuyuAjL6 z1wh$X!hwQQ5?RrQaeZR<7E?>~_E3u4yBDa3&5yUhR9*069iy(4Ri@6(%L_R)c_!VlhEl!EC(lF3A{5g19K_=96OyrOP zmkCx@3D3t_@br!L$&=RsBfPP7I#ZRjY~$K3(&L~Rb$s|2DB;Z?lqU5ZxcXn+l>|5` zI~ZPfkX0kJT>wo)8}@F4B%4Lx(0i^PewqMQec}!wHFP|;-Ug`mj8G^*7Wuo*yf^Us z$?}{3J#!;d_93xlvI5yxfK~d!VhIo8C#pmf%|2UUdu#kXY2%Cj?Uz&)JUPHpYD#E( zxef+ewYTnD{knuC$2OPgiG;&+Rs|2ryOK!wkK@ZCz#QT_wr`5isqU?LXZBN473yI@ z-GBu-#e`AF)DP=-Q*1s;A3vi*Ov2gM^Jd}=4mn1I;|yQgSUL2X@|5yN_@3%qT@tm1 z`(OOR3gY<6lP!F1cF(Oak9bc~=iQJ`l@3MM;+g->6=qu;e2D(QcV{Gt$mehcevIxP zY!qY~Fd{`ed5+$d>OV2ahK?|+{HMFTQw#Z+cAR%sejP$5{OH{7N`NVB$qZKNEbhFR z3I(9%)t&uEm-W>BGTVkwkwhaICC(>|UeC&QbSFf}KR6g9Ca-Nf^*cek^Vpr92K>qd3XQ(2UZvb%k5U^w`gR{Z&YbOGQTGOfg{EtQ0))_C z&$#hcfWNuQ*?ta18}pcBNM`K0&&NvY-~gzyJJQ8i9qX`OEqJl5j)QrLJcrEQA+f3-r1m_+DXrZ z^1RnjVKzx5fZJY80Sk(6OBNuloi6Nu5Ac2P-%L7A9$c>XeOOw`iu1(0QoN3oVly#% zpFV(!JWo$f#TOYcoApwn(nnG64bot^TNYo__I^*nyT!Ama~0~9Is1IDX|@}JlEz_b z!iSJZxA!blf?PiqJY000W~W+43*U28+2^Cg2j-?bHPnh!z^X|9vQ+}*Bqn;j2!&xa zg2BqvDIGO0DI7d4z@^76w03L%O0k(MKNcdE`v z87HYeYGZ8-hI9A>`ListG>R4AzEo2TjK-nMyS|`BVX2q_3x<}iIy;<{b*r=Z`2{$y zx_=7tG2R2ao#me!q0`!jEqFLT5e+W<#5zW| zM!t=W6cwK8=<%IE>eXrhSVYY{r}aRGWKo^+iBBuRpZS`dVlo9G9EQiHX5#5kLY+5w zI6sN|tKG(>nm@|SmRSwzTL8Y`N}a3L$7D$!Njz)kee7U0N0 zsmZ*qbGLBS)HEt%*Ju+>qXY7oj_{s@qqBE>VDG}6$U$f2f`P1O~YJu8Q%bh3i zD9RWXhIQY`ktIZKhtC^k;u7X~|SIn?`JN1jBxRW03qAt`uGS)0N>P|g*F03 zwcFV8L3M5_+EjksjNGK&J7tD@Ez~Hg>DkN5b7LnJW+;nc;h!!?rgET?aVa?mH*z*o zURwt@J50UCSw3bg za0J``o7ehWE;4KOCjmilb%j%?E;(sP8uVzFH}Q3-FY(=?eU; zqE@PvE&e+!Oj|&ug-AS8QxW1C-dTbB3|U=g_7-sD7!XZCBFXe9a%QGfr{~Os3&Tp_ zEgoz&3jCmCq@xPXj7QO!s}0_UNLtFDX)Am>**x;7ujM5vxJ362%bNhxOgowqdCTduU&v-cI0IZc7xy65?WP|yM@)&8(X)5L>TzPz=ATdo5=%Wc&@loK}z3Q zBr0fsT_r_2xbz!Vv``R#p=wWIfw~soxG|Q9&s@it>F5n_!oA3VXJ3F87Xvf4oJ?Kl zw<#A-WJ%R%lhVG18bo{*?~#5(SC^(PBX>Q>YH>OE+FMR#+ABt;{X6vI%7#O~F>4=b zM!l-GKl|t6Nz1l2Mg4CvbU~+RCra6q%6+1eU<^#vX1|AH2pnw^&dHuanl7%*#WOaB z1-R|OlbOTZq{eq5VA5%qZ;W#LlgxKnub1L0&tIb-wBz&DysVYcIJl3yf#oxmAa~nG zmW2eF#LURhtT~Q3bYhw)p3ak7=Gqim_Xun)o?$(iw~cFh_AfTd5!wJCiDDJFAuIb) z5YeCaZX{ivVdORpvy`tu_l%?)oD4k4w9Hrqz@svOG^Q268q2n>$erqKR7RK(gzzO4 zUo?4h{h3-=HkT=#4H@;$c!%H19PDU)FTY&L3$e%skx{&o-o~qfN&6x6FVx2{5C(5d z31W|}lbC}^k7*pu+Z@>~!H5(UZ+dfq`IwWC{&yj#dws&Ae!}nm7iZJdK_yh^5gCfwhQ_te*xs5^*ifTC(TG^JNDix4pYaON%_OlX* z>)>);DM_1%#+4GMuT-^cLQ`c9b?J!xR|R&NkCdKz9Ag^s+HF{yk*m78B<<|nB+B)) z0a2qko6K_`$%vC%1NmDWv{a}nx_6S!QTvJfiAv^V+8vH6Di;bhTjOv(Xu!k699Y=5Xj$90Af75O4_` z4ILa29>XeGobtY+glN@Ze~SSY;uj5_Ayphl zUqj_b4u878$6{(JrjgIGAH*cs(=>D+5G5g=pSU7{r#YZq)%Hxm_?5{^wRzQ`MRuO! zo?^UVirjLfjTd=yA57j#Hm1ohE@i}eWq1psk@$A)O~-O*U?xA}SD#~>H?RIS>NW4o zlwyXwl_KgQ>hmpdg+#whqtba4AW&XGX=W1F`v0AEOf z-@Pzbs_{c76tSn&{9fZ6niP_bg$_kZaYc~*`jiL0fx&Q0`R!7nEk`~V<4-3SVIX9$ zCh8AgqY=wl@fmmnM}Zw=HKXf}8~TbchsuT_Ur=53odvRQpWinyk8yb@R?bzt?tbG+2CSmrrNH05_q8w&np_=%-d0!t906{-?HwG%?===6?rc zi~Xa>v3l7@*j;4#ghPTzaCHG#o0xKe=TTsR_t2`TDE8QtvuhWj+t1Gq5lnAriBoy| z48Yy*Fz*FUyC{~BF_*B!0iiH*2UnCJ>2QZgHCA%0m0%Ep20udQpmp3v3y^!*Z}1|Q z@r}OvCLCA;r1+iAsP0>e$L?$EajgoKXo=zR6phw$^0pmQatIHmmei$IuPvHAW`Lx^ zkle>n9%a2&NQcUWp*5}g zCF-I@(jrPq1i}$mMp)*(W`3DLbwr3ckrtkY2*7lq6}K@SI!i_Q5D9T2y@g_HyXC8L z+NazcCAv3SF?@@v^p-K5ZCcfwF}oYAN+zl*$(|%KQ~MXbX~YRm;BZ1`;Cn=be%CD@ zHdZp(1>)faami*#?EzCP!vkMt_WON@tWgBA*35nk_WQ+(2DKJeD)Lt;5s zZ-nVR7oFCX96oJBYlPJHlS!MdJUkKS>~(9ef{yA=@XjM6mggULXe$`~XHb88h}ZuC z-~QbM4vR)RNZRp$L8+kp&wq{I(}6>}5A2m%9X_ea>hNdnsj*(q8?(dQUFkT7Nq@1- zp90O?1*H%C+1wppECk-IQ>yBP<#yDSCsB^X4lnrrhA3^re-N|HI`E;!RDxG6gp-{%P=% z?EZf3$`@C$Rf5mOyLU5NE5_TVtt#1Qw~7DlNf({joKg*H6ZoT>iWn`HRPpsL$(a$n zXKDPVEgTL#ng)`5|KyqX^~J8c`+U_Ng}W2aTmDUY-LIk2KL7Y1=e{euGQP$hzAjR} zuq<`z^M}jVSO{)c$ckWMIJ!qJ@00K0HHij(OZb^T9^S^dW^VVnt$Q}z$_?A?{F<|* zfl+Hx%3e{^L&_TtRf&IKlDyn^x7A-sD|=@ohpR_hc(>Nq@Q0b#zHP8`-+}Xrh15LmHbV^hgNFm`gA*jS)a$>uKR?0)i#b5-9e`6o=5H1Ngm=#yBi)dJG5&5 zc1Dr4UBZs*GHKxQ?to=Gu(T^Hqy3UjHH-#L@TOe__{6W`2qK z@6UPkGi&96mDYu_{d4#@Z=_YfxBWiv_xalA`##^Ve81=WJsJyq(lK5b+%UuUQ+@sO ze;j(f?!|%~yC2%|_pt?)u=KyTojmX4`IP6Iif>xJne)xBT7BdR9QZ4EwW5Lf$Klsy z`@J3iB+S*dp9tK3Gqv~p!9OpA_C%2!ILCR}XX?LawAg#6{%ezrMa7SQ?G{U8-_7}U zuR7m$`@GxdbDwYfe7o}P9@+||J}j7bsQ#f0r%6+viAVL}Uos!#`bY6-7*I70EaCbX QKgTZk0C0lpNA>@k0D^-PmjD0& literal 0 HcmV?d00001 diff --git a/docs/freqai-configuration.md b/docs/freqai-configuration.md index 5190c59c9..706524744 100644 --- a/docs/freqai-configuration.md +++ b/docs/freqai-configuration.md @@ -130,7 +130,7 @@ The FreqAI strategy requires the user to include the following lines of code in ``` -Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](freqai-feature_engineering.md#feature-engineering)) and labels ([more information](freqai-running.md#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. +Notice how the `populate_any_indicators()` is where the user adds their own features ([more information](freqai-feature-engineering.md#feature-engineering)) and labels ([more information](freqai-running.md#setting-classifier-targets)). See a full example at `templates/FreqaiExampleStrategy.py`. Another structure to consider is the location of the labels at the bottom of the example function (below `if set_generalized_indicators:`). This is where the user will add single features and labels to their feature set to avoid duplication of them from various configuration parameters that multiply the feature set, such as `include_timeframes`. diff --git a/docs/freqai-developers.md b/docs/freqai-developers.md new file mode 100644 index 000000000..01cdf1e71 --- /dev/null +++ b/docs/freqai-developers.md @@ -0,0 +1,28 @@ +# Development + +The class structure and details algorithmic overview is depicted in the following diagram: + +![image](assets/freqai_algorithm-diagram.jpg) + +As shown, there are three distinct objects comprising `FreqAI`: + +* IFreqaiModel + * Singular persistent object containing all the necessary logic to collect data, store data, process data, engineer features, run training, and inference models. +* FreqaiDataKitchen + * A non-persistent object which is created uniquely for each unique asset/model. Beyond metadata, it also contains a variety of data processing tools. +* FreqaiDataDrawer + * Singular persistent object containing all the historical predictions, models, and save/load methods. + +There are a variety of built-in prediction models which inherit directly from `IFreqaiModel` including: + +* CatboostRegressor +* CatboostRegressorMultiTarget +* CatboostClassifier +* LightGBMRegressor +* LightGBMRegressorMultiTarget +* LightGBMClassifier +* XGBoostRegressor +* XGBoostRegressorMultiTarget +* XGBoostClassifier + +Each of these have full access to all methods in `IFreqaiModel`. And can therefore, override any of those functions at will. However, advanced users will likely stick to overriding `fit()`, `train()`, `predict()`, and `data_cleaning_train/predict()`. \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 95106ae1e..726924b78 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -29,6 +29,7 @@ nav: - Feature engineering: freqai-feature-engineering.md - Running: freqai-running.md - Data handling: freqai-data-handling.md + - Developer guide: freqai-developers.md - Short / Leverage: leverage.md - Utility Sub-commands: utils.md - Plotting: plotting.md From 72d197a99d0570ae9d3607042d7ec5a533907c8e Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 15:42:27 +0200 Subject: [PATCH 239/437] Run first epoch in non-parallel mode this allows dataprovider to load it's cache. closes #7384 --- freqtrade/data/dataprovider.py | 4 +++- freqtrade/optimize/hyperopt.py | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index e639b3ae7..c6519d2b8 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -196,7 +196,9 @@ class DataProvider: Clear pair dataframe cache. """ self.__cached_pairs = {} - self.__cached_pairs_backtesting = {} + # Don't reset backtesting pairs - + # otherwise they're reloaded each time during hyperopt due to with analyze_per_epoch + # self.__cached_pairs_backtesting = {} self.__slice_index = 0 # Exchange functions diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index 76fc84609..b0119368f 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -580,11 +580,24 @@ class Hyperopt: max_value=self.total_epochs, redirect_stdout=False, redirect_stderr=False, widgets=widgets ) as pbar: - EVALS = ceil(self.total_epochs / jobs) - for i in range(EVALS): + start = 0 + + if self.analyze_per_epoch: + # First analysis not in parallel mode when using --analyze-per-epoch. + # This allows dataprovider to load it's informative cache. + asked, is_random = self.get_asked_points(n_points=1) + # print(asked) + f_val = self.generate_optimizer(asked[0]) + self.opt.tell(asked, [f_val['loss']]) + self.evaluate_result(f_val, 1, is_random[0]) + pbar.update(1) + start += 1 + + evals = ceil((self.total_epochs - start) / jobs) + for i in range(evals): # Correct the number of epochs to be processed for the last # iteration (should not exceed self.total_epochs in total) - n_rest = (i + 1) * jobs - self.total_epochs + n_rest = (i + 1) * jobs - (self.total_epochs - start) current_jobs = jobs - n_rest if n_rest > 0 else jobs asked, is_random = self.get_asked_points(n_points=current_jobs) @@ -594,7 +607,7 @@ class Hyperopt: # Calculate progressbar outputs for j, val in enumerate(f_val): # Use human-friendly indexes here (starting from 1) - current = i * jobs + j + 1 + current = i * jobs + j + 1 + start self.evaluate_result(val, current, is_random[j]) From 816c1f760373f6fc55710cb2e3f09ae39eb14fc5 Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 17:51:30 +0200 Subject: [PATCH 240/437] add test for per epoch hyperopt --- tests/optimize/test_hyperopt.py | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/optimize/test_hyperopt.py b/tests/optimize/test_hyperopt.py index 0f615b7a3..eaea8aee7 100644 --- a/tests/optimize/test_hyperopt.py +++ b/tests/optimize/test_hyperopt.py @@ -922,6 +922,45 @@ def test_in_strategy_auto_hyperopt_with_parallel(mocker, hyperopt_conf, tmpdir, hyperopt.start() +def test_in_strategy_auto_hyperopt_per_epoch(mocker, hyperopt_conf, tmpdir, fee) -> None: + patch_exchange(mocker) + mocker.patch('freqtrade.exchange.Exchange.get_fee', fee) + (Path(tmpdir) / 'hyperopt_results').mkdir(parents=True) + + hyperopt_conf.update({ + 'strategy': 'HyperoptableStrategy', + 'user_data_dir': Path(tmpdir), + 'hyperopt_random_state': 42, + 'spaces': ['all'], + 'epochs': 3, + 'analyze_per_epoch': True, + }) + go = mocker.patch('freqtrade.optimize.hyperopt.Hyperopt.generate_optimizer', + return_value={ + 'loss': 0.05, + 'results_explanation': 'foo result', 'params': {}, + 'results_metrics': generate_result_metrics(), + }) + hyperopt = Hyperopt(hyperopt_conf) + hyperopt.backtesting.exchange.get_max_leverage = MagicMock(return_value=1.0) + assert isinstance(hyperopt.custom_hyperopt, HyperOptAuto) + assert isinstance(hyperopt.backtesting.strategy.buy_rsi, IntParameter) + assert hyperopt.backtesting.strategy.bot_loop_started is True + + assert hyperopt.backtesting.strategy.buy_rsi.in_space is True + assert hyperopt.backtesting.strategy.buy_rsi.value == 35 + assert hyperopt.backtesting.strategy.sell_rsi.value == 74 + assert hyperopt.backtesting.strategy.protection_cooldown_lookback.value == 30 + buy_rsi_range = hyperopt.backtesting.strategy.buy_rsi.range + assert isinstance(buy_rsi_range, range) + # Range from 0 - 50 (inclusive) + assert len(list(buy_rsi_range)) == 51 + + hyperopt.start() + # backtesting should be called 3 times (once per epoch) + assert go.call_count == 3 + + def test_SKDecimal(): space = SKDecimal(1, 2, decimals=2) assert 1.5 in space From 982c0315fa2ba909362173c2e892aa7bca2c836b Mon Sep 17 00:00:00 2001 From: Matthias Date: Sun, 11 Sep 2022 19:31:11 +0200 Subject: [PATCH 241/437] Rename variable --- freqtrade/optimize/hyperopt.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py index b0119368f..f15e0b7d8 100644 --- a/freqtrade/optimize/hyperopt.py +++ b/freqtrade/optimize/hyperopt.py @@ -586,10 +586,9 @@ class Hyperopt: # First analysis not in parallel mode when using --analyze-per-epoch. # This allows dataprovider to load it's informative cache. asked, is_random = self.get_asked_points(n_points=1) - # print(asked) - f_val = self.generate_optimizer(asked[0]) - self.opt.tell(asked, [f_val['loss']]) - self.evaluate_result(f_val, 1, is_random[0]) + f_val0 = self.generate_optimizer(asked[0]) + self.opt.tell(asked, [f_val0['loss']]) + self.evaluate_result(f_val0, 1, is_random[0]) pbar.update(1) start += 1 From 5483cf21f694a4bc0ec90bb533d587d5428c7da1 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Sun, 11 Sep 2022 11:42:13 -0600 Subject: [PATCH 242/437] remove default secret_ws_token, set timeout min to 0 --- freqtrade/constants.py | 7 ++++--- freqtrade/rpc/api_server/api_auth.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index e77940b3c..2cc2fd115 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -502,12 +502,13 @@ CONF_SCHEMA = { 'required': ['name', 'url', 'ws_token'] } }, - 'wait_timeout': {'type': 'integer'}, - 'sleep_time': {'type': 'integer'}, - 'ping_timeout': {'type': 'integer'}, + 'wait_timeout': {'type': 'integer', 'minimum': 0}, + 'sleep_time': {'type': 'integer', 'minimum': 0}, + 'ping_timeout': {'type': 'integer', 'minimum': 0}, 'remove_signals_analyzed_df': {'type': 'boolean', 'default': False}, 'initial_candle_limit': { 'type': 'integer', + 'minimum': 0, 'maximum': 1500, 'default': 1500 } diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 93be251ab..1ab158ea7 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -56,7 +56,7 @@ async def validate_ws_token( ws_token: Union[str, None] = Query(default=None, alias="token"), api_config: Dict[str, Any] = Depends(get_api_config) ): - secret_ws_token = api_config.get('ws_token', 'secret_ws_t0ken.') + secret_ws_token = api_config.get('ws_token', None) secret_jwt_key = api_config.get('jwt_secret_key', 'super-secret') if ws_token and secrets.compare_digest(secret_ws_token, ws_token): From 6777d43aea7f169db1711999b4a15c3fedf21a5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 03:01:27 +0000 Subject: [PATCH 243/437] Bump sqlalchemy from 1.4.40 to 1.4.41 Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.4.40 to 1.4.41. - [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases) - [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy/sqlalchemy/commits) --- updated-dependencies: - dependency-name: sqlalchemy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fdbe6ac28..d063410d4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ ccxt==1.93.3 # Pin cryptography for now due to rust build errors with piwheels cryptography==37.0.4 aiohttp==3.8.1 -SQLAlchemy==1.4.40 +SQLAlchemy==1.4.41 python-telegram-bot==13.14 arrow==1.2.3 cachetools==4.2.2 From 6bfe99606179ebb1cbb236b8751da180ccd1b3ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 03:01:56 +0000 Subject: [PATCH 244/437] Bump mkdocs-material from 8.4.2 to 8.4.3 Bumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 8.4.2 to 8.4.3. - [Release notes](https://github.com/squidfunk/mkdocs-material/releases) - [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG) - [Commits](https://github.com/squidfunk/mkdocs-material/compare/8.4.2...8.4.3) --- updated-dependencies: - dependency-name: mkdocs-material dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 5a6c46471..d63e79004 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,6 +1,6 @@ markdown==3.3.7 mkdocs==1.3.1 -mkdocs-material==8.4.2 +mkdocs-material==8.4.3 mdx_truly_sane_lists==1.3 pymdown-extensions==9.5 jinja2==3.1.2 From 1ef334411ed5c9ba0204acb41172089bfb5c38dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 03:02:01 +0000 Subject: [PATCH 245/437] Bump types-requests from 2.28.9 to 2.28.10 Bumps [types-requests](https://github.com/python/typeshed) from 2.28.9 to 2.28.10. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-requests dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 40ca4e154..69749f843 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -25,6 +25,6 @@ nbconvert==7.0.0 # mypy types types-cachetools==5.2.1 types-filelock==3.2.7 -types-requests==2.28.9 +types-requests==2.28.10 types-tabulate==0.8.11 types-python-dateutil==2.8.19 From a4b7e0a714c0f9624d693772467080c43012649e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 03:02:06 +0000 Subject: [PATCH 246/437] Bump fastapi from 0.82.0 to 0.83.0 Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.82.0 to 0.83.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.82.0...0.83.0) --- updated-dependencies: - dependency-name: fastapi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fdbe6ac28..ea8cb39ff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,7 +34,7 @@ orjson==3.8.0 sdnotify==0.3.2 # API Server -fastapi==0.82.0 +fastapi==0.83.0 uvicorn==0.18.3 pyjwt==2.4.0 aiofiles==0.8.0 From 6968fc333b584355c90cf9235ee743a23a239e9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 03:02:10 +0000 Subject: [PATCH 247/437] Bump jsonschema from 4.15.0 to 4.16.0 Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.15.0 to 4.16.0. - [Release notes](https://github.com/python-jsonschema/jsonschema/releases) - [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst) - [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.15.0...v4.16.0) --- updated-dependencies: - dependency-name: jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fdbe6ac28..8a3701bb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ arrow==1.2.3 cachetools==4.2.2 requests==2.28.1 urllib3==1.26.12 -jsonschema==4.15.0 +jsonschema==4.16.0 TA-Lib==0.4.24 technical==1.3.0 tabulate==0.8.10 From c149c47afbc20b083c3f6077edcb6fdc1c223801 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 05:05:30 +0000 Subject: [PATCH 248/437] Bump ccxt from 1.93.3 to 1.93.35 Bumps [ccxt](https://github.com/ccxt/ccxt) from 1.93.3 to 1.93.35. - [Release notes](https://github.com/ccxt/ccxt/releases) - [Changelog](https://github.com/ccxt/ccxt/blob/master/exchanges.cfg) - [Commits](https://github.com/ccxt/ccxt/compare/1.93.3...1.93.35) --- updated-dependencies: - dependency-name: ccxt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d063410d4..af9048c87 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ numpy==1.23.2 pandas==1.4.4 pandas-ta==0.3.14b -ccxt==1.93.3 +ccxt==1.93.35 # Pin cryptography for now due to rust build errors with piwheels cryptography==37.0.4 aiohttp==3.8.1 From 715a71465d36a1b613b2884855b006e892b94ff9 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 12 Sep 2022 07:28:31 +0200 Subject: [PATCH 249/437] Fix auth bug when no token is set --- freqtrade/data/dataprovider.py | 5 ++--- freqtrade/rpc/api_server/api_auth.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 8ca638046..fd7997521 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -88,11 +88,10 @@ class DataProvider: def _set_producer_pairs(self, pairlist: List[str], producer_name: str = "default"): """ Set the pairs received to later be used. - This only supports 1 Producer right now. :param pairlist: List of pairs """ - self.__producer_pairs[producer_name] = pairlist.copy() + self.__producer_pairs[producer_name] = pairlist def get_producer_pairs(self, producer_name: str = "default") -> List[str]: """ @@ -100,7 +99,7 @@ class DataProvider: :returns: List of pairs """ - return self.__producer_pairs.get(producer_name, []) + return self.__producer_pairs.get(producer_name, []).copy() def _emit_df( self, diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 1ab158ea7..e91e5941b 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -59,7 +59,7 @@ async def validate_ws_token( secret_ws_token = api_config.get('ws_token', None) secret_jwt_key = api_config.get('jwt_secret_key', 'super-secret') - if ws_token and secrets.compare_digest(secret_ws_token, ws_token): + if ws_token and secret_ws_token and secrets.compare_digest(secret_ws_token, ws_token): # Just return the token if it matches return ws_token else: @@ -69,7 +69,7 @@ async def validate_ws_token( # If the token is a jwt, and it's valid return the user except HTTPException: pass - logger.info("Denying websocket request") + logger.debug("Denying websocket request.") # If it doesn't match, close the websocket connection await ws.close(code=status.WS_1008_POLICY_VIOLATION) From 09cdce864e6fab1efecb28c413f74f21af027fea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 06:02:21 +0000 Subject: [PATCH 250/437] Bump ta-lib from 0.4.24 to 0.4.25 Bumps [ta-lib](https://github.com/mrjbq7/ta-lib) from 0.4.24 to 0.4.25. - [Release notes](https://github.com/mrjbq7/ta-lib/releases) - [Changelog](https://github.com/mrjbq7/ta-lib/blob/master/CHANGELOG) - [Commits](https://github.com/mrjbq7/ta-lib/compare/TA_Lib-0.4.24...TA_Lib-0.4.25) --- updated-dependencies: - dependency-name: ta-lib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a4767bf1b..25f44ab29 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ cachetools==4.2.2 requests==2.28.1 urllib3==1.26.12 jsonschema==4.16.0 -TA-Lib==0.4.24 +TA-Lib==0.4.25 technical==1.3.0 tabulate==0.8.10 pycoingecko==3.0.0 From 4ac804f795227163d93c03438cddbd8d722fdd9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 06:05:04 +0000 Subject: [PATCH 251/437] Bump numpy from 1.23.2 to 1.23.3 Bumps [numpy](https://github.com/numpy/numpy) from 1.23.2 to 1.23.3. - [Release notes](https://github.com/numpy/numpy/releases) - [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst) - [Commits](https://github.com/numpy/numpy/compare/v1.23.2...v1.23.3) --- updated-dependencies: - dependency-name: numpy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9bb8e6af0..551440cc4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy==1.23.2 +numpy==1.23.3 pandas==1.4.4 pandas-ta==0.3.14b From 00db473f102fb4c6cee1199930e9fe81c3f7792c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 06:05:22 +0000 Subject: [PATCH 252/437] Bump cryptography from 37.0.4 to 38.0.1 Bumps [cryptography](https://github.com/pyca/cryptography) from 37.0.4 to 38.0.1. - [Release notes](https://github.com/pyca/cryptography/releases) - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pyca/cryptography/compare/37.0.4...38.0.1) --- updated-dependencies: - dependency-name: cryptography dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9bb8e6af0..59bef6b11 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ pandas-ta==0.3.14b ccxt==1.93.35 # Pin cryptography for now due to rust build errors with piwheels -cryptography==37.0.4 +cryptography==38.0.1 aiohttp==3.8.1 SQLAlchemy==1.4.41 python-telegram-bot==13.14 From 7ee92db7a2c2f25b48917d285f11ab8f6d474418 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Sep 2022 06:07:40 +0000 Subject: [PATCH 253/437] Bump aiofiles from 0.8.0 to 22.1.0 Bumps [aiofiles](https://github.com/Tinche/aiofiles) from 0.8.0 to 22.1.0. - [Release notes](https://github.com/Tinche/aiofiles/releases) - [Commits](https://github.com/Tinche/aiofiles/compare/v0.8.0...v22.1.0) --- updated-dependencies: - dependency-name: aiofiles dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 345c336f5..e263b7914 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,7 +37,7 @@ sdnotify==0.3.2 fastapi==0.83.0 uvicorn==0.18.3 pyjwt==2.4.0 -aiofiles==0.8.0 +aiofiles==22.1.0 psutil==5.9.2 # Support for colorized terminal output From f45824acf536ccd7f56d78f0ea692a414709962c Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 12 Sep 2022 09:23:02 +0200 Subject: [PATCH 254/437] Bump precommit types/requests --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 86c4ec1ad..6f2b3ba3c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: additional_dependencies: - types-cachetools==5.2.1 - types-filelock==3.2.7 - - types-requests==2.28.9 + - types-requests==2.28.10 - types-tabulate==0.8.11 - types-python-dateutil==2.8.19 # stages: [push] From d6205e6cfb653947be23afddaf2679ff236a2e30 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 07:36:11 -0600 Subject: [PATCH 255/437] test logging lines --- freqtrade/rpc/external_message_consumer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 89fa90c8e..59064c90b 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -305,6 +305,9 @@ class ExternalMessageConsumer: pair, timeframe, candle_type = key + logger.debug(message.data.key) + logger.debug(message.data) + # If set, remove the Entry and Exit signals from the Producer if self._emc_config.get('remove_entry_exit_signals', False): df = remove_entry_exit_signals(df) From 457075b82386006e5d543f207f8cd00151a97e49 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 07:47:30 -0600 Subject: [PATCH 256/437] one more line --- freqtrade/data/dataprovider.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 94e79c8be..f8ea0073b 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -113,6 +113,7 @@ class DataProvider: :param data: Tuple containing the DataFrame and the datetime it was cached """ if self.__rpc: + logger.debug(f"Sending df {dataframe}") self.__rpc.send_msg( { 'type': RPCMessageType.ANALYZED_DF, From 10852555e593fc84b4d56b58616201154eb1ea24 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 09:53:47 -0600 Subject: [PATCH 257/437] change verbosity of testing log --- freqtrade/data/dataprovider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index f8ea0073b..19d6d6ae1 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -113,7 +113,7 @@ class DataProvider: :param data: Tuple containing the DataFrame and the datetime it was cached """ if self.__rpc: - logger.debug(f"Sending df {dataframe}") + logger.debug(f"Sending df {dataframe.iloc[-1]}") self.__rpc.send_msg( { 'type': RPCMessageType.ANALYZED_DF, From a477b3c244680e0e2e72d12f5a12a1ed557640f0 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 10:45:59 -0600 Subject: [PATCH 258/437] remove log line, fix tests to not connect to actual ip --- freqtrade/data/dataprovider.py | 1 - tests/rpc/test_rpc_emc.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 19d6d6ae1..94e79c8be 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -113,7 +113,6 @@ class DataProvider: :param data: Tuple containing the DataFrame and the datetime it was cached """ if self.__rpc: - logger.debug(f"Sending df {dataframe.iloc[-1]}") self.__rpc.send_msg( { 'type': RPCMessageType.ANALYZED_DF, diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index e29419102..b3f6fdc4d 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -28,7 +28,7 @@ def patched_emc(default_conf, mocker): "producers": [ { "name": "default", - "url": "ws://127.0.0.1:8080/api/v1/message/ws", + "url": "ws://something:port/api/v1/message/ws", "ws_token": _TEST_WS_TOKEN } ] From 0052e5891788ffbfdaf20dd0374599924369644e Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 12 Sep 2022 19:50:22 +0200 Subject: [PATCH 259/437] emc: Fix potential startup timing issue --- freqtrade/rpc/external_message_consumer.py | 6 +++--- tests/rpc/test_rpc_emc.py | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 59064c90b..122863987 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -15,6 +15,7 @@ from pydantic import ValidationError from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import RPCMessageType +from freqtrade.exceptions import OperationalException from freqtrade.misc import remove_entry_exit_signals from freqtrade.rpc.api_server.ws.channel import WebSocketChannel from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSAnalyzedDFRequest, @@ -57,7 +58,7 @@ class ExternalMessageConsumer: self.producers = self._emc_config.get('producers', []) if self.enabled and len(self.producers) < 1: - raise ValueError("You must specify at least 1 Producer to connect to.") + raise OperationalException("You must specify at least 1 Producer to connect to.") self.wait_timeout = self._emc_config.get('wait_timeout', 300) # in seconds self.ping_timeout = self._emc_config.get('ping_timeout', 10) # in seconds @@ -97,9 +98,8 @@ class ExternalMessageConsumer: self._loop = asyncio.new_event_loop() self._thread = Thread(target=self._loop.run_forever) - self._thread.start() - self._running = True + self._thread.start() self._main_task = asyncio.run_coroutine_threadsafe(self._main(), loop=self._loop) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index b3f6fdc4d..94635810c 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -11,6 +11,7 @@ import pytest import websockets from freqtrade.data.dataprovider import DataProvider +from freqtrade.exceptions import OperationalException from freqtrade.rpc.external_message_consumer import ExternalMessageConsumer from tests.conftest import log_has, log_has_re, log_has_when @@ -71,7 +72,7 @@ def test_emc_shutdown(patched_emc, caplog): assert not log_has("Stopping ExternalMessageConsumer", caplog) -def test_emc_init(patched_emc, default_conf, mocker, caplog): +def test_emc_init(patched_emc, default_conf): # Test the settings were set correctly assert patched_emc.initial_candle_limit <= 1500 assert patched_emc.wait_timeout > 0 @@ -84,12 +85,10 @@ def test_emc_init(patched_emc, default_conf, mocker, caplog): } }) dataprovider = DataProvider(default_conf, None, None, None) - with pytest.raises(ValueError) as exc: + with pytest.raises(OperationalException, + match="You must specify at least 1 Producer to connect to."): ExternalMessageConsumer(default_conf, dataprovider) - # Make sure we failed because of no producers - assert str(exc.value) == "You must specify at least 1 Producer to connect to." - # Parametrize this? def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): From 867d59b930b27e774fd391d3f372272a5ddcd7d3 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 12 Sep 2022 20:00:01 +0200 Subject: [PATCH 260/437] Improve type specifitivity --- freqtrade/rpc/external_message_consumer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 122863987..bd921cf8e 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -8,7 +8,7 @@ import asyncio import logging import socket from threading import Thread -from typing import TYPE_CHECKING, Any, Dict, List +from typing import TYPE_CHECKING, Any, Callable, Dict, List import websockets from pydantic import ValidationError @@ -80,7 +80,7 @@ class ExternalMessageConsumer: ] # Specify which function to use for which RPCMessageType - self._message_handlers = { + self._message_handlers: Dict[str, Callable[[str, WSMessageSchema], None]] = { RPCMessageType.WHITELIST: self._consume_whitelist_message, RPCMessageType.ANALYZED_DF: self._consume_analyzed_df_message, } @@ -279,7 +279,7 @@ class ExternalMessageConsumer: message_handler(producer_name, producer_message) - def _consume_whitelist_message(self, producer_name: str, message: Any): + def _consume_whitelist_message(self, producer_name: str, message: WSMessageSchema): try: # Validate the message message = WSWhitelistMessage.parse_obj(message) @@ -292,7 +292,7 @@ class ExternalMessageConsumer: logger.debug(f"Consumed message from `{producer_name}` of type `RPCMessageType.WHITELIST`") - def _consume_analyzed_df_message(self, producer_name: str, message: Any): + def _consume_analyzed_df_message(self, producer_name: str, message: WSMessageSchema): try: message = WSAnalyzedDFMessage.parse_obj(message) except ValidationError as e: From b6434040de76f43d66b710da60f1be4f88b80adf Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 12 Sep 2022 20:24:28 +0200 Subject: [PATCH 261/437] Remove plain json serializer implementation --- freqtrade/rpc/api_server/ws/serializer.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/freqtrade/rpc/api_server/ws/serializer.py b/freqtrade/rpc/api_server/ws/serializer.py index d1ddd84f0..22d177f85 100644 --- a/freqtrade/rpc/api_server/ws/serializer.py +++ b/freqtrade/rpc/api_server/ws/serializer.py @@ -1,4 +1,3 @@ -import json import logging from abc import ABC, abstractmethod @@ -38,14 +37,6 @@ class WebSocketSerializer(ABC): await self._websocket.close(code) -class JSONWebSocketSerializer(WebSocketSerializer): - def _serialize(self, data): - return json.dumps(data, default=_json_default) - - def _deserialize(self, data): - return json.loads(data, object_hook=_json_object_hook) - - class HybridJSONWebSocketSerializer(WebSocketSerializer): def _serialize(self, data) -> str: return str(orjson.dumps(data, default=_json_default), "utf-8") From c19a5fbe06e35839255ad0b961d20c39299b7e1d Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 13:57:29 -0600 Subject: [PATCH 262/437] copy data being transferred, remove debug messages in emc --- freqtrade/data/dataprovider.py | 3 ++- freqtrade/rpc/external_message_consumer.py | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index 94e79c8be..e3bee7118 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -184,7 +184,8 @@ class DataProvider: return (DataFrame(), datetime.fromtimestamp(0, tz=timezone.utc)) # We have it, return this data - return self.__producer_pairs_df[producer_name][pair_key] + df, la = self.__producer_pairs_df[producer_name][pair_key] + return (df.copy(), la) def add_pairlisthandler(self, pairlists) -> None: """ diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index bd921cf8e..89edc8417 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -269,6 +269,10 @@ class ExternalMessageConsumer: logger.error(f"Invalid message from `{producer_name}`: {e}") return + if not producer_message.data: + logger.error(f"Empty message received from `{producer_name}`") + return + logger.info(f"Received message of type `{producer_message.type}` from `{producer_name}`") message_handler = self._message_handlers.get(producer_message.type) @@ -282,32 +286,29 @@ class ExternalMessageConsumer: def _consume_whitelist_message(self, producer_name: str, message: WSMessageSchema): try: # Validate the message - message = WSWhitelistMessage.parse_obj(message) + whitelist_message = WSWhitelistMessage.parse_obj(message) except ValidationError as e: logger.error(f"Invalid message from `{producer_name}`: {e}") return # Add the pairlist data to the DataProvider - self._dp._set_producer_pairs(message.data, producer_name=producer_name) + self._dp._set_producer_pairs(whitelist_message.data.copy(), producer_name=producer_name) logger.debug(f"Consumed message from `{producer_name}` of type `RPCMessageType.WHITELIST`") def _consume_analyzed_df_message(self, producer_name: str, message: WSMessageSchema): try: - message = WSAnalyzedDFMessage.parse_obj(message) + df_message = WSAnalyzedDFMessage.parse_obj(message) except ValidationError as e: logger.error(f"Invalid message from `{producer_name}`: {e}") return - key = message.data.key - df = message.data.df - la = message.data.la + key = df_message.data.key + df = df_message.data.df + la = df_message.data.la pair, timeframe, candle_type = key - logger.debug(message.data.key) - logger.debug(message.data) - # If set, remove the Entry and Exit signals from the Producer if self._emc_config.get('remove_entry_exit_signals', False): df = remove_entry_exit_signals(df) From 0697041f146fa1f4d3aaa74a0af6419d0a57143f Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 14:09:12 -0600 Subject: [PATCH 263/437] remove copy statement where not needed --- freqtrade/rpc/external_message_consumer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 89edc8417..a9fdd62ca 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -292,7 +292,7 @@ class ExternalMessageConsumer: return # Add the pairlist data to the DataProvider - self._dp._set_producer_pairs(whitelist_message.data.copy(), producer_name=producer_name) + self._dp._set_producer_pairs(whitelist_message.data, producer_name=producer_name) logger.debug(f"Consumed message from `{producer_name}` of type `RPCMessageType.WHITELIST`") From 12a3e90f7860920af11eb08047023ee782c21786 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 14:12:39 -0600 Subject: [PATCH 264/437] fix tests --- tests/rpc/test_rpc_emc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index 94635810c..1968c5d39 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -29,7 +29,7 @@ def patched_emc(default_conf, mocker): "producers": [ { "name": "default", - "url": "ws://something:port/api/v1/message/ws", + "url": "ws://null:9891/api/v1/message/ws", "ws_token": _TEST_WS_TOKEN } ] @@ -156,7 +156,7 @@ def test_emc_handle_producer_message(patched_emc, caplog, ohlcv_history): malformed_message = {"type": "whitelist", "data": None} patched_emc.handle_producer_message(test_producer, malformed_message) - assert log_has_re(r"Invalid message .+", caplog) + assert log_has_re(r"Empty message .+", caplog) async def test_emc_create_connection_success(default_conf, caplog, mocker): From bf2e5dee759bd393dcff91570a9364c944d35f5e Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 14:21:39 -0600 Subject: [PATCH 265/437] add running false on shutdown, fix dp typing --- freqtrade/data/dataprovider.py | 14 +++++--------- freqtrade/rpc/external_message_consumer.py | 1 + 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/freqtrade/data/dataprovider.py b/freqtrade/data/dataprovider.py index e3bee7118..dae8ec162 100644 --- a/freqtrade/data/dataprovider.py +++ b/freqtrade/data/dataprovider.py @@ -128,9 +128,9 @@ class DataProvider: self, pair: str, dataframe: DataFrame, - last_analyzed: Optional[datetime] = None, - timeframe: Optional[str] = None, - candle_type: Optional[CandleType] = None, + last_analyzed: datetime, + timeframe: str, + candle_type: CandleType, producer_name: str = "default" ) -> None: """ @@ -140,10 +140,7 @@ class DataProvider: :param timeframe: Timeframe to get data for :param candle_type: Any of the enum CandleType (must match trading mode!) """ - _timeframe = self._default_timeframe if not timeframe else timeframe - _candle_type = self._default_candle_type if not candle_type else candle_type - - pair_key = (pair, _timeframe, _candle_type) + pair_key = (pair, timeframe, candle_type) if producer_name not in self.__producer_pairs_df: self.__producer_pairs_df[producer_name] = {} @@ -161,8 +158,7 @@ class DataProvider: producer_name: str = "default" ) -> Tuple[DataFrame, datetime]: """ - Get the pair data from the external sources. Will wait if the policy is - set to, and data is not available. + Get the pair data from the external sources. :param pair: pair to get the data for :param timeframe: Timeframe to get data for diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index a9fdd62ca..e167ce24d 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -109,6 +109,7 @@ class ExternalMessageConsumer: """ if self._thread and self._loop: logger.info("Stopping ExternalMessageConsumer") + self._running = False if self._sub_tasks: # Cancel sub tasks From 75ce9067dcfdc32ad39cdddf7c7c89ee25dc1348 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Mon, 12 Sep 2022 16:39:16 -0600 Subject: [PATCH 266/437] fix dp test --- tests/data/test_dataprovider.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/data/test_dataprovider.py b/tests/data/test_dataprovider.py index 812688cb1..9915b6316 100644 --- a/tests/data/test_dataprovider.py +++ b/tests/data/test_dataprovider.py @@ -169,6 +169,7 @@ def test_external_df(mocker, default_conf, ohlcv_history): candle_type = CandleType.SPOT empty_la = datetime.fromtimestamp(0, tz=timezone.utc) + now = datetime.now(timezone.utc) # no data has been added, any request should return an empty dataframe dataframe, la = dataprovider.get_external_df(pair, timeframe, candle_type) @@ -176,7 +177,7 @@ def test_external_df(mocker, default_conf, ohlcv_history): assert la == empty_la # the data is added, should return that added dataframe - dataprovider._add_external_df(pair, ohlcv_history, timeframe=timeframe, candle_type=candle_type) + dataprovider._add_external_df(pair, ohlcv_history, now, timeframe, candle_type) dataframe, la = dataprovider.get_external_df(pair, timeframe, candle_type) assert len(dataframe) > 0 assert la > empty_la From 6d0dfd4dc8f122716784759926e21bc1f0c6c00b Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 12:27:41 -0600 Subject: [PATCH 267/437] continue trying connect on ping error --- freqtrade/rpc/external_message_consumer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index e167ce24d..ef2417225 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -252,11 +252,11 @@ class ExternalMessageConsumer: continue except Exception: - logger.info( + logger.error( f"Ping error {channel} - retrying in {self.sleep_time}s") await asyncio.sleep(self.sleep_time) - break + continue def handle_producer_message(self, producer: Dict[str, Any], message: Dict[str, Any]): """ From 07aa206f71995ffc92f744d40ae40973d1c54813 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 12:36:40 -0600 Subject: [PATCH 268/437] real fix for reconnecting --- freqtrade/rpc/external_message_consumer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index ef2417225..f8e5315f9 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -205,14 +205,14 @@ class ExternalMessageConsumer: continue except websockets.exceptions.ConnectionClosedOK: - # Successfully closed, just end - return + # Successfully closed, just keep trying to connect again indefinitely + continue except Exception as e: # An unforseen error has occurred, log and stop logger.error("Unexpected error has occurred:") logger.exception(e) - break + continue async def _receive_messages( self, @@ -256,7 +256,7 @@ class ExternalMessageConsumer: f"Ping error {channel} - retrying in {self.sleep_time}s") await asyncio.sleep(self.sleep_time) - continue + break def handle_producer_message(self, producer: Dict[str, Any], message: Dict[str, Any]): """ From aeaca78940131ef4d3165d3d53c2082478d3d192 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 12:39:12 -0600 Subject: [PATCH 269/437] change port in send_msg test --- tests/rpc/test_rpc_apiserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index 2f25f442b..f22499086 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -1752,7 +1752,7 @@ def test_api_ws_send_msg(default_conf, mocker, caplog): default_conf.update({"api_server": {"enabled": True, "listen_ip_address": "127.0.0.1", - "listen_port": 8080, + "listen_port": 9913, "username": "TestUser", "password": "testPass", }}) From 79c70bd52dc402a1e75252532b2a744e1ff0c891 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 13 Sep 2022 20:12:02 +0200 Subject: [PATCH 270/437] use WebSocketState from fastapi available since 0.82.0 --- freqtrade/rpc/api_server/api_ws.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 34b780956..174a0a85e 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -1,10 +1,9 @@ import logging from typing import Any, Dict -from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect +from fastapi import APIRouter, Depends, WebSocketDisconnect +from fastapi.websockets import WebSocket, WebSocketState from pydantic import ValidationError -# fastapi does not make this available through it, so import directly from starlette -from starlette.websockets import WebSocketState from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.api_auth import validate_ws_token From d2abc9417f53f9a330e11dde257d7e014d120f96 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 13 Sep 2022 20:42:24 +0200 Subject: [PATCH 271/437] Simplify ws imports --- freqtrade/rpc/api_server/api_ws.py | 2 +- freqtrade/rpc/api_server/webserver.py | 2 +- freqtrade/rpc/api_server/ws/__init__.py | 6 ++++++ freqtrade/rpc/external_message_consumer.py | 5 ++--- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/freqtrade/rpc/api_server/api_ws.py b/freqtrade/rpc/api_server/api_ws.py index 174a0a85e..c4a3e9d4a 100644 --- a/freqtrade/rpc/api_server/api_ws.py +++ b/freqtrade/rpc/api_server/api_ws.py @@ -8,7 +8,7 @@ from pydantic import ValidationError from freqtrade.enums import RPCMessageType, RPCRequestType from freqtrade.rpc.api_server.api_auth import validate_ws_token from freqtrade.rpc.api_server.deps import get_channel_manager, get_rpc -from freqtrade.rpc.api_server.ws.channel import WebSocketChannel +from freqtrade.rpc.api_server.ws import WebSocketChannel from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSMessageSchema, WSRequestSchema, WSWhitelistMessage) from freqtrade.rpc.rpc import RPC diff --git a/freqtrade/rpc/api_server/webserver.py b/freqtrade/rpc/api_server/webserver.py index 3fb8159e1..7a59a7a4c 100644 --- a/freqtrade/rpc/api_server/webserver.py +++ b/freqtrade/rpc/api_server/webserver.py @@ -14,7 +14,7 @@ from starlette.responses import JSONResponse from freqtrade.exceptions import OperationalException from freqtrade.rpc.api_server.uvicorn_threaded import UvicornServer -from freqtrade.rpc.api_server.ws.channel import ChannelManager +from freqtrade.rpc.api_server.ws import ChannelManager from freqtrade.rpc.rpc import RPC, RPCException, RPCHandler diff --git a/freqtrade/rpc/api_server/ws/__init__.py b/freqtrade/rpc/api_server/ws/__init__.py index e69de29bb..c00d29e22 100644 --- a/freqtrade/rpc/api_server/ws/__init__.py +++ b/freqtrade/rpc/api_server/ws/__init__.py @@ -0,0 +1,6 @@ +# flake8: noqa: F401 +# isort: off +from freqtrade.rpc.api_server.ws.types import WebSocketType +from freqtrade.rpc.api_server.ws.proxy import WebSocketProxy +from freqtrade.rpc.api_server.ws.serializer import HybridJSONWebSocketSerializer, MsgPackWebSocketSerializer +from freqtrade.rpc.api_server.ws.channel import ChannelManager, WebSocketChannel diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index f8e5315f9..2ff261eee 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -17,7 +17,7 @@ from freqtrade.data.dataprovider import DataProvider from freqtrade.enums import RPCMessageType from freqtrade.exceptions import OperationalException from freqtrade.misc import remove_entry_exit_signals -from freqtrade.rpc.api_server.ws.channel import WebSocketChannel +from freqtrade.rpc.api_server.ws import WebSocketChannel from freqtrade.rpc.api_server.ws_schemas import (WSAnalyzedDFMessage, WSAnalyzedDFRequest, WSMessageSchema, WSRequestSchema, WSSubscribeRequest, WSWhitelistMessage, @@ -252,8 +252,7 @@ class ExternalMessageConsumer: continue except Exception: - logger.error( - f"Ping error {channel} - retrying in {self.sleep_time}s") + logger.warning(f"Ping error {channel} - retrying in {self.sleep_time}s") await asyncio.sleep(self.sleep_time) break From 877d24bcdd1adb0d3378dbc24a7930d24638cba8 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 13 Sep 2022 20:42:32 +0200 Subject: [PATCH 272/437] Fix external dependency of test --- tests/rpc/test_rpc_apiserver.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tests/rpc/test_rpc_apiserver.py b/tests/rpc/test_rpc_apiserver.py index f22499086..e007e0a9e 100644 --- a/tests/rpc/test_rpc_apiserver.py +++ b/tests/rpc/test_rpc_apiserver.py @@ -1698,8 +1698,7 @@ def test_api_ws_subscribe(botclient, mocker): ftbot, client = botclient ws_url = f"/api/v1/message/ws?token={_TEST_WS_TOKEN}" - sub_mock = mocker.patch( - 'freqtrade.rpc.api_server.ws.channel.WebSocketChannel.set_subscriptions', MagicMock()) + sub_mock = mocker.patch('freqtrade.rpc.api_server.ws.WebSocketChannel.set_subscriptions') with client.websocket_connect(ws_url) as ws: ws.send_json({'type': 'subscribe', 'data': ['whitelist']}) @@ -1752,18 +1751,24 @@ def test_api_ws_send_msg(default_conf, mocker, caplog): default_conf.update({"api_server": {"enabled": True, "listen_ip_address": "127.0.0.1", - "listen_port": 9913, - "username": "TestUser", - "password": "testPass", + "listen_port": 8080, + "CORS_origins": ['http://example.com'], + "username": _TEST_USER, + "password": _TEST_PASS, + "ws_token": _TEST_WS_TOKEN }}) - mocker.patch('freqtrade.rpc.telegram.Updater', MagicMock()) + mocker.patch('freqtrade.rpc.telegram.Updater') + mocker.patch('freqtrade.rpc.api_server.ApiServer.start_api') apiserver = ApiServer(default_conf) apiserver.add_rpc_handler(RPC(get_patched_freqtradebot(mocker, default_conf))) + apiserver.start_message_queue() + # Give the queue thread time to start + time.sleep(0.2) # Test message_queue coro receives the message test_message = {"type": "status", "data": "test"} apiserver.send_msg(test_message) - time.sleep(1) # Not sure how else to wait for the coro to receive the data + time.sleep(0.1) # Not sure how else to wait for the coro to receive the data assert log_has("Found message of type: status", caplog) # Test if exception logged when error occurs in sending @@ -1771,7 +1776,7 @@ def test_api_ws_send_msg(default_conf, mocker, caplog): side_effect=Exception) apiserver.send_msg(test_message) - time.sleep(2) # Not sure how else to wait for the coro to receive the data + time.sleep(0.1) # Not sure how else to wait for the coro to receive the data assert log_has_re(r"Exception happened in background task.*", caplog) finally: From 7b6e465d57e392114d8cca2df24c18c5d4c3e4fe Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 13 Sep 2022 21:28:11 +0200 Subject: [PATCH 273/437] Remove gate live test skip --- tests/exchange/test_ccxt_compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/exchange/test_ccxt_compat.py b/tests/exchange/test_ccxt_compat.py index f57b0b366..82be6196a 100644 --- a/tests/exchange/test_ccxt_compat.py +++ b/tests/exchange/test_ccxt_compat.py @@ -297,7 +297,7 @@ class TestCCXTExchange(): def test_ccxt__async_get_candle_history(self, exchange): exchange, exchangename = exchange # For some weired reason, this test returns random lengths for bittrex. - if not exchange._ft_has['ohlcv_has_history'] or exchangename in ('bittrex', 'gateio'): + if not exchange._ft_has['ohlcv_has_history'] or exchangename in ('bittrex'): return pair = EXCHANGES[exchangename]['pair'] timeframe = EXCHANGES[exchangename]['timeframe'] From 46a425d1b640d8b15c2115e3478cd635e0dfdbd8 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 13:36:21 -0600 Subject: [PATCH 274/437] fix OOM on emc test --- tests/rpc/test_rpc_emc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/rpc/test_rpc_emc.py b/tests/rpc/test_rpc_emc.py index 1968c5d39..7bb727810 100644 --- a/tests/rpc/test_rpc_emc.py +++ b/tests/rpc/test_rpc_emc.py @@ -184,14 +184,14 @@ async def test_emc_create_connection_success(default_conf, caplog, mocker): test_producer = default_conf['external_message_consumer']['producers'][0] lock = asyncio.Lock() + emc._running = True + async def eat(websocket): - pass + emc._running = False try: async with websockets.serve(eat, _TEST_WS_HOST, _TEST_WS_PORT): - emc._running = True await emc._create_connection(test_producer, lock) - emc._running = False assert log_has_re(r"Producer connection success.+", caplog) finally: From 7a98775f012d9467b951427d56daead30e630e37 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 13 Sep 2022 22:07:59 +0200 Subject: [PATCH 275/437] Version bump apiVersion --- freqtrade/rpc/api_server/api_v1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/api_server/api_v1.py b/freqtrade/rpc/api_server/api_v1.py index bf21715b7..53f5c16d7 100644 --- a/freqtrade/rpc/api_server/api_v1.py +++ b/freqtrade/rpc/api_server/api_v1.py @@ -38,7 +38,8 @@ logger = logging.getLogger(__name__) # 2.15: Add backtest history endpoints # 2.16: Additional daily metrics # 2.17: Forceentry - leverage, partial force_exit -API_VERSION = 2.17 +# 2.20: Add websocket endpoints +API_VERSION = 2.20 # Public API, requires no auth. router_public = APIRouter() From d75d5a7dadaf60f3e0fc619af73d2964527a8d4a Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 16:06:25 -0600 Subject: [PATCH 276/437] debug ping error message --- freqtrade/rpc/external_message_consumer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index 2ff261eee..fd6ccfacd 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -251,8 +251,9 @@ class ExternalMessageConsumer: logger.debug(f"Connection to {channel} still alive...") continue - except Exception: + except Exception as e: logger.warning(f"Ping error {channel} - retrying in {self.sleep_time}s") + logger.debug(e, exc_info=e) await asyncio.sleep(self.sleep_time) break From 06350a13cbad4de1780058dde2b145bca3146171 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 16:39:53 -0600 Subject: [PATCH 277/437] support specifying message size in emc config --- freqtrade/constants.py | 6 ++++++ freqtrade/rpc/external_message_consumer.py | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/freqtrade/constants.py b/freqtrade/constants.py index 2cc2fd115..470ffb2a3 100644 --- a/freqtrade/constants.py +++ b/freqtrade/constants.py @@ -511,6 +511,12 @@ CONF_SCHEMA = { 'minimum': 0, 'maximum': 1500, 'default': 1500 + }, + 'max_message_size': { + 'type': 'integer', + 'minimum': 1048576, # 1mb + 'maxmium': 8388608, # 8.3mb, + 'default': 1048576, # 1mb } }, 'required': ['producers'] diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index fd6ccfacd..7dd6c09b0 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -67,6 +67,9 @@ class ExternalMessageConsumer: # The amount of candles per dataframe on the initial request self.initial_candle_limit = self._emc_config.get('initial_candle_limit', 1500) + # Message size limit, default 1mb + self.message_size_limit = self._emc_config.get('message_size_limit', 2**20) + # Setting these explicitly as they probably shouldn't be changed by a user # Unless we somehow integrate this with the strategy to allow creating # callbacks for the messages @@ -175,7 +178,7 @@ class ExternalMessageConsumer: ws_url = f"{url}?token={token}" # This will raise InvalidURI if the url is bad - async with websockets.connect(ws_url) as ws: + async with websockets.connect(ws_url, max_size=self.message_size_limit) as ws: channel = WebSocketChannel(ws, channel_id=name) logger.info(f"Producer connection success - {channel}") From 37dd22c89e2e50bce49ffce17277dc06d2abec8b Mon Sep 17 00:00:00 2001 From: initrv Date: Wed, 14 Sep 2022 03:40:13 +0300 Subject: [PATCH 278/437] Fixed a bug that prevents clearing old models Corrects the error of clearing old models when the model directory contains directories with names that do not match a regular expression --- freqtrade/freqai/data_drawer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/freqai/data_drawer.py b/freqtrade/freqai/data_drawer.py index 9eeabef8f..1c091f1be 100644 --- a/freqtrade/freqai/data_drawer.py +++ b/freqtrade/freqai/data_drawer.py @@ -355,7 +355,7 @@ class FreqaiDataDrawer: for dir in model_folders: result = pattern.match(str(dir.name)) if result is None: - break + continue coin = result.group(1) timestamp = result.group(2) From aed19ff6cee279f1446338dab54b2bb348145902 Mon Sep 17 00:00:00 2001 From: Timothy Pogue Date: Tue, 13 Sep 2022 19:17:12 -0600 Subject: [PATCH 279/437] fix The future belongs to a different loop error --- freqtrade/rpc/api_server/ws/channel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/freqtrade/rpc/api_server/ws/channel.py b/freqtrade/rpc/api_server/ws/channel.py index f4a0da47b..cffe3092d 100644 --- a/freqtrade/rpc/api_server/ws/channel.py +++ b/freqtrade/rpc/api_server/ws/channel.py @@ -71,7 +71,6 @@ class WebSocketChannel: Close the WebSocketChannel """ - await self._websocket.close() self._closed = True def is_closed(self) -> bool: From 49800e4cc300eb39b412287a05480a98962c354b Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 14 Sep 2022 06:55:05 +0200 Subject: [PATCH 280/437] pin ci python to 3.10.6 for now --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb5bc209e..91d53044d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: strategy: matrix: os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04 ] - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10.6"] steps: - uses: actions/checkout@v3 @@ -121,7 +121,7 @@ jobs: strategy: matrix: os: [ macos-latest ] - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10.6"] steps: - uses: actions/checkout@v3 @@ -205,7 +205,7 @@ jobs: strategy: matrix: os: [ windows-latest ] - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10.6"] steps: - uses: actions/checkout@v3 From 91bc3d11618c3f5bf47a8a71166544cf4e0b7a0f Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 14 Sep 2022 07:04:14 +0200 Subject: [PATCH 281/437] Update docs aroudn use_exit_signal close #7413 --- docs/strategy-customization.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/strategy-customization.md b/docs/strategy-customization.md index 2b6e1fb2f..b97bd6d23 100644 --- a/docs/strategy-customization.md +++ b/docs/strategy-customization.md @@ -264,7 +264,8 @@ def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFram ### Exit signal rules Edit the method `populate_exit_trend()` into your strategy file to update your exit strategy. -Please note that the exit-signal is only used if `use_exit_signal` is set to true in the configuration. +The exit-signal is only used for exits if `use_exit_signal` is set to true in the configuration. +`use_exit_signal` will not influence [signal collision rules](#colliding-signals) - which will still apply and can prevent entries. It's important to always return the dataframe without removing/modifying the columns `"open", "high", "low", "close", "volume"`, otherwise these fields would contain something unexpected. From 711849abd6fc48c5936d31bc4e8a7afc130c0dfb Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 14 Sep 2022 07:16:57 +0200 Subject: [PATCH 282/437] Use Wheels for win builds --- .../TA_Lib-0.4.24-cp310-cp310-win_amd64.whl | Bin 515758 -> 0 bytes .../TA_Lib-0.4.24-cp38-cp38-win_amd64.whl | Bin 518186 -> 0 bytes .../TA_Lib-0.4.24-cp39-cp39-win_amd64.whl | Bin 515822 -> 0 bytes .../TA_Lib-0.4.25-cp310-cp310-win_amd64.whl | Bin 0 -> 500560 bytes .../TA_Lib-0.4.25-cp38-cp38-win_amd64.whl | Bin 0 -> 506094 bytes .../TA_Lib-0.4.25-cp39-cp39-win_amd64.whl | Bin 0 -> 503429 bytes build_helpers/install_windows.ps1 | 6 +++--- docs/windows_installation.md | 4 ++-- 8 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 build_helpers/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl delete mode 100644 build_helpers/TA_Lib-0.4.24-cp38-cp38-win_amd64.whl delete mode 100644 build_helpers/TA_Lib-0.4.24-cp39-cp39-win_amd64.whl create mode 100644 build_helpers/TA_Lib-0.4.25-cp310-cp310-win_amd64.whl create mode 100644 build_helpers/TA_Lib-0.4.25-cp38-cp38-win_amd64.whl create mode 100644 build_helpers/TA_Lib-0.4.25-cp39-cp39-win_amd64.whl diff --git a/build_helpers/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl b/build_helpers/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl deleted file mode 100644 index 9a96b7894639e81e0840f7f15dd4d38ae0a35068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515758 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

Ljk9*L`7oyC!e$cxM8?3hcn-%zyU}Y) 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 z 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

`BPKWl<{%U>S4vn^_a*z7|83~86(44V9 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 z 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 n*NOaJ$Ogcm|APGIv@RbYEXC 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 z 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

dgir&KZK{0-j=eUyG7W8#FT6pCNo{BAh@18AgB zs1_#~zIk1RLx>n7sA>nHZ-E#is5G0n(REIg|F-x@9wFb><{lwBQqDT-fJaE7hHIvq z)|PGdYt@8se{D(sYF4Ks6FovmvOSrtb_l8Ot#k;v!#>)ptRjaH3@%YOMZ+~h18{^b zoI^~8WjzVXx#=kH-c?C{5mQg2qzeRY`?}9%OTHgK7W2IO_$3LS- zqAzR7Q0JBiQrEOZ%jnm~1UT4l_s27i9VdduF0 zbmaXEauZk~7q#O>;5f^RjJ(JTigsdAYhDC_#CcH^6*)iPzgzMu$2HsqA&jOJK3_GZ zhGDV`!lM-cZ;1@a1>t9u+aiB!PVx^!UVY|F@%;6LmZ|I>uPw{bZE8w#w4sOSg>XDf zrK<-xWG{r=8Ys42o2n99CjdQ8HRfnC@W^mS1P)GAb8?#+qdGw+Yj{XFwyQ=_bN%`n zWUg;W+gBU6Zy_smR(2VN*QS`6*}vc-S~76NW6eZE!5uxn$S&B|4`66n+#-bkP)jt| zlU5oG1>EZ`fz+XQfuB73KY03AU!NS91>LH+GXbusW`g0Y{6d^B(6?>j>Z8cE_S zBJN=>nST@adI#g1R1o+2a&eE&r#cZ0iF+l7Da5#HH6(HGqMNvPb)=%+^XmU1?p-cf zRNPAd8#g7O$+eeR%f-F5vm|k^uPp9qYoK5@bd_4%+ptO&&a5R-I4eERT{sJ_#)Pxa zXOXyn0tCdpu8JPZQ;++s?mhk*%6i;33&p)jO;OxC7zpAXWE`}| z_d{{7B8hvwRpQ=Rd$DIE>m_iT99}mN^#r87A`BDS$4&m+T^@|%y%z>x-b-tIP%PX( ziFPoJo2+RU(Jn4LQkcd&Ee=5ci!mq%+UKaELH{v_%YmJTb2+g6aD^OLubLG~GIvVut>Rb+dpUZ)VH;ZhkKI0v-kDsafpGAYbs*-3hLX7 z5V{N_O9NAoc`qd>Yb&1e>VQ8sbqKTcs+2ayf){ckVK@36dbr6}R+FWstZmq59q2Pf zl$xS+4MVx1`+OBLbRRbzIZUkCh$;#*Ikj#Gt>;OGZpmdg0bO=^rN&Tcs2AtYUYf~K zCIMV_A1bcyAEA3D3pFK^`)J0TO(BNrv#P|Lp@GGYHkHFp#)!r|2b|ZbyFIEX)9bVu>hY$Z7%Jb~Cp1#@ig%XDVI>x8RQ!f31h3&0@K4K5TqqmVp9$-J z_C1S@t)Lm2bm$sz|q?-v@Xb zhPVt_Au1ugTnI)fiW43h|J=-dJD#Ewk8yumo>^IG>IORFX6h~)v$#uTIW%!UWvVQa z-$tnAw>Di#_te%OLK6#yC&_TOJcT4~3+rb^Tl+-}t4dLyFdC~6*|d>XlXZfzBaYg{ zJdUWOB|W;qF+z$kvS1M*OLk@HkU`^T4O!z{XnaYHc(bt+QIgjrdc^0=AqpKgTe_^% zGf`2zwjp>nlQ&bIW1gBvZGb)NURRU_`pIJcr|~4v`@!>TnW(*}$nC$m_KjbN_TPNb z{##KL=sPZw^c_)P|AnbtpQ$MlAmH1IV&=PJesJ@EB|%zs=|}S$&|Kru9t)(St4D7Zw1bFbcohFLfu4#1v9S z@OheMIlN5P;-dUhfxJ1~Di!6%Jj{RGTjyWtZS!xSnt!k~|FQD?ZG8R}ip;;kTjw7v z&0nXSf4BcI|KR^V|DJC1AN$t%S0rsqV+=VCx*&L`Bp%Uj^%)-bl8&f!CXF!<0iAa!#ctqE8LBLKOoUypS`H7Y1_%GIy|ofpnA;8OV(p5(9Z+5;Bli7N{A>4Z)m&Tvvq{ z$c!ં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 diff --git a/build_helpers/TA_Lib-0.4.24-cp39-cp39-win_amd64.whl b/build_helpers/TA_Lib-0.4.24-cp39-cp39-win_amd64.whl deleted file mode 100644 index 84d3e60ab601a8d46567a1deca86fed1537f4627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515822 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℞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

|$S? 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 z zS|b?Nnb+QH_gf1)?&~(~_ve=@p*n9|s(nr0+kL-!wmQRD=5lJ0!@q4N9KYUmRpQBX zM>u9(1;=o5QpG=e%9~VC7C@jFXYlRra%1Rw=;3`6j5@3O!ltG#E(_V&lsg=MZ!6^@ z#BF3|=~6msQ{!JO6SOQ5Uj99BRX&4Sq#(DBXJ+CT8_9rIa^R5?j{g|2wf^^`+u+8D zT1`3C#fthurmQkPxZ~d8!8=I(-rS*T1I+Kq zGB5PSlL!V4l~0HPo|(MLr*qtYxt}&hYjanqe2O37!9Bm)`=;oW_!UN>DfY{of}8nY zOEfRf71?6DB0dIDZP--|_uq%(U8Kk7U9!PA= zfIP@%b!=W*vogs@jbvj?WSR{&;(xiheaf>tEpRhznitKjZ&V>td*6A*J&BL%&zH1+ zKPei8wYG;t?)k9Q@jhi%*l5ZdCDYSPM)ZiqXE(A#M_H1HB|<*Xm%rRTJ$K5j>|YmgjJ1?etbKvn<|w#&gXR?w4_D$3#&4H2d;6{ zfR$BkD32DtRSv$No2R?8+%g?ko-@@R?8_Z2n$SP~Y_IDgH#e_uPu9FtN4J#! z7{gA-5It)12gP}MnbW4VS@)GcOB%5myQ%J-8+q@KU@^W+eQ8ReA`nAUo_8*(JiiNv z-TfJk?YBD0;TxfyWA-qfcxBX-QW>B^fnw=XxsCKOJ_mBTsh6aoN5M zmvQY`e#*6}t(KZB4&1gOvm};D+4E++fzN$%~ zdRHz^YJO_;!0VW)2B%dUG!@cvwpL=lWgHJ{2nyBfw&^66q>jtzR=Kn!v8~%~^=utF zZ8>dbk8fW(wM;wWHf*<2w*qT}I*+g9H;!O+LA1wL#OnW?@c&6Sfx#xa7S{69>iSQc zuRjtR>c&$Zb$yEQ8Z0Oxr5UOG9>FBWS0WxT)IJx})EJO~z78BMl$|BQzP@rJW6=cYwc5FVdFtP3M=@Zg94* zk=1W_vLYwio}gB==PLP>k3x!IS-9oE^#@PVG!A#Qiyn$ryMKJ+{_E~pl;w%&50Bv8 zbDhs*KbPR$WF1e#b3?x$fpvOR<`X}>;iYTjvqu2|W$n3`S(*z^j#l+L*mKMA`{$Px zYlpsPQ+ImXxq~J)p0K8M9q%k=sJ5O-)G=O+zfcKo|@$NLge&phtg7djXxz4fR5*4G)PEEbH_|jRu z$>wY#Al1b=J92p3TKsFq7JSBL)&54!>W;&-&8q&5d@4zi%9>Y_Uk<0&P7PJ}446+c zzD0pcl|>dmURq0g)<63Gyeph4SHAa*rvJcXlqDFuki^foVCB`?kdNJ}Ur>KqSaSc1 zX>s3*BmX#WOpwM~CnA1vQE+mr=5UfX8&7L5cy{;IY!Pvr7~#B?#>p7)r|xw|YxDpb;yd1coNK_b)oXrV3vPzzq<9N%~EEb4-Mg9M=ZoKbg%}(@-^w&C8t8L zpVxHOh{v?v!TLWT5ad`k*6diQa80<1OCRqK%71%25SJ4hrUv*8tEt$UHZ%1;ipy7N zscZ7wGTq&FxR&d0lY#^i z!kktVM!h7N>bf*FkmU3~!4n170O6aQAu?%_=t{32{*AFpm3QQq1Fnhu?xopohxg;> z`TZKbZ?{c6pFC^sJZg}?%ND_x6voB*ul*fNB|A^rL`&!Ik+`<3C6~^!R$8G$hfCjy zyE&JKQQ9<1l6$|3*WS(hTU|2?gddmMMCXZ?@3Y~C&Rxbi&K@R@yY8vgZ&ZJI!t`TA zl|ITzSV`Rx{zxaKR&r?4j^V`B{Wq`0;CF|8;r5A+3Y>Aw7az2=mlD zRMR*dzEb3e+>Ti;;FCDqcU=vWk}l_~V|Lt4bWZ+L*#=#Y*U_-t$?lg7{DA#0uCZ8C z&_bAIb*Ca=_n;U<*Y#0_n(V4A5^rV{!W=u9@#}J`Kd?YJ^>@GZ<>XZigm9QrVWT!` zYX0(mK5)5XL`?k}f2ZPyo=OF~lS|&Bd|(s3as)QGjG(wos6dbw#)+rJm%}MvT>tX| zT2#O0GP+CF+iN2T9;QehUgX~aGAw#B%~>eSH0E*T{XJW#>sezXdr!?r^=w$D`j2Ju zWmllOEB1%4eQot!pT3!y?N?#@hq!ZCO_2T736!n(J)JsE?F0hyFgcs|q$wm6Ei$QB zqqJmHBaF3|jpLkK`g4V}xcdu?-85An2wU;Inms%_Z&(Iip43mOjhLDT>gV_1KaPlr zUF+@q=${3u{y(`m79@`tmyl8(udX6{n`#5-R7WIP^l(!6B*{(BUA_IVwhYxd#u*ES9G z!50DP?8-=1IWGb0L>BDefhns4VvIBs_IXHr-06k($%&I$^{A(lt>zyUx^ea2w9_Tq z_lMV%LKtX^+(T7+=ATQBTOjSZs^{?cQ&9Wg&E#h9c&xE)X3u<;1Cr^pW|#E81PrX% zsI^`j-SXCIG5@xG;!4qCzJfdW9g;Ou4i4#cS9ZCFYe&ASc{iJA*S?hirs2_8anHrn zWj~78$p4F-k3CDSkJ+ePN3h@dAajjQquTDt0jwjOE+i7>lzAFj zcWkIb<}*1y*lgfE80(HTbP&CMC~HCY8g`+ITgRpu?U46g~x$wL|&McCA9nw>! zrV_Ip(`&uYKk;DyIf3*`$If_~?qQe*!1$Xs@O^7A?ThCE#3Vn4 z*q%r)0sX}!%mj*$x=7l^+}1HnKq<_KqNJ3cF19~}Y9(XDa9I}7YIza+a7J*vE9>LN zAv-6M7w4sgpRM0}I(zsYKBKRr*;)&Ch;L!d(qC0U?Guq!?WQD9`$gjDp?H_MjMei7 z)s(A048k4QS5zwB+{Ug@{i&^>sz&Gs>p|n`wZLzF>)PvhJZ7Y`G}+XVsEEiJdh^2F zR5*@zEz48qeTPOB;b=!0D%KFIp~BQea_;==Se}Qmeu=nxE;j2e9j;Ma|2yaO`#<@s ziKjy6@LLfk_ZD!%Ll>d(VQ`>_LkAm`^T>N#%W)L@g;Jq|eUXFhhoTt^9wrN4O&d!K_6`0J z;AbsuoY%*b6_M3P6pJj51ACsYo$e$XM6Gyc&q%EtIdgM1@g7w}%+jVhn6;@enlroa zef}xCz1fogNh=BLh!EsTn{w0oCzOAdO8u~)+g%MfIfea7HPHNir>q9b!sUC&**oOeS4KYZXekctEr@yxp4ao zQ$3XW@aVd7lQM3-VqG7VnVLC&LVkgB-&$Rn+00nsFM62jyVjMa5%DCr&k}=Rv z*tqA=Nce~w4x+u&2K za8UB=@m8?Lzv-(Jo}PRcp?1Z+@db1KtxCLWL4_!`YcclKsh>kQmAjvSykH-nc)@}L zI$-~53W_&ByO{f{eD(M#@L}Y73vZRCbTxsd^yS!&wNm{<<=9*Ul1!}Mi)w{~@?VdO zg4H@+&|gl*kWq>#IBu3$--#qNq}GHV{b$iq-tk2;$8yYZo&bLF^0^l*p}=s=*=WMl z`~tCD@0|F&`MH|Kc=RcIRlIZ+0TR(pAX9SMd}Qmd5j?-v-`Zl4ck;lko^OUXSX-97 zu}r=UpS0OtsyLn&H;szAzZyXOI$!!vi(_YO{$*i>BH2*Ano#G&WlCm*sA>-g4>|U3 z`!zqmZBg`E!+0&~w`cRjyB|q^rfr+S(lZq|{W?Wv8~iTYrB#DoIZSM)e?hW;rMYIP zYU9)1^nMx(U_M-!va6ETJx>1Oy6a_97N7d%o6-!km-b=&5yiTa1*AIBR?@u2$m^cAzijm<7^h#}O3b<(<2;5&>D#Cq}3!YAwUDJxM9<`*Sl z(H++wvVhtZjQ1PZAMD>LzQT|SO|=sqjgzQvd(1p8#{1I4Bfjsz7;wPf0loeHd z^sr9b4mi^Ow(yDNJ>Ki<5*8)}mixS|RVxAh`>On8^^@l_>L=SXfD_gD?BzhUM}8mS z&MoP1{{DhrS=Hhv`l`t*^QZWgF^$aLC3k=hbCuCOTT8}3KmySTP4uT5qg$+m%$fe3gMbOSXUJUcSXjv3woR`DSEB2Ql(`s_=;cCV8diKLfwdVf26A_TD`Ka$D~Ys-4uZUlyK!mo7YC_zgc# zlUpS*r>0z54*L}u4Wr25VZXJ(%XxD0O4KEGcnvB_7WkNP&iX-Up-I~BHEiY`e7;jx zLZqbYl#eiB@ue)7rm^nhWBM4y_(RlTC~+kld`=IOf~x{sjtiK3>Yf}z^kJ+qz0 zM>&t_8xK-mWa(`4FXW?*LURATa44evq?62q@d|B|+%kl?CEek(FHQ_({FdW7{X1~e znCn+ymZs!`k3Iapm_V6ntlf*V_P(0GhKQ*DM6Q`$ULQGq+cEoyET28I+q3)9=EqHl zR0%jz7u#AQ(OOiXhwn)SKENgLxs{?E(pF0#3(J{b_lF5_#UUB!hNx@2RTx?WW+u2Z z9czb5SriTcZP7A=va&c*0XY|zX%W11O0W%H(6IpVSJaInd%y!hP8mFR(<)ZOM3|`!HLrN4?&XVR}oFAMv9?J)5+8`Uz?+TIS*{5gp3&6EyD4;K%7&)kg5sV{oI& zM{ueaL^|VJyeqfKIe!M=M6>zL#_2@X$! zPcOZPoiYHWXDB!g17x3&V$stue(VfLAY4w03@3O4LaY4#$xByD!vRq8#(IGr9*Fz3 z?d-4U?g5bi?+%J@Bd^Lo7KBE;MWFbiF6?qY|GOLFrTsI0B1VBS>yBD)Vyk%X8q=zT zEBe!x5QGw-_Cd@P~Ce2%4;Xa^RFw`O*5YLy6Oze62)ZWq*;3+WmgPCC-^RK}` z0b&Aw2apC(*e*pC0SJK(T%HN;4RGWez&jED5N2?hIA@D%JQ%CD^lZ4D7C>_@0ynQQ zP^v zGOX?1jtM?glCnq_Kq<&+WmU3cCP;j561!b6oKW0|y*EGe{3JQvoQagR3qn*3j*us* zK3I7Wb%exkLhkFfxj-p-nYewiFaZ~Mc~-<`*kJg z;^A0PoIZIwrRb`%+eF2U3@xZw_{anDF$nbx`Vi!f#TN-x-@9-|7jf_+Fq5y;G2&gA zzy9=d!w9{)8@UI4TwUqknIty$FEYm~E%)-e;>?WetwYCTQk)G~YR zj9IO_Q{(Y^XtXy%^i$GTN+nX`A)Y_K80h&Q#Qr+Nlb7~4j}>k{Qen}0O7%5+wq@~E zYsbx@@^N%jpXO`a&l|JU3&s!Y;#?yFDN}ze9InxvW7~et>w-SFMmk#XdGfQ}GDEYM8P5%m^QjQx4-Ml`2VPu7OHw71U6iLQ zmb$HXAd281Yb(5M@?2mlnsY+~LzTmYXWgB;iOAU{EXAb`*NqzD*SRiU6~LR{BC9@B znhQW57_uiV>*p$BBo_j**DH5VY^}?VdBlhls`s3ogz&yXgliC6>o~I?_)kr-skW#D zVEeaw?$Z^<@kI+`DB6geBh)1&HSS)Sj$d}71Yni2TP`+=oPqJfYGTGsiH4+w86Xa~ zc+i<>IIm%dk7$VQ>9j>t=wn&nR@ST<%4Oz7g2Wq$YgDKE&nSwhfTUOE!ThA;T@V$& zC{!HO`p1JmgZKtui>?`B(Rhy;NN(?pPMGVa+)xU?*)NvQ4*L@c;*X$gcF*`=l;A1{ zu#u32J~DJxH^tZZ7vVdTZbRis(6=Z#(*4?6OhRZ;{e8R{*OnNZDP4(`nB#wbF`4XZ zH;~}#S<2x1CA^~FT`7Diqy(|Qph0HFAJZP52^uJ{!NamyHFU~$iiC)6%YCy==zBJ= zQS_wPukJx2DSRPs(Sg)Bqq5}$S0O;%4PK2LbREY9sfGnNtdE#;J(-O`v629Xps3}r zhyzNr4mQgu}r%>im$7J5KQqaEy~ zhqXf+ec#>Tm(y5R73)Y#=;^@h_t|)Kto4a?v%_wn7RlOF8i|Io?88?VW8M&liWo+z z>EeHWXIoqgr@&DIpD#4MpXe1xDGn$`MN#uAIHNfY8d>2zF+kOPR1^pA#T)-im(m@- zPvO)3?vzF3kdlU7p376tBC-eZW=3u40pixH%K^Oe5Do5|7Fixsx5)Azq6KB@{alH7i1QC!TzH0W_R5GlLjn{nF%ECd?{bb>N0 z7p$VkY>hVM;LXNxW~yPLMLTH2W%}H?!;f+&@e;EGR7|kF#}|=u8Jn+NL7{PxN^mqw zD%13F6N`30ee`7;pPyYc%9oUN2r^%tk`gKz^MbwyAAy)1&|4h51(+QZbxeXOREGpe zi0!`{Zk9EMC(W+Qn@2lo8jeKd}Eo`qJi-=B~p``-=gG6k0oj_KqG4HLmKpq+s4|{ zjKbHh5WBcbg+jDRD&uJ%w-{{e1qCl1aCsqs3wYR#CeSl#0841Sh}kX1uh`(w7``8P zX!4xxV8W>hm@oh0ied9+zEV`ch-sqK>da`jH4t#4rcs9tm8vMF&)Bux7}bZs$BV0 zMdxY#IRoBBkrHPN2*#f`G=qko5Rdd?`K+fBE`uwg&2Ay|GahujLCrhikI2j#iX}B3 z#HMlMeMUGardS~h9mmnF+QZ^FtuGsAE>F^Wi|Vv=+E6Z2)&B3a|F&*0+praQww!f( z(BoJaRC#wppTFSghp~Z5k?`Vy%2xJM%K441*!mg_|0D5X6YvN%Y>p9>`xH7?YX-f; z(#;2SSva@})G_uV9&W|X9Wde@#wc+%fE@vKC(9BmxziAi67H42QrY{eX!XS=J|I8g ze1^8$g})?;r6bRfY+nsP5Y8RYk~dj8B+7QU#Eb$>iS(qxHz-vS30A_rUz!jw_i}RC z^Hl30Ku4hc>f$~{`O~HAph|feQl00`4!LmP*EQAf@40CFmriP4eLOuEuQdQj<9{iL zPkBS_n1-PgR>%ClPrSUtA>NZ?4j|nKDKSzw{T1l(#uA+A~_4%>e)tJu)OH_~m-5owK{$FyWpADJU}Rc3Sy+o&vOr-nmm`=m$2+sDEVEAaCn0WXE>p1?ER{abkY|~Y@k_GY#45K-PMuCo>K?^F) zh)-A|+{F!Vg$2RZ6@M)WGr7l9zIxv|D5>?_Luo*C3Se?*UH!I8vDMW zs17>le<^b^@E7U&Y*1lCBR6PImRWOe!X-D*bTN|!cy`O1NV&auLDT)D^aE`IKozij zOOkle6U)bLjL)Pg#Cx*P5jzKSP}HQAH|FB9#M z4Y&mqS+JU-EqX;&QpTc@WXR7B5eGBh>Yy!SQ8@h;97Uy(oxpbsp}H$hi#VWEKE302 zM-+!VATvf>%EI^4rKIkzk-JaMqZlSzi@Ddxf;Xqxf&OLoz&ndpL$unFv?a^T8VEz@ z$5nuAL5MUyGTH1m9&AvEmlB0(h2Q#G$rbL)hQ^Q24y?^ygYAUqPO?Dc05!CCi91fQ zPTd7)zXo+o!4Nn88c8X}T$-eG2ol2?;$359N-(YLcOkss##^u(Wlajx$Hgo~D1Fpx z6eHf+VCMz+qn!s$}RlWq`*L3h~{`x1mBLsd#f2Qu8s0 zfAx{O0MsBQQo$LL4}v?RS;CmFFtV4!`ZcpCj43>|uaYv{X>AM-=n6j%pu;!0P~si{ z>I7(hSEBtncsnxD)+6ee_#rO5(r)N=#Ft&dV%*#>s_b@ZN0YMoQ7iaSdKN2jlP^|g z82^;15T7UtqYMA9)D9Rmu;%TQax{M*Ut|;A12pXAw*(Xks>5wcG8ImL(1X@g`NBt2 z<Hf1SEV(j>A7=@?-XbV&W@Z~rf#{^8t;^dp~<^Q-%PzLcJ>9P}zR z?opX=k}D&ig|fScyTn_uW70*e<8#8C>d?L&4WeW>fe?53{rGg{`3L7zW};fg?f4Z# z-?-6XJogN>V_Ox=#mlT{8A=4pE+-|Tx?TBHf}wsrcDn-eSzqBMTr_45lYIq~-G6Nx zX7cf6P0|RPT}}oB$qBE-O%rj#j7AvUf^~pJ@9p2s1+lvk%j#lNb0-oa)v@6^fbeHV zt>K~r?vXMn#r?S2>m^hkP*BGGIAqa><6uFkreP&)K|fd#v*!L3`PKbqxFxJab(gX? zjLCyP#py2GF1>4{8vUH}!i%;F|-<$J}3r_;OP2m!CDmm-}-lv9zYyKZ4pD#0gs7feiKrHRHQz6*%lwiL> zpayM9Vs&(kuNa&veRC9vzMeeSor=y&R*jFPQ$mX`j$H$i`zmYLJCtSlr)YRP z!z|!L8knI2h}{MH>Pl%>f)fp*csKMW!kkmNLsOQ2#_Yd{=dV9>Caq8cs1zljLWca0 zP4GE7MGkRR6t|&nr2BCwZxZns6tzf^5)e>@7db0L)V)tbX-(9$Qdg15?v?oUdjIQJ-C*?cI3p%J1>2VCohLlVM zAr|_q^U-xm8ZqD=Jxe{bw>`@hP|~^wlyc|ewOOPPt-B|b2)q-1vWpWK#DjOgAg&4O zGt&=`6K@rzU~FtyPVMiDojU1IIPw7HpV02zS5X$8k2rSuP?r1RV)MuuJPsGek!qIh{j=;A~<3*;#yuBQh^KJqi z!qo|{cHS1eaTnctN)0OpFM;;8>Oi^AhzHrRmrt{-bcph3<;5|6;ND`BRGlHiqNA}Q zh+z`XDg>d1u

s=;CFP>&Y{reP{W2?`0{3`Yz-@#BC@1SOE0}i5mSt85ReI>+Z{^ zfNb1|Lw90Rl8iVnjBmXa@2v67d10DhAatv{86e zzbJazXZv$aDjeG$cmXBBYKLY*Q zoywcuh!Ah0!DXVGU^E(OS5XrM5L&f>=?X4wx?as~&~)D>CducRD@FYjqY6(9DPh=c zy9}bn1Gu^!0PO+^qWFsB)bDui@4C-lu;A_h2@9F*Kq|}7?)ewmB~&ahh`BC13nUUO zT49MN=QG2W6hOz3OD_&42PaV z!9wmeneXwJyPmhMOh!Eq>-|_(fcW>#y@m}z{4F7In&Hi?TNfQPCGN7T{ug~y>mu5> zp`^RN7J}7{yZoC=w8t#Gla7 zIObpix7B4stXVD?!gKm7CBq{{G58j(`r}Jl;?`))witXny%1cA7Uzt3cD>}R_hqSU zkP5nep@|>Zy`cDu7WY;aEJBTYTo%P(4F{$_WFd~+jIIBU=NT$u?0FcWp33W4c&Ns(TI~UdU;0WZqnj39Z9b04yg?D#L6#k|} z*Zt*q@}JP(XTib1e=cG{!Bcrv;z23DtbqngC$QHU+`ID(Y_5=>%w)PpWiKpNQ?fU%P2bMTJOJ#3vV%+=6=FnWabCnv(L1nr2KP8r*y%cuW< zf)`Cqg4#nK3f4-Y8IO!}-3jamV2w0f2JUP$2+LH8=qp8VmLfzv1$hfcOk_HF%d9vt?K_<;3@rx>Yi23{9Yl}h0FheR$LK;O&WPV~~P(q}H1eW1@W-|rE zJ)ZcqY?u%8Z7kh)2wN=Wc+ge{wGSgi>FW&W>zo968&-bjA|bkKRI`mksM; zTq|0$%&JVWitZUivrg%+rAI;7UaG4GzjMLEbP+3#rEp7c=7y}r6Ftj@5U z*k_`7r-oK%H}NF~^%R4m!Jx|jqz5fFz8o~1L%ibxMRvznS*uq${;S~0k%#C zCJxtwg0M2Bh|W@k8pb@rpyMzcek4j@PVd1wtEfxnugD>(8lm(#bDwY%fstW^yBHJ$ z21SWM6+KM%mCr`5Z82icX1K5!hM6X%!}$*_H9m_%8uE0p%S|)Jem>q}TOy}>km|z# zYvLFvqgXiush9~BK<-=!7d&P+y~Tkov+cNM!ryrI#e^n|U{}f?g+WPUP)%9s+uz=J z4+aTFl%@#cMm$~_DNW^A8jHCQe8wOhSUv~Bh0i8(EGg0}F>*U8QbQa|7ebHH!H2);=zDbD8gG5vNI=v^lMQ-o^hJaC5Vb?mqSH!fa=-E-YMSY z#~#nc94&|ePQ-%;#DfMQT!CVj6h!q6u>sgP?2bWp2zGbfgxI(f=7X$^9m5D)rHC6C zlq$xY*+ApHdsCT1EHN|ZEm5v)m;tj=8lN@#8_Qmq4*g>K<*Q#ybEb^QsXylJzmoY< zgg@WNaeFDaLjn@~x_QuJ-$tq09qdOfOn^yUjMuApyU9j;YMn@Hzz@lHPo#AUb^9?x z5K~gf`DQt!7>6nRooFkr9Lki_qn(Fjf80oUiHs|P8eq)Z@IwYfMI0|yq%s3)3g4#m zG%ri2@xace&si5C3z~=-Heay3o8>NHo)<)x3jq5C@&OXDzwhspnSMDjn_ldx-GT zd1ctl+=kN;HW%h~vB`8{YoIg5>d9Vj$@hX4o0{(QLJ107;#j>~ zmsbRhz@U^d<}eKE<4U@d4jeg?PJHk77D`_RF~lHS1$o&)*lxS&$>B$^Pu;{KK6@R6 zzK)%~&Iv2QvT#vWm6~w%nv2q~XnuHbCYDL+LOT(eG~3iYnR)FY*6jLu?u} z<(%vq-ZI2m6>woGlSSM0GX>ug$DhFY`mr+HTbGv)tTYMkxR%IseVxcs#8P7Om+p~1S;z~42&{*tuF{@7va_+7!DQ`A7+E8!o7h{5 z&?`kGmLd)yf?KG;-ES=*n3b?zM+XMk=+P)popos&hh$F{CddTwXTI}w6)UsC zQ=*ko22lAu(hAVCH&y9mN>HV zYxO|Fyuf*@uxhIiZzNp*&O8H?W_Wu|GR@~tl+v@W0_O3g#vSs0njw@=Ux$myls~U& z0-ZlZ1w8XUt0}@6Fv<{vKm6!zdh>=%(D!~xapZpf{%MQZlAl96kC#Y2mw9iXZ?&G$ z9IL~wrS_M1IE63ncf`N!cOL%T_T*T~?HP0FluLj1(|CUWljvCfkde-X_u0^^2B_l2jc<4FO`=o4>FmE4f@_Yuops>L296#Pb|Nqh~CT5 z^?eTl_!AM|c_J$PfLr-)ydvo`OCJaKZGH{Pwi$j8^Sq^8+7qjfa~X`+_1#}<8i*Y& z>UnCf|8t{L{hNctE8C2+G~ymTEuOHdPGGtC5@<1vu43I`(K>0Tnhq#=@RT2WD>{F# z;Elc{9SFQMe52u;B=ftqDw^|ysl1`#Ubb-Md?4A$JmiSS21UYc%B}Y|Do&66%k3^O z+-SY)R?=l~=VWAy_Rs-(pWA&eY7XD(F=X3e(1fSEwjQZ$Lh#hVUkQH>_tY0b|&-h2G66MIZsw+56Z zEoDTP+Bsf`x&AOYN5A@`%eVJ1iIfwa+&lQQFKW=4wB{^c4Seu=7>SFGrJLq0`s*}@ zv0F+l7O_}8CcTh5`?s_TiVoC0UMd0StiBtAIw?DUKYE0}nd9o!g z=k20cTHGZ?><=c#Sp*`TDOH&7FFV}e$@A#8aTp%$dIt0uno>9SSb4UZw1wPP+pA@d zBzON8Tu&y3xl*d;`w0!6t-E;iOtsHiT|V4h)gS?rF^fW&#itj?fx^oX5^~1Ujfa7o z-%alt{0s4@_E5;kx1~+Z3g!4x2qX`3Rk!?9q^8?j`@|qU$puhyi7r~j@i^V|Hs48O zmAzOl>3*2Qe|#s6_F#E#>9efPwm4s<_8+@*vB46vC7m2S-e&SO7c5+?o=y5Ykgq%YN<&?g)v zdL+%Lwcn}2ZwurL3Z_o%SXAHm`@<$RqDB4dl0ii(QJlFD�v!YHo2*G4zH)<|tHR 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%0AF)#N0=F)wy^M+}9HNz((O1v>o3>gpPekLX1&3 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

    5Cl!QQ$+dJU3UI3&PBSRhztnEr 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

    y5<|- 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

    Qh`II(tLhbvJeq)5X* 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

pVN%njX{oI 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⪚;m&nDXuH5RktQa;lZyJ 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