VeighNa量化社区
你的开源社区量化交易平台
warpgate's Avatar
Member
离线
46 帖子
声望: 1

strategy里面怎样可以调用main_engine的get_position呢?

xiaohe wrote:

可以通过main_engine.get_position获取

是不是可以在策略里面调用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的一段逻辑如下:

description

模拟盘跑了半个多月一直正常,直到今天(12-3)在截图红框内的步骤报了这样的错:

description

触发的时间正好是10:15-10:30停盘之后。排查了当日录制的bar,发现了一条10:16分的记录,不确定是否是CTP端数据异常导致:

description

不知道大家有没有遇到类似的问题。

其实我不是这个意思... 我想问的是在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:

交易所会推送

这个版本需要升级吗?

warpgate wrote:

vnpy_ctp.version是6.5.1.5

xiaohe wrote:

请问你的vnpy_ctp版本是?

vnpy_ctp.version是6.5.1.5

xiaohe wrote:

请问你的vnpy_ctp版本是?

我今天(2021-11-22)也突然遇到了同样的问题,早上打开录制之后发现录制的时间是未来的时间。没有做任何改动,之前data_recorder功能也一直正常。

description

xiaohe wrote:

那是夜盘的数据吧,请升级至最新版再试试看吧

看到文档里面提到锁仓委托转换:

如果lock设置为True,那么该笔订单则会进行锁仓委托转换(在有今仓的情况下,如果想平仓,则会先平掉所有的昨仓,然后剩下的部分都进行反向开仓来代替平今仓,以避免平今的手续费惩罚)。

我理解要完成这个操作,光靠记录一个净持仓pos不够用吧,应该还要记录昨仓、今仓,还要区分出对应的方向。这些信息都存在什么地方了,也是在.vntrader目录下的json文件里面吗?

好的,我试下

用Python的交易员 wrote:

推荐直接在底层接口进行修改,vnpy_ctp/ctp_gateway.py中的CtpMdApi.onRtnDepthMarketData里

后来没再用停止单功能了,通过限价的方式来止损了。

嗯,上一张图传错了,可以忽略了,后面这两张图是停止单触发的成交的情况。注意看它价格,开仓和平仓价格差距巨大,按照涨跌停价格来的,不是合理的撮合价格。
xiaohe wrote:

没看出来你传这张图什么意思,从你上一张图看是正常的

如果要确保所有模块都不受其他时间的脏数据影响,请问是不是要在所有的engine.py里面更改process_tick_event?比如vnpy>trader>engine.py、vnpy>app>data_recorder>engine.py、vnpy_ctastrategy>engine.py?

description

好的,谢谢
xiaohe wrote:

应该是第一下在本地提交委托的时候没有生成datatime,你打印的时候过滤一下应该就好了

确实存在None的情况,这是为什么呢?回测没有这样的问题。

description

xiaohe wrote:

可以自己打印一下trade.datetime和order.datetime看看

因为需要把逐笔委托和成交记录保存到本地文件(csv)供复盘研究,我分别在策略的on_trade和on_order内增加了相关代码,保存相关属性。

在跑回测的时候都一切正常,但实盘仿真的时候,trade.datetime和order.datetime都出现了NoneType错误。是不是实盘和回测的处理逻辑不一样?

description

不好意思,图发错了,重新传两个图。这两个图里面都是停止单触发的成交,价格按涨跌停来的,很离谱。
description

description

xiaohe wrote:

上面是委托价格,下面是成交价格,从图上看,没有以委托价格成交呀

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

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