Add function to search exchange for closest matching pairs/tfs
This commit is contained in:
parent
4d93a6b757
commit
ff300d5c85
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user