diff --git a/freqtrade/edge/edge_positioning.py b/freqtrade/edge/edge_positioning.py index f2df0d3f2..ac0262d18 100644 --- a/freqtrade/edge/edge_positioning.py +++ b/freqtrade/edge/edge_positioning.py @@ -172,13 +172,7 @@ class Edge: pair_data = pair_data.sort_values(by=['date']) pair_data = pair_data.reset_index(drop=True) - df_analyzed = self.strategy.advise_exit( - dataframe=self.strategy.advise_entry( - dataframe=pair_data, - metadata={'pair': pair} - ), - metadata={'pair': pair} - )[headers].copy() + df_analyzed = self.strategy.ft_advise_signals(pair_data, {'pair': pair})[headers].copy() trades += self._find_trades_for_stoploss_range(df_analyzed, pair, self._stoploss_range) diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py index 3dca9d480..852f9df8d 100644 --- a/freqtrade/optimize/backtesting.py +++ b/freqtrade/optimize/backtesting.py @@ -367,11 +367,7 @@ class Backtesting: if not pair_data.empty: # Cleanup from prior runs pair_data.drop(HEADERS[5:] + ['buy', 'sell'], axis=1, errors='ignore') - - df_analyzed = self.strategy.advise_exit( - self.strategy.advise_entry(pair_data, {'pair': pair}), - {'pair': pair} - ).copy() + df_analyzed = self.strategy.ft_advise_signals(pair_data, {'pair': pair}) # Trim startup period from analyzed dataframe df_analyzed = processed[pair] = pair_data = trim_dataframe( df_analyzed, self.timerange, startup_candles=self.required_startup) diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 1e9ebe1ae..0f848130f 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -825,6 +825,7 @@ class IStrategy(ABC, HyperStrategyMixin): """ Parses the given candle (OHLCV) data and returns a populated DataFrame add several TA indicators and entry order signal to it + Should only be used in live. :param dataframe: Dataframe containing data from exchange :param metadata: Metadata dictionary with additional data (e.g. 'pair') :return: DataFrame of candle (OHLCV) data with indicator data and signals added @@ -1321,6 +1322,20 @@ class IStrategy(ABC, HyperStrategyMixin): return {pair: self.advise_indicators(pair_data.copy(), {'pair': pair}).copy() for pair, pair_data in data.items()} + def ft_advise_signals(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + """ + Call advise_entry and advise_exit and return the resulting dataframe. + :param dataframe: Dataframe containing data from exchange, as well as pre-calculated + indicators + :param metadata: Metadata dictionary with additional data (e.g. 'pair') + :return: DataFrame of candle (OHLCV) data with indicator data and signals added + + """ + + dataframe = self.advise_entry(dataframe, metadata) + dataframe = self.advise_exit(dataframe, metadata) + return dataframe + def advise_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Populate indicators that will be used in the Buy, Sell, short, exit_short strategy