diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index 189da23f..188588f0 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -40,6 +40,12 @@ class FreqaiPrimer(IStrategy): # EMA参数 self._ema_period = 20 # EMA窗口大小 self._max_history_length = 200 # 最大历史记录长度 + + # 添加波动系数计算时间戳缓存,用于限制计算频率 + # 格式: {pair: timestamp} + self._volatility_timestamp = {} + self._volatility_cache = {} + self._volatility_update_interval = 3600 # 波动系数更新间隔(秒),设置为1小时 # 只用于adjust_trade_position方法的波动系数获取 def get_volatility_coefficient(self, pair: str) -> float: @@ -55,6 +61,8 @@ class FreqaiPrimer(IStrategy): 波动系数表示某币对与BTC/USDT相比的波动幅度倍数 - 山寨币的波动系数可能大于3 - 稳定性较高的币对(如DOT/USDT)波动系数可能小于1 + + 添加了时间戳缓存机制,限制波动系数的计算频率为每小时一次 """ # 检查特殊币对 if pair == 'USDT/USDT': @@ -63,6 +71,16 @@ class FreqaiPrimer(IStrategy): return 1.0 try: + # 获取当前时间戳 + current_time = datetime.datetime.now().timestamp() + + # 检查是否需要重新计算波动系数 + # 如果缓存中有值且距离上次计算时间小于更新间隔,则直接返回缓存值 + if (pair in self._volatility_cache and + pair in self._volatility_timestamp and + current_time - self._volatility_timestamp[pair] < self._volatility_update_interval): + return self._volatility_cache[pair] + # 初始化该币对的历史记录(如果不存在) if pair not in self._volatility_history: self._volatility_history[pair] = [] @@ -91,17 +109,21 @@ class FreqaiPrimer(IStrategy): # 确保EMA值在合理范围内 final_coef = max(0.1, min(5.0, ema_volatility_coef)) logger.info(f"计算波动系数EMA完成 {pair}: 最终系数={final_coef:.4f} (历史数据点数={len(self._volatility_history[pair])})") - return final_coef else: # 如果历史数据不足,返回当前波动系数(或默认值) - # 当历史数据少于EMA周期时,使用简单移动平均或直接返回当前值 - # 这里选择直接返回当前波动系数,并限制范围 final_coef = max(0.1, min(5.0, current_volatility_coef)) logger.info(f"计算波动系数EMA完成 {pair}: 最终系数={final_coef:.4f} (历史数据不足,使用当前值)") - return final_coef + + # 更新缓存和时间戳 + self._volatility_cache[pair] = final_coef + self._volatility_timestamp[pair] = current_time + + return final_coef except Exception as e: logger.warning(f"计算波动系数EMA时出错 {pair}: {str(e)}") - return 1.0 # 出错时返回默认值1.0 + # 如果出错,尝试返回缓存值,否则返回默认值1.0 + return self._volatility_cache.get(pair, 1.0) + def _calculate_current_volatility_coef(self, pair: str) -> float: """