# 风控系统部署手册
版本|日期|作者|备注
----|----|----|---
0.0.1|2020-09-30||初始版本编写
## 1 简介
本文档是主要是介绍风控系统环境配置和风控系统安装的便捷手册. 分为:
+ 系统依赖环境部署
+ 上账系统部署
+ 上交所系统部署
+ 深交所系统部署
等三部分组成。在进行系统配置前,请为创建一个 __`rishon`__ 并为该用户开通 __`su`__ 权限,以便后续软件包的安装及其系统配置文件的创建和修改。
## 2 系统环境部署
系统环境部署是指风控系统运行时,所依赖的系统库,软件库等。主要有
+ gcc-7.5.0+
+ boost 1.65.1
+ odbc and msodbcsql17
+ python3.6.8 及第三方库aiohttp
+ other tools
## 3 gcc-7.5.0
由于 __redhat 7__ 内置的 __gcc__ 版本为 __4.8.5__。由于风控系统采用了新版的 c++11/c++14/c++17 进行开发。__gcc-7.5.0__ 是一个较为全面支持c++17. 建议 gcc 通过源码安装,且版本 __最低__ 为 __gcc-7.5.0__
__Table 2.1: gcc-7.5.0 所依赖的库和软件表__
name|package name|download url|description
----|-----------|------------|-----------
m4|m4-1.4.16-10.el7.x86_64.rpm|[m4下载](http://mirror.centos.org/centos/7/os/x86_64/Packages/m4-1.4.16-10.el7.x86_64.rpm)|编译 __gmp__ 依赖
gmp|gmp-6.2.0.tar|源码安装,压缩包已提供|gcc源码编译前需要安装
mpfr|mpfr-4.1.0.tar.bz2|源码安装,压缩包已提供|gcc源码编译前需要安装
mpc|mpc-1.2.0.tar.gz|源码安装,压缩包已提供|gcc源码编译前需要安装
isl|isl-0.16.1.tar.bz2|源码安装,压缩包已提供|gcc源码编译前需要安装
其中, __`gmp`__, __`mpfr`__ , __`mpc`__ 和 __`isl`__ 四个文件是通过源码安装。 如果系统可以联网,可直接在 gcc 目录下的执行:
```
[gcc-7.5.0]$ ./contrib/download_prerequisites
```
即可。另外,以上四个包, 详见压缩在文件 __`gcc-tmp.tar.bz`__。
### 3.1 install m4
__`m4`__ 是直接用提供的安装包进行安装,或者在命令行直接进行
```
yum install m4
```
### 3.2 gmp
```
[rishon@stsz141654 tool]$ ls
gcc-tmp.tar.bz
[rishon@stsz141654 tool]$ tar xvf gcc-tmp.tar.bz
gmp-6.2.0.tar
isl-0.16.1.tar.bz2
mpc-1.2.0.tar.gz
mpfr-4.1.0.tar.bz2
[rishon@stsz141654 tool]$ tar xvf gmp-6.2.0.tar
[rishon@stsz141654 tool]$ cd gmp-6.2.0/
[rishon@stsz141654 gmp-6.2.0]$ mkdir build
[rishon@stsz141654 gmp-6.2.0]$ cd build/
[rishon@stsz141654 build]$ ls
[rishon@stsz141654 build]$ ../configure
config.status: linking ../mpn/x86_64/aorrlsh_n.asm to mpn/rsblsh_n.asm
config.status: linking ../mpn/generic/add_n_sub_n.c to mpn/add_n_sub_n.c
config.status: linking ../mpn/x86_64/addaddmul_1msb0.asm to mpn/addaddmul_1msb0.asm
config.status: linking ../mpn/x86_64/pentium4/gmp-mparam.h to gmp-mparam.h
config.status: executing libtool commands
configure: summary of build options:
Version: GNU MP 6.2.0
Host type: pentium4-pc-linux-gnu
ABI: 64
Install prefix: /usr/local
Compiler: gcc
Static libraries: yes
Shared libraries: yes
[rishon@stsz141654 build]$ make -j20
[rishon@stsz141654 build]$ sudo make install
```
### 3.3 mpfr
```
[rishon@stsz141654 tool]$ tar xvf mpfr-4.1.0.tar.bz2
[rishon@stsz141654 tool]$ cd mpfr-4.1.0/
[rishon@stsz141654 mpfr-4.1.0]$ ls
acinclude.m4 AUTHORS compile configure COPYING.LESSER examples ltmain.sh Makefile.in NEWS src TODO VERSION
aclocal.m4 BUGS config.guess configure.ac depcomp INSTALL m4 missing PATCHES test-driver tools
ar-lib ChangeLog config.sub COPYING doc install-sh Makefile.am mpfr.pc.in README tests tune
[rishon@stsz141654 mpfr-4.1.0]$ mkdir build
[rishon@stsz141654 mpfr-4.1.0]$ cd build/
[rishon@stsz141654 build]$ ../configure
[rishon@stsz141654 build]$ make -j20
[rishon@stsz141654 build]$ sudo make install
```
### 3.4 mpc
```
[rishon@stsz141654 tool]$ tar xvf mpc-1.2.0.tar.gz
[rishon@stsz141654 tool]$ cd mpc-1.2.0/
[rishon@stsz141654 mpc-1.2.0]$ mkdir build
[rishon@stsz141654 mpc-1.2.0]$ cd build
[rishon@stsz141654 build]$ ../configure
[rishon@stsz141654 build]$ make -j20
[rishon@stsz141654 build]$ sudo make install
```
### 3.5 isl
```
[rishon@stsz141654 tool]$ tar xvf isl-0.16.1.tar.bz2
[rishon@stsz141654 tool]$ cd isl-0.16.1/
[rishon@stsz141654 isl-0.16.1]$ mkdir build
[rishon@stsz141654 isl-0.16.1]$ cd build
[rishon@stsz141654 build]$ ../configure
configure: creating ./config.status
config.status: creating Makefile
config.status: creating doc/Makefile
config.status: creating bound_test.sh
config.status: creating codegen_test.sh
config.status: creating pip_test.sh
config.status: creating isl_config.h
config.status: executing depfiles commands
config.status: executing libtool commands
config.status: executing include/isl/stdint.h commands
config.status: creating include/isl/stdint.h : _ISL_INCLUDE_ISL_STDINT_H
config.status: executing isl.pc commands
config.status: creating isl.pc.in
config.status: creating isl.pc
config.status: creating isl-uninstalled.pc
config.status: creating isl-uninstalled.sh
[rishon@stsz141654 build]$ make -j20
[rishon@stsz141654 build]$ sudo make install
```
### 3.6 gcc
```
[rishon@stsz141654 tool]$ tar xvf gcc-7.5.0.tar.bz2
[rishon@stsz141654 tool]$ cd gcc-7.5.0/
[rishon@stsz141654 mpc-1.2.0]$ mkdir build
[rishon@stsz141654 mpc-1.2.0]$ cd build
[rishon@stsz141654 build]$ ../configure --prefix=/usr/local/gcc7 --enable-languages=c,c++,go --disable-multilib
[rishon@stsz141654 build]$ make -j20
[rishon@stsz141654 build]$ sudo make install
```
大概编译20分钟左右。可以把 __`/etc/local/lib`__ , __`/etc/local/gcc7/lib64`__ 和 __`/etc/local/lib64`__ 加到 __`/etc/ld.so.conf`__ 里面, 并执行
__`su ldconfig`__.
## 4 boost 1.65.1
```
[rishon@stsz141654 tool]$ tar xvf boost 1.65.1.tar.gz
[rishon@stsz141654 tool]$ cd boost 1.65.1/
[rishon@stsz141654 boost 1.65.1]$ ./bootstrap.sh
[rishon@stsz141654 boost 1.65.1]$ ./b2 -j20
[rishon@stsz141654 boost 1.65.1]$ sudo ./b2 install
```
## 5 odbc and msodbcsql
odbc 和 msodbcsql 以下载安装包为主。 [下载路径](https://packages.microsoft.com/rhel/7/prod/)
+ [unixODBC-2.3.7-1](https://packages.microsoft.com/rhel/7/prod/unixODBC-2.3.7-1.rh.x86_64.rpm)
+ [unixODBC-devel-2.3.7-1](https://packages.microsoft.com/rhel/7/prod/unixODBC-devel-2.3.7-1.rh.x86_64.rpm)
+ [msodbcsql17-17.6.1.1](https://packages.microsoft.com/rhel/7/prod/msodbcsql17-17.6.1.1-1.x86_64.rpm)
依次安装
```
sudo yum install unixODBC
sudo yum install unixODBC
sudo yum install msodbcsql17
```
如果安装失败, 可进行强制安装
+ __`rpm -ivh unixODBC-2.3.1-14.el7.x86_64.rpm --force --nodeps`__ ,
+ __`rpm -ivh unixODBC-devel-2.3.1-14.el7.x86_64.rpm --force --nodeps`__,
+ __`rpm -ivh msodbcsql17-17.6.1.1-1.x86_64.rpm --force --nodeps`__
## 6 Python3.6.8
您可以选择熟悉的方式自行安装Python3.6.8 及第三方库aiohttp 。此外我们提供了一个方便的压缩包,目录结构如下,解压之后执行其中的install.sh 即可。
```
[root@stsz141654 tool]# tar -zxvf python3_rpm.tar.gz
python3_rpm/
python3_rpm/python3-3.6.8-13.el7.x86_64.rpm
python3_rpm/python3-libs-3.6.8-13.el7.x86_64.rpm
python3_rpm/python3-pip-9.0.3-5.el7.noarch.rpm
python3_rpm/python3-setuptools-39.2.0-10.el7.noarch.rpm
python3_rpm/install.sh
[root@stsz141654 tool]# cd python3_rpm/
[root@stsz141654 python3_rpm]#
[root@stsz141654 python3_rpm]# cat install.sh
#!/bin/bash
rpm -ivh *.rpm
python3 -m pip install -i http://stockmirrors.paic.com.cn/pypi/web/simple aiohttp --trusted-host stockmirrors.paic.com.cn
[root@stsz141654 python3_rpm]# bash install.sh
warning: python3-3.6.8-13.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:python3-libs-3.6.8-13.el7 ################################# [ 25%]
2:python3-pip-9.0.3-5.el7 ################################# [ 50%]
3:python3-setuptools-39.2.0-10.el7 ################################# [ 75%]
4:python3-3.6.8-13.el7 ################################# [100%]
WARNING: Running pip install with root privileges is generally not a good idea. Try `__main__.py install --user` instead.
Collecting aiohttp
Downloading http://stockmirrors.paic.com.cn/pypi/web/packages/7c/39/7eb5f98d24904e0f6d3edb505d4aa60e3ef83c0a58d6fe18244a51757247/aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl (1.2MB)
100% |████████████████████████████████| 1.2MB 3.4MB/s
Requirement already satisfied: chardet<4.0,>=2.0 in /usr/local/lib/python3.6/site-packages (from aiohttp)
Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.6/site-packages (from aiohttp)
Requirement already satisfied: typing-extensions>=3.6.5; python_version < "3.7" in /usr/local/lib/python3.6/site-packages (from aiohttp)
Requirement already satisfied: idna-ssl>=1.0; python_version < "3.7" in /usr/local/lib/python3.6/site-packages (from aiohttp)
Requirement already satisfied: async-timeout<4.0,>=3.0 in /usr/local/lib/python3.6/site-packages (from aiohttp)
Collecting multidict<5.0,>=4.5 (from aiohttp)
Downloading http://stockmirrors.paic.com.cn/pypi/web/packages/1a/95/f50352b5366e7d579e8b99631680a9e32e1b22adfa1629a8f23b1d22d5e2/multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl (148kB)
100% |████████████████████████████████| 153kB 2.0MB/s
Collecting yarl<2.0,>=1.0 (from aiohttp)
Downloading http://stockmirrors.paic.com.cn/pypi/web/packages/a0/b4/2cbeaf2c3ea53865d9613b315fe24e78c66acedb1df7e4be4e064c87203b/yarl-1.5.1-cp36-cp36m-manylinux1_x86_64.whl (257kB)
100% |████████████████████████████████| 266kB 1.8MB/s
Requirement already satisfied: idna>=2.0 in /usr/local/lib/python3.6/site-packages (from idna-ssl>=1.0; python_version < "3.7"->aiohttp)
Installing collected packages: multidict, yarl, aiohttp
Successfully installed aiohttp-3.6.2 multidict-4.7.6 yarl-1.5.1
```
## 7 其他软工具
以下软件非必须, 建议安装
+ tree - list directroies and files
+ mlocate - locate files
+ lrzsz - send / recived tool
+ telnent - check port
+ htop - advanced top
+ sqlcmd - sql connect tool
+ tcpdump
## 7 配置odbc
### 7.1 查看 odbc 配置
用 __`odbcinst -j`__ 查看配置
```
[rishon@stsz141654 ~]$ odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/rishon/.odbc.ini
```
### 7.2 配置 odbc 驱动
__odbcinst.ini__
```
[rishon@stsz141654 ~]$ cat /usr/local/etc/odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.6.so.1.1
UsageCount=3
```
### 7.3 配置 odbc 数据源
__.odbc.ini__
```
[rishon@stsz141654 ~]$ cat /home/rishon/.odbc.ini
[counter]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_45499
[exchange]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_38971
[counter_cts]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_45488
[exchange_cts]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.248.20
Port = 1433
Database = oiw_38970
[uat_counter]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.236.34
Port = 1433
Database = oiw_46360
[uat_exchange]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.224.43
Port = 1433
Database = oiw_46360
[uat_counter_cts]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.236.34
Port = 1433
Database = oiw_41813
[uat_exchange_cts]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.232.157
Port = 1433
Database = oiw_41813
```
### 7.4 验证 odbc 数据源
```
[rishon@stsz141654 ~]$ isql -v counter sa Paic1234
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
```
## 8 risk_controller
风控系统的目录结构如下
```
[rishon@stsz141654 mom]$ tree
.
├── query
│ └── query_data
│ ├── bin
│ │ └── query_data_v0.1.1_2020_09_27
│ ├── data
│ │ ├── codes.txt
│ │ ├── cts-codes.txt
│ │ ├── sh
│ │ │ ├── asset.txt
│ │ │ ├── stk_info.txt
│ │ │ └── order.txt
│ │ └── sz
│ │ ├── asset.txt
│ │ ├── stk_info.txt
│ │ └── order.txt
│ └── query_data -> bin/query_data_v0.1.1_2020_09_27
└── soft
├── sh_risk_controller
│ ├── bin
│ │ └── sh_risk_controller_v1.1.1_2020_09_27
│ ├── conf
│ │ └── configs.json
│ ├── configs.json -> conf/configs.json
│ ├── data
│ │ ├── account.txt
│ │ ├── asset.txt
│ │ ├── order.txt
│ │ └── stk_info.txt
│ └── sh_risk_controller -> bin/sh_risk_controller_v1.1.1_2020_09_27
└── sz_risk_controller
├── bin
│ └── sz_risk_controller_v1.1.2_2020_09_27
├── binary_key
│ ├── 100101.key.txt
│ ├── 190007.key.txt
│ ├── 1.key.txt
│ ├── 200102.key.txt
│ ├── 200115.key.txt
│ ├── 290008.key.txt
│ ├── 2.key.txt
│ └── 6.key.txt
├── conf
│ └── config.json
├── config.json -> conf/config.json
├── data
│ ├── account.txt
│ ├── asset.txt
│ ├── order.txt
│ └── stk_info.txt
└── sz_risk_controller -> bin/sz_risk_controller_v1.1.2_2020_09_27
```
## 9 上账系统
目录结构为
```
[rishon@stsz141654 query_data]$ tree
.
├── bin
│ └── query_data_vX.X.X_YYYY_MM_DD
├── data
│ ├── codes.txt
│ ├── cts-codes.txt
│ ├── sh
│ │ ├── asset.txt
│ │ ├── stk_info.txt
│ │ └── order.txt
│ └── sz
│ ├── asset.txt
│ ├── stk_info.txt
│ └── order.txt
├── async_get_secu_info.py
└── query_data -> bin/query_data_vX.X.X_YYYY_MM_DD
```
上账系统分三大部分:
1. 股票列表信息():每天 __开市前拉取__ ,且当天只会在开市时 __拉取一次__。
2. 股票持仓(query_data): __盘中启动拉取__。
3. 未成交订单(query_data): __盘中启动拉取__。
上述 __1__ 部分提供了一个向行情API查询的脚本。
上述 __2__, __3__ 部分需要提供 __客户ID__ 列表的文件作为输入。
### 9.1 获取股票列表信息
__`async_get_secu_info.py`__ 为一个并发的http请求脚本,向客户指定的api查询当日股票的涨跌停价,交易量等信息,输出到文件中,供风控系统使用。
其帮助信息如下。
```
[root@redhat query_data]# python3 async_get_secu_info.py -h
usage: async_get_secu_info.py [-h] [--sz_output SZ_OUTPUT]
[--sh_output SH_OUTPUT]
URL_HQ
positional arguments:
URL_HQ example:
http://30.76.147.73:30078/JHQGateway/hq/request
optional arguments:
-h, --help show this help message and exit
--sz_output SZ_OUTPUT
output file path of stock list in SZ market, default:
./data/sz/stk_info.txt
--sh_output SH_OUTPUT
output file path of stock list in SH market, default:
./data/sh/stk_info.txt
```
一般不需要修改输出的文件路径。
必须要输入行情API的地址,示例:
```
[root@redhat query_data]# python3 async_get_secu_info.py http://30.76.147.73:30078/JHQGateway/hq/request
2020-09-15 17:36:42,573 async_get_secu_info.py [line:180] INFO start all stock query
2020-09-15 17:36:42,573 async_get_secu_info.py [line:189] INFO request code_list start with index 0
2020-09-15 17:36:42,685 async_get_secu_info.py [line:106] INFO request success : http://30.76.147.73:30078/JHQGateway/hq/request/56004, {'listRange': '0', 'attrMark':'0', 'orderField': '0', 'sort': '0', 'local': 0, 'reqSize': '5000'}
...
2020-09-30 15:44:08,482 async_get_secu_info.py [line:206] INFO finish all stock query
2020-09-30 15:44:08,482 async_get_secu_info.py [line:208] INFO start write output to file
2020-09-30 15:44:08,499 async_get_secu_info.py [line:221] INFO finish writing file
2020-09-30 15:44:08,501 async_get_secu_info.py [line:227] INFO exit
```
### 9.2 持仓和未成交订单查询
持仓和未成交订单查询为盘中启动的时候执行。即盘中启动的时候先执行持仓和订单查询后,再执行相应的风控程序。
>bin 目录下有历史版本的二进制可执行程序。然后在项目目录下有一个 __`query_data`__ 的软连接指向该 __`bin/query_data_vX.X.X_YYYY_MM_DD`__ 的二进制文件。以便升级有问题时,__回退__ 到上一个稳定的 __历史版本__。
主要参数及其详情:
```
[rishon@stsz141654 query_data]$ ./query_data --help
usage: ./query_data [options] ...
options:
-h, --host host name (string [=10.25.229.151])
-p, --port port number (int [=9200])
-c, --codes user codes file (string [=./data/codes.txt])
-x, --cts_host host name (string [=10.25.163.162])
-y, --cts_port cts port number (int [=9100])
-z, --cts_codes cts user codes file (string [=./data/cts-codes.txt])
-d, --szasset sz asset file (string [=./data/sz/asset.txt])
-e, --shasset sh asset file (string [=./data/sh/asset.txt])
-f, --szorder sz uncomplete order file (string [=./data/sz/order.txt])
-j, --shorder sh uncomplete order file (string [=./data/sh/order.txt])
-k, --szstk user codes file (string [=./data/sz/stk_info.txt])
-l, --shstk user codes file (string [=./data/sh/stk_info.txt])
-g, --logger_level debug:1, info:2, warn:3, error:4, critical:5, off:6 (int [=2])
-u, --market_num 1-sz, 2-sh (int [=3])
-?, --help print this message
[rishon@stsz141654 query_data]$ ./query_data -?
usage: ./query_data [options] ...
options:
-h, --host host name (string [=10.25.229.151])
-p, --port port number (int [=9200])
-c, --codes user codes file (string [=./data/codes.txt])
-x, --cts_host host name (string [=10.25.163.162])
-y, --cts_port cts port number (int [=9100])
-z, --cts_codes cts user codes file (string [=./data/cts-codes.txt])
-d, --szasset sz asset file (string [=./data/sz/asset.txt])
-e, --shasset sh asset file (string [=./data/sh/asset.txt])
-f, --szorder sz uncomplete order file (string [=./data/sz/order.txt])
-j, --shorder sh uncomplete order file (string [=./data/sh/order.txt])
-k, --szstk user codes file (string [=./data/sz/stk_info.txt])
-l, --shstk user codes file (string [=./data/sh/stk_info.txt])
-g, --logger_level debug:1, info:2, warn:3, error:4, critical:5, off:6 (int [=2])
-u, --market_num 1-sz, 2-sh (int [=3])
-?, --help print this message
```
name|full name|short name|default value| description
----|---------|----------|-------------|-------------
极速IP地址|--host|-h|10.25.229.151|极速接口的IP地址,缺省值是 __10.25.229.151__,可在启动时命令行传入所需要的值
极速端口|--port|-p|9200|极速接口的端口,缺省值是 __9200__,可在启动时命令行传入所需要的值
极速的客户ID|--codes|-c|./data/codes.txt|极速客户代码列表文件路径,可在启动时命令行传入所需要的值。文件格式是一个客户代码占一行
集中IP地址|--cts_host|-x|10.25.163.162|集中接口的IP地址,缺省值是 __10.25.163.162__,可在启动时命令行传入所需要的值
集中端口|--cts_port|-y|9100|集中接口的端口,缺省值是 __9100__,可在启动时命令行传入所需要的值
集中的客户ID|--cts_codes|-z|9200|集中客户代码列表文件路径,可在启动时命令行传入所需要的值。文件格式是 __一个客户代码占一行__
深交所持仓|--szasset|-d|./data/sz/asset.txt|深交所持仓文件的路径,建议在该路径下 __touch该文件__. 接口会把查询出来的结果集写入到该文件
上交所持仓|--shasset|-e|./data/sh/asset.txt|上交所持仓文件的路径,建议在该路径下 __touch该文件__. 接口会把查询出来的结果集写入到该文件
深交所未成交订单|--szorder|-f|./data/sz/order.txt|深交所未成交订单文件的路径,建议在该路径下 __touch该文件__. 接口会把查询出来的结果集写入到该文件
上交所未成交订单|--shorder|-j|./data/sh/order.txt|上交所未成交订单文件的路径,建议在该路径下 __touch该文件__. 接口会把查询出来的结果集写入到该文件
深交所股票信息|--szstk|-k|./data/sz/stk_info.txt|深交所股票信息文件的路径,该路径为 __股票信息查询的列表清单__, 为 __输入文件__
上交所未成交订单|--shstk|-l|./data/sh/stk_info.txt|上交所股票信息文件的路径,该路径为 __股票信息查询的列表清单__, 为 __输入文件__ 接口会把查询出来的结果集写入到该文件
日志文件等级|--logger_level|-g|info|debug:1, info:2, warn:3, error:4, critical:5, off:6
证券市场|--market_num|-u|3|1-sz, 2-sh, 缺省为3,拉取上交所和深交所所有的持仓和未成交订单
## 10 深交所风控
深交所目前是tcp流式协议:step协议(集中)和binary协议(极速)
### 10.1 目录结构
深交所有step(集中)和binary(极速)两协议。目录结构为:
```
[rishon@stsz141654 sz_risk_controller]$ tree
.
├── bin
│ └── sz_risk_controller_vX.X.X_YYYY_MM_DD
├── binary_key
│ ├── 100101.key.txt
│ ├── 190007.key.txt
│ ├── 1.key.txt
│ ├── 200102.key.txt
│ ├── 200115.key.txt
│ ├── 290008.key.txt
│ ├── 2.key.txt
│ └── 6.key.txt
├── conf
│ └── config.json
├── config.json -> conf/config.json
├── data
│ ├── account.txt
│ ├── asset.txt
│ ├── order.txt
│ └── stk_info.txt
└── sz_risk_controller -> bin/sz_risk_controller_vX.X.X_YYYY_MM_DD
```
> bin 目录下有所有历史版本的二进制可执行程序。在项目的主目录下还有一个 __`sz_risk_controller`__ 的软连接指向最新的 __` bin/sz_risk_controller_vX.X.X_YYYY_MM_DD`__ 的二进制文件。软连接另外一个作用是,当升级失败或者新版本有问题时,以便通过修改软连接的方式 __回退__ 到上一个稳定的 __历史版本__. 同理,__`config.json`__ 也有软连接,作用类似。
> binary_key 目录下有 binary 协议所定义的一些key-value的键值对,其中__100101__ 为新订单,__200102__ 和 __200115__ 为执行报告。
### 10.2 config.json 详情
```
[rishon@stsz141654 sz_risk_controller]$ cat config.json
{
"task_ctrls_flag":0,
"binary": {
"tgw_host": "10.25.151.121",
"tgw_port": 17922,
"svr_port": 30000
},
"step":{
"tgw_host": "10.25.151.122",
"tgw_port": 8109,
"svr_port": 31000
},
"data_path": {
"funds_file": "./data/account.txt",
"holding_file": "./data/asset.txt",
"stk_info_file": "./data/stk_info.txt",
"order_file": "./data/order.txt"
},
"risk_limit":{
"float_shr_pct": 0.3,
"total_shr_pct": 0.03,
"nday_vol_pct": 0.3
},
"logger_level":{
"soft_level":"2",
"order_level":"1",
"error_level":"1"
}
}
```
+ task_ctrls_flag: 是否开启风控。此参数缺省为0,风控启动时忽略该参数的值。但风控启动后,可以通过 __`kill -1 PID`__ 关闭风控。注意,__关闭风控后当天不可再次开启风控__ 。
+ binary/step: 由tgw的ip地址(tgw_host/)及其端口(tgw_port),和自身开放的端口接收柜台请求(svr_port)三部分组成.
+ data_path: 由股东代码(funds_file),股票持仓(holding_file),股票信息(stk_info_file) 和未成交订单(order_file) 四部分组成。
+ risk_limit: 集中度等参数配置。皆为交易所缺省值。
+ logger_level:有软件日常运行日志(soft_level), 订单日志(order_level),和错误异常日志(error_level)三部分日志级别控制。
> risk_limit 请不要修改配置,因皆为交易所缺省值。目前该版本还没有实现,为后续的集中度等所预留。
> 各类日志可以在运行中,如果想提升或者降低日志级别请先修改想要的日志级别,然后执行 __`kill -1 PID`__ 即可。
> 如果想盘中查看未成交订单,请执行 __`kill -2 PID`__。 会在深交所主目录下生成一个 orders.txt 软连接。该动作请勿频繁执行,尤其是业务繁忙的时候。
### 10.3 日志级别详情
目前日志级别有:
1. 调试日志:1 - debug
2. 一般日志:2 - info
3. 警告日志:3 - warn
4. 错误日志:4 - error
5. 致命日志:5 - critical
6. 关闭所有日志:6 - off
六部分组成。优先级是开启当前日志级别后,比当前日志级别大的日志都会输出。比如,开启 info 日志,会输出的日志级别有 info,warn,error,critical;但比 info 低的 debug 日志级别不会输出。所有日志都为异步方式。
> 如果错误日志开启了debug日志,风控系统会按 __`tcpdump -A`__ 的形式打印tcp的十六进制的文本数据流,请慎重适当开启日志打印,尽管日志是异步方式打印。
### 10.4 深交所风控系统运行
线上不建议手动直接运行系统。如果要在命令行手动执行风控,请以 __后台__ 的形式执行
```
./sz_risk_controller config.json
```
### 10.5 启动后状态检查
风控系统启动后,可以查看风控系统主目录下的:
1. __`error.log`__:错误日志和tcp包流日志。
2. __`daily.log`__:系统运行的常规日志。
3. __`monitor.log`__:系统监控日志,主要有各个柜台运行次数,订单处理次数等详情数据的输出。
4. __`order.log`__:新订单详情日志,和执行报告返回时的详情
各个文件输出的情况。也可以直接命令行执行
```
[rishon@stsz141654 ~]$ ps -ef |grep sh_risk_controller
```
或者在命令行直接进行
```
[rishon@stsz141654 ~]$ netstatus -anplt |grep sz_
```
## 11 上交所风控
上交所目前是接口库的形式,通过扫表的方式实现。目前,上交所风控系统支持多个接口库的链接。
### 11.1 目录结构
```
[rishon@stsz141654 sh_risk_controller]$ tree
.
├── bin
│ └── sh_risk_controller_vX.X.X_YYYY_MM_DD
├── conf
│ └── configs.json
├── configs.json -> conf/configs.json
├── data
│ ├── account.txt
│ ├── asset.txt
│ ├── order.txt
│ └── stk_info.txt
└── sh_risk_controller -> bin/sh_risk_controller_vX.X.X_YYYY_MM_DD
```
> bin 目录下有所有历史版本的二进制可执行程序。在项目的主目录下还有一个 __`sh_risk_controller`__ 的软连接指向最新的 __` bin/sh_risk_controller_vX.X.X_YYYY_MM_DD`__ 的二进制文件。软连接另外一个作用是,当升级失败或者新版本有问题时,以便通过修改软连接的方式 __回退__ 到上一个稳定的 __历史版本__. 同理,__`configs.json`__ 也有软连接,作用类似。
### 11.2 configs.json 详情
```
[rishon@stsz141654 sh_risk_controller]$ cat configs.json
{
"task_ctrls_flag":0,
"logger_level":
{
"soft_level":"1",
"order_level":"1",
"error_level":"1"
},
"data":[
{
"dsn_counter": {
"database": "uat_counter",
"user": "oiw",
"password": "oiw123",
"seatId":"46360"
},
"dsn_exchange": {
"database": "uat_exchange",
"user": "oiw",
"password": "oiw2005",
"seatId":"46360"
}
},
{
"dsn_counter": {
"database": "uat_counter_cts",
"user": "oiw",
"password": "oiw123",
"seatId":"41813"
},
"dsn_exchange": {
"database": "uat_exchange_cts",
"user": "oiw",
"password": "oiw2005",
"seatId":"41813"
}
}
],
"data_path": {
"file_account": "./data/account.txt",
"file_asset": "./data/asset.txt",
"file_stk_info": "./data/stk_info.txt",
"file_order": "./data/order.txt"
}
}
```
+ task_ctrls_flag: 是否开启风控。此参数缺省为0,风控启动时忽略该参数的值。但风控启动后,可以通过 __`kill -1 PID`__ 关闭风控。关闭风控后,系统为透传。可以理解为柜台直连了交易所。上交所风控系统支持系统运行时多次开启或者关闭风控功能。
+ logger_level:有软件日常运行日志(soft_level), 订单日志(order_level),和错误异常日志(error_level)三部分日志级别控制
+ data 组别是接口库的配置。其中 __`dsn_counter`__ 为 __`柜台接口库`__ , __`dsn_exchange`__ 为 __`交易所接口库`___。
+ database: 为接口库的dsn的接口库的配置,主要是接口库的ip,端口信息。详情见 __`11.5 dsn配置详情`__ 章节。
+ seatId 席位号,目前席位号是追缴到表名后面的。如果席位号为空,则代表表名无后缀。
+ data_path: 由股东代码(funds_file),股票持仓(holding_file),股票信息(stk_info_file) 和未成交订单(order_file) 四部分组成。
### 11.3 日志级别详情
目前日志级别有:
1. 调试日志:1 - debug
2. 一般日志:2 - info
3. 警告日志:3 - warn
4. 错误日志:4 - error
5. 致命日志:5 - critical
6. 关闭所有日志:6 - off
六部分组成。优先级是开启当前日志级别后,比当前日志级别大的日志都会输出。比如,开启 info 日志,会输出的日志级别有 info,warn,error,critical;但比 info 低的 debug 日志级别不会输出。所有日志都为异步方式。
### 11.4 表结构详情
__申报表(ordwth)__
```
CREATE TABLE dbo.ordwth_[seatId]
(
rec_num INT NOT NULL,
[date] CHAR (8),
[time] CHAR (8),
reff CHAR (10),
acc CHAR (10),
stock CHAR (6),
bs CHAR (1),
price CHAR (8),
qty CHAR (8),
status CHAR (1),
owflag CHAR (3),
ordrec CHAR (8),
firmid CHAR (5),
branchid CHAR (5),
checkord BINARY (16),
CONSTRAINT PK_ordwth_[seatId] PRIMARY KEY (rec_num)
)
```
__确认表(ordwth2)__
```
CREATE TABLE dbo.ordwth2_[seatId]
(
rec_num INT NOT NULL,
[date] CHAR (8),
[time] CHAR (8),
reff CHAR (10),
acc CHAR (10),
stock CHAR (6),
bs CHAR (1),
price CHAR (8),
qty CHAR (8),
status CHAR (1),
qty2 CHAR (8),
remark CHAR (30),
status1 CHAR (1),
teordernum CHAR (8),
owflag CHAR (3),
ordrec CHAR (8),
firmid CHAR (5),
branchid CHAR (5),
checkord BINARY (16),
rec_num2 INT IDENTITY NOT NULL,
CONSTRAINT PK_ordwth2_[seatId] PRIMARY KEY (rec_num2)
)
CREATE UNIQUE INDEX ordwth2_[seatId]_uidx
ON dbo.ordwth2_[seatId] (rec_num)
```
__成交回报表(cjbh)__
```
CREATE TABLE dbo.cjhb_[seatId]
(
rec_num INT IDENTITY NOT NULL,
gddm CHAR (10),
gdxm CHAR (8),
bcrq CHAR (8),
cjbh INT NOT NULL,
gsdm CHAR (5),
cjsl CHAR (10),
bcye CHAR (10),
zqdm CHAR (6) NOT NULL,
sbsj CHAR (6),
cjsj CHAR (6),
cjjg CHAR (8),
cjje CHAR (12),
sqbh CHAR (10),
bs CHAR (1) NOT NULL,
mjbh CHAR (5),
CONSTRAINT PK_cjhb_[seatId] PRIMARY KEY (rec_num)
)
```
> 如果没有配置席位号,那么相应的表名为:__ordwth, ordwth2, cjbh__。
### 11.5 dsn 部署详情
dsn 部署详情可参阅 __`7.1 查看 odbc 配置`__ , __`7.2 配置 odbc 驱动`__ 和 __`7.3 配置 odbc 数据源`__, 此处再做进一步详情。
#### 11.5.1 查看 odbc 配置
用 __`odbcinst -j`__ 查看配置
```
[rishon@stsz141654 ~]$ odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/rishon/.odbc.ini
```
+ unixODBC 2.3.7: unixODBC版本信息
+ DRIVERS:unixODBC驱动配置信息,为整个系统所有用户共享,一经配置,一般无需修改。此处主要是 __`libmsodbcsql`__ 库路径
+ SYSTEM DATA SOURCES:unixODBC 系统数据配置信息,为整个系统所有用户共享,一经配置,一般无需修改。此处若是配置了数据源,为整个系统用户可见。缺省为空,无配置信息。
+ FILE DATA SOURCES:unixODBC文件配置信息目录,为整个系统所有用户共享,一经配置,一般无需修改。确实是空美丽。
+ USER DATA SOURCES:unixODBC当前用户的 __`dsn`__ 配置信息,为当前用户所有,此处配置当前用户的数据源。该文件一般为当前用户主目录,文件名为:__`.odbc.ini`__ 。
#### 11.5.2 配置 odbc 驱动
文件 __`odbcinst.ini`__ 为系统所有,一般无需修改。以下为一个样板:
```
[rishon@stsz141654 ~]$ cat /usr/local/etc/odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.6.so.1.1
UsageCount=3
```
其中的 __`Driver`__ 为 __mssql__ 库文件路径。
### 11.5.3 配置 odbc 数据源
文件 __`.odbc.ini`__ 为当前用户的 __`dsn`__ 数据源配置。以下为为一个样本:
```
[rishon@stsz141654 ~]$ cat /home/rishon/.odbc.ini
[counter]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_45499
[exchange]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_38971
[counter_cts]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.172.110
Port = 1433
Database = oiw_45488
[exchange_cts]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.248.20
Port = 1433
Database = oiw_38970
[uat_counter]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.236.34
Port = 1433
Database = oiw_46360
[uat_exchange]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.224.43
Port = 1433
Database = oiw_46360
[uat_counter_cts]
Desciption = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.236.34
Port = 1433
Database = oiw_41813
[uat_exchange_cts]
Description = mssql server
Driver = ODBC Driver 17 for SQL Server
Server = 10.25.232.157
Port = 1433
Database = oiw_41813
```
其中:
1. __`[uat_exchange_cts]`__ 即为上交所风控的 __`config.json|data|dsn__xxx|database`__ 的值。此处的 __`Database`__ 为库名。
2. __`Server`__ 为接口库的 IP。
3. __`Port`__ 为接口库的端口 port 。
4. __`Database`__ 为接口库的数据库名。
> 请注意每组名字,如 __`uat_exchange_cts`__ 的惟一性。
### 11.6 上交所风控系统运行
线上不建议手动直接运行系统。如果要在命令行手动执行风控,请以 __后台__ 的形式执行
```
./sh_risk_controller configs.json
```
### 11.7 启动后状态检查
风控系统启动后,可以查看风控系统主目录下的:
1. __`error.log`__:错误日志。
2. __`daily.log`__:系统运行的常规日志。
3. __`monitor.log`__:系统监控日志,主要有各个柜台运行次数,订单处理次数等详情数据的输出。
4. __`order.log`__:新订单详情日志,和执行报告返回时的详情
各个文件输出的情况。也可以直接命令行执行
```
[rishon@stsz141654 ~]$ ps -ef |grep sh_risk_controller
```