上期所FPGA行情U50版本发布!

HUNDSUN®

FPGA行情上期使用指南

一、场景介绍

1.1 背景概述

​ 由于DMA通道只有一个,资源上的限制,客户只能启动一个程序接收行情数据。客户策略存在多个的场景,目前是订阅所有策略关注的品种和合约,然后各个策略相互过滤不需要的行情,这个过滤存在性能上的损耗。FPGA行情上期支持多通道隔离,满足不同策略使用不同通道订阅行情,我们支持16个DMA通道,多个通道之间独立订阅和使用行情,一张U50板卡相当于同时拥有16个FPGA。策略比较多的场景,可以一个策略一个线程一个通道,只订阅当前策略关注的行情。就不用在多个策略使用行情上取并集,然后各个策略再去过滤。多通道可以把这个过滤放到FPGA内部,同时支持多线程和多进程使用,充分利用多核CPU的优势。

1.2 读者对象

  • 开发工程师
  • 技术支持工程师
  • 测试工程师
  • 维护工程师

二、测试环境

2.1 FPGA固件机器

​ FPGA固件机器,将最新集成固件上传到该机器,执行以下命令刷固件,--file_path指定固件rbf文件。

  • 使用案例
enyx-firmware-manager --board=0 --file_path=shell_top_xilinx_u50_mem_eth_dyn.rbf --force driver

img注意

重刷固件后需reboot

2.2 tcpreplay回放机器

​ tcpreplay向FPGA固件机器发送回放数据。

  • 使用案例
tcpreplay -i p4p1 --pps=1000 zt_shfe_20230131_am_end.pcap

img注意

-i指定发送口,需要提前确认接线。--pps指定发送速度。

三、配置说明

config.ini配置文件参考内容如下

[config]
device=xilinx0:0
# set cpucore=-1 to disable cpu binding
cpucore=5
ine2ps=disabled
shfe2ps=enabled
shfe4ps=disabled
ine4ps=enabled

# SHFE A/B 2ps/4ps, change only if SHFE change them.
shfe2ps_ip_a=239.3.42.71:21000
shfe2ps_ip_b=239.4.42.72:21000
shfe4ps_ip_a=239.3.2.3:21101
shfe4ps_ip_b=239.4.2.4:21101

# INE A/B 2ps/4ps, change only if INE change them.
ine2ps_ip_a=239.3.52.71:25000
ine2ps_ip_b=239.4.52.72:25000
ine4ps_ip_a=239.3.151.91:25101
ine4ps_ip_b=239.4.151.92:25101

# SHFE/INE topic id, change only if SHFE/INE change them.
shfe2ps_topic_id=1000
shfe4ps_topic_id=1101
ine2ps_topic_id=5000
ine4ps_topic_id=5101

# SHFE/INE TCP Snap port, change only if SHFE/INE change them.
shfe2ps_snap_port=33022
shfe4ps_snap_port=22000
ine2ps_snap_port=33022
ine4ps_snap_port=22000

# Does the startup wait for the snapshot to initialize the FPGA based on changes in the configuration file crc
crc_mux_check=0

# 0 to 15 bit identify whether the corresponding channel has the last tick enabled. Corresponding maximum contract number of the subject.
last_tick_channel=0
shfe2ps_max_inst_no=81000
shfe4ps_max_inst_no=81101
ine2ps_max_inst_no=85000
ine4ps_max_inst_no=85101

# license key
license=KkRBeU5qSTBPQT49$LWpBeU5URXlNhkU9

# 0 to 3 bits, respectively, are the error, warning, info, and debug log level bits. When the corresponding bit is set to 1, record the corresponding level log information
# Support specified log path ,must modify all config_*.ini .  eg.  log_path=/  
log_level=15

# Network version configuration item, copying 0 channel subscription contract market push
DSTMAC=01:00:5E:01:02:03
DSTIP=224.1.2.3
DSTPORT=5000

SRCMAC=64:3f:5f:01:02:03
SRCIP=10.253.1.115
SRCPORT=1234

[channel0]
# subscribe instruments, e.g. all to receive all instruments, or ag2201,bu,ag2306P5800
insts=all
options=recv

[channel1]
insts=ag2512P6700,ag2510,ag2509P9,cu2509,fu,ni,rb2507C2800
options=recv

[channel2]
insts=ag2512P6700,ag2510,ag2509P9
options=norecv

[channel3]
insts=ag,al,al,au2504,sc25
options=norecv

[channel4]
insts=all
options=recv

#[channel5]
#insts=pb,ni,fu,cu,au
#options=norecv

3.1 [config]

​ 0通道做统一订阅配置管理,1-15通道的行情订阅合约,在0通道config.ini对应“channel通道编号”配置即可。其他通道相互独立,可随时独立重启。如果盘中涉及到订阅合约变更,在0通道config.ini修改后重启0通道程序,其他通道程序无须重启。1-15通道就是一个纯receiver,只需关注device和cpucore配置即可。

  • device:设备配置,指定卡号和通道号xilinx卡号:通道号,如果是0卡0通道,配置xilinx0:0
  • cpucore:设置绑核,多通道建议设置不同绑核编号(编号范围可lscpu查看)
  • shfe2ps:上海每秒两笔是否启用标识,默认启用(enabled:启用 disabled:不启用)
  • shfe4ps:上海每秒四笔是否启用标识,默认不启用(enabled:启用 disabled:不启用)
  • ine2ps:能源每秒两笔是否启用标识,默认不启用(enabled:启用 disabled:不启用)
  • ine4ps:能源每秒四笔是否启用标识,默认启用(enabled:启用 disabled:不启用)
  • shfe2ps_ip_a:上海每秒两笔A路组播地址端口配置,239.3.42.71:21000
  • shfe2ps_ip_b:上海每秒两笔B路组播地址端口配置,239.4.42.72:21000
  • shfe4ps_ip_a:上海每秒四笔A路组播地址端口配置,239.3.2.3:21101
  • shfe4ps_ip_b:上海每秒四笔B路组播地址端口配置,239.4.2.4:21101
  • ine2ps_ip_a:能源每秒两笔A路组播地址端口配置,239.3.52.71:25000
  • ine2ps_ip_b:能源每秒两笔B路组播地址端口配置,239.4.52.72:25000
  • ine4ps_ip_a:能源每秒四笔A路组播地址端口配置,239.3.151.91:25101
  • ine4ps_ip_b:能源每秒四笔B路组播地址端口配置,239.4.151.92:25101
  • shfe2ps_topic_id:上海每秒两笔行情主题,1000
  • shfe4ps_topic_id:上海每秒四笔行情主题,1101
  • ine2ps_topic_id:能源每秒两笔行情主题,5000
  • ine4ps_topic_id:能源每秒四笔行情主题,5101
  • shfe2ps_snap_port:上海每秒两笔TCP快照端口,33022
  • shfe4ps_snap_port:上海每秒四笔TCP快照端口,22000
  • ine2ps_snap_port:能源每秒两笔TCP快照端口,33022
  • ine4ps_snap_port:能源每秒四笔TCP快照端口,22000
  • crc_mux_check:是否检测配置文件CRC变化,无变化不初始化FPGA,0
  • last_tick_channel:last tick通道使能开关,0~15bit分别对应0~15通道,置1标识启用,当tick结束会上送一个结束报文,默认值0
  • shfe2ps_max_inst_no:上海每秒两笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值81000
  • shfe4ps_max_inst_no:上海每秒四笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值81101
  • ine2ps_max_inst_no:能源每秒两笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值85000
  • ine4ps_max_inst_no:能源每秒四笔最大合约号,last tick通道使能,当tick结束会上送一个结束报文,报文max_inst_no字段会携带配置值,默认值85101
  • license:授权license,使用时校验license
  • log_level:日志等级,[3:0]对应位置为1,则依次记录debug、info、warning、error等级日志信息。如:log_level=7,则记录info、warning、error日志信息
  • DSTMAC:网络版配置,目的MAC地址
  • DSTIP:网络版配置,目的IP地址
  • DSTPORT:网络版配置,目的端口
  • SRCMAC:网络版配置,源MAC地址
  • SRCIP:网络版配置,源IP地址
  • SRCPORT:网络版配置,源端口
  • repeat_quote_upload:价量不变重复行情上送使能开关,默认注释,不启用(1:启用 0:不启用)
  • event_model_sel:某合约出现udp错包时行情不重启,继续接收其余合约行情使能开关,默认注释,不启用(1:启用 0:不启用)
  • shield_price_check:软件初始化价格保护使能开关,默认注释,启用(0:启用 1:不启用)
  • board_id:U50板卡编号,当一台机器存在多张U50板卡时需要指定,默认注释,值0
  • log_path:配置该通道日志输出路径,默认注释,日志落在api当前路径
  • init_tcpcnt:配置TCP初始化最大等待TCP超时次数,默认注释,超时等待3次

网络版行情是复用本地版0通道订阅的行情然后从网口0、1交替发送

3.2 [channel]

​ 最多支持16个通道(0~15),配置时channel通道号

  • insts:配置订阅合约,all标识订阅全量合约。订阅指定合约时多个合约间用英文,分隔。
  • options:当insts配置有all品种时,当前配置项用于控制期权行情是否接收,默认norecv
    • recv:期权行情接收
    • norecv:期权行情不接收

四、使用场景

4.1 按合约订阅

insts支持配置品种,标识订阅配置该品种下全量合约行情。options配置recv,标识期权合约参与合约行情订阅。

  • 0通道配置订阅zn,ag,sc品种,不订阅期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=zn,ag,sc
    options=norecv

    ​ 订阅zn,ag,sc品种下所有期货合约,不订阅对应期权合约。行情输出落地文件中不存在期权相关行情数据。

  • 0通道配置订阅zn品种,订阅期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=zn
    options=recv

    ​ 订阅zn品种下所有期货合约和对应期权合约。行情输出落地文件中存在期权相关行情数据。

  • 0通道配置订阅cu2510合约,不订阅期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=cu2510
    options=norecv

    ​ 订阅cu2510期货合约,不订阅对应期权合约。行情输出落地文件中不存在期权相关行情数据。

  • 0通道配置订阅cu2510合约和对应期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=cu2510
    options=recv

    ​ 订阅cu2510期货合约及对应期权合约。行情输出落地文件中存在期权相关行情数据。

  • 0通道配置订阅al2505C10000期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=al2505C10000
    options=recv

    ​ 订阅al2505C10000期权合约。行情输出落地文件中存在al2505C10000期权相关行情数据。

  • 0通道配置订阅al2505C10000期权合约行情。

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=al2505C10000
    options=norecv

    ​ 订阅al2505C10000期权合约。行情输出落地文件中存在al2505C10000期权相关行情数据。

4.2 订阅全量合约

insts配置all,标识订阅全量合约行情。options配置recv,标识期权合约参与合约行情订阅。

  • 0通道配置

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=all
    options=recv

    ​ 程序输出内容包含所有品种下所有期货合约行情订阅,期权合约也参与合约行情订阅。行情输出落地文件中存在所有品种期货和期权相关行情数据。

    1692408884266

4.3 多通道订阅相同合约

​ 此处以四个通道为例,订阅相同合约行情,测试不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。

img注意

0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。

  • 0通道配置

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=all
    options=recv
    
    [channel1]
    insts=ag2512P6700,ag2510,ag2509P9,cu2509,fu,ni,rb2507C2800
    options=recv
    
    [channel2]
    insts=ag2512P6700,ag2510,ag2509P9
    options=norecv
    
    [channel15]
    insts=ag,al,al,au2504,sc25
    options=recv
  • 1通道配置

    [config]
    device=xilinx0:1
    cpucore=1
  • 2通道配置

    [config]
    device=xilinx0:2
    cpucore=2
  • 15通道配置

    [config]
    device=xilinx0:15
    cpucore=15

4.4 多通道订阅不同合约

​ 此处以四个通道为例,订阅不同合约行情,测试不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。

img注意

0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。

  • 0通道配置

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=ag2506,al2506,zn2511
    options=recv
    
    [channel1]
    insts=au2507,ni2506,rb2507,ru2503,sn2503,zn2508
    options=recv
    
    [channel2]
    insts=bu2504,cu2503,fu2505,hc2505
    options=recv
    
    [channel15]
    insts=bu2504,bu2507,cu2503,fu2505,hc2505
    options=recv
  • 1通道配置

    [config]
    device=xilinx0:1
    cpucore=1
  • 2通道配置

    [config]
    device=xilinx0:2
    cpucore=2
  • 15通道配置

    [config]
    device=xilinx0:15
    cpucore=15

4.5 多通道退订

​ 此处以四个通道为例,在原有订阅合约基础上删减部分合约,测试被删减合约是否还会有行情数据上送。并且验证不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。

img注意

0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。

  • 0通道配置

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=ag2303,zn2311
    options=recv
    
    [channel1]
    insts=au2302,au2304,au2306C392,rb2303,rb2305P4800,ru2305P12500,sn2303,zn2303
    options=recv
    
    [channel2]
    insts=bu2304,bu2307,cu2305P62000,hc2305
    options=recv
    
    [channel15]
    insts=bu2304,bu2307,cu2305P62000,hc2305
    options=recv
  • 1通道配置

    [config]
    device=xilinx0:1
    cpucore=1
  • 2通道配置

    [config]
    device=xilinx0:2
    cpucore=2
    
  • 15通道配置

    [config]
    device=xilinx0:15
    cpucore=15

4.6 多通道新增订阅

​ 此处以四个通道为例,在原有订阅合约基础上新增部分合约,测试新增合约是否有行情数据上送。并且验证不同通道间是否有合约上送乱串(单个合约记录数之和是否等于总记录数)或者行情数据丢失(可同全量订阅输出参照对比是否有少记录数)。

img注意

0通道作为管理通道,合约行情订阅统一由0通道完成,其他通道仅负责接收数据即可。

  • 0通道配置

    [config]
    device=xilinx0:0
    cpucore=0
    
    [channel0]
    insts=ag2306P5800,ag2303,al2303,al2303C17000,zn2311,zn2303P23800
    options=recv
    
    [channel1]
    insts=au2302,au2304,au2306C392,ni2306,rb2303,rb2305P4800,ru2303,ru2305P12500,sn2303,zn2303
    options=recv
    
    [channel2]
    insts=bu2304,bu2307,cu2303,cu2305P62000,fu2305,hc2305
    options=recv
    
    [channel15]
    insts=bu2304,bu2307,cu2303,cu2305P62000,fu2305,hc2305
    options=recv
  • 1通道配置

    [config]
    device=xilinx0:1
    cpucore=1
  • 2通道配置

    [config]
    device=xilinx0:2
    cpucore=2
  • 15通道配置

    [config]
    device=xilinx0:15
    cpucore=15

4.7 全部通道测试

​ 所有通道均参与订阅(目前0通道为管理通道,0~15通道均可参与行情订阅),查看各个通道行情订阅是否正常,也可结合上述场景进行全通道覆盖测试。

五、测试步骤

5.1 板卡烧最新集成固件

​ 板卡烧制请跳转至固件烧制。首次烧制完成,后续测试无须烧制。

5.2 启动0通道监听tcp数据

​ 0通道作为初始化和管理通道,如果需要再次初始化需要更改config.ini ,代码检测文件CRC发生变化,会重新REST硬件初始化,然后收取TCP数据进行FPGA初始化。

  • 0通道启动输出(监听TCP初始化数据)

1692408997381

5.3 启动其他通道

​ 其他通道作为数据接收者,启动即可。

  • 1通道启动

1692409164151

  • 2通道启动

1692409490676

  • 15通道启动

    3~14通道同理,此处不做赘述

1692412512456

5.4 tcpreplay回放数据

​ 启动tcpreplay回放生产转包原始数据,0通道获取到TCP数据后开始解析并初始化FPGA。

[root@t5810 zt_pcap]# tcpreplay -i p4p1 --pps=1000 zt_shfe_20230131_am_end.pcap
  • 0通道收到TCP数据初始化FPGA并发起合约行情订阅

1692412638646

5.5 关闭读写并开启DMA上送

​ 0通道作为管理通道,在TCP初始化结束后发起合约行情订阅,然后关闭寄存器读写功能,最后启动DMA行情上送,随后各通道会收到MDA上送的当前通道订阅的合约行情数据。

  • 0通道关闭寄存器读写并开启DMA上送

1692412714214

5.6 查看行情落地数据

​ 在启动目录下会生成nano_u50_yyyymmdd_hhmmss.csv记录当前通道收取到的行情数据。

5.7 日志输出

​ 在启动目录下会生成nano_u50_yyyymmdd_hhmmss.log记录启动日志,日志仅在启动是记录,运行期间不会记录日志信息。

六、附录

6.1 管理通道

​ 0通道作为TCP初始化和管理通道,启动时如果检测到当前config.ini配置CRC同上次不一致,就会重新Rest初始化FPGA。

  • CRC校验未发生变化,无须初始化。此处考虑到如果客户只是盘中重启了程序,配置没有发生变更,无须等待快照重新初始化(期货公司向交易所获取快照一般是两分钟一次,此场景下重启就无须等待着两分钟)

1692412860412

  • 对配置文件进行修改操作后重新启动,会重新Rest初始化FPGA,初始化FPGA后需重新等待TCP快照初始化(期货公司向交易所获取快照一般是两分钟一次)。

1692412955733

6.2 通道重启

​ 开启MDA上送后,0~15通道均可随时重启。如果盘中需要更换订阅合约,必须修改0通道配置后重新启动,其他通道无须调整。

6.3 board id查看

​ 使用enyx-firmware-manager -l命令即可查看board id。

1692413454550

6.4 license获取

​ 访问https://www.nanoexpress.com/license网站,使用mac地址查询获取。获取到的秘钥配置到0通道config.ini配置中license配置项。

img注意

运行demo实例程序,输出DNA和MAC地址。

1695476730253

  • 参考实例
# license key
license=KVRZNU1UVXpORFo9$LWpBeU16RXlNYEk9

6.5 开发机器编译

​ 如果开发机器不是板卡部署机器,编译程序需要安装U50板卡驱动。详情请参阅FPGA U50行情部署安装驱动安装部分。

6.6 DMA抓包

utils\reg目录下hs-capture, -i指定DMA通道编号,编号取值[0,15]。

[tangf@t7810 capture]$ ./hs-capture -i 8 -H 12 -N -w test.pcap 
listening port

6.7 寄存器状态

utils\reg目录下nano_state, 即可查看接线和寄存器状态信息。

1698757406911

6.8 U50 API开发包

U50 API请跳转至发布包下载页签,下载对应release发布包,包内sample-code部分为API和示例代码。

6.9 U50 行情部署安装

详情请参阅FPGA U50行情部署安装

ICP备案号:辽ICP备20002814号-2