Add protection parameter space
This commit is contained in:
		| @@ -218,7 +218,7 @@ AVAILABLE_CLI_OPTIONS = { | ||||
|     "spaces": Arg( | ||||
|         '--spaces', | ||||
|         help='Specify which parameters to hyperopt. Space-separated list.', | ||||
|         choices=['all', 'buy', 'sell', 'roi', 'stoploss', 'trailing', 'default'], | ||||
|         choices=['all', 'buy', 'sell', 'roi', 'stoploss', 'trailing', 'protection', 'default'], | ||||
|         nargs='+', | ||||
|         default='default', | ||||
|     ), | ||||
|   | ||||
| @@ -66,6 +66,7 @@ class Hyperopt: | ||||
|     def __init__(self, config: Dict[str, Any]) -> None: | ||||
|         self.buy_space: List[Dimension] = [] | ||||
|         self.sell_space: List[Dimension] = [] | ||||
|         self.protection_space: List[Dimension] = [] | ||||
|         self.roi_space: List[Dimension] = [] | ||||
|         self.stoploss_space: List[Dimension] = [] | ||||
|         self.trailing_space: List[Dimension] = [] | ||||
| @@ -191,6 +192,8 @@ class Hyperopt: | ||||
|             result['buy'] = {p.name: params.get(p.name) for p in self.buy_space} | ||||
|         if HyperoptTools.has_space(self.config, 'sell'): | ||||
|             result['sell'] = {p.name: params.get(p.name) for p in self.sell_space} | ||||
|         if HyperoptTools.has_space(self.config, 'protection'): | ||||
|             result['protection'] = {p.name: params.get(p.name) for p in self.protection_space} | ||||
|         if HyperoptTools.has_space(self.config, 'roi'): | ||||
|             result['roi'] = {str(k): v for k, v in | ||||
|                              self.custom_hyperopt.generate_roi_table(params).items()} | ||||
| @@ -241,6 +244,10 @@ class Hyperopt: | ||||
|         """ | ||||
|         Assign the dimensions in the hyperoptimization space. | ||||
|         """ | ||||
|         if self.auto_hyperopt and HyperoptTools.has_space(self.config, 'protection'): | ||||
|             # Protections can only be optimized when using the Parameter interface | ||||
|             logger.debug("Hyperopt has 'protection' space") | ||||
|             self.protection_space = self.custom_hyperopt.protection_space() | ||||
|  | ||||
|         if HyperoptTools.has_space(self.config, 'buy'): | ||||
|             logger.debug("Hyperopt has 'buy' space") | ||||
| @@ -261,8 +268,8 @@ class Hyperopt: | ||||
|         if HyperoptTools.has_space(self.config, 'trailing'): | ||||
|             logger.debug("Hyperopt has 'trailing' space") | ||||
|             self.trailing_space = self.custom_hyperopt.trailing_space() | ||||
|         self.dimensions = (self.buy_space + self.sell_space + self.roi_space + | ||||
|                            self.stoploss_space + self.trailing_space) | ||||
|         self.dimensions = (self.buy_space + self.sell_space + self.protection_space | ||||
|                            + self.roi_space + self.stoploss_space + self.trailing_space) | ||||
|  | ||||
|     def generate_optimizer(self, raw_params: List[Any], iteration=None) -> Dict: | ||||
|         """ | ||||
| @@ -282,6 +289,12 @@ class Hyperopt: | ||||
|             self.backtesting.strategy.advise_sell = (  # type: ignore | ||||
|                 self.custom_hyperopt.sell_strategy_generator(params_dict)) | ||||
|  | ||||
|         if HyperoptTools.has_space(self.config, 'protection'): | ||||
|             for attr_name, attr in self.backtesting.strategy.enumerate_parameters('protection'): | ||||
|                 if attr.optimize: | ||||
|                     # noinspection PyProtectedMember | ||||
|                     attr.value = params_dict[attr_name] | ||||
|  | ||||
|         if HyperoptTools.has_space(self.config, 'roi'): | ||||
|             self.backtesting.strategy.minimal_roi = (  # type: ignore | ||||
|                 self.custom_hyperopt.generate_roi_table(params_dict)) | ||||
|   | ||||
| @@ -73,6 +73,9 @@ class HyperOptAuto(IHyperOpt): | ||||
|     def sell_indicator_space(self) -> List['Dimension']: | ||||
|         return self._get_indicator_space('sell', 'sell_indicator_space') | ||||
|  | ||||
|     def protection_space(self) -> List['Dimension']: | ||||
|         return self._get_indicator_space('protection', 'indicator_space') | ||||
|  | ||||
|     def generate_roi_table(self, params: Dict) -> Dict[int, float]: | ||||
|         return self._get_func('generate_roi_table')(params) | ||||
|  | ||||
|   | ||||
| @@ -57,6 +57,13 @@ class IHyperOpt(ABC): | ||||
|         """ | ||||
|         raise OperationalException(_format_exception_message('sell_strategy_generator', 'sell')) | ||||
|  | ||||
|     def protection_space(self) -> List[Dimension]: | ||||
|         """ | ||||
|         Create a protection space. | ||||
|         Only supported by the Parameter interface. | ||||
|         """ | ||||
|         raise OperationalException(_format_exception_message('indicator_space', 'protection')) | ||||
|  | ||||
|     def indicator_space(self) -> List[Dimension]: | ||||
|         """ | ||||
|         Create an indicator space. | ||||
|   | ||||
| @@ -283,6 +283,7 @@ class HyperStrategyMixin(object): | ||||
|         self.config = config | ||||
|         self.ft_buy_params: List[BaseParameter] = [] | ||||
|         self.ft_sell_params: List[BaseParameter] = [] | ||||
|         self.ft_protection_params: List[BaseParameter] = [] | ||||
|  | ||||
|         self._load_hyper_params(config.get('runmode') == RunMode.HYPEROPT) | ||||
|  | ||||
| @@ -292,11 +293,11 @@ class HyperStrategyMixin(object): | ||||
|         :param category: | ||||
|         :return: | ||||
|         """ | ||||
|         if category not in ('buy', 'sell', None): | ||||
|             raise OperationalException('Category must be one of: "buy", "sell", None.') | ||||
|         if category not in ('buy', 'sell', 'protection', None): | ||||
|             raise OperationalException('Category must be one of: "buy", "sell", "protection", None.') | ||||
|  | ||||
|         if category is None: | ||||
|             params = self.ft_buy_params + self.ft_sell_params | ||||
|             params = self.ft_buy_params + self.ft_sell_params + self.ft_protection_params | ||||
|         else: | ||||
|             params = getattr(self, f"ft_{category}_params") | ||||
|  | ||||
| @@ -324,9 +325,10 @@ class HyperStrategyMixin(object): | ||||
|         params: Dict = { | ||||
|             'buy': list(cls.detect_parameters('buy')), | ||||
|             'sell': list(cls.detect_parameters('sell')), | ||||
|             'protection': list(cls.detect_parameters('protection')), | ||||
|         } | ||||
|         params.update({ | ||||
|             'count': len(params['buy'] + params['sell']) | ||||
|             'count': len(params['buy'] + params['sell'] + params['protection']) | ||||
|         }) | ||||
|  | ||||
|         return params | ||||
| @@ -340,9 +342,12 @@ class HyperStrategyMixin(object): | ||||
|         self._ft_params_from_file = params | ||||
|         buy_params = deep_merge_dicts(params.get('buy', {}), getattr(self, 'buy_params', {})) | ||||
|         sell_params = deep_merge_dicts(params.get('sell', {}), getattr(self, 'sell_params', {})) | ||||
|         protection_params = deep_merge_dicts(params.get('protection', {}), | ||||
|                                              getattr(self, 'protection_params', {})) | ||||
|  | ||||
|         self._load_params(buy_params, 'buy', hyperopt) | ||||
|         self._load_params(sell_params, 'sell', hyperopt) | ||||
|         self._load_params(protection_params, 'protection', hyperopt) | ||||
|  | ||||
|     def load_params_from_file(self) -> Dict: | ||||
|         filename_str = getattr(self, '__file__', '') | ||||
| @@ -397,7 +402,8 @@ class HyperStrategyMixin(object): | ||||
|         """ | ||||
|         params = { | ||||
|             'buy': {}, | ||||
|             'sell': {} | ||||
|             'sell': {}, | ||||
|             'protection': {}, | ||||
|         } | ||||
|         for name, p in self.enumerate_parameters(): | ||||
|             if not p.optimize or not p.in_space: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user