问题描述
/
解决方案
ptrade持久化信息恢复机制解析
在ptrade量化平台中,是的,持久化信息恢复时会覆盖initialize函数中初始化的同名变量。
覆盖机制说明
当券商系统升级或环境重启后恢复交易时,ptrade框架的执行顺序如下:
- 首先,框架会执行策略的
initialize函数,进行变量的初始化。 - 然后,框架会执行持久化信息恢复操作。
因此,如果持久化信息中保存了策略定义的全局对象 g 中的某个变量,那么在恢复时,持久化信息中的变量值将会覆盖掉 initialize 函数中刚刚初始化的该变量。
如何避免变量被覆盖?
如果您希望某些变量在重启后重新初始化,而不被持久化信息覆盖(例如涉及到IO操作的类对象、打开的文件等无法被序列化的对象),您可以采用以下方法:
在 initialize 中初始化该变量时,将变量名以双下划线 __ 开头。在ptrade中,全局变量 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()
总结
- 普通全局变量 (
g.var):会被持久化保存,重启时会覆盖initialize中的初始值。 - 私有全局变量 (
g.__var):不会被持久化保存,重启时依赖initialize重新初始化。