3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade量化交易平台中,策略在遇到券商升级或环境重启后,框架会自动进行持久化信息的恢复。了解其恢复机制对于保证策略逻辑的连贯性至关重要。
当环境重启后恢复交易时,PTrade框架的执行顺序如下:
initialize 函数:框架会先运行初始化函数,重新声明和赋值基础变量。pickle 模块保存的全局对象 g 中的变量)。由于恢复操作在 initialize 之后执行,如果持久化信息中保存了策略定义的全局对象 g 中的某个变量,那么恢复时,持久化信息中的变量值将会覆盖掉 initialize 函数中初始化的该变量值。
例如,如果在 initialize 中设置了 g.count = 0,但在重启前持久化保存的 g.count 值为 5,那么重启恢复后,g.count 的值将是 5。
在处理持久化时,需要特别注意以下几点:
g 上,会导致持久化失败。initialize 中初始化该变量时,名字以 __(双下划线)开头。全局变量 g 中以 __ 开头的变量被视为私有变量,持久化时将不会被保存。以下示例展示了如何处理不可序列化的类对象,使其在重启时正常初始化而不参与持久化:
class Test(object):
count = 5
def print_info(self):
self.count += 1
log.info("a" * self.count)
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 初始化无法被序列化的类对象,并赋值为私有变量(以__开头)
# 落地持久化信息时会跳过保存该变量,重启时会重新执行这行代码进行实例化
g.__test_class = Test()
def handle_data(context, data):
# 调用私有变量中定义的方法
g.__test_class.print_info()
总结来说,PTrade在重启后会先走 initialize 再覆盖持久化数据,开发者需合理利用 __ 私有变量前缀来管理不需要或不能被持久化的对象。