先说个结论,看完策略,整个人有点不好了
介绍策略处理的文档上,全是以界面介绍为主,如果是用no_ui的,那得自己研究
上篇讲了连接行情后,用no_ui的run.py跑起来,里面已经加载了策略,就是这段
event_engine = EventEngine() main_engine = MainEngine(event_engine) main_engine.add_gateway(CtpGateway) cta_engine = main_engine.add_app(CtaStrategyApp) main_engine.write_log("主引擎创建成功") log_engine = main_engine.get_engine("log") event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event) main_engine.write_log("注册日志事件监听") main_engine.connect(ctp_setting, "CTP") main_engine.write_log("连接CTP接口") sleep(10) cta_engine.init_engine() main_engine.write_log("CTA策略初始化完成") cta_engine.init_all_strategies() sleep(60) # Leave enough time to complete strategy initialization main_engine.write_log("CTA策略全部初始化") cta_engine.start_all_strategies() main_engine.write_log("CTA策略全部启动")
它的这个策略,是基于策略基类写策略代码,看清楚,是策略代码,还不是策略实例。然后需要自己添加一次参数才算是策略实例
可以理解为,一个策略代码,根据参数不同,保存成多个策略实例 (保存在用户目录\.vntrader\cta_strategy_setting.json中)
我也不理解为什么要做成这个样子,这个样子好像只有在交易软件中的指标这样干,可以调参,来测试不同的结果达到最优,大概是这样想的吧,
那样有个最大的缺陷,就是不能调试,全靠print了,目前这个框架面向对象是非开发者,所以在界面上完成。但站在开发者角度的话就很奇葩了。
好在VeighNa 公布了源码,调试策略也没有问题。建立项目时把vnpy,vnpy_ctp,vnpy_ctastrategy放在一起,然后策略文件放在vnpy_ctastrategy\strategies下面,即可以调试,但说实话,已经没有兴趣去看其它的app啥的了,纯粹写策略,用JJ比这个方便很多很多。
另外策略中用到的BarGenerator也只支持最小的1分钟周期,用到秒的没得玩,要自己去改了。另外,这个BarGenerator不支持实时周期和静态周期的切换,比如5分钟线,有些策略需要实时的tick形成的K线,有些时候要整个5分钟完成之后形成的K线。
另外也说下行情交易部分,今天也回头看了一下,有些做法不认同,比如交易部分是没有考虑成本价的问题,也就是如果策略用到成本价这个的话,就没法弄了
另外,还有一个地方,比如让人吐槽,看代码:
def init_query(self) -> None: """初始化查询任务""" self.count: int = 0 self.query_functions: list = [self.query_account, self.query_position] self.event_engine.register(EVENT_TIMER, self.process_timer_event)
这是在ctp_gateway中的一段代码,意思是通过定时任务(process_timer_event,2秒)去查询账户和持仓,我没有往后看了,查完了肯定会更新本地数据,这么频繁的查询,如果没有做好队列或锁,一定会跟本地数据和在运行的策略中的开平形成冲突。可能作者觉得写个try就完了吧