diff --git a/user_data/strategies/Supertrend.py b/user_data/strategies/Supertrend.py index 62d86d1..2d2aa25 100644 --- a/user_data/strategies/Supertrend.py +++ b/user_data/strategies/Supertrend.py @@ -1,8 +1,8 @@ """ Supertrend strategy: -* Description: Generate a 3 supertrend indicators based on different pairs for [period, multiplier] -> [period: 10, multiplier: 1], [period: 11, multiplier: 2], [period: 13, multiplier: 3] - Buys if the 3 indicators are 'up' - Sells if the 3 indicators are 'down' +* Description: Generate a 3 supertrend indicators for 'buy' strategies & 3 supertrend indicators for 'sell' strategies + Buys if the 3 'buy' indicators are 'up' + Sells if the 3 'sell' indicators are 'down' * Author: @juankysoriano (Juan Carlos Soriano) * github: https://github.com/juankysoriano/ """ @@ -16,9 +16,29 @@ import talib.abstract as ta import numpy as np class Supertrend(IStrategy): - # ROI, Stoploss and Trailing Stop are values generated by 'freqtrade hyperopt --strategy Supertrend --hyperopt-loss ShortTradeDurHyperOptLoss --timerange=20210101- --timeframe=1h --spaces roi stoploss trailing' + # Buy params, Sell params, ROI, Stoploss and Trailing Stop are values generated by 'freqtrade hyperopt --strategy Supertrend --hyperopt-loss ShortTradeDurHyperOptLoss --timerange=20210101- --timeframe=1h --spaces all' # It's encourage you find the values that better suites your needs and risk management strategies + # Buy hyperspace params: + 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, + } + # ROI table: minimal_roi = { "0": 0.087, @@ -38,23 +58,57 @@ class Supertrend(IStrategy): timeframe = '1h' - startup_candle_count = 10 + startup_candle_count = 18 + + buy_m1 = IntParameter(1, 7, default=4) + buy_m2 = IntParameter(1, 7, default=4) + buy_m3 = IntParameter(1, 7, default=4) + buy_p1 = IntParameter(7, 21, default=14) + buy_p2 = IntParameter(7, 21, default=14) + buy_p3 = IntParameter(7, 21, default=14) + + sell_m1 = IntParameter(1, 7, default=4) + sell_m2 = IntParameter(1, 7, default=4) + sell_m3 = IntParameter(1, 7, default=4) + sell_p1 = IntParameter(7, 21, default=14) + sell_p2 = IntParameter(7, 21, default=14) + sell_p3 = IntParameter(7, 21, default=14) def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - dataframe['supertrend_1'] = self.supertrend(dataframe, 1, 10)['STX'] - dataframe['supertrend_2'] = self.supertrend(dataframe, 2, 11)['STX'] - dataframe['supertrend_3'] = self.supertrend(dataframe, 3, 12)['STX'] + 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'] return dataframe def populate_buy_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( - (dataframe['supertrend_1'] == 'up') & - (dataframe['supertrend_2'] == 'up') & - (dataframe['supertrend_3'] == 'up') & # The three indicators are 'up' for the current candle + (dataframe[f'supertrend_1_buy_{self.buy_m1.value}_{self.buy_p1.value}'] == 'up') & + (dataframe[f'supertrend_2_buy_{self.buy_m2.value}_{self.buy_p2.value}'] == 'up') & + (dataframe[f'supertrend_3_buy_{self.buy_m3.value}_{self.buy_p3.value}'] == 'up') & # The three indicators are 'up' for the current candle (dataframe['volume'] > 0) # There is at least some trading volume - ), + ), 'buy'] = 1 return dataframe @@ -62,9 +116,9 @@ class Supertrend(IStrategy): def populate_sell_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( - (dataframe['supertrend_1'] == 'down') & - (dataframe['supertrend_2'] == 'down') & - (dataframe['supertrend_3'] == 'down') & # The three indicators are 'down' for the current candle + (dataframe[f'supertrend_1_sell_{self.sell_m1.value}_{self.sell_p1.value}'] == 'down') & + (dataframe[f'supertrend_2_sell_{self.sell_m2.value}_{self.sell_p2.value}'] == 'down') & + (dataframe[f'supertrend_3_sell_{self.sell_m3.value}_{self.sell_p3.value}'] == 'down') & # The three indicators are 'down' for the current candle (dataframe['volume'] > 0) # There is at least some trading volume ), 'sell'] = 1 @@ -72,6 +126,7 @@ class Supertrend(IStrategy): return dataframe + """ Supertrend Indicator; adapted for freqtrade from: https://github.com/freqtrade/freqtrade-strategies/issues/30