vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 42
声望: 4

写这个贴子源于对vnpy自带海龟策略的解读。里面碰到了一些不太明白的地方,本想偷个懒发帖问问,觉得了解的大牛们一两句话可能就说明白了。但天下并无便宜事物,得到的回帖大致意思是,看看代码吧。好吧,虽然多年前就跳离码农的坑,没想到为了程序化交易,又要再次跳坑。

在海龟策略里使用了停损单,使得策略逻辑非常的简单明了。但是,关于停损单的触发机制成了解读策略的一个疑问点。

海龟策略里,针对买单,策略会通过send_buy_orders(这个send_buy_orders实际上只是通过调用CtaTemplate的buy,buy里再调用send_order,send_order里再调用cta_engine.send_order,然后再调用send_local_stop_order(如果交易所不支持停损单,则使用本地停损单))把停损单存入策略的停损单缓存数组stop_orders[]里。在这里,一系列的buy,send_order,send_buy_orders等并非如函数名字面上的意思是直接发送出交易指令,而是象刚才说的,最终只是将停损单缓存在本地而已。我们知道,停损单的意思是当价格突破某个设定的价格时,会以市价单或某个能尽可能成交的委托单真正发送给交易所。那么当然,对这个数组必须有进一步的处理,猜想在tick数据到达时,肯定会有相应的代码来处理这个stop_orders[],否则,这些停损单们就得老死在大家的本地内存里了。

继续跟读代码,发现CtaEngine有个process_tick_event处理函数,并且CtaEngine针对(EVENT_TICK事件注册了process_tick_event函数:
event_engine.register(EVENT_TICK, self.process_tick_event),显然,这个函数就是用来处理tick数据的,老天保佑,这个函数里调用了check_stop_order,终于找到一个跟停损单名字相关的函数名了,但愿这个函数名称跟它所干的活能对上。继续看该函数定义。
这个函数里首先是根据传入的tick数据检查缓存数组里各停损单是否到达触发条件,如果达到条件,就通过main_engine.send_order,继而调用gateway.send_order真正将单子发送给交易所。

看到这里,停损单的基本执行过程就清晰了。简单说来可以梳理为一下步骤:
1.自定义策略里,如果需要用到停损单,可以在策略里定义这些单子会通过CtaTemplate的四个买卖函数(buy,sell,short,cover,注意设置函数参数里的stop为true)将其存入本地停损单缓存数组stop_orders[]里,该数组定义在CtaEngine类里,最终被用户策略类所继承。(这里只是解读交易所不支持停损单的代码逻辑分支,交易所支持停损单的话,单子会被直接发送给交易所);
2.当接收到tick数据时,由于注册了tick事件的处理函数process_tick_event,该函数会被调用执行。在process_tick_event函数里,会调用check_stop_order来遍历检查缓存数组里的每个停损单。若某个停损单满足触发条件,则将停损单转换为合适的价格通过主引擎的send_order(继而调用gateway.send_order)发送给交易所。

最终梳理出来,其实也不算太复杂。如果有对停损单的执行机制想要解读的同学,可以做一个参考。
刚刚开始学习python和这个框架,上面的分析不一定完全靠谱,要是上面分析有误之处,还请指正,大家一起进步。

Administrator
avatar
加入于:
帖子: 4655
声望: 266

给你加个精华

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

沪公网安备 31011502017034号