介紹下VNPY的Event事件處理,和建立新事件型別

張國平發表於2021-09-01

最近在做VNPY前臺介面的修改,不可避免就是要接觸到Event事件和相關的引擎,學習了不少。這裡簡單介紹下Event事件和相關處理;然後關於如何維護自己定義的新事件型別。


在VNPY中,常見的合約價格,策略狀態,發單狀態,成交狀態和賬務等等,這些從相關交易或者市場介面傳入後,打包成event,傳送對應的接收方法,其中 前臺介面顯示資料更新,都是透過event傳入。可以理解為一個VNPY資料傳輸機制。


從VNPY程式碼來看,涉及Evnet的定義是類 Event,定義Event,其實很簡單,就是事件型別和資料兩個屬性,事件這個就是是字串名字,比如原生的EVENT_TICK = "eTick." EVENT_TRADE = "eTrade." ; 而資料就是對應的TickData, TradeData這樣的可以資料型別。


另一個是類EventEngine,這個引擎就是維護可以理解就是維護一個佇列Queue, 像流水線一樣有各個地方放入的事件,和把事件傳給對應處理方法;。這個按照事件型別註冊的對應方法,是在EventEngine中維護一個字典,儲存事件型別和處理方法關聯。這裡要用到一些執行緒技巧;具體可以自己看看程式碼,事件型別是key值,對應的處理方法是按照list來儲存,所以一個事件型別可以註冊多個處理方法;之前我說一個事件型別只能註冊一個處理方法是錯誤的。


這裡說說如何建立一個新的事件型別,和繫結註冊的過程。

比如在CTA策略交易中,有原生的EVENT_CTA_STOPORDER = "eCtaStopOrder";來返回策略對應的停止單;但是在顯示的成交資訊中,並沒有顯示是那個策略的相關成交;這裡為就為做一個新的事件型別EVENT_CTA_TRADE = 'eCtaTrade';繫結CTA策略成交資訊。


首先維護一個事件型別名稱,EVENT_CTA_TRADE = 'eCtaTrade';這個直接放在cta_strategy的base檔案就是,就是一段字串。

然後做在cta_strategy的cta_engine中建立一個事件丟擲方法,丟擲事件, 下面程式碼可以放在已有方法process_trade_event。

使用動態繫結例項,給已有trade新增一個新的屬性strategy,變成; 這裡使用了淺複製,避免後面處理時候影響原始檔。

cta_trade = copy(trade)
cta_trade .strategy = strategy.strategy_name
event = Event(EVENT_CTA_TRADE, cta_trade)
self.event_engine.put(event)


然後嘗試把交易資訊事件型別在事件引擎進行註冊,關聯處理方法,當有這個事件時候,傳入到一個叫process_cta_trade_event事件處理:

self.event_engine.register(EVENT_CTA_TRADE , self.process_cta_trade_event)

至於process_cta_trade_event, 這麼處理就看你,只要抓取trade的資料,可以輸出到log,資料庫或者文字就隨意了。

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

相關文章