VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 42
声望: 4

最近在编制策略,需要做的一项工作是:将仓位的开仓价及运行时计算出的止损价存入数据文件,在系统下一次启动时再读入存储的数据,然后根据数据自动生成所持仓位的止损停损单。

解决上述问题的想法是,编写一个策略的成员函数,根据仓位,开仓价及止损价生成停损单。然后在策略的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里做就行了。

一个疑问,望解惑一下,谢谢!

Member
avatar
加入于:
帖子: 4618
声望: 284

初始化完成之后,证明准备工作进行好了,指标的计算也没有误差了。但是启动策略把trading变成true的时刻,才是决定开始交易的时候。如果trading变成true放在启动策略之前,那应该才是没有意义,只起到一个通知的效果吧。

Member
avatar
加入于:
帖子: 62
声望: 3

我也有相同的问题,我希望策略一开始就根据on_init计算的参数挂单。那么,在vnpy里面该如何做?(我本来的第一反应也是在on_start里面完成挂单。。。)

Member
avatar
加入于:
帖子: 4618
声望: 284

那么可以缓存一下该参数进行下单或者参考1楼进行个性化修改

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】