Add function to search exchange for closest matching pairs/tfs
This commit is contained in:
		| @@ -872,20 +872,3 @@ Users can then use these columns, concert with all their own additional indicato | |||||||
|  |  | ||||||
|         return df |         return df | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| The user does need to ensure their `informative_pairs()` contains the following (users can add their own `informative_pair` needs to the bottom of this template): |  | ||||||
|  |  | ||||||
| ```python |  | ||||||
|     def informative_pairs(self): |  | ||||||
|         whitelist_pairs = self.dp.current_whitelist() |  | ||||||
|         corr_pairs = self.config["freqai"]["feature_parameters"]["include_corr_pairlist"] |  | ||||||
|         informative_pairs = [] |  | ||||||
|         for tf in self.config["freqai"]["feature_parameters"]["include_timeframes"]: |  | ||||||
|             for pair in whitelist_pairs: |  | ||||||
|                 informative_pairs.append((pair, tf)) |  | ||||||
|             for pair in corr_pairs: |  | ||||||
|                 if pair in whitelist_pairs: |  | ||||||
|                     continue  # avoid duplication |  | ||||||
|                 informative_pairs.append((pair, tf)) |  | ||||||
|         return informative_pairs |  | ||||||
| ``` |  | ||||||
|   | |||||||
| @@ -8,18 +8,19 @@ | |||||||
|         "identifier": "spicy-id", |         "identifier": "spicy-id", | ||||||
|         "feature_parameters": { |         "feature_parameters": { | ||||||
|             "include_timeframes": [ |             "include_timeframes": [ | ||||||
|                 "3m", |                 "30m", | ||||||
|                 "15m", |                 "1h", | ||||||
|                 "1h" |                 "4h" | ||||||
|             ], |             ], | ||||||
|             "include_corr_pairlist": [ |             "include_corr_pairlist": [ | ||||||
|                 "BTC/USDT", |                 "BTC/USD", | ||||||
|                 "ETH/USDT" |                 "ETH/USD" | ||||||
|             ], |             ], | ||||||
|             "label_period_candles": 20, |             "label_period_candles": 20, | ||||||
|             "include_shifted_candles": 2, |             "include_shifted_candles": 2, | ||||||
|             "DI_threshold": 0.9, |             "DI_threshold": 0.9, | ||||||
|             "weight_factor": 0.9, |             "weight_factor": 0.9, | ||||||
|  |             "principal_component_analysis": true, | ||||||
|             "indicator_periods_candles": [ |             "indicator_periods_candles": [ | ||||||
|                 10, |                 10, | ||||||
|                 20 |                 20 | ||||||
|   | |||||||
| @@ -157,7 +157,6 @@ class IStrategy(ABC, HyperStrategyMixin): | |||||||
|  |  | ||||||
|             if spice_rack: |             if spice_rack: | ||||||
|                 import types |                 import types | ||||||
|  |  | ||||||
|                 from freqtrade.freqai.utils import auto_populate_any_indicators |                 from freqtrade.freqai.utils import auto_populate_any_indicators | ||||||
|                 self.populate_any_indicators = types.MethodType(  # type: ignore |                 self.populate_any_indicators = types.MethodType(  # type: ignore | ||||||
|                         auto_populate_any_indicators, self) |                         auto_populate_any_indicators, self) | ||||||
| @@ -189,12 +188,44 @@ class IStrategy(ABC, HyperStrategyMixin): | |||||||
|     def setup_freqai_spice_rack(self, config: dict) -> Dict[str, Any]: |     def setup_freqai_spice_rack(self, config: dict) -> Dict[str, Any]: | ||||||
|         import json |         import json | ||||||
|         from pathlib import Path |         from pathlib import Path | ||||||
|  |         import difflib | ||||||
|         auto_config = config.get('freqai_config', 'lightgbm_config.json') |         auto_config = config.get('freqai_config', 'lightgbm_config.json') | ||||||
|         with open(Path('freqtrade') / 'freqai' / 'spice_rack' |         with open(Path('freqtrade') / 'freqai' / 'spice_rack' | ||||||
|                   / auto_config) as json_file: |                   / auto_config) as json_file: | ||||||
|             freqai_config = json.load(json_file) |             freqai_config = json.load(json_file) | ||||||
|             config['freqai'] = freqai_config['freqai'] |             config['freqai'] = freqai_config['freqai'] | ||||||
|             config['freqai']['identifier'] = config['freqai_identifier'] |             config['freqai']['identifier'] = config['freqai_identifier'] | ||||||
|  |             corr_pairs = config['freqai']['feature_parameters']['include_corr_pairlist'] | ||||||
|  |             timeframes = config['freqai']['feature_parameters']['include_timeframes'] | ||||||
|  |             new_corr_pairs = [] | ||||||
|  |             new_tfs = [] | ||||||
|  |  | ||||||
|  |             # find the closest pairs to what the default config wants | ||||||
|  |             for pair in corr_pairs: | ||||||
|  |                 closest_pair = difflib.get_close_matches( | ||||||
|  |                                             pair, | ||||||
|  |                                             self.dp._exchange.markets  # type: ignore | ||||||
|  |                                             )[0] | ||||||
|  |                 new_corr_pairs.append(closest_pair) | ||||||
|  |                 logger.info(f'Spice rack will use {closest_pair} as informative in FreqAI model.') | ||||||
|  |  | ||||||
|  |             # find the closest matching timeframes to what the default config wants | ||||||
|  |             if timeframe_to_seconds(config['timeframe']) > timeframe_to_seconds('15m'): | ||||||
|  |                 logger.warning('Default spice rack is designed for lower base timeframes (e.g. > ' | ||||||
|  |                                f'15m). But user passed {config["timeframe"]}.') | ||||||
|  |             new_tfs.append(config['timeframe']) | ||||||
|  |  | ||||||
|  |             list_tfs = [timeframe_to_seconds(tf) for tf | ||||||
|  |                         in self.dp._exchange.timeframes]  # type: ignore | ||||||
|  |             for tf in timeframes: | ||||||
|  |                 tf_secs = timeframe_to_seconds(tf) | ||||||
|  |                 closest_index = min(range(len(list_tfs)), key=lambda i: abs(list_tfs[i] - tf_secs)) | ||||||
|  |                 closest_tf = self.dp._exchange.timeframes[closest_index]  # type: ignore | ||||||
|  |                 logger.info(f'Spice rack will use {closest_tf} as informative tf in FreqAI model.') | ||||||
|  |                 new_tfs.append(closest_tf) | ||||||
|  |  | ||||||
|  |         config['freqai']['feature_parameters'].update({'include_timeframes': new_tfs}) | ||||||
|  |         config['freqai']['feature_parameters'].update({'include_corr_pairlist': new_corr_pairs}) | ||||||
|         config.update({"freqaimodel": 'LightGBMRegressorMultiTarget'}) |         config.update({"freqaimodel": 'LightGBMRegressorMultiTarget'}) | ||||||
|         return config |         return config | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user