from freqtrade.strategy import IStrategy from freqtrade.strategy import CategoricalParameter, DecimalParameter, IntParameter from pandas import DataFrame import talib.abstract as ta class MACDStrategy_127(IStrategy): """ author@: Gert Wohlgemuth idea: uptrend definition: MACD above MACD signal and CCI < -50 downtrend definition: MACD below MACD signal and CCI > 100 freqtrade hyperopt --strategy MACDStrategy --hyperopt-loss --spaces buy sell The idea is to optimize only the CCI value. - Buy side: CCI between -700 and 0 - Sell side: CCI between 0 and 700 """ INTERFACE_VERSION = 2 minimal_roi = { "60": 0.01, "30": 0.03, "20": 0.04, "0": 0.05 } stoploss = -0.3 timeframe = '5m' buy_cci = IntParameter(low=-700, high=0, default=-50, space='buy', optimize=True) sell_cci = IntParameter(low=0, high=700, default=100, space='sell', optimize=True) buy_params = { "buy_cci": -48, } sell_params = { "sell_cci": 687, } def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: macd = ta.MACD(dataframe) dataframe['macd'] = macd['macd'] dataframe['macdsignal'] = macd['macdsignal'] dataframe['macdhist'] = macd['macdhist'] dataframe['cci'] = ta.CCI(dataframe) return dataframe def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Based on TA indicators, populates the buy signal for the given dataframe :param dataframe: DataFrame :return: DataFrame with buy column """ dataframe.loc[ ( (dataframe['macd'] > dataframe['macdsignal']) & (dataframe['cci'] <= self.buy_cci.value) & (dataframe['volume'] > 0) # Make sure Volume is not 0 ), 'buy'] = 1 return dataframe def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Based on TA indicators, populates the sell signal for the given dataframe :param dataframe: DataFrame :return: DataFrame with buy column """ dataframe.loc[ ( (dataframe['macd'] < dataframe['macdsignal']) & (dataframe['cci'] >= self.sell_cci.value) & (dataframe['volume'] > 0) # Make sure Volume is not 0 ), 'sell'] = 1 return dataframe