楼主: littleDreamX
4015 3

[程序化交易] 如何突破行情Tick接收的限制. [推广有奖]

  • 0关注
  • 4粉丝

本科生

2%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0
学术水平
10 点
热心指数
15 点
信用等级
5 点
经验
701 点
帖子
36
精华
0
在线时间
34 小时
注册时间
2016-4-11
最后登录
2018-5-22

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在商品期货高频交易策略中, Tick行情的接收速度对策略的盈利结果有着决定性的影响但市面上大多数交易框架,都是采用回调模式的机制, onBar/onTick, Tick不漏掉就不错了, 为什么呢?因为onBar/onTick函数里面,你要处理一整遍代码逻辑,很浪费时间, 不管你愿不愿意,你的策略逻辑必须被打断,必须采用状态机的模式,比如:

  1. var state = STATE_IDLE;
  2. function onTick() {
  3.     if (state == STATE_IDLE) {
  4.         // do something...
  5.     } else if (state == ....) {
  6.         // do something
  7.     }
  8. }
复制代码



BotVS没有采用这种落后的回调机制, 而是采用了不打断策略逻辑的main函数入口机制, 让用户可以更自然的控制策略流程,
用C++与Golang做为稳定的策略低层,策略上层用Javascript/Python处理逻辑问题, 不要说脚本语言速度慢,
除非你用它来做神经网络训练, 就算用神经网络训练, 加入Jit热编译后,他在任何场合都够用的了, Chrome秒IE十条街就是例子.
结合事件触发机制,同样的也能使策略在第一时间最快的速度处理行情, 入门级的策略这里就不再写了, 就以期货高频Tick的合成来说,
比如我们连接一个期货公司, 只能收到这个期货公司的行情, 我们接收行情的速度跟质量也跟自己的网络有关系,
跟期货公司前置机的负载也有关系,那么,怎么样才能做到更快的获取更准确的期货Tick数据呢。

在BotVS的策略模型下,你很容易就能操作N家不同期货公司的账户,并把他们的行情,融合处理,以最快的速度下单,
正常情况下,我们最多可以从期货公司拿到两个Tick每秒, 但通过融合行情的技术,以MA801为例,我们可以拿到最多一秒6次不重复的Tick

图1

废话不多说,直接上代码(此代码只能实盘,不能回测, 如果您不用BotVS可以只参考原理):

实盘添加交易所时,可以添加N个期货公司,进行行情的并发融合处理. 这里暂时添加两个, 演示说明:

代码如下:


  1. function main() {
  2.     Log("准备连接交易所并订阅行情")
  3.     // Step 1: 全部期货前置机都开始订阅品种
  4.     _.each(exchanges, function(e) {
  5.         // 等待连接上交易所, 是的, 策略是 365 天不间断运行的, 休盘了也可以运行, 而且不是事件回调的逻辑
  6.         while (!e.IO("status")) Sleep(1000);
  7.         // 利用_C重试函数排除网络错误, 刚刚连上交易所就订阅行情, 可能会出现CTP未准备好的错误
  8.         _C(e.SetContractType, "MA801")
  9.         // 切换行情接收模式为立即返回模式而非事件触发模式, 可参考API文档
  10.         e.IO("mode", 0)
  11.     })
  12.     Log("开始融合数据...")
  13.     // Step 2: 重要的地方开始了
  14.     var preVolume = 0
  15.     while (true) {
  16.         var ts = new Date().getTime()
  17.         // 任何一个交易所有tick事件发生时就返回
  18.         var ret = exchange.IO("wait_any")
  19.         // 合适的时间重置Volume
  20.         if (ret.Nano/1000000 - ts > 60000) {
  21.             preVolume = 0
  22.         }
  23.         // 定位到发生事件的交易所
  24.         var e = exchanges[ret.Index]
  25.         // 获取行情, 之前切换过事件模式为立即返回, 所以这里返回的是刚更新的行情, 而且GetTicker不会失败
  26.         // 只显示成交量递增的Tick, 实际过程,不用比较,只用处理就可以了.
  27.         var ticker = e.GetTicker()
  28.         if (ticker.Volume >= preVolume) {
  29.             Log(ret, ticker.Last, ticker.Volume)
  30.             preVolume = ticker.Volume
  31.         }
  32.     }
  33. }
复制代码


效果如下:

可以看到21:24:44秒的时候第一个期货公司的数据比第二个先到, 添加两个期货公司就看出来效果了,如果添加5个以上期货公司一起融合
那么你基本上没有漏Tick的可能, 如果用来开发高频交易策略,你已经解决了很重要也是决定性的一步,Tick接收的速度以及稳定性.

经测试,郑商所的tick 1秒内是可有多个数据的,上期和大商限制在了固定2个。所以郑商所的品种是可以拿到1秒2个以上的tick 数据的。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Tick TIC Javascript something exchanges 商品期货 CTP 程序化交易

沙发
isoiso 在职认证  发表于 2018-12-24 20:40:53 |只看作者 |坛友微信交流群
百度“财富通数据中心”哪里有高频数据,tick数据,全息数据,逐笔成交明细,逐笔成交,

股票逐笔数据,分笔数据,50ETF期权,商品期权,期货tick,国债期货,股指期货tick,股票

数据,股票tick,期货数据,tick,股指期货数据,股票历史数据,期货历史数据,上市

公司专业财务数据,外盘期货数据,外汇数据,上海黄金交易所数据,港股数据,大连五档

分笔tick,中金所五档,1分钟数据,一分钟数据,五分钟数据,5分钟数据。

使用道具

藤椅
yixiao_ph 发表于 2018-12-25 09:22:52 |只看作者 |坛友微信交流群
好东西一定要顶

使用道具

板凳
nickchen 发表于 2018-12-27 16:43:53 |只看作者 |坛友微信交流群
做高频 估计数据源速度是大问题的

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 17:43