ITPub博客

首页 > 应用开发 > Python > VNPY中开盘前挂单失效的解决方法

VNPY中开盘前挂单失效的解决方法

原创 Python 作者:张国平 时间:2019-01-16 18:36:26 0 删除 编辑

在VNPY量化交易平台中,挂停止单(STOP Order)是交易发起的常见方式,停止单是至一旦价位到了预定点位,才启动交易的订单。


期货早盘9点和夜盘9点刚刚开票十分钟,往往是波动最大的时段,交易机会很多。但是VNPY存在明明应该挂着停止单,在开盘时候就没有了,应该是在开盘时刻,所有挂单都是失效了,虽然这些挂单是在VNPY内部失效,但是也会失效。具体代码看了半天,还是没有找到具体原因。


这里提供一个临时修补方法。


  1. 定义一个全局策略变量stopOpenOrder, 默认值为False;

    定义个全局变量 status,默认值为NA,放在策略判断交易代码中,一旦触发挂单,更新这个为挂单方向。

    最后把停止单挂单价格也设为全局变量


     2.覆盖停止单推送function,一旦有开单,这个 stopOpenOrder变为True

    def onStopOrder(self, so):

        """停止单推送"""

        self.writeCtaLog(u'%s阻止单, 品种:%s, 状态: %s, 方向:%s,价格:%s' % (self.name, so.vtSymbol, so.status, so.orderType, so.price))

        if so.offset == OFFSET_OPEN:

            self.stopOpenOrder = True

        self.putEvent()


    3.覆盖OnTick function, 如果pos为空, stopOpenOrder == False时候,  如果 status是buy 或者short,进行相应挂单。

    def onTick(self, tick):

        """收到行情TICK推送(必须由用户继承实现)"""

        if self.pos == 0 and self.stopOpenOrder == False:

            if self.status == "buy":

                self.buy(self.buyPrice, self.fixedSize, True)

            elif self.status == "short":

                self.short(self.shortPrice, self.fixedSize, True)

        self.bg.updateTick(tick)



在实际测试中,如果符合挂单条件,但是并没有开出挂单,当第一个tick到来时候,会自动挂单。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22259926/viewspace-2563701/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
SAP 金融风险管理产品专家

注册时间:2009-08-05

  • 博文量
    134
  • 访问量
    322388