无标题文章

# 风控系统部署手册

版本|日期|作者|备注

----|----|----|---

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

```

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342