最近在编制策略,需要做的一项工作是:将仓位的开仓价及运行时计算出的止损价存入数据文件,在系统下一次启动时再读入存储的数据,然后根据数据自动生成所持仓位的止损停损单。
解决上述问题的想法是,编写一个策略的成员函数,根据仓位,开仓价及止损价生成停损单。然后在策略的on_start函数中调用该函数完成该功能。
在这里遇到一个问题:该功能会最终通过CtaEngine的sell/cover函数生成停损单。但是CtaEngine的初始化逻辑的顺序是:调用完策略的on_start函数后再置策略的trading=True。但在sell/cover函数生成停损单时,会检查trading是否为True,而在on_start函数里,trading还未置为True,所以无法生成停损单。
解决这个问题似乎很简单:一是在CtaEngine的初始化逻辑里,将trading=True语句放在对on_start函数的调用前(不过改动框架代码不是个好办法);二是在on_start函数里强行先将trading置为True(在这里置值似乎逻辑性不强)。当然还有其它办法,这里先不讨论了。
不过这个问题实质上涉及到的一个设计问题:即框架希望用户在on_start里做些什么,或者能做些什么。trading=True语句放在on_start之前和之后有巨大的区别。
一般的理解是,框架在做好数据初始化等各种运行准备工作后,会通过on_start通知用户策略,可以去真正做一些跟仓单处理相关的逻辑了,如帖子开始提及的功能。那么trading=True语句应该置于on_start函数之前,否则这个用户策略拿这个on_start也并没有什么作用(除非仅仅是用来告知用户,策略启动起来了),因为其它的初始化工作放在on_init里做就行了。
一个疑问,望解惑一下,谢谢!