diff --git a/freqtrade/resolvers/strategy_resolver.py b/freqtrade/resolvers/strategy_resolver.py index c1d967383..ee00b419b 100644 --- a/freqtrade/resolvers/strategy_resolver.py +++ b/freqtrade/resolvers/strategy_resolver.py @@ -56,6 +56,33 @@ class StrategyResolver(IResolver): else: config['stoploss'] = self.strategy.stoploss + if 'trailing_stop' in config: + self.strategy.trailing_stop = config['trailing_stop'] + logger.info( + "Override strategy 'trailing_stop' with value in config file: %s.", + config['trailing_stop'] + ) + elif hasattr(self.strategy, "trailing_stop"): + config['trailing_stop'] = self.strategy.trailing_stop + + if 'trailing_stop_positive' in config: + self.strategy.trailing_stop_positive = config['trailing_stop_positive'] + logger.info( + "Override strategy 'trailing_stop_positive' with value in config file: %s.", + config['trailing_stop_positive'] + ) + elif hasattr(self.strategy, "trailing_stop_positive"): + config['trailing_stop_positive'] = self.strategy.trailing_stop_positive + + if 'trailing_stop_positive_offset' in config: + self.strategy.trailing_stop_positive_offset = config['trailing_stop_positive_offset'] + logger.info( + "Override strategy 'trailing_stop_positive_offset' with value in config file: %s.", + config['trailing_stop_positive_offset'] + ) + elif hasattr(self.strategy, "trailing_stop_positive_offset"): + config['trailing_stop_positive_offset'] = self.strategy.trailing_stop_positive_offset + if 'ticker_interval' in config: self.strategy.ticker_interval = config['ticker_interval'] logger.info( diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 694430fd6..a6569ec19 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -67,6 +67,11 @@ class IStrategy(ABC): # associated stoploss stoploss: float + # trailing stoploss + trailing_stop: bool = False + trailing_stop_positive: float + trailing_stop_positive_offset: float + # associated ticker interval ticker_interval: str diff --git a/freqtrade/tests/strategy/test_strategy.py b/freqtrade/tests/strategy/test_strategy.py index 08d95fc5d..676ffc95b 100644 --- a/freqtrade/tests/strategy/test_strategy.py +++ b/freqtrade/tests/strategy/test_strategy.py @@ -150,6 +150,45 @@ def test_strategy_override_stoploss(caplog): ) in caplog.record_tuples +def test_strategy_override_trailing_stop(caplog): + caplog.set_level(logging.INFO) + config = { + 'strategy': 'DefaultStrategy', + 'trailing_stop': True + } + resolver = StrategyResolver(config) + + assert resolver.strategy.trailing_stop + assert isinstance(resolver.strategy.trailing_stop, bool) + assert ('freqtrade.resolvers.strategy_resolver', + logging.INFO, + "Override strategy 'trailing_stop' with value in config file: True." + ) in caplog.record_tuples + + +def test_strategy_override_trailing_stop_positive(caplog): + caplog.set_level(logging.INFO) + config = { + 'strategy': 'DefaultStrategy', + 'trailing_stop_positive': -0.1, + 'trailing_stop_positive_offset': -0.2 + + } + resolver = StrategyResolver(config) + + assert resolver.strategy.trailing_stop_positive == -0.1 + assert ('freqtrade.resolvers.strategy_resolver', + logging.INFO, + "Override strategy 'trailing_stop_positive' with value in config file: -0.1." + ) in caplog.record_tuples + + assert resolver.strategy.trailing_stop_positive_offset == -0.2 + assert ('freqtrade.resolvers.strategy_resolver', + logging.INFO, + "Override strategy 'trailing_stop_positive' with value in config file: -0.1." + ) in caplog.record_tuples + + def test_strategy_override_ticker_interval(caplog): caplog.set_level(logging.INFO)