波动系数

This commit is contained in:
zhangkun9038@dingtalk.com 2025-09-28 15:44:07 +08:00
parent dafa793e5f
commit b1b79ad619

View File

@ -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:
"""