1 概述

  目前,我主要负责QDII的报盘,涉及证券代码的资讯、行情、交易报盘等任务。
操作手册《QDII操作手册-转换机部分.docx》 1 、设计文档 2。清单如下:

  • qdii_archivehq (境外行情归档境外业务日期自动切换)
  • qdii_baseinfo (一系列彭博行情文件转换任务)
  • qdii_fix (FIX转换任务)
  • qdii_futhsfix (境外FIX期货报盘)
  • qdii_hsfix (恒生FIX转换任务)
  • qdii_realhq (彭博实时行情任务聚源行情转换任务)
  • qdii_reuterhq (路透Xtra3000行情转换)
  • qdii_spfut (境外统一期货委托境外统一期货成交境外统一期货行情)

下面有 的任务需要代码走读。

2 转换任务逻辑

境外行情归档/ 境外业务日期自动切换

境外行情归档
首次启动检查境外非期货市场是否有历史行情(tstockinfo每个市场只保留一天的行情数据),有历史行情则进行行情填充(sp_qdii_makeup_stockinfo)。
然后任务一直检查是否有市场闭市,然后执行行情归档操作(sp_qdii_market_store)
境外业务日期自动切换
线程1 负责循环调用存储过程:sp_qdii_marketbusintrance(根据市场和品种进行业务日期的切换)
线程2 负责循环调用存储过程:sp_qdii_businentrancefuture(期货基金业务初始化)

FIX转换任务 √

功能:
(1) 负责进行境外股票、期货的委托报送,确认和成交
(2) 支持合笔与分笔委托报单
参考文档:《FIX转换机详细设计.docx》

恒生FIX转换任务

  逻辑与《FIX转换任务》类似。
区别:FIX转换任务调用的是appia.dll收发FIX报文,恒生FIX转换机采用的是HSFIX引擎。

注意:HSFIX执行路径不能含中文,否则启动会报错,报错截图详见QDII操作手册1

境外FIX期货报盘

逻辑和《HSFIX转换机》类似,只是调用的后台服务不同。

境外统一期货报盘(含委托、成交、行情) √

目前支持香港SP柜台。
详见《SharpPoint报盘详细设计.docx》2

彭博资讯文件导入(10个)√

逻辑:IniVar(Load)→Parse→CheckData→Import,主要更新的表:tstockinfo,tstockmarketinfo,thisstockinfo
(1)加载基础数据,初始化数据库连接;
(2)Parse从csv文件中读取一行数据;
(3)CheckData对该行记录做合法性检查(长度、类型等),然后进行数据处理;
(4)Import拼接SQL并执行。
下面仅以“彭博期货信息”导入任务为例展开。

Task 导入的表
境外证券信息导入 tstockinfo,tstockmarketinfo,thisstockinfo,treutersstockinfo
境外收盘行情导入 tstockinfo,tstockmarketinfo
境外外汇信息导入 tcurrencyrate(币种汇率表)
境外股本信息导入 tstockinfo,tstockmarketinfo
境外债券评级导入 (待作废) tbondproperty
彭博债券信息导入 tstockinfo,tstockmarketinfo,thisstockinfo,tbondproperty
境外期货信息导入 treutersstockinfo,tstockinfo,thisstockinfo,
tstockmarketinfo,TFUTURESINFO,TQDIIFUTURESINFO
路透DSS公司行为数据导入 treuterscorpactioninfo
彭博公司行为数据导入 tbloombergcorpactioninfo

实时行情任务(3个)√

彭博实时行情任务
  主要通过Bloomberg DesktopAPI的库,向彭博终端订阅实时行情。
回调接口SessionProcessEvent来接收事件消息、实时行情,并放入行情队列hqMemoData。
行情刷新线程调用服务svc_qdiirealhq,刷新后台实时行情。

接口文档:Documents\D9.接口文档\01.QDII基础数据接口\bloomberg\B1.彭博 Desktop API

路透Xtra3000行情转换:
  主要通过Reuter的rtx实时行情库,先查询stockinfo中境外市场的代码,然后按照代码订阅路透的实时行情AdxRtList.RegisterItems(stockcode),同样调用svc_qdiirealhq服务来刷新实时行情。

接口文档:Documents\D9.接口文档\01.QDII基础数据接口\Reuters\R2.路透Xtra3000行情

聚源行情转换任务
  通过读取dbf来获取实时行情,目前仅支持港股的实时行情。同样调用svc_qdiirealhq服务来刷新后台实时行情。

导入样例文件:HKQuotes.dbf

后台服务 (svc_qdiirealhq、svc_qdii_blcoaction) √

**实时行情服务:**svc_qdiirealhq
 逻辑:前台传入 | 分隔的批量行情数据包,服务每次解析一条,根据前台传入标志isSaveToDB=0, 则把行情写入共享内存ChangeStockHq(); 否则调用RefreshDBStkInfo()更新数据库行情(更新停牌标志和涨跌停价格),主要更新的表:tstockinfo,tstockmarketinfo。

**公司行为:**svc_qdii_blcoaction svc_qdii_singlecoac
 svc_qdii_blcoaction: 支持导入的彭博公司行为数据类型:配股、红利、红股、股份拆分。
逻辑:该服务每次处理一条公司行为数据,然后插入(或更新)到tcorpactioninfo表中。
 svc_qdii_singlecoac: 支持的Reuter公司行为数据类型:红股、红利、红利选择、资本回报、股份拆分、股份合并、派送红股、配股。
逻辑:和svc_qdii_blcoaction类似。

3 小工具

FIX回报重演工具(Fixrep)

Description:
  一个模拟券商:主要通过读取 Appia Engine 的日志数据,然后接收appia engine 发送的委托数据,和日志中的委托数据进行对比,匹配成功则发送对应的执行报告。
实现逻辑: 参考文档:《FIX回报重演设计方案.docx》2

SVN: \QDII\trunk\developtools\Fixrep
Doc: \QDII\trunk\developtools\Fixrep\FIX回报重演工具使用说明.pdf

FixSimulator模拟成交工具

Description:
  FIX模拟成交工具:支持恒生FIX转换机、FIX转换机。

SVN: \QDII\trunk\developtools\FixSimulator
Doc: \QDII\trunk\developtools\FixSimulator\README.pdf

FIX日志解析工具

Log Analysis

彭博SAPI行情下载工具(or XLSX模板获取)

彭博SAPI行情工具需要客户购买彭博的SAPI接口才能使用;如果没有购买,就采用Excel模板通过彭博Excel插件来获取资讯和行情数据。
彭博SAPI行情使用请参考《彭博取数工具操作手册.docx》3
XLSX模板

svn路径:Install\BloombergExcel导出模板

4 UFX/EI交易

EI交易服务

EI作用是在ASAR外面再封装一层,给HS内部其他系统,可以用功能号的方式调用。

UFX交易服务

5 问题分析

以下是我解决或遇到的几个问题,个人觉得比较有意思,和大家分享一下,希望能有帮助。
(1)头文件未引用(source:lizp
问题分析:

能够正常编译和运行(编译时会有警告)

1
  const char* getFundName(int a)  

如果不包含头文件,会生成缺省的定义

1
   int getFundName(int a) 

如果在64位的机器上运行,当函数返回一个大于32位的指针时,高位就会被截断,从而导致程序崩溃。

建议:正确包含头文件,且不要有头文件的循环引用。
(2)关于文件编码的问题(source:wangpx

我们后台服务源代码统一编码是gb2312,如果不统一,编译的时候,会报一些结构体成员不存在等一些奇怪的问题。

(3)变量多次定义的问题(source:sunquan)
sqlca头文件里面使用了一个全局变量,当工程加入cpp文件时,编译时就会报重复定义。

C语言里面:同一个变量多处(同一个文件或多个文件)允许重复声明,但是最多只能有一次定义。
C++同一个文件有多处声明,在编译期报错;声明分散在多个文件,每个文件最多一个,则链接为SO时报错。

解决办法:CPP头文件引用前定义一个宏,当在cpp文件编译的时候,该全局变量在宏展开的时候会加上extern。

6 其他

NYFIX对接相关

NYFIX网络的对接、券商的测试流程,参考文档《NYFIX对接分享.pptx》4
开发自测可采用上面提到的 FIX模拟成交
使用引擎的启动参考脚本如下:(内含手册)

自测引擎Bat启动脚本在:svn:developtools\Appia引擎-模拟成交配置
和nyfix上的券商做测试bat: Install\NYFIX\Nyfix公司券商测试

测试用例模板:

Broker FIX Test scripts(Template2016).xlsx svn路径:Documents\QDII券商测试-2016

ASAR相关问题排查思路

一般中间件的常见问题是: 比如AS服务起不来?
检查:一般升级完AS服务,需要用asar用户执行命令:

fundcfgtool ~/bin/ ~/workspace/

一般思路:
A 如果是所有服务都启动超时
一般是环境配置的问题,查看日志具体分析: trade.log/as_fund_n.log(n表示具体的数字)

注意: 首次安装完系统,需要用集成工具更新hstrade.ini中的加密串。
加密串获取: select * from hsuserpassword where l_user_type=5 (l_user_type=5 供后台服务使用)

B 如果是个别服务起不来
检查消息中心是否已经成功启动。如果已启动,再根据对应的日志,看是什么错误。
经常出现Oracle库下面的xxx.so找不到,但是locate又能查到这个so,这时候检查asar用户是否有访问该so的权限即可。

其他

如果后续有新增转换任务,请同步在文档**《QDII操作手册-转换机部分.docx》**中补充对应的操作文档。

本次培训的所有文档将上传至svn:Documents\D6.培训资料\07.QDII功能\转换机_交接内容[孙权]

参考文档

《QDII报盘详细设计.docx》
《SharpPoint报盘详细设计.docx》
……
svn:Documents\D2.Designs\05.模块设计\01.转换机(报盘&行情)\02.报盘\


  1. 《QDII操作手册-转换机部分.docx》→svn:Documents\D4.Manuals\03.境外投资系统操作手册 ↩︎ ↩︎

  2. 转换机设计文档: ↩︎ ↩︎ ↩︎

  3. 《彭博取数工具操作手册.docx》 →svn:Install\Bloomberg\ ↩︎

  4. 《NYFIX对接分享.pptx》 →svn:Documents\D9.接口文档\00.FIX接口\02.Appia\ ↩︎