From 803c94f73584584c30a961b5239c2814a2c2a556 Mon Sep 17 00:00:00 2001 From: Emilio Basualdo Date: Thu, 11 Aug 2022 13:46:41 -0300 Subject: [PATCH] allowing custom rpc messages to be sent --- freqtrade/enums/rpcmessagetype.py | 2 ++ freqtrade/freqtradebot.py | 1 + freqtrade/rpc/telegram.py | 2 ++ freqtrade/strategy/interface.py | 9 ++++++++- freqtrade/templates/sample_strategy.py | 7 +++++++ 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 415d8f18c..23486822f 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -19,6 +19,8 @@ class RPCMessageType(Enum): STRATEGY_MSG = 'strategy_msg' + CUSTOM_MSG = "custom_msg" + def __repr__(self): return self.value diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 0dbeb2e44..a5276282a 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -81,6 +81,7 @@ class FreqtradeBot(LoggingMixin): # the initial state of the bot. # Keep this at the end of this initialization method. self.rpc: RPCManager = RPCManager(self) + self.strategy.set_rpc_send_msg_function(self.rpc.send_msg) self.pairlists = PairListManager(self.exchange, self.config) diff --git a/freqtrade/rpc/telegram.py b/freqtrade/rpc/telegram.py index 9e0cd7d86..605de15b4 100644 --- a/freqtrade/rpc/telegram.py +++ b/freqtrade/rpc/telegram.py @@ -407,6 +407,8 @@ class Telegram(RPCHandler): message = f"{msg['status']}" elif msg_type == RPCMessageType.STRATEGY_MSG: message = f"{msg['msg']}" + elif msg_type == RPCMessageType.CUSTOM_MSG: + message = f"{msg['msg']}" else: raise NotImplementedError(f"Unknown message type: {msg_type}") return message diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 5e0aba2fe..bb5566ff9 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 Dict, List, Optional, Tuple, Union, Callable 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 import RPC from freqtrade.strategy.hyper import HyperStrategyMixin from freqtrade.strategy.informative_decorator import (InformativeData, PopulateIndicators, _create_and_merge_informative_pair, @@ -119,6 +120,9 @@ class IStrategy(ABC, HyperStrategyMixin): # Definition of plot_config. See plotting documentation for more details. plot_config: Dict = {} + # Add rpc handler to send custom messages + send_msg = lambda x: x + def __init__(self, config: dict) -> None: self.config = config # Dict to determine if analysis is necessary @@ -1191,3 +1195,6 @@ class IStrategy(ABC, HyperStrategyMixin): if 'exit_long' not in df.columns: df = df.rename({'sell': 'exit_long'}, axis='columns') return df + + def set_rpc_send_msg_function(self, rpc_send_msg_function: Callable): + self.send_msg = rpc_send_msg_function diff --git a/freqtrade/templates/sample_strategy.py b/freqtrade/templates/sample_strategy.py index 1b375714a..a51bc934b 100644 --- a/freqtrade/templates/sample_strategy.py +++ b/freqtrade/templates/sample_strategy.py @@ -6,6 +6,7 @@ import numpy as np # noqa import pandas as pd # noqa from pandas import DataFrame +from freqtrade.enums import RPCMessageType from freqtrade.strategy import (BooleanParameter, CategoricalParameter, DecimalParameter, IStrategy, IntParameter) @@ -108,6 +109,12 @@ class SampleStrategy(IStrategy): } } + def bot_start(self, **kwargs) -> None: + self.send_msg({ + 'type': RPCMessageType.CUSTOM_MSG, + 'msg': "This is a custom message sent to all RPCs" + }) + def informative_pairs(self): """ Define additional, informative pair/interval combinations to be cached from the exchange.