diff --git a/freqtrade/configuration/config_validation.py b/freqtrade/configuration/config_validation.py index 92846b704..6a8374e6d 100644 --- a/freqtrade/configuration/config_validation.py +++ b/freqtrade/configuration/config_validation.py @@ -68,6 +68,10 @@ def validate_config_consistency(conf: Dict[str, Any]) -> None: def _validate_trailing_stoploss(conf: Dict[str, Any]) -> None: + if conf.get('stoploss') == 0.0: + raise OperationalException( + 'The config stoploss needs to be different from 0 to avoid problems with sell orders.' + ) # Skip if trailing stoploss is not activated if not conf.get('trailing_stop', False): return @@ -79,12 +83,19 @@ def _validate_trailing_stoploss(conf: Dict[str, Any]) -> None: if tsl_only_offset: if tsl_positive == 0.0: raise OperationalException( - f'The config trailing_only_offset_is_reached needs ' + 'The config trailing_only_offset_is_reached needs ' 'trailing_stop_positive_offset to be more than 0 in your config.') if tsl_positive > 0 and 0 < tsl_offset <= tsl_positive: raise OperationalException( - f'The config trailing_stop_positive_offset needs ' - 'to be greater than trailing_stop_positive_offset in your config.') + 'The config trailing_stop_positive_offset needs ' + 'to be greater than trailing_stop_positive in your config.') + + # Fetch again without default + if 'trailing_stop_positive' in conf and float(conf['trailing_stop_positive']) == 0.0: + raise OperationalException( + 'The config trailing_stop_positive needs to be different from 0 ' + 'to avoid problems with sell orders.' + ) def _validate_edge(conf: Dict[str, Any]) -> None: diff --git a/freqtrade/tests/test_configuration.py b/freqtrade/tests/test_configuration.py index a2a87c2cf..10ce7e8cf 100644 --- a/freqtrade/tests/test_configuration.py +++ b/freqtrade/tests/test_configuration.py @@ -648,6 +648,12 @@ def test_create_userdata_dir_exists_exception(mocker, default_conf, caplog) -> N def test_validate_tsl(default_conf): + default_conf['stoploss'] = 0.0 + with pytest.raises(OperationalException, match='The config stoploss needs to be different ' + 'from 0 to avoid problems with sell orders.'): + validate_config_consistency(default_conf) + default_conf['stoploss'] = -0.10 + default_conf['trailing_stop'] = True default_conf['trailing_stop_positive'] = 0 default_conf['trailing_stop_positive_offset'] = 0 @@ -662,13 +668,22 @@ def test_validate_tsl(default_conf): default_conf['trailing_stop_positive'] = 0.015 with pytest.raises(OperationalException, match=r'The config trailing_stop_positive_offset needs ' - 'to be greater than trailing_stop_positive_offset in your config.'): + 'to be greater than trailing_stop_positive in your config.'): validate_config_consistency(default_conf) default_conf['trailing_stop_positive'] = 0.01 default_conf['trailing_stop_positive_offset'] = 0.015 validate_config_consistency(default_conf) + # 0 trailing stop positive - results in "Order would trigger immediately" + default_conf['trailing_stop_positive'] = 0 + default_conf['trailing_stop_positive_offset'] = 0.02 + default_conf['trailing_only_offset_is_reached'] = False + with pytest.raises(OperationalException, + match='The config trailing_stop_positive needs to be different from 0 ' + 'to avoid problems with sell orders'): + validate_config_consistency(default_conf) + def test_validate_edge(edge_conf): edge_conf.update({"pairlist": {