VNPY使用一個方法處理多個事件EVENT,來計算期貨單個合約資金比率
最近想到個需求,針對期貨CTP介面,比如持有三個合約,每個合約佔用的資金比率。
這個需求分解下,就是資金佔用,這個在期貨中就是保證金金額。
在CTP介面中,OnRspQryTradingAccount 方法是返回查詢賬戶資金資訊,可以返回賬號總保證金金額。
而onRspQryInvestorPosition方法是返回查詢持倉情況,持倉情況包括對應合約的保證金金額,這裡要注意的地方是,CTP 系統將持倉明細記錄按合約,持倉方向,開倉日期(針對上期所,區分昨倉、今倉)進行彙總,而vnpy是隻區分合約和合約方向,vnpy會將不同開倉時間返回的進行二次彙總。
這裡處理流程就和明確了,首先增強PositionData和 AccountData 這兩個資料類,加入保證金屬性;然後增強ctp_gateway的對應方法中獲取保證金資料;這兩步比較簡單,程式碼略。
第三步增強倉位報表PositionMonitor,增加保證金相關header資料列。然後除了預設的“EVENT_POSITION”, 還要訂閱註冊“EVENT_ACCOUNT",這裡要重寫父類方法regist_event;其實vnpy中事件註冊時多對多關係,一個方法可以處理多個事件,雖然預設不鼓勵。
def register_event(self): super(PositionMonitor,self).register_event() if self.event_type_account: self.signal.connect(self.process_event) self.event_engine.register(self.event_type_account, self.signal.emit)
然後複寫父類方法process_event,來處理這兩個事件,如果是Account事件,就更新總保證金資料,如果是合約事件,就計算對應保證金金額和總保證金百分比。
def process_event(self, event: Event) -> None: """ Process new data from event and update into table. """ # Disable sorting to prevent unwanted error. if self.sorting: self.setSortingEnabled(False) # Update data into table. if event.type == self.event_type_account: self.total_margin = event.data.CurrMargin else: data = event.data if self.total_margin!=0: data.useMarginRate = '{:.2%}'.format(data.useMargin/self.total_margin) if not self.data_key: self.insert_new_row(data) else: key = data.__getattribute__(self.data_key) if key in self.cells: self.update_old_row(data) else: self.insert_new_row(data) # Enable sorting if self.sorting: self.setSortingEnabled(True)
其實修改邏輯很簡單,就是一個方法處理多個事件要考慮下。實現效果如下圖:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2841085/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何計算期貨合約盈虧?
- 針對vnpy的mongodb資料庫,合併多個主力合約行情為連續行情資料MongoDB資料庫
- 一個簡單的MapReduce示例(多個MapReduce任務處理)
- 介紹下VNPY的Event事件處理,和建立新事件型別事件型別
- on()方法一次註冊多個事件處理函式程式碼例項事件函式
- jQuery能夠為一個元素註冊多個相同事件處理函式jQuery事件函式
- 編寫一個簡單的智慧合約
- 處理多個異常
- jQuery:在一個回撥中處理多個請求jQuery
- 多個excel檔案合併成一個excel表的方法 如何快速合併多個excel檔案Excel
- 用JS點選事件做一個簡單的計算器JS事件
- 把C#程式(含多個Dll)合併成一個Exe的超簡單方法C#
- 一次性將多個資料夾批處理壓縮成多個.rar
- 來個簡單的事件委託 冒個泡事件
- 一個網站有多個語言版本怎麼處理?網站
- Laravel event 事件使用中 記錄的一個小問題Laravel事件
- 多個commit合併成一個MIT
- WebApi在MVC 4中一個Controll多個post方法報錯處理WebAPIMVC
- CMP2.0如何實現資料庫多個表格共用一個BEAN處理資料庫Bean
- 如何處理多個集合關聯關係時,試試這個方法?
- 一個停下車來處理 BUG 的 IT 男……
- js為物件註冊多個事件處理函式程式碼JS物件事件函式
- 一個關於latch: library cache事件的處理事件
- SAP 不支援交貨單中同一個物料多個行專案HU與序列號組合發貨場景
- 快速上手第一個智慧合約
- 秒合約|現貨期權|合約跟單系統開發案例
- 一個最簡單的計算器
- 能用一個公式來計算使用者體驗嗎?公式
- AngularJS中處理多個promiseAngularJSPromise
- 一個簡單易用的資料庫壞塊處理方案資料庫
- freeswitch的event事件處理事件
- 解決jQuery多個事件處理函式執行的現象jQuery事件函式
- ORACLE多個event設定方式Oracle
- 啟動一個程式並處理程式結束事件 (轉)事件
- 字串處理:下劃線,多空格變單空格,統計單詞出現個數字串
- 利用聚寬(Joinquant)資料來源為vnpy新增期貨行情資料
- 小白的第一個HelloWord智慧合約
- 組合模式-統一的處理個別物件與組合物件模式物件