VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 107
声望: 5

cta策略,暂停在重启,均线数据好像是没有更新,只有删除策略,重新添加策略后数据才是最新的,这个是啥原因?能改进下嘛

Super Moderator
avatar
加入于:
帖子: 89
声望: 8

在 CTA 策略中,暂停后重启时均线数据没有更新,通常是由于策略的状态和缓存数据没有正确恢复导致的。以下是可能的原因及改进方法:


1. 原因分析

  • 缓存数据未更新:策略暂停时,缓存的历史数据(如 ArrayManagerBarGenerator)可能没有正确保存或恢复。
  • 策略状态未同步:策略的 inited 状态或变量(如 posbars 等)在重启时没有正确加载。
  • 历史数据未重新加载:策略重启时,可能没有重新加载最新的历史数据,导致均线计算不准确。

2. 改进方法

方法 1:确保策略重启时重新加载历史数据

在策略的 on_init 方法中,确保每次重启时都重新加载足够的历史数据:

def on_init(self):
    """策略初始化回调"""
    self.write_log("策略初始化")
    self.load_bar(10)  # 加载 10 天的历史数据

方法 2:检查缓存数据的恢复

确保策略的缓存数据(如 ArrayManagerBarGenerator)在重启时正确恢复。可以在 on_init 方法中重新初始化这些组件:

def on_init(self):
    """策略初始化回调"""
    self.write_log("策略初始化")
    self.am = ArrayManager(size=100)  # 重新初始化 ArrayManager
    self.load_bar(10)  # 加载 10 天的历史数据

方法 3:同步策略状态

确保策略的状态变量(如 posbars 等)在重启时正确同步。可以在 on_start 方法中检查并更新这些变量:

def on_start(self):
    """策略启动回调"""
    self.write_log("策略启动")
    if not self.am.inited:
        self.load_bar(10)  # 如果未初始化,重新加载历史数据

方法 4:手动触发数据更新

在策略重启后,手动触发一次数据更新,确保均线数据是最新的。可以在 on_start 方法中调用 put_eventupdate_bar

def on_start(self):
    """策略启动回调"""
    self.write_log("策略启动")
    self.put_event()  # 触发策略状态更新

方法 5:检查策略配置文件

确保策略的配置文件(如 cta_strategy_data.json)正确保存了策略的状态和变量。如果文件损坏或未正确保存,可以手动删除该文件,让策略重新初始化。


3. 验证改进

  • 在策略重启后,检查日志输出,确保历史数据已正确加载。
  • 使用 print 或日志输出,检查 ArrayManagerBarGenerator 中的数据是否更新。
  • 在图形界面中观察均线数据是否与最新行情一致。

4. 注意事项

  • 如果策略使用了复杂的缓存机制(如自定义的 K 线缓存),确保这些缓存在重启时正确恢复。
  • 如果问题仍然存在,可以尝试删除策略并重新添加,确保策略完全重新初始化。

通过以上改进方法,应该可以解决 CTA 策略暂停后重启时均线数据未更新的问题。如果问题仍然存在,可以提供更多细节以便进一步排查。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】