是不是可以在策略里面调用strategy engine里面的offset_converter.get_position_holding获得
用Python的交易员 wrote:
CTA策略模块无法访问底层账户的实际持仓,可以通过self.pos查看自己的逻辑持仓
感谢
有原 wrote:
如果净持仓self.pos=0,并且第二天接着交易,那么因为self.pos=0所以只会做开仓操作,我们以买入开仓为例(当天首笔开仓),我们将这笔买入开仓的头寸记为req.volume,那么vn.py会做如下操作:
1,如果有昨天的空仓,则平掉该空仓;
2,如果req.volume减去昨仓还有剩余,则以该剩余头寸来下开仓的订单。关于锁仓的细节可以参考vn.py官方公众号上提供的CTA课程,另外vn.py做这个转换逻辑的底层代码在vnpy.trader.converter.PositionHolding.convert_order_request_lock函数中。
portfolio strategy的模板里面on_tick函数有更新bar的一段逻辑如下:
模拟盘跑了半个多月一直正常,直到今天(12-3)在截图红框内的步骤报了这样的错:
触发的时间正好是10:15-10:30停盘之后。排查了当日录制的bar,发现了一条10:16分的记录,不确定是否是CTP端数据异常导致:
不知道大家有没有遇到类似的问题。
其实我不是这个意思... 我想问的是在lock=True时,程序如何在self.pos==0的情况下,知道去做平昨仓操作。毕竟只通过self.pos净持仓作为判断依据的时候,self.pos==0,按代码里的逻辑它该做开仓操作,但事实上程序做了平仓操作。lock=True的背后是否做了更复杂的判断?
xiaohe wrote:
用self.pos策略净持仓这个变量编写策略只是一种示例写法,也可以从示例策略的逻辑中看到,都是self.pos等于0的时候做开仓操作,不等于0的时候做平仓操作。如果有自己的想法可以基于自己的需求来编写策略
这个逻辑我是理解的,今仓是不用平的,但是对于有昨仓的情况呢,在净持仓等于0的情况下,它是怎么判断做平昨操作的呢?
郭易燔 wrote:
锁仓的目的本就是为了避免平今惩罚,你为什么还要去平今仓呢,那你就没必要用锁仓模式了呀。锁仓模式就意味着你的今仓有多空两个仓位,你如果需要的不是反向而是平仓,那不使用锁仓模式就行。多空单相同意味着你之前使用的就是锁仓模式,那你继续开仓的行为就是符合预期的。
我试一下,我看官方文档里面说6.5.1.6的版本依赖2.7版本的vnstudio。
郭易燔 wrote:
pip install vnpy_ctp --upgrade 试一下,我使用6.5.1.6版本的记录夜盘数据未发生时间错乱的问题。
我看策略里面似乎是根据净持仓(self.get_pos(vt_symbol))来决定具体操作的,在lock=True的情况下,多空单数量相同则净持仓为0,那岂不会导致操作行为的偏差,平仓操作变开仓?
xiaohe wrote:
交易所会推送
我今天(2021-11-22)也突然遇到了同样的问题,早上打开录制之后发现录制的时间是未来的时间。没有做任何改动,之前data_recorder功能也一直正常。
xiaohe wrote:
那是夜盘的数据吧,请升级至最新版再试试看吧
看到文档里面提到锁仓委托转换:
如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。
我理解要完成这个操作,光靠记录一个净持仓pos不够用吧,应该还要记录昨仓、今仓,还要区分出对应的方向。这些信息都存在什么地方了,也是在.vntrader目录下的json文件里面吗?
后来没再用停止单功能了,通过限价的方式来止损了。
嗯,上一张图传错了,可以忽略了,后面这两张图是停止单触发的成交的情况。注意看它价格,开仓和平仓价格差距巨大,按照涨跌停价格来的,不是合理的撮合价格。
xiaohe wrote:
没看出来你传这张图什么意思,从你上一张图看是正常的
如果要确保所有模块都不受其他时间的脏数据影响,请问是不是要在所有的engine.py里面更改process_tick_event?比如vnpy>trader>engine.py、vnpy>app>data_recorder>engine.py、vnpy_ctastrategy>engine.py?
好的,谢谢
xiaohe wrote:
应该是第一下在本地提交委托的时候没有生成datatime,你打印的时候过滤一下应该就好了
因为需要把逐笔委托和成交记录保存到本地文件(csv)供复盘研究,我分别在策略的on_trade和on_order内增加了相关代码,保存相关属性。
在跑回测的时候都一切正常,但实盘仿真的时候,trade.datetime和order.datetime都出现了NoneType错误。是不是实盘和回测的处理逻辑不一样?