17

小白期货CTP程序化交易开发入门(三)--Tick数据转成K线数据

 3 years ago
source link: https://zhuanlan.zhihu.com/p/23202005
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

小白期货CTP程序化交易开发入门(三)--Tick数据转成K线数据

专注数字货币的程序化交易
从本节起,改到专栏来写了,还不知道专栏和原来的有什么差别。。。。

这次来说说怎么把Tick数据转成K线数据。

首先,修改CTP行情DEMO,源代码具体看(小白期货CTP程序化交易开发入门(一)),修改下代码,只接收一个合约的行情。

v2-d58c8d0612006c9ed106d54d66aa8709_720w.png
对于K线数据,只需要有Time、Volume、Price、Open、High、Low、Close就可以了,而这些数据对于CTP来说,只需要三项,Time、Volume和LastPrice,改下代码如下:


然后,接收数据去。。。

简单说明下Volume,从CTP接收到的Volume,是累计成交量,也就是从夜盘开始时(晚上21:00)累计下来,当前Tick的实际成交量,是当前的Volume减前一个时刻的Volume。

一般来说,将历史资料的Tick数据转成K线数据,都是先将数据转为1分钟的K线数据,而其他的分钟,则是按1分钟的K线数据再去合成,如果是即时数据,则只能每接收一个数据处理一次。

要将Tick数据转成1分钟的K线数据,首先将保存的Tick数据读取到DataTable中:

cycle.Value是控件值,这个代码实际上可以转成任何能被60整除的值的K线数据,注意,一般来说,都是1、3、5、10、15、30这类的K线,能被60整除的目的在于,不需要去调整不同小时之前的问题,比如将10:01:00的数据到和09:59:00一起。

其中要注意的是,如商品期货,在10点15分时会产生10:15:00.000和10:15:00.500的数据,因为10:15-10:30是休息时段,而股指期货则没有这个问题;在11:30:00.000、11:30:00.500和15:00:00.000、15:00:00.500也一样,这虽然都只是1秒钟的时间,如果用来产生1分钟的K线数据,则各会生成一个数据,我个人都是直接将这个计入到前1分钟的K线中。另外,若按这个逻辑,夜盘也会比较麻烦,因为不同的商品期货的收盘时间不一致,每个都去区别对待也很麻烦,比如好的方法可是,如将时间都提前1秒,也就是用DataTime函数中的.AddSecond(-1)的方法去处理,然后再针对被提前1秒到21:00前、09:00前、09:30前(这是股指)、10:30前(非股指)、13:00前(股指)和13:30(非股指)的数据计到后一分钟去,这样就能有效解决夜盘收盘时间不一致的问题。

然后使用Linq的Group By方法,做分组。

此处重点在于前面,将列No做为主键,就可以用来查找对应的第一条记录和最后一条件,其中对应的No分别是Min和Max。

基本上这样,就大功告成了,快去试试吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK