diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index 50b23292..93b7eb87 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -35,6 +35,15 @@ class FreqaiPrimer(IStrategy): super().__init__(config) # 调用父类的初始化方法并传递config # 存储从配置文件加载的默认值 self._trailing_stop_positive_default = 0.004 # 降低默认值以更容易触发跟踪止盈 + + # 验证 FreqAI 配置 + if self.config and "freqai" in self.config: + logger.info(f"FreqAI 已启用: {self.config['freqai'].get('model', 'Unknown')}") + else: + logger.warning("FreqAI 未在配置文件中启用或配置缺失") + + # 验证 h1_max_candles 参数 + assert self.h1_max_candles.value <= 50, f"h1_max_candles={self.h1_max_candles.value} 超出安全范围!" @property def protections(self): @@ -84,6 +93,47 @@ class FreqaiPrimer(IStrategy): can_short = False # 禁用做空 freqai_predicted_add_step = 0.057 # 默认0.5% + # FreqAI 配置 + freqai_info = { + "enabled": True, + "identifier": "freqai_primer_mixed", + "model": "LightGBMRegressor", + "feature_parameters": { + "include_timeframes": ["3m", "15m", "1h"], + "include_shifted_candles": 2, + "label_period_candles": 12 + }, + "data_split_parameters": { + "test_size": 0.2, + "shuffle": False + }, + "model_training_parameters": { + "price_value_divergence": { + "model": "LightGBMRegressor", + "model_params": { + "n_estimators": 200, + "learning_rate": 0.05, + "num_leaves": 31, + "verbose": -1 + } + }, + "optimal_first_length": { + "model": "LightGBMClassifier", + "model_params": { + "n_estimators": 150, + "learning_rate": 0.1, + "num_leaves": 15, + "max_depth": 8, + "min_child_samples": 10, + "class_weight": "balanced", + "verbose": -1 + } + } + }, + "fit_live_predictions_candles": 100, + "live_retrain_candles": 100 + } + # [propertiesGrp_List]-------------------------------------------------------------------------------------------------------------------------------------- # [propertiesGrp step="1" name="第一轮优化" epochs="300" space="buy " description="入场基础条件优化,入场确认条件优化"] bb_std = DecimalParameter(2.0, 5.0, decimals=1, default=3.5, optimize=True, load=True, space='buy') # 安全:2.0-5.0 @@ -408,6 +458,8 @@ class FreqaiPrimer(IStrategy): return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: + # 🔧 调用FreqAI进行预测 + dataframe = self.freqai.start(dataframe, metadata, self) # 计算 3m 周期的指标 bb_length_value = self.bb_length.value @@ -525,6 +577,11 @@ class FreqaiPrimer(IStrategy): # 合并 1h 数据 dataframe = dataframe.merge(df_1h, how='left', on='date').ffill() + + # 🔧 验证 FreqAI 预测列是否存在 + if '&-add_position_step' not in dataframe.columns: + logger.debug(f"[{metadata['pair']}] FreqAI预测列不存在,将在训练后自动生成") + dataframe['&-add_position_step'] = self.freqai_predicted_add_step # 使用默认值 # 验证合并后的列 #logger.info(f"[{metadata['pair']}] 合并后的数据框列名: {list(dataframe.columns)}")