import numpy as np import pandas as pd from pandas import DataFrame from freqtrade.strategy.interface import IStrategy class FractalTest(IStrategy): INTERFACE_VERSION = 3 can_short: bool = False minimal_roi = { "60": 0.01, "30": 0.02, "0": 0.04 } stoploss = -0.10 trailing_stop = False timeframe = '5m' process_only_new_candles = True use_exit_signal = True exit_profit_only = False ignore_roi_if_entry_signal = False startup_candle_count: int = 200 order_types = { 'entry': 'limit', 'exit': 'limit', 'stoploss': 'market', 'stoploss_on_exchange': False } order_time_in_force = { 'entry': 'GTC', 'exit': 'GTC' } def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['fractal_up'] = self.fractal_up(dataframe) dataframe['fractal_down'] = self.fractal_down(dataframe) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( dataframe['fractal_up'] ), 'enter_long'] = 1 dataframe.loc[ ( dataframe['fractal_down'] ), 'enter_short'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # This should contain conditions to exit trades, currently just placeholders dataframe.loc[ ( # Add your exit conditions here ), 'exit_long'] = 1 dataframe.loc[ ( # Add your exit conditions here ), 'exit_short'] = 1 return dataframe def fractal_up(self, dataframe: DataFrame) -> pd.Series: n = 10 # Number of rows to consider for identifying a fractal roll_n = 2 * n + 1 highest = dataframe['high'].rolling(window=roll_n, center=True).max() return highest == dataframe['high'] def fractal_down(self, dataframe: DataFrame) -> pd.Series: n = 10 # Number of rows to consider for a fractal roll_n = 2 * n + 1 lowest = dataframe['low'].rolling(window=roll_n, center=True).min() return lowest == dataframe['low']