ITPub博客

首页 > 应用开发 > Python > 简化 vnTrader 手动下单界面

简化 vnTrader 手动下单界面

原创 Python 作者:张国平 时间:2021-09-07 12:21:13 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/22259926/viewspace-2790764/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
SAP 金融风险管理产品专家

注册时间:2009-08-05

  • 博文量
    229
  • 访问量
    635929