from __future__ import annotations from pandas import DataFrame import talib.abstract as ta from freqtrade.strategy import DecimalParameter, IStrategy class FreqaiTrendV1(IStrategy): INTERFACE_VERSION = 3 timeframe = "5m" can_short = False process_only_new_candles = True startup_candle_count = 240 minimal_roi = {"0": 0.04, "120": 0.01, "360": 0.0} stoploss = -0.08 trailing_stop = True trailing_stop_positive = 0.015 trailing_stop_positive_offset = 0.035 trailing_only_offset_is_reached = True prediction_entry = DecimalParameter(0.004, 0.025, default=0.01, decimals=3, space="buy") prediction_exit = DecimalParameter(-0.020, 0.004, default=-0.004, decimals=3, space="sell") def feature_engineering_expand_all( self, dataframe: DataFrame, period: int, metadata: dict, **kwargs ) -> DataFrame: dataframe[f"%-rsi-{period}"] = ta.RSI(dataframe, timeperiod=period) dataframe[f"%-mfi-{period}"] = ta.MFI(dataframe, timeperiod=period) dataframe[f"%-adx-{period}"] = ta.ADX(dataframe, timeperiod=period) dataframe[f"%-ema-distance-{period}"] = ( dataframe["close"] / ta.EMA(dataframe, timeperiod=period) - 1.0 ) return dataframe def feature_engineering_standard( self, dataframe: DataFrame, metadata: dict, **kwargs ) -> DataFrame: dataframe["%-pct-change"] = dataframe["close"].pct_change() dataframe["%-raw-volume"] = dataframe["volume"] dataframe["%-day-of-week"] = dataframe["date"].dt.dayofweek dataframe["%-hour-of-day"] = dataframe["date"].dt.hour return dataframe def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) -> DataFrame: label_period = self.freqai_info["feature_parameters"]["label_period_candles"] dataframe["&-s_close"] = ( dataframe["close"].shift(-label_period) / dataframe["close"] - 1.0 ) return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe = self.freqai.start(dataframe, metadata, self) dataframe["ema_50"] = ta.EMA(dataframe, timeperiod=50) dataframe["ema_200"] = ta.EMA(dataframe, timeperiod=200) dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe["do_predict"] == 1) & (dataframe["&-s_close"] > self.prediction_entry.value) & (dataframe["ema_50"] > dataframe["ema_200"]) & (dataframe["rsi"] > 45) ), "enter_long", ] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe["do_predict"] != 1) | (dataframe["&-s_close"] < self.prediction_exit.value) | (dataframe["close"] < dataframe["ema_50"]) ), "exit_long", ] = 1 return dataframe