stable1 7

This commit is contained in:
zhangkun9038@dingtalk.com 2025-04-28 18:30:02 +08:00
parent d6fe9f8573
commit 42781656b4

View File

@ -75,30 +75,29 @@ class FreqaiExampleStrategy(IStrategy):
# 保留关键的技术指标
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
# 确保 MACD 列被正确计算并保留
def calculate_macd(self, dataframe: DataFrame) -> DataFrame:
"""
Centralized method to calculate MACD and ensure proper assignment to the dataframe.
"""
try:
macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
dataframe["macd"] = macd["macd"]
dataframe["macdsignal"] = macd["macdsignal"]
# Ensure no NaN or infinite values in MACD columns
dataframe["macd"] = dataframe["macd"].replace([np.inf, -np.inf], np.nan).ffill().fillna(0)
dataframe["macdsignal"] = dataframe["macdsignal"].replace([np.inf, -np.inf], np.nan).ffill().fillna(0)
logger.info("MACD 列已成功计算并验证。")
except Exception as e:
logger.error(f"计算 MACD 列时出错:{str(e)}")
dataframe["macd"] = np.nan
dataframe["macdsignal"] = np.nan
# 检查并填充 NaN 值
if "macd" in dataframe.columns and "macdsignal" in dataframe.columns:
dataframe["macd"] = dataframe["macd"].fillna(method='ffill').fillna(0)
dataframe["macdsignal"] = dataframe["macdsignal"].fillna(method='ffill').fillna(0)
else:
logger.error("MACD 或 MACD 信号列缺失,无法生成买入信号。尝试重新计算 MACD 列。")
try:
macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
dataframe["macd"] = macd["macd"].fillna(method='ffill').fillna(0)
dataframe["macdsignal"] = macd["macdsignal"].fillna(method='ffill').fillna(0)
logger.info("MACD 列已成功重新计算。")
except Exception as e:
logger.error(f"重新计算 MACD 列时出错:{str(e)}")
raise ValueError("DataFrame 缺少必要的 MACD 列且无法重新计算。")
return dataframe
# 使用 centralized 方法计算 MACD
dataframe = self.calculate_macd(dataframe)
# 检查 MACD 列是否存在
if "macd" not in dataframe.columns or "macdsignal" not in dataframe.columns:
@ -325,18 +324,13 @@ class FreqaiExampleStrategy(IStrategy):
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 改进买入信号条件
# 检查 MACD 列是否存在
# 使用 centralized 方法计算 MACD
dataframe = self.calculate_macd(dataframe)
# 再次检查 MACD 列是否存在
if "macd" not in dataframe.columns or "macdsignal" not in dataframe.columns:
logger.error("MACD 或 MACD 信号列缺失,无法生成买入信号。尝试重新计算 MACD 列。")
try:
macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9)
dataframe["macd"] = macd["macd"]
dataframe["macdsignal"] = macd["macdsignal"]
logger.info("MACD 列已成功重新计算。")
except Exception as e:
logger.error(f"重新计算 MACD 列时出错:{str(e)}")
raise ValueError("dataframe 缺少必要的 MACD 列且无法重新计算。")
logger.error("MACD 或 MACD 信号列仍然缺失,无法生成买入信号。")
raise ValueError("dataframe 缺少必要的 MACD 列且无法重新计算。")
enter_long_conditions = [
(dataframe["rsi"] < dataframe["buy_rsi_pred"]), # RSI 低于买入阈值