VeighNa量化社区
你的开源社区量化交易平台
Member
加入于:
帖子: 158
声望: 71

VnTrader提供了手工交易的界面,这样紧急情况下可以手工下单。

但是现有的手工交易界面选项比较多,尤其是针对上交所的平昨平今,还要看看对应持仓情况,不然就提示仓位不足,非常耽误事情。想到cta策略发单都参数其实很简单,针对平今平昨已经提供了OffsetConverter类对订单处理,这里就调用借鉴来简单化手工下单界面。

看看简化完以后界面,在逐条说说。最近做vntrader界面修改的事情挺多,后面陆续更新。

description

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里面还是要修改下,改成平昨优先。这个另外再说。

Administrator
avatar
加入于:
帖子: 4503
声望: 322

感谢分享,给你加个精华

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】