美文网首页
QDII转换机工作汇总

QDII转换机工作汇总

作者: ColdRomantic | 来源:发表于2017-04-07 17:59 被阅读145次

    <center><h1>QDII转换机工作汇总</h1></center>
    <p align="center">孙权 2017-03-21 17:35:12</p>

    [TOC]

    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
    问题分析:

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

      const char* getFundName(int a)  
    

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

       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\

    相关文章

      网友评论

          本文标题:QDII转换机工作汇总

          本文链接:https://www.haomeiwen.com/subject/dyqgittx.html