From bf324b06b98beb9fa10982ef30797051dee2d369 Mon Sep 17 00:00:00 2001 From: "zhangkun9038@dingtalk.com" Date: Thu, 14 Aug 2025 20:19:03 +0800 Subject: [PATCH] =?UTF-8?q?redis=E5=AD=98=E5=82=A8trend=5Fscore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- freqtrade/templates/freqaiprimer.py | 37 ++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index c0c04f3..b425a0b 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -1038,6 +1038,39 @@ class FreqaiPrimer(IStrategy): logger.error(f"[{pair}] 获取市场趋势失败:{e}", exc_info=True) return 50 + def get_trend_score_with_cache(self, pair: str, timeframe: str, timestamp: int, dataframe: DataFrame, metadata: dict) -> float: + """ + 获取趋势得分,优先从 Redis 缓存中读取,如果缓存未命中则计算并存储到 Redis。 + """ + import redis + from datetime import datetime + + # 创建 Redis 客户端 + if not hasattr(self, 'redis_client') and self.redis_url: + self.redis_client = redis.from_url(self.redis_url) + logger.info("✅ Redis 客户端已初始化") + + # 生成缓存键 + cache_key = f"trend_score:{pair}:{timeframe}:{timestamp}" + + # 尝试从 Redis 获取趋势得分 + if self.redis_client: + cached_score = self.redis_client.get(cache_key) + if cached_score is not None: + logger.info(f"[{pair}] 从 Redis 缓存中获取 trend_score: {float(cached_score):.2f}") + return float(cached_score) + + # 缓存未命中,计算趋势得分 + trend_score = self.get_market_trend(dataframe=dataframe, metadata=metadata) + logger.info(f"[{pair}] 计算 trend_score: {trend_score:.2f}") + + # 将趋势得分存储到 Redis,设置过期时间为 1 天 + if self.redis_client: + self.redis_client.setex(cache_key, 86400, trend_score) + logger.info(f"[{pair}] 已将 trend_score 存储到 Redis,key={cache_key}, value={trend_score:.2f}") + + return trend_score + def detect_trend_status(self, dataframe: DataFrame, metadata: dict) -> str: """ 基于加权分段的trend_score判断趋势状态 @@ -1060,7 +1093,9 @@ class FreqaiPrimer(IStrategy): # 获取历史数据片段 hist_df = dataframe.iloc[:i+1] if i != -1 else dataframe if len(hist_df) > 0: - score = self.get_market_trend(hist_df, metadata) + # 使用新的 get_trend_score_with_cache 方法替代直接调用 get_market_trend + timestamp = int(hist_df.index[-1].timestamp()) # 获取时间戳 + score = self.get_trend_score_with_cache(pair=pair, timeframe=self.timeframe, timestamp=timestamp, dataframe=hist_df, metadata=metadata) trend_scores_20.append(score) else: trend_scores_20.append(50) # 默认值