# --- Do not remove these libs --- from freqtrade.strategy import IStrategy from pandas import DataFrame import talib.abstract as ta class ADXMomentum(IStrategy): """ Trend-following momentum strategy that enters long positions during strong upward trends and exits when momentum reverses. Entry: ADX > 25 (strong trend), MOM > 0 (positive momentum), PLUS_DI > 25 and PLUS_DI > MINUS_DI (upward directional strength). Exit: ADX > 25, MOM < 0 (negative momentum), MINUS_DI > 25 and PLUS_DI < MINUS_DI (downward directional strength). """ INTERFACE_VERSION: int = 3 # Minimal ROI designed for the strategy. # adjust based on market conditions. We would recommend to keep it low for quick turn arounds # This attribute will be overridden if the config file contains "minimal_roi" minimal_roi = {"0": 0.05} # Optimal stoploss designed for the strategy stoploss = -0.25 # Optimal timeframe for the strategy timeframe = "1h" # Number of candles the strategy requires before producing valid signals startup_candle_count: int = 20 exit_profit_only = False def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe["adx"] = ta.ADX(dataframe, timeperiod=14) dataframe["plus_di"] = ta.PLUS_DI(dataframe, timeperiod=25) dataframe["minus_di"] = ta.MINUS_DI(dataframe, timeperiod=25) dataframe["sar"] = ta.SAR(dataframe) dataframe["mom"] = ta.MOM(dataframe, timeperiod=14) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe["adx"] > 25) & (dataframe["mom"] > 0) & (dataframe["plus_di"] > 25) & (dataframe["plus_di"] > dataframe["minus_di"]) ), "enter_long", ] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe["adx"] > 25) & (dataframe["mom"] < 0) & (dataframe["minus_di"] > 25) & (dataframe["plus_di"] < dataframe["minus_di"]) ), "exit_long", ] = 1 return dataframe