NSE/Stock Exchange 第四代通信网关监控开发
最编程
2024-04-28 08:38:27
...
一、背景
虽然北交所已经从股转公司独立出来,但其交易、行情程序还是和股转公司一样,沿用深证通的四代通信网关。四代网关的功能没有五代网关强大,如要实现集中监控,需要利用网关自身的监控接口结合第三方监控开展。实现不难,为了省钱我们自己开发即可。
二、前期准备
1、四代网关两个(行情+交易),已有待配置
2、监控脚本(python),待开发
3、监控集中展示(redis、grafana),已有待配置
三、开发过程
1、网关配置
网关的监控端口默认是关闭的,需要手工开启。开启程序后,点开参数配置界面,在通信设置页签中点击勾选,启用网关监控,端口设置为8888(交易)、8889(行情),确定后需要重启网关程序才可生效。
2、脚本开发
根据深证通文档指引,可以用telnet和socket两种方式实现python脚本,我们选择socket。具体逻辑为,连接网关监控端口,执行1条监控指令,获取回显数据并通过接口上传至redis,由grafana展示。
需要注意的是,监控指令要用二进制,且结尾需要有两个换行符,如b"type=heartbeat\n\n"。
代码如下:
# -*- coding:gbk -*-
import socket
import requests
import time
import json
url="http://172.21.234.30/jsondata/neeq_gw"
def neeq(gwip,gwport,gwtype):
con = socket.create_connection((gwip,gwport))
time.sleep(1)
con.send(b'type=queryrunstatus\n\n')
time.sleep(1)
result = con.recv(1024).split(b'\r\n')
gwstat = []
for g in result:
if g != b'':
gwstat.append(g.decode('gbk'))
gwdict = dict((l.split('=',1) for l in gwstat))
if gwtype=='trade':
value=[{"网关类型":"交易网关",
"网关号":gwdict['userId'],
"待发委托":gwdict['pendingOrderCount'],
"已发委托":gwdict['sentOrderCount'],
"成功委托":gwdict['successOrderCount'],
"非法委托":gwdict['invalidOrderCount'],
"成交回报":gwdict['tradeCount'],
"通信状态":gwdict['commStatus'],
"市场状态":gwdict['marketStatus']
}]
elif gwtype=='quote':
value=[{"网关类型":"行情网关",
"网关号":gwdict['userId'],
"TCP状态":gwdict['tcpCommStatus'],
"UDP状态":gwdict['ucpCommStatus'],
"待处理包数":gwdict['numOfToDealPkts'],
"乱序包数":gwdict['numOfSeqErrPkts'],
"错报数":gwdict['numOfErrPkts'],
"总包数":gwdict['numOfPkts'],
"总字节数":gwdict['numOfBytes'],
"市场状态":gwdict['marketStatus'],
"证券信息条数":gwdict['numOf_NQXX'],
"证券信息更新时间":gwdict['NQXX_QuotaTime'],
"证券行情条数":gwdict['numOf_NQHQ'],
"证券行情更新时间":gwdict['NQHQ_QuotaTime']
}]
return(json.dumps(value))
if __name__ == '__main__':
pushvalue = []
broketgw = neeq('172.21.237.95','8888','trade')
brokemdgw = neeq('172.21.237.95','8889','quote')
pushvalue = json.loads(broketgw) + json.loads(brokemdgw)
pushvalue = json.dumps(pushvalue)
re = requests.post(url, data=pushvalue)
print(re)