簡化 vnTrader 手動下單介面
VnTrader提供了手工交易的介面,這樣緊急情況下可以手工下單。
但是現有的手工交易介面選項比較多,尤其是針對上交所的平昨平今,還要看看對應持倉情況,不然就提示倉位不足,非常耽誤事情。想到cta策略發單都引數其實很簡單,針對平今平昨已經提供了OffsetConverter類對訂單處理,這裡就呼叫借鑑來簡單化手工下單介面。
手下看看簡化完以後介面,在逐條說說。最近做vntrader介面修改的事情挺多,後面陸續更新。
vnTrader手工交易的ui程式碼是TradingWidget這個類子,在trader/ui/widget.py這個檔案,該元件繼承了QtWidgets.QWidget這個Qt的基礎元件,放置了多個QLabel文字條,QLineEdit文字編輯框,和QComboBox下拉選擇框;用grid和vbox進行佈局。結構比較清晰。下拉框引數來自於trader/constant.py 檔案定義。
首先說下介面簡化,
交易所,對於交易所下拉框exchange_combo,如果只進行國內期貨交易的的化,可以註釋原有的交易所資訊,直接寫死三大國內交易所。
self.exchange_combo.addItems([ "SHFE", "CZCE", "DCE"])
名稱,沒有什麼可以修改。
方向,預設多和空兩個方向,沒有需求修改,
開平,修改的重點,這裡直接使用淨倉模式,不考慮開平,淨倉模式下,如果無持倉,直接開倉;如果有持倉,方向相反就是平倉,方向相同就是增倉;使用淨倉模式,直接註釋掉這條,改成Qlabel文字就可以。
如果要保留開平,則修改addItems,保留開和平,平昨平今交給 OffsetConverter處理。
self.offset_combo.addItems(["開","平"])
型別,這裡提供了很多下單型別;針對國內期貨介面ctp,用的上就是限價單LIMIT和市價單MARKET,其中市價單的只有鄭商所和大商所支援,所以寫死限價單交易即可,這裡可以直接註釋掉,在下面req裡面直接寫。
其他的價格和介面就沒什麼要修改的了。
後面就是交易訂單req的處理,主要就是這麼使用offsetconverter。
首先要在初始化方法加入,新建一個offset_converter,用來處理價格
self.offset_converter = OffsetConverter(self.main_engine)
之後,在訂閱event時候,加入一個對倉位事件的關聯註冊,獲得倉位更新的資訊,因為一個event型別可以被多個方法處理,所以沒有問題。在新建兩個方法process_position_event更新倉位資訊;這裡要注意的是這個offset_converter 和cta engine中的offset_converter是平行的兩個存在,並不是同一個;這裡這個主要關注倉位更新。
def register_event(self) -> None: """""" self.signal_tick.connect(self.process_tick_event) self.event_engine.register(EVENT_TICK, self.signal_tick.emit) # 新增對倉位event的關聯註冊 self.event_engine.register(EVENT_POSITION, self.process_position_event) #新增方法,更新offset_converter中倉位資訊 def process_position_event(self, event: Event): """""" position = event.data self.offset_converter.update_position(position)
最後,在現在的send_order中修改req,給定type和offset,這裡offset如果採用多空,就要換成Offset(str(self.offset_combo.currentText()))。
然後用convert_order_request處理,這裡使用net淨倉模式,如果不是,就是False;返回可能是多個request佇列,比如一個平單分出平今和平昨兩個,再每一個都是傳送一遍。
這裡offset_converter只是考慮現有倉位,沒有考慮到cta引擎裡面的本地單的鎖單等情況,所以如果cta引擎也同時發單,可能並不一定準確。
original_req = OrderRequest( =symbol, =Exchange((.exchange_combo.currentText())), =Direction((.direction_combo.currentText())), =OrderType.LIMIT, =volume, =price, =Offset.NONE, =) req_list = .offset_converter.convert_order_request(original_req, = , = ) vt_orderids = [] gateway_name = (.gateway_combo.currentText()) req req_list: vt_orderid = .main_engine.send_order(req, gateway_name)
最後,上期所的之前是平今優惠,所以vnpy預設是優先平今,但是最近改成平今懲罰,所以再offset_converter裡面還是要修改下,改成平昨優先。這個另外再說。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2790764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- seldom 2.0 讓介面自動化測試更簡單
- Python之介面自動化初級:開始一個簡單的介面測試Python
- VnTrader 實現CTA策略初始化完成後,自動啟動該策略
- 直播系統原始碼,極光IM簡單的聊天介面全手動原始碼
- golang 簡單實現介面資料格式化Golang
- Python介面自動化——檔案上傳/下載介面Python
- 把玩Alpine linux(三):簡單手動配置Linux
- 動手實現一個簡單的 rpc 框架到入門 grpc (下)RPC框架
- Web自動化—簡單瞭解Web
- 手寫簡單的元件化跳轉Router元件化
- 動手實現一個簡單的promisePromise
- Golang介面簡單瞭解Golang
- 手撕Vue-資料驅動介面改變下Vue
- 自己動手實現一個簡單的 IOC
- Laravel 手動搭建簡單的資料爬蟲Laravel爬蟲
- Linux下搭建介面自動化測試平臺Linux
- DevOps,CI,CD,自動化簡單介紹dev
- 硬碟介面進化簡史硬碟
- 使用Flask開發簡單介面Flask
- 簡單說一下 [清除 & 閉合] 浮動
- 簡單說下WBTC
- 簡單API介面簽名驗證API
- heygen模型介面 簡單使用 java版模型Java
- 簡單互動
- 手寫簡單的RPCRPC
- 沒有介面文件的情況下如何開展介面自動化測試?
- Httpclient 介面自動化HTTPclient
- python 介面自動化Python
- 全自動化介面
- Java語言搭建介面自動化框架學習一(單介面請求和響應)Java框架
- 天哪!手動編寫mybatis雛形竟然這麼簡單MyBatis
- 手動簡單實現Vue雙向資料繫結Vue
- 最簡容器化動手小實踐——再戰flappybirdAPP
- Jmeter 介面自動化連載 (14) - 上傳與下載JMeter
- python介面自動化(四十)- logger 日誌 - 下(超詳解)Python
- 簡單介紹python自動化運維常用庫Python運維
- web自動化框架—BasePage 類的簡單封裝Web框架封裝
- 介面自動化之介面整理(抓包)