VNPY重新啟動後,沒有停止單掛單原因和簡潔解決方法

張國平發表於2019-01-29
之前在這個連結裡面,提了vnpy重啟後,比如開盤前開始,即使符合掛單條件,也沒有掛單出現的問題,給了一個比較麻煩的方法。
http://blog.itpub.net/22259926/viewspace-2563701/
後來研究程式碼,發現原因應該是:
程式用onInit(self) 初始化回放資料,但是此時self.trading 為false,不會發出停止單;而啟動onStart時候,不會重新回放啟動,也就不會有掛單,這樣重啟第一個時間K線是沒有停止單在的。
由於歷史回測是連續的K線,這樣也就是造成回測和實盤差異較大。


之前連結解決方法比較複雜,簡單解決方法就是把回放最後一個bar放在onStart裡面跑,這時候 self.trading 為True,允許掛單
1. 修改策略的 onInit(self)  ,回放不包括最後一個bar
def onInit(self):
    """初始化策略(必須由使用者繼承實現)"""
    self.writeCtaLog(u'%s策略初始化' % self.name)
    # 載入歷史資料,並採用回放計算的方式初始化策略數值
    initData = self.loadBar(self.initDays)
    for bar in initData[:-1]:
        self.onBar(bar)
    self.putEvent()
2.給onStart加入最後一個bar回放,
def onStart(self):
    """啟動策略(必須由使用者繼承實現)"""
    initData = self.loadBar(1)
    bar = initData[-1]
    self.onBar(bar)
    self.writeCtaLog(u'%s策略啟動' % self.name)    
    self.putEvent()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2565165/,如需轉載,請註明出處,否則將追究法律責任。

相關文章