VNPY中開盤前掛單失效的解決方法

張國平發表於2019-01-16

在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章