Validate stoploss_on_exchange_limit_ratio at startup time
This commit is contained in:
		| @@ -386,6 +386,13 @@ class Exchange: | |||||||
|                 f'On exchange stoploss is not supported for {self.name}.' |                 f'On exchange stoploss is not supported for {self.name}.' | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|  |         # Limit price threshold: As limit price should always be below stop-price | ||||||
|  |         # Used for limit stoplosses on exchange | ||||||
|  |         limit_price_pct = order_types.get('stoploss_on_exchange_limit_ratio', 0.99) | ||||||
|  |         if limit_price_pct >= 1.0 or limit_price_pct <= 0.0: | ||||||
|  |             raise OperationalException( | ||||||
|  |                 "stoploss_on_exchange_limit_ratio should be < 1.0 and > 0.0") | ||||||
|  |  | ||||||
|     def validate_order_time_in_force(self, order_time_in_force: Dict) -> None: |     def validate_order_time_in_force(self, order_time_in_force: Dict) -> None: | ||||||
|         """ |         """ | ||||||
|         Checks if order time in force configured in strategy/config are supported |         Checks if order time in force configured in strategy/config are supported | ||||||
|   | |||||||
| @@ -689,13 +689,13 @@ def test_validate_order_types(default_conf, mocker): | |||||||
|     mocker.patch('freqtrade.exchange.Exchange.validate_timeframes') |     mocker.patch('freqtrade.exchange.Exchange.validate_timeframes') | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.validate_stakecurrency') |     mocker.patch('freqtrade.exchange.Exchange.validate_stakecurrency') | ||||||
|     mocker.patch('freqtrade.exchange.Exchange.name', 'Bittrex') |     mocker.patch('freqtrade.exchange.Exchange.name', 'Bittrex') | ||||||
|  |  | ||||||
|     default_conf['order_types'] = { |     default_conf['order_types'] = { | ||||||
|         'buy': 'limit', |         'buy': 'limit', | ||||||
|         'sell': 'limit', |         'sell': 'limit', | ||||||
|         'stoploss': 'market', |         'stoploss': 'market', | ||||||
|         'stoploss_on_exchange': False |         'stoploss_on_exchange': False | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Exchange(default_conf) |     Exchange(default_conf) | ||||||
|  |  | ||||||
|     type(api_mock).has = PropertyMock(return_value={'createMarketOrder': False}) |     type(api_mock).has = PropertyMock(return_value={'createMarketOrder': False}) | ||||||
| @@ -707,7 +707,6 @@ def test_validate_order_types(default_conf, mocker): | |||||||
|         'stoploss': 'market', |         'stoploss': 'market', | ||||||
|         'stoploss_on_exchange': False |         'stoploss_on_exchange': False | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     with pytest.raises(OperationalException, |     with pytest.raises(OperationalException, | ||||||
|                        match=r'Exchange .* does not support market orders.'): |                        match=r'Exchange .* does not support market orders.'): | ||||||
|         Exchange(default_conf) |         Exchange(default_conf) | ||||||
| @@ -718,11 +717,32 @@ def test_validate_order_types(default_conf, mocker): | |||||||
|         'stoploss': 'limit', |         'stoploss': 'limit', | ||||||
|         'stoploss_on_exchange': True |         'stoploss_on_exchange': True | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     with pytest.raises(OperationalException, |     with pytest.raises(OperationalException, | ||||||
|                        match=r'On exchange stoploss is not supported for .*'): |                        match=r'On exchange stoploss is not supported for .*'): | ||||||
|         Exchange(default_conf) |         Exchange(default_conf) | ||||||
|  |  | ||||||
|  |     default_conf['order_types'] = { | ||||||
|  |         'buy': 'limit', | ||||||
|  |         'sell': 'limit', | ||||||
|  |         'stoploss': 'limit', | ||||||
|  |         'stoploss_on_exchange': False, | ||||||
|  |         'stoploss_on_exchange_limit_ratio': 1.05 | ||||||
|  |     } | ||||||
|  |     with pytest.raises(OperationalException, | ||||||
|  |                        match=r'stoploss_on_exchange_limit_ratio should be < 1.0 and > 0.0'): | ||||||
|  |         Exchange(default_conf) | ||||||
|  |  | ||||||
|  |     default_conf['order_types'] = { | ||||||
|  |         'buy': 'limit', | ||||||
|  |         'sell': 'limit', | ||||||
|  |         'stoploss': 'limit', | ||||||
|  |         'stoploss_on_exchange': False, | ||||||
|  |         'stoploss_on_exchange_limit_ratio': -0.1 | ||||||
|  |     } | ||||||
|  |     with pytest.raises(OperationalException, | ||||||
|  |                        match=r'stoploss_on_exchange_limit_ratio should be < 1.0 and > 0.0'): | ||||||
|  |         Exchange(default_conf) | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_validate_order_types_not_in_config(default_conf, mocker): | def test_validate_order_types_not_in_config(default_conf, mocker): | ||||||
|     api_mock = MagicMock() |     api_mock = MagicMock() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user