diff --git a/freqtrade/templates/FreqaiExampleStrategy.py b/freqtrade/templates/FreqaiExampleStrategy.py index 804f0b6..3e85ccd 100644 --- a/freqtrade/templates/FreqaiExampleStrategy.py +++ b/freqtrade/templates/FreqaiExampleStrategy.py @@ -78,6 +78,11 @@ class FreqaiExampleStrategy(IStrategy): dataframe["macd"] = macd["macd"] dataframe["macdsignal"] = macd["macdsignal"] + # 确保 MACD 列存在 + if "macd" not in dataframe.columns or "macdsignal" not in dataframe.columns: + logger.error("MACD 或 MACD 信号列缺失,无法生成买入信号") + raise ValueError("DataFrame 缺少必要的 MACD 列") + # 保留布林带相关特征 bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) dataframe["bb_lowerband"] = bollinger["lower"] @@ -143,6 +148,10 @@ class FreqaiExampleStrategy(IStrategy): if dataframe["up_or_down"].ndim == 1: dataframe["up_or_down"] = dataframe["up_or_down"].values.reshape(-1, 1) + # 检查并处理 NaN 或无限值 + dataframe["up_or_down"] = dataframe["up_or_down"].replace([np.inf, -np.inf], np.nan) + dataframe["up_or_down"] = dataframe["up_or_down"].ffill().fillna(0) + # 生成 %-volatility 特征 dataframe["%-volatility"] = dataframe["close"].pct_change().rolling(20).std() @@ -272,6 +281,11 @@ class FreqaiExampleStrategy(IStrategy): return df def populate_entry_trend(self, df: DataFrame, metadata: dict) -> DataFrame: # 改进买入信号条件 + # 检查 MACD 列是否存在 + if "macd" not in df.columns or "macdsignal" not in df.columns: + logger.error("MACD 或 MACD 信号列缺失,无法生成买入信号") + raise ValueError("DataFrame 缺少必要的 MACD 列") + enter_long_conditions = [ (df["rsi"] < df["buy_rsi_pred"]), # RSI 低于买入阈值 (df["volume"] > df["volume"].rolling(window=10).mean() * 1.2), # 成交量高于近期均值20%