【转】编译quickfast解析库(沪深level2行情转码库)
编译quickfast解析库(沪深level2行情转码库)
为了方便大家编译和使用QuickFast库,我在GitHub上放置了一个v1.4版本的构建环境:
https://github.com/imharrywu/quickfast
包括了预编译的依赖库(boost, xcerces) 以及工程管理的MPC, 同时生成了一个预编译的库在Output\Release下。
说明一下,对1.4的构建环境稍作了修改:
1,使用MPC4.1,因为需要boost_system
2,全部使用了动态库,官方编译的时候,只有boost_thread使用动态库,感觉不太协调,所以统一全部是动态库.
3,需要boost_date_time, boost_chrono等。
详细步骤请直接看GitHub上的README.md
1) 下载源代码
下载quickfast项目(windows平台):
http://quickfast.googlecode.com/files/quickfast_win_src_1_4.zip
公布一个QQ群:229609210 同行们可以申请加入一起讨论。
2) 下载第三方库和配置脚本
2.1) 下载activeperl
(google it)
2.2) 下载mpc
http://www.ociweb.com/products/mpc
2.3) 下载boost
(google it)
2.4) 下载xerces
http://xerces.apache.org/xerces-c/
2.5) 配置脚本
下载 行情转码库的配置脚本setup.bat(gif文件另存为zip,解压可以得到bat文件)
http://hi.csdn.net/attachment/201112/13/0_1323743665laAL.gif
setup.bat配置脚本设置三方库路径和编译器选项
- @REM 1) Customize this file by setting variables to suit your environment
- @REM 2) Also you should customize QuickFAST.features to enable particular features on your system.
- @REM 3) Delete the following line when you finishing customizing this file.
- @REM [==DELETED==]echo See remarks in %0 for information about setting your build environment
- @REM 4) And, then run the `m.cmd' to generate *.sln & *.vcproj files
- @echo off
- REM =====================================================================================
- REM EDIT THE FOLLOWING LINES OR SET THESE VALUES IN YOUR ENVIRONMENT BEFORE RUNNING SETUP
- if "a" == "a%MPC_ROOT%" set MPC_ROOT=H:\workspace\qf\MPC
- if "a" == "a%XERCES_ROOT%" set XERCES_ROOT=H:\workspace\qf\xerces-c-3.1.1-x86-windows-vc-8.0
- if "a" == "a%XERCES_LIBNAME%" set XERCES_LIBNAME=xerces-c_3
- if "a" == "a%BOOST_VERSION%" set BOOST_VERSION=boost_1_47_0
- if "a" == "a%BOOST_ROOT%" set BOOST_ROOT=H:\workspace\qf\%BOOST_VERSION%
- REM END OF VALUES TO BE SET
- REM =====================================================================================
注意:boost默认编译出来的include和lib不在同一个目录下,需要move一下。
3) 生成项目文件
在vc的命令行下,运行这个setup.bat && m.bat就可以生成QuickFast.sln
4) 编译生成QuickFast库
用vs2008打开QuickFast.sln编译连接,生成的文件在Output目录的相应配置文件夹下。
5) 样例程序文档
这个解决方案提供了很多例子,最简单的是TutorialApplication和InterpretApplication这2个例子。
也可以用doxygen生成文档。
http://hi.csdn.net/attachment/201112/26/0_1324861393eteG.gif
6) 行情解码例子程序
楼主用Codecs::SynchronousDecoder(同步解码器,官方例子使用的是异步解码器) 实现了一个简单的解码封装DLL,通过tcp socket从上游数据源获取fast的码流并且解码。
同行们你们主要参考 RunDecoderLoop(...)函数内部的行情解码步骤
这个dll的其他代码都可以忽略, 主要关注 《第七节 行情解码的几个主要步骤》 的内容。
这个例子是一个dll库,导出了一个API,这个API以市场代码等为参数(上海市场解码,或者深圳市场解码),开始各个市场的解码。
同时这个API接受一组回调接口来通知数据消费者来处理解码后的行情数据, 参看 IDataExInterface 定义。
建议大家把2个市场的解码放在2个线程里面,最好分别在2个机房里面。
FAST码流是剥掉了STEP协议头以后STEP协议BODY部分用FAST编码过的内容。
Fast_Steam = Fast(STEP_PACKET -STEP_HEAD) =Fast(STEP_BODY)
导出库的头文件
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- enum MarketTag
- {
- ShenzhenMarket = 0,
- ShanghaiMarket = 1,
- };
- struct IDataExInterface /*解码以后的数据通过接口中的pNotify接口来通知客户端更新数据*/
- {
- void (__stdcall * pfnFeedStatus)(ConnectionStatus connStatus);
- // 上海的行情数据通知接口
- void (__stdcall * pfnFeed_SHFAST30_UA3202)(const SHFAST30_UA3202_t * );
- void (__stdcall * pfnFeed_SHFAST30_UA3201)(const SHFAST30_UA3201_t * );
- void (__stdcall * pfnFeed_SHFAST30_UA3113)(const SHFAST30_UA3113_t * );
- // 深圳的行情数据通知接口
- void (__stdcall * pfnFeed_SZFAST_103)(const SZFAST_103_t *);
- void (__stdcall * pfnFeed_SZFAST_202)(const SZFAST_202_t *);
- void (__stdcall * pfnFeed_SZFAST_201)(const SZFAST_201_t *);
- void (__stdcall * pfnFeed_SZFAST_104)(const SZFAST_104_t *);
- };
- FASTDECODER_API
- int RunDecoderLoop(const char * pIp
- , unsigned short nPort
- , MarketTag nMarketTag
- , const char * templateFileName
- , const struct IDataExInterface * pNotify
- );
- #ifdef __cplusplus
- };
- #endif
客户端可以这样调用DLL
- void Level2Thread(void * arg) // 把各个市场的解码放在各自的线程里面
- {
- MarketTag nMarketTag = static_cast<MarketTag>((int)arg);
- IDataExInterface * pNotify = new IDataExInterface;
- memset(pNotify, 0, sizeof(IDataExInterface));
- pNotify->pfnFeedStatus = FeedStatus; // 用于报告解码状态的回调
- switch (nMarketTag)
- {
- case ShenzhenMarket:
- {
- SetThreadAffinityMask(GetCurrentThread(), 1);
- pNotify->pfnFeed_SZFAST_103 = Feed_SZFAST_103;
- pNotify->pfnFeed_SZFAST_104 = Feed_SZFAST_104;
- pNotify->pfnFeed_SZFAST_201 = Feed_SZFAST_201;
- pNotify->pfnFeed_SZFAST_202 = Feed_SZFAST_202;
- RunDecoderLoop( // 在该线程里面开始深圳市场解码
- "127.0.0.1", 1111
- , MarketTag(ShenzhenMarket)
- , ".\\fasttemplates_2.00.xml"
- , pNotify);
- } break;
- case ShanghaiMarket:
- {
- SetThreadAffinityMask(GetCurrentThread(), 2);
- pNotify->pfnFeed_SHFAST30_UA3113 = Feed_SHFAST30_UA3113;
- pNotify->pfnFeed_SHFAST30_UA3201 = Feed_SHFAST30_UA3201;
- pNotify->pfnFeed_SHFAST30_UA3202 = Feed_SHFAST30_UA3202;
- RunDecoderLoop( // 在该线程里面开始上海市场解码
- "127.0.0.1", 2222
- , MarketTag(ShanghaiMarket)
- , ".\\template.2.03.xml"
- , pNotify);
- } break;
- }
- return ;
- }
- /**
- *
- * 简单的开启两个市场的解码线程开始解码,
- * 导出函数RunDecoderLoop是一个循环解码的阻塞调用过程,
- * 所以放在2个独立的线程中。
- *
- **/ int main(int argc, char* argv[])
- {
- _beginthread(Level2Thread, 0, (void *)ShanghaiMarket);
- _beginthread(Level2Thread, 0, (void *)ShenzhenMarket);
- printf("Press any key to quit decoder.\n"); getchar();
- return 0;
- }
7) 行情解码的几个主要步骤
用Codecs::SynchronousDecoder解码fast的几个重要步骤
7.1) 构造xml解析对象
- /************************************************************************
- *
- * 全局的xml解析类
- *
- * 注意: 多线程同时构造parser会资源冲突
- *
- *
- ************************************************************************/
- static Codecs::XMLTemplateParser parser;
7.2) 解析xml模板生成fast模板
- /////////////////////////////////////////////
- // Parse the templates from the template file
- // errors are reported by throwing exceptions
- // which are caught below.
- std::ifstream tmplFile(templateFileName, openMode);
- Codecs::TemplateRegistryPtr registry;
- try {
- registry = parser.parse(tmplFile);
- }catch (std::exception & e){
- std::cerr << e.what() << std::endl;
- return -1;
- }
7.3) 创建一个decoder对象
- //////////////////////////////////////
- // Create a sync decoder and
- // setup attributes.
- Codecs::SynchronousDecoder * pDecoder
- = new Codecs::SynchronousDecoder(registry);
- pDecoder->setHeaderBytes(0);
- pDecoder->setResetOnMessage(false);
- pDecoder->setLimit(0);
7.4) 实现一个消息消费者,并且注册给解码器
- //////////////////////////////////////
- // Create an application object to use
- // the incoming data. In this case to
- // accept complete messages and interpret
- // them to standard out.
- CMessageConsumerImpl * pHandler
- = new CMessageConsumerImpl(nMarketTag
- , pNotify
- , pDecoder);
- //////////////////////////////////////
- // and use the interpreter as the consumer
- // of generic messages.
- Codecs::GenericMessageBuilder builder(*pHandler);
7.5) 开始解码
接收网络数据包(放置在pFastBody, 长度位nBodyLength)
- pDataSource = new Codecs::DataSourceBuffer(pFastBody , pFastHeader->nBodyLength);
- try{
- pDecoder->reset();
- pDecoder->decode(*pDataSource, builder);
- } catch (std::exception & e)
- {
- std::cout<<e.what()<<std::endl;
- }
- delete pDataSource;
- pDataSource = NULL;
7.6)实现消息消费者接口
- /// @brief A message consumer that attempts to produce a human readable version
- /// of a message that has been decoded by QuickFAST.
- class CMessageConsumerImpl : public Codecs::MessageConsumer
重写消费消息函数
- virtual bool consumeMessage(Messages::Message & message);
7.7) 消费消息的过程就是消息的格式化过程
在消息的格式化过程中,主要是遍历Message的各个filed,如果field是
一般类型,直接转换成相应的值;如果是sequence和group,则需要将
field转换成sequence和group,遍历;另外,由于sequence里面的每一个
item也是一个Message结构,所以需要以Message的方式遍历结构的每一个成员;
- foreach(item in seq)
- foreach(member in item)
7.8) 输出
8) 资源下载
=========================================================================
项目源文件下载
(将下面的gif链接另存为zip,解压->重命名->解压,有加密,确实有需要的朋友请留言获取)
=========================================================================
最新版本
version 2.0,修改了日志打印方式和配置文件加载quickfast-v2-[8n0].zip.png
http://hi.csdn.net/attachment/201112/27/0_132498087296Py.gif
历史版本
version 1.0,项目源文件Examples-8n0.zip
http://hi.csdn.net/attachment/201112/26/0_132486187064m4.gif
【转】编译quickfast解析库(沪深level2行情转码库)的更多相关文章
- [python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上
将沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上 原理:python读取前一次处理完的计算5日后涨跌幅输出的csv文件 文件名前加"[paint]" 安照通达信的画图文件和板 ...
- [python]沪深龙虎榜数据进一步处理,计算日后5日的涨跌幅
沪深龙虎榜数据进一步处理,计算日后5日的涨跌幅 事前数据: 前面处理得到的csv文件 文件名前加入“[wait]”等待程序处理 python代码从雅虎股票历史数据api获取数据,计算后面5日的涨跌幅 ...
- [python]数据整理,将取得的众多的沪深龙虎榜数据整一整
将昨日取得的众多的沪深龙虎榜数据整一整 提取文件夹内所有抓取下来的沪深龙虎榜数据,整理出沪深两市(含中小创)涨幅榜股票及前5大买入卖出资金净值,保存到csv文件 再手动使用数据透视表进行统计 原始数据 ...
- [python]初试页面抓取——抓取沪深股市交易龙虎榜数据
[python]抓取沪深股市交易龙虎榜数据 python 3.5.0下运行 没做自动建立files文件夹,需要手动在py文件目录下建立files文件夹后运行 #coding=utf-8 import ...
- window10(64bit)+VS2010编译ACE_TAO源码库
1.下载 ACE+TAO下载地址:http://download.dre.vanderbilt.edu/previous_versions/ VS2010下载地址:https://pan.baidu. ...
- python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间
最近开始玩股票量化,由于想要做完整的股票回测,因此股票的上市和退市信息就必不可少.因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧.所以我们要把沪深全部股票的上市时间.退市时间全部都爬下 ...
- 高级C/C++编译技术之读书笔记(三)之动态库设计
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 高级C/C++编译技术之读书笔记(四)之定位库文件
最近有幸阅读了<高级C/C++编译技术>深受启发,该书深入浅出地讲解了构建过程(编译.链接)中的各种细节,从多个角度展示了程序与库文件或代码的集成方法,提出了面向代码复用和系统集成的软件架 ...
- 【VS工程设置】 编译动态库,命令行添加参数,不使用预编译头,指定该项目链接 哪种 运行库
编译动态库 注意: 动态库: [目标文件扩展] => .dll + [配置类型] => 动态库(.dll) 静态库: [目标文件扩展] => .lib + [ 配置类型]=> ...
随机推荐
- Caché数据库学习笔记(4)
目录 DeepSee的使用 数据.方法等的导入与导出 ======================================================== ================ ...
- 在centos6.5中安装scp和lrzsz
简介 scp用于在两台centos中传输文件用的,lrzsz用于在xshell上传输本地文件到远程centos服务器上用的 1.安装scp [root@localhost ~]# scp -ba ...
- Ubuntu 16.04.1下修改MySQL默认编码
在Ubuntu 下配置 MySQL 的字符编码.安装完 MySQL 后,系统默认的字符编码是 latin1 ,输入的是中文,可是输出却是一堆乱码.现在要做的就是把 MySQL的默认字符编码设置为支持中 ...
- web字体详解@font-face
一:字体的下载(http://www.dafont.com/new.php) 二:选择需要的字体并下载( Download ) 三:下载后并解压 四:获取@font-face所需要字体的格式.eot, ...
- iOS开发Swift篇—(十)方法
iOS开发Swift篇—(十)方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开头 ( ...
- 省常中模拟 day2
第一题: 题目大意: 有mn颗糖,要装进k个盒子里,使得既可以平均分给n个人,也可以平均分给m个人. 求k的最小值. 解题过程: 1.先看一组小数据(13,21).那么根据贪心的原则很容易想到先拿13 ...
- Android之View和SurfaceView
Android之View和SurfaceView Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三 ...
- Java read txt file
package com.Yang; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;i ...
- android_permission权限大全
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...
- jQueryMobile控件之页面切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...