vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 46
声望: 1

实盘遇到如下问题:
1、如果策略是K线合成后再发出信号,那么在收盘后发出去的order不会成交,而且进程关掉后会自动取消所有order,导致无法执行操作。
2、1分钟K线的合成基于下一分钟tick数据的到来,但郑商所在15:00后不发tick,所以郑商所合约15:00后没有合成bar,也就无法执行on_bar。这跟bar只能是在晚上21:00前执行策略初始化时,从rqdata获取。如果刚好这跟bar是有开仓信号的,那么也会因为还没开盘而无法执行。
3、在非交易时间,交易所会推送fakedata,如果从开盘前就接受tick推送,那么合成的bar会是错误的。
4、集合竞价时发出的tick的datetime是前一个交易日的时间,也会导致合成bar错误。
5、本地停止单,收盘后会清空
解决方案如下:
on_tick的最初,做tick.datetime的判断,根据不同品种检查时间,确保刚好是大于等于开盘时间,小于收盘时间,这样可以确保合成的bar是正确的。
另外,K线合成后发出的信号,不要直接执行buy或short,而是维护一个list,在on_tick里面去检查这个list。因为收盘的最后一根K线不会在收盘后合成,而是在开盘前初始化时,从rqdata下载。如果此时直接发出信号的话,因为没开盘会被拒单,所以应该更新到list里,等开盘后有tick进来时再发信号。
关于停止单,在engine的stop_strategy里面设置一个检查,只要停止策略时有未成交的停止单,就保存下来,然后再在开盘时在on_tick里面检查记录的停止单,如果有的话,就复制停止单发出去。
只想到了这些笨办法,多了很多检查步骤,但还好不影响性能。

Member
avatar
加入于:
帖子: 138
声望: 13

是一种解决思路。
我的做法与你有所不同,因为数据我是自己维护的,交易呢是基于ps,所以没有什么参照性,展开内容过多,有兴趣在交流吧。

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

沪公网安备 31011502017034号