# --- Do not remove these libs --- from freqtrade.strategy import IStrategy from freqtrade.strategy import CategoricalParameter, DecimalParameter, IntParameter from pandas import DataFrame # -------------------------------- import talib.abstract as ta class StochasticOscillator(IStrategy): INTERFACE_VERSION = 2 # Minimal ROI designed for the strategy minimal_roi = { "40": 0.0, "30": 0.01, "20": 0.02, "0": 0.04 } # Optimal stoploss designed for the strategy stoploss = -0.10 # Optimal ticker interval for the strategy ticker_interval = '5m' # Optional order type mapping order_types = { 'buy': 'limit', 'sell': 'limit', 'stoploss': 'limit', 'stoploss_on_exchange': False } # Number of candles the strategy requires before producing valid signals startup_candle_count: int = 20 # Optional time in force for orders order_time_in_force = { 'buy': 'gtc', 'sell': 'gtc', } def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # stoch dataframe['L14'] = dataframe['Low'].rolling(window=14) dataframe['H14'] = dataframe["high"].rolling(window=14) dataframe['%K'] = 100 * ((dataframe['Close'] - dataframe['L14']) / dataframe['H14'] -dataframe['L14'] ) ) dataframe['%D'] = dataframe['%K'].rolling(window=3).mean() # RSI dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 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 :param metadata: Additional information, like the currently traded pair :return: DataFrame with buy column """ dataframe.loc[ ( (dataframe['rsi_fast'] < 35) & dataframe['%K'] == dataframe['%D'] & dataframe['%D'] > 30 ), '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 :param metadata: Additional information, like the currently traded pair :return: DataFrame with buy column """ dataframe.loc[ ( (dataframe['rsi'] > 50) & dataframe['%K'] == dataframe['%D'] & dataframe['%D'] < 50 ), 'sell'] = 1 return dataframe