官方图形化回测界面是vnpy/app/cta_backtester/ui/widget.py
中的BacktesterManager
。__init__()
方法最后调用逻辑是这样的:
# vnpy/app/cta_backtester/ui/widget.py BacktesterManager __init__()
self.init_ui() # 初始化界面
self.register_event()
self.backtester_engine.init_engine()
self.init_strategy_settings() # 初始化策略配置
在init_ui()
方法里有一段代码似乎是从cta_backtester_setting.json
中读取上一次回测时使用的策略,配置为默认策略:
# vnpy/app/cta_backtester/ui/widget.py BacktesterManager init_ui()
# Load setting
setting = load_json(self.setting_filename)
if not setting:
return
self.class_combo.setCurrentIndex(
self.class_combo.findText(setting["class_name"])
)
但self.class_combo
此时还没有添加任何策略选项,所以self.class_combo.findText(setting["class_name"])
始终返回的是-1
,没有实现设置当前策略为上一次回测策略的效果。
self.class_combo
是在init_strategy_settings()
方法里才添加了策略选项:
# vnpy/app/cta_backtester/ui/widget.py BacktesterManager
def init_strategy_settings(self):
""""""
self.class_names = self.backtester_engine.get_strategy_class_names()
for class_name in self.class_names:
setting = self.backtester_engine.get_default_setting(class_name)
self.settings[class_name] = setting
self.class_combo.addItems(self.class_names) # 给`self.class_combo`添加策略选项
所以可能应该将设置当前策略为上一次回测策略的代码改到init_strategy_settings()
方法里:
def init_strategy_settings(self):
""""""
self.class_names = self.backtester_engine.get_strategy_class_names()
for class_name in self.class_names:
setting = self.backtester_engine.get_default_setting(class_name)
self.settings[class_name] = setting
self.class_combo.addItems(self.class_names) # 给`self.class_combo`添加策略选项
# Load setting
setting = load_json(self.setting_filename)
# 设置当前策略为上一次回测策略
self.class_combo.setCurrentIndex(
self.class_combo.findText(setting["class_name"])
)