VeighNa量化社区
你的开源社区量化交易平台
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
加入于:
帖子: 4500
声望: 320

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
加入于:
帖子: 252
声望: 3

用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
加入于:
帖子: 4500
声望: 320

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

Member
avatar
加入于:
帖子: 24
声望: 2

用Python的交易员 wrote:

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

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

# 写在__init__里
self.vt_orderids = []

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

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

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

那么,self.vt_orderids何时清空?否则后续挂单if self.vt_orderids始终为真,也就是开一单之后就无法挂单了,如何解决?

Member
avatar
加入于:
帖子: 4618
声望: 284

可以在on_trade推送以后删掉该委托号吧

Member
avatar
加入于:
帖子: 104
声望: 5

1.如果有仓位,止损为stop单,on_bar里面,在挂止损单之前判断有无止损委托if not self.sell_vt_orderids: 然后挂止损self.sell_vt_orderids = self.sell(……), self.vt_orderids.extend(self.sell_vt_orderdis); 同时在on_trade里面if self.pos == 0: 遍历self.sell_vt_orderids,如果在vt_orderids,就remove;这个操作是不是就实现了止损单不用美分钟挂扯单,只有在有单子入场挂止损,不触发止损就不用撤止损单了
2.按照这种方法,就可以不用self.cancel_all()了吧?在on_bar里:self.pos == 0 时候,if not self.long_vt_orderids :就发单self.long_vt_orderids = self.buy(……);同时在on_trade里面,self.pos >0遍历self.long_vt_orderids并remove

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

用Python的交易员 wrote:

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

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

# 写在__init__里
self.vt_orderids = []

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

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

这样在尚未收到委托变化回报之前,都不会挂新的委托出去。
老大,下单ID在什么地方清除呢,不然后面都下不了单了

Member
avatar
加入于:
帖子: 337
声望: 27

刘易斯华哥 wrote:

用Python的交易员 wrote:

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

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

# 写在__init__里
self.vt_orderids = []

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

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

这样在尚未收到委托变化回报之前,都不会挂新的委托出去。
老大,下单ID在什么地方清除呢,不然后面都下不了单了
请参考7楼

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

青青子荆 wrote:

刘易斯华哥 wrote:

用Python的交易员 wrote:

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

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

# 写在__init__里
self.vt_orderids = []

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

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

这样在尚未收到委托变化回报之前,都不会挂新的委托出去。
老大,下单ID在什么地方清除呢,不然后面都下不了单了
请参考7楼
好的,谢谢。已经添加代码
td_orderid = trade.orderid

    # 删掉已经下单的成功的ID
    if td_orderid in self.vt_orderids:
        self.vt_orderids.remove(td_orderid)
Member
avatar
加入于:
帖子: 3
声望: 0

mark,学习中

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

mark!

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

沪公网安备 31011502017034号

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