VnTrader提供了手工交易的界面,这样紧急情况下可以手工下单。
但是现有的手工交易界面选项比较多,尤其是针对上交所的平昨平今,还要看看对应持仓情况,不然就提示仓位不足,非常耽误事情。想到cta策略发单都参数其实很简单,针对平今平昨已经提供了OffsetConverter类对订单处理,这里就调用借鉴来简单化手工下单界面。
看看简化完以后界面,在逐条说说。最近做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里面还是要修改下,改成平昨优先。这个另外再说。