介紹下VNPY的Event事件處理,和建立新事件型別
最近在做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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- freeswitch的event事件處理事件
- W3C的事件處理和IE的事件處理有哪些區別?事件
- SAP CRM和Cloud for Customer中的Event handler(事件處理器)Cloud事件
- SAP Spartacus 事件服務 Event Service 使用介紹事件
- Javascript中的事件物件和事件型別JavaScript事件物件型別
- C#總結(二)事件Event 介紹總結C#事件
- Event Handler 事件處理程式 2 —跨瀏覽器事件物件《高程3》事件瀏覽器物件
- 事件分發和處理事件
- Netty事件監聽和處理(下)【有福利】Netty事件
- 事件處理事件
- VNPY使用一個方法處理多個事件EVENT,來計算期貨單個合約資金比率事件
- 事件流處理 (ESP) 與 Kafka 簡介事件Kafka
- VNPY 的EVENT事件作為 pyQT5的訊號觸發函式事件QT函式
- Laravel 中的 Event 和事件的概念Laravel事件
- React事件處理React事件
- vue事件處理Vue事件
- JavaSwing 事件處理Java事件
- JavaScript事件處理JavaScript事件
- Flutter | 事件處理Flutter事件
- 事件分發之View事件處理事件View
- mysql 事件 eventMySql事件
- 【ol】事件型別事件型別
- Netty是如何處理新連線接入事件的?Netty事件
- JavaScript和JQuery的滑鼠mouse事件冒泡處理JavaScriptjQuery事件
- react之事件處理React事件
- Node.js Event Loop 處理的幾大週期介紹Node.jsOOP
- [譯]RxJava 的全面介紹:Observable 型別、背壓、錯誤處理RxJava型別
- jQuery事件物件event的屬性和方法jQuery事件物件
- js 建立和觸發事件 和 自定義事件JS事件
- SQL Server 2008事件處理系統簡介LSSQLServer事件
- 介紹基於事件的架構事件架構
- redis的事件處理機制Redis事件
- nodejs事件和事件迴圈簡介NodeJS事件
- Tkinter (44) 事件 Event事件
- JS中event事件JS事件
- Laravel使用event事件Laravel事件
- Qt 事件傳遞流程-事件處理器|事件分發器|事件過濾器QT事件過濾器
- 詳解 Solidity 事件Event - 完全搞懂事件的使用Solid事件