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

wfdcf7caf766f44d93 wrote:

xiaohe wrote:

你调用委托函数的时候没有成交,只是发出委托,如果能够撮合也是下一分钟才能成交。
对委托记录有疑惑可以结合自己打印的委托记录进行排查

感谢大佬解答,那还是想问一下,那是不是代表成交记录就是比委托慢一分钟?

用bar的回测模式中,是的。因为发出委托的时间是在一个bar的结束时间,是否成交只有等收到下一个bar才知道。

是的。应该是屏幕分辨率的问题。调整一下试试。

zhengongyi wrote:

连龙八卦 wrote:

vnpy自带notebook软件,如果安装veighna_studio的话
我装了veighna_studio 咋俩说的是一个 么 我的里边没有notebook
进入veighna studio之后点投研就是notebook

数据一样的吧?可能是时间表示方法的问题?

wind的9:00可能是bar的开始时间,ifind是结束的时间。

如果是回测,在你收到最新的bar之后,最新价就是这个bar的收盘价,最新的最低价就算bar的low。在回测里面,如果是K线回测模式,K线没走完是不会触发交易的,因为交易逻辑是在on_bar函数里面。

能再说一下你的问题吗?没有特别懂。

成交价应该是取决于bar和你的下单价。如果是cta策略,可以看看vnpy_ctastrategy下面的backtesting的逻辑。

cta进阶课程也有详细讲到相关逻辑。

因为在load_bar函数中加载了十天的K线,那个期间是不交易的。

simnow正在维护,暂时不能使用。预计需要维护三周。

是10点前面一小时的(9-10)

就算是实际实盘,如果用的是bar的策略,在收到一根bar的open数据的时候,其实这根bar已经结束了,下一根bar已经开始了。你说的情况对于用bar的策略应该不成立吧,只有实际你在用tick或者是手动在交易才有可能。

ahren wrote:

alvinli512 wrote:

“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?

是的,之前按照orderid来判断的,想了下tradeid 可以,你看看这么实现有没有漏洞
on_trade()里面先long_tradeid = [],short_tradeid = []缓存tradeid,接着
self.pos != 0时候获取trade.price,不同的方向上把trade.tradeid 分别加入对应的tradeid 列表,即:long_tradeid.extend(trade.tradeid)
self.pos > 0 时候 判断有long_tradeid,计算long_stop,然后遍历long_tradeid,发出止损单
即:self.sell(self.long_stop,abs(trade.volume),stop=True);反之,self.pos<0同样;
这样的话,就是循环成交笔次数挂止损单,没有剔除tradeid list ;
on_trade是每一次trade触发一次,所以这样的话两个id的list是存不了大于一个id的,每次on_trade都会被初始化一次。

这样是不是复杂了啊?或许试试,在每一次on_trade里关注trade的开平状态,只要是开仓的话就发出止损单。不需要查看之前是否发出止损单,只要是最新on_trade的开仓,之前一定是没有发过的。

“先判断没发出止损单”这个判断是通过之前的order id吗。或许可以用trade id来判断?

找不到数据服务驱动不影响的,终止应该是其他原因

ahren wrote:

alvinli512 wrote:

可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。

就是说我在仓位不等于0时候,缓存trade.volume,来替换止损单中的self.pos?
是的。这样的话,比如一个订单买10;被分成三次成交,分别成交334。on_trade会被调用三次,三次的trade.volume分别也就是334。

如果只成交了33,那就只下了两个停止单,量分别是33,因为on_trade只被调用了两次。

可以在每次on_trade下查看仓位,如果大于0,用trade.volume来下停止单。就只下每次成交量的停止单数量。

祝融焱 wrote:

alvinli512 wrote:

可以只绑定一个合约,比如就根据大商所的时间来判断。
可以参考一下海龟策略的51课时。
考虑过这个逻辑,但是会导致 其他合约的数据是丢失的,比如大商所的一分钟结束的时候,可能郑商所刚走了1秒,这时生成的话,生成的郑商所K线就是只有1S的数据。
除非改写bargenerator
是的。可以写一个新的类NewBarGenerator,修改一下update_tick函数对new_minute的判断。

可以只绑定一个合约,比如就根据大商所的时间来判断。
可以参考一下海龟策略的51课时。

这个没有设置不输出模式。
如果实在不想要的话可以编辑vnpy_ctastrategy里的backtesting.py,把加载进度相关代码注释掉。

如果回测数据是每天的bar,可以用最新的bar是周几来判断(bar.datetime.isocalendar()[2]表示周几)。
在拿到周五的bar的时候,一周结束。
但是有少数情况周五不是一周的最后一个交易日。

python因为计算精度的问题,在某些情况下结果不准确,会出现类似截图里面小数位很多的情况。

一般来说这样的数据对使用的影响不大。额外处理的话会增加复杂度。

如果确实需要处理的话,可以在策略里面用一下rounding。

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

沪公网安备 31011502017034号

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