簡化 vnTrader 手動下單介面

張國平發表於2021-09-07

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章