波动系数
This commit is contained in:
parent
dafa793e5f
commit
b1b79ad619
@ -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:
|
||||
"""
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user