简单来讲就是我自己用CTP接口拿来了tick数据来做分析,期望达到一些期货软件交易明细功能所产生的效果。由于我不是行内人,所以有些地方可能实现得不是很合理或者有误,请大家指点或者提出来,非常感谢。
本篇文章只把代码贴出来,下一篇基于代码讲程序的流程。
希望通过这个实践达到如下目的:
- 熟悉CTP接口
- 熟悉期货的盘口分析
我是基于vn.py框架上做的开发,先看看期望达成的效果和我的成果
目的
成果
CTP接口
CTP接口这里不多说,去看看官方文档即可:CTP官方文档下载
我用到了行情查询相关的接口,先订阅,再在回调函数中处理每个tick数据。说到这里,个人觉得CTP要是能开源就好了,这样就能自己编译在mac下的版本了,哈哈,真想把CTP的dll文件反编译掉。现在我自己搞了个WindowsToGo在mac上跑着的,想装个B真不容易。
而且如果开源的话,说不定能在CTP实现层大大提高效率。而此时我们只能在CTP的上层做文章,当然我暂时不会做HFT,也无所谓了。
我的程序
我用到的数据是我们常说的tick数据,我的tick数据的知识还来自于Tick 数据在技术上究竟是什么东西?
通过这篇文章、CTP开发文档还有自己对期货行情的观察可以看出通过CTP接口订阅到的tick数据其实不是order book 每次发生变化发送的通知,而是1秒钟两次的快照数据,准确的应该是说两次快照间的统计数据。
而这个实例当中有一部分(计算单的类型:多开,空开,计算对手单的组成)是根据order book 只变化一次来进行编写的,所以这部分是不准确的,像有朋友开玩笑说,期货软件里面这部分数据也是忽悠小白的。不管怎样拥有分析tick数据的技能是不忽悠的。
直接上代码吧,哎呦,知乎也能贴代码了,不过没有语法高亮,知乎,加油哦
把代码放在vn.py项目的\vnpy\vn.ctp\vnctpmd\test\目录下就可以执行啦,需要源码的朋友也可以到我的github上去下载。程序主要是两部分,一部分是Enum和字典定义,第二部分是根据当前tick和上一个tick算出我们要的值,详细分析请见下一篇文章。
# 仓位变化方向
open_interest_delta_forward_enum = enum(OPEN="Open", CLOSE="Close", EXCHANGE="Exchange", NONE="None",
OPENFWDOUBLE="OpenFwDouble", CLOSEFWDOUBLE="CloseFwDOuble")
# 订单成交区域,决定是多还是空
order_forward_enum = enum(UP="Up", DOWN="Down", MIDDLE="Middle")
# 最终需要的tick方向
tick_type_enum = enum(OPENLONG="OpenLong", OPENSHORT="OpenShort", OPENDOUBLE="OpenDouble",
CLOSELONG="CloseLong", CLOSESHORT="CloseShort", CLOSEDOUBLE="CloseDouble",
EXCHANGELONG="ExchangeLong", EXCHANGESHORT="ExchangeShort",
OPENUNKOWN="OpenUnkown", CLOSEUNKOWN="CloseUnkown", EXCHANGEUNKOWN="ExchangeUnkown",
UNKOWN="Unkown", NOCHANGE="NoChange")
tick_color_enum = enum(RED="Red", GREEN="Green", WHITE="White")
tick_type_key_enum = enum(TICKTYPE="TickType", TICKCOLOR="TickColor")
# 只与计算对手单的组成相关
opponent_key_enum = enum(OPPOSITE="Opposite", SIMILAR="Similar")
# 只做翻译成中文使用,对应 tick_type_enum
tick_type_str_dict = {tick_type_enum.OPENLONG: "多开", tick_type_enum.OPENSHORT: "空开",
tick_type_enum.OPENDOUBLE: "双开",
tick_type_enum.CLOSELONG: "多平", tick_type_enum.CLOSESHORT: "空平",
tick_type_enum.CLOSEDOUBLE: "双平",
tick_type_enum.EXCHANGELONG: "多换", tick_type_enum.EXCHANGESHORT: "空换",
tick_type_enum.OPENUNKOWN: "未知开仓", tick_type_enum.CLOSEUNKOWN: "未知平仓",
tick_type_enum.EXCHANGEUNKOWN: "未知换仓",
tick_type_enum.UNKOWN: "未知", tick_type_enum.NOCHANGE: "没有变化",
tick_color_enum.RED: "红", tick_color_enum.GREEN: "绿", tick_color_enum.WHITE: "白"}
# 根据 open_interest_delta_forward_enum 和 order_forward_enum 计算出tick类型的字典
tick_type_cal_dict = {
open_interest_delta_forward_enum.NONE:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.NOCHANGE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
open_interest_delta_forward_enum.EXCHANGE:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGELONG,
tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGESHORT,
tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.EXCHANGEUNKOWN,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
open_interest_delta_forward_enum.OPENFWDOUBLE:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
open_interest_delta_forward_enum.OPEN:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENLONG,
tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENSHORT,
tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.OPENUNKOWN,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
open_interest_delta_forward_enum.CLOSEFWDOUBLE:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEDOUBLE,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
open_interest_delta_forward_enum.CLOSE:
{
order_forward_enum.UP: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSESHORT,
tick_type_key_enum.TICKCOLOR: tick_color_enum.RED},
order_forward_enum.DOWN: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSELONG,
tick_type_key_enum.TICKCOLOR: tick_color_enum.GREEN},
order_forward_enum.MIDDLE: {tick_type_key_enum.TICKTYPE: tick_type_enum.CLOSEUNKOWN,
tick_type_key_enum.TICKCOLOR: tick_color_enum.WHITE}
},
}
# input1 计算订单是在ask范围内成交还是在bid范围内成交
order_forward = TickAnalysis.get_order_forward(data["LastPrice"],data["AskPrice1"], data["BidPrice1"],
self.PreDepthMarketData["LastPrice"],
self.PreDepthMarketData["AskPrice1"],
self.PreDepthMarketData["BidPrice1"])
# input2 计算仓位变化方向
open_interest_delta_forward = TickAnalysis.get_open_interest_delta_forward(open_interest_delta,
volume_delta)
# f(input1,input2) = output1 根据成交区域和仓位变化方向计算出tick的类型
tick_type_dict = tick_type_cal_dict[open_interest_delta_forward][order_forward]
Comments
comments powered by Disqus