vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 11
声望: 0

程序很普通:

            if self.pos == 0:
                if bar.close_price > self.day_open:
                    self.buy(self.long_entry, self.fixed_size, stop=True)
                else:
                    self.short(self.short_entry, self.fixed_size, stop=True)

但在10:30一秒之内成交两次,我交易的是ni2002,当时跳空高开急速拉升了一下

抱歉,截图发不上来,edge和chrome都试过了

是不是因为没有成交回报,就重复成交了呢?这种情况怎么避免?

Administrator
avatar
加入于:
帖子: 3895
声望: 206

10:30这个点因为是上午休息的结束点,所以有可能短时间触发两次分钟线更新,此时成交回报如果尚未收到确实会出现上述情况。

解决办法是每次下单后,记录委托号:

# 写在__init__里
self.vt_orderids = []

# 写在on_bar里
vt_orderids = self.buy(...)
self.vt_orderids.extend(vt_orderids)

# 然后每次下单前,加上判断
if self.vt_orderids:
    return

这样在尚未收到委托变化回报之前,都不会挂新的委托出去。

Member
avatar
加入于:
帖子: 11
声望: 0

谢谢回复并指导!

按大佬说的改,然后继续观察,毕竟我觉得这事挺大的

Member
avatar
加入于:
帖子: 128
声望: 0

用Python的交易员 wrote:

vt_orderids = self.buy(...)

1:老师您好,我也遇到类似问题,咨询您一下,self.buy(...)括号里面是写策略名称吗?还是写其他的什么?
2:如下面代码所示,我是这么处理这个问题的,如果设置一个开关变量switch,如果开仓后,开关self.switch = 0立即复位,开仓后self.switch=1好像可以解决tick中未收到成交信息多次发单的情况,老师您好,我这么处理,与您提示的每次下单后,记录委托号,在尚未收到委托变化回报之前,不挂新的委托出去,那种效率更高,更稳定成熟呢? 小白一个,望您指点一下,万分感激!

    def on_tick(self, tick: TickData):
        self.cancel_all()
        self.bg_x.update_tick(tick)
        if self.pos > 0:
            if tick.last_price < self.long_stop and self.switch==1:
                self.sell(tick.last_price*0.9, abs(self.pos))
                self.switch = 0
Administrator
avatar
加入于:
帖子: 3895
声望: 206

请查看这里的文档:https://www.vnpy.com/docs/cn/cta_strategy.html

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