设计撮合系统的目的
为了使应届毕业生入职前能有针对性的学习相关知识,使其入职后能尽快适应工作环境该课题主要针 对所有开发岗位对于非开发岗位想转开发岗位的同学,通过该课题的完成情况来证明自己入职时已经具备开发能力,从而进行岗位调整希望各位同学在做该课题的过程中能看到自己的不足,在毕业前有限时间内抓紧学习和加强相关技术知识。
3.2 需求概述
名称:股票交易系统的实现操作系统:Windows数据库:Oracle、SQLServer(两个接口数据库)或者Mysql开发语言:C++、java等自选,本课根据完成程度分为初级、中级、高级三个程度,个人根据自己的能力和时间,自行选择实现程度。
3.3 股票交易流程
模拟上海股票交易的委托、报盘、撮合三个业务。
委托:模拟证券公司接收到投资的股票买卖请求(不模拟撤单业务),写入交易所规定的接口库中(委托数据库)。
报盘:模拟交易所报盘机程序,读取委托接口库中券商写入的委托信息,送到交易所的撮合系统中(撮合数据库)。
撮合:模拟交易所的撮合系统,对报盘机报送上来的委托记录进行撮合,并反馈成交信息(撮合数据库)。
3.4 委托数据库接口说明
安装SQLServer数据库(版本不限)创建表脚本参见委托数据库接口表创建脚本.sql一共三张表ashare_ordwth委托表ashare_ordwth2委托确认表ashare_cjhb成交回报表。委托表结构,如表3-1所示,该表是由委托程序负责写,报盘程序读。
表3-1委托数据ashare_ordwth表
列名称 | 名称 | 类型 | 填写要求 |
rec_num | 记录序号 | INTEGER | 必填,从1开始 ,连续递增 .表索引 |
date | 日期 | CHAR(8) | 必填,数据写入时的日期,格式:20151013 |
time | 时间 | CHAR(8) | 必填,数据写入时的时间,格式:13:11:11 |
reff | 合同序号 | CHAR(10) | 必填,每笔委托合同序号唯一并递增,格式:0000000001 |
acc | 股东代码 | CHAR(10) | 必填,委托程序前端输入,格式:A000000001 |
stock | 股票代码 | CHAR(6) | 必填,6位数字组成,格式:600446 |
bs | 买卖标志 | CHAR(1) | 必填,买入委托填‘B’,卖出委托填‘S’,大写 |
price | 委托价格 | CHAR(8) | 必填,大于0,小数点保留两位,例如:12.31 |
qty | 委托数量 | CHAR(8) | 必填,大于0,整数,例如: 2100 |
status | 状态 | CHAR(1) | 必填,填‘R’ |
owflag | 委托类型 | CHAR(3) | 必填,填‘ORD’ |
ordrec | 委托类型 | CHAR(8) | 必填,填空 |
firmid | 结算会员 | CHAR(5) | 必填,‘JZGF’ |
checkord | 加密校验码 | binary(16) | 必填,填 0 |
branchid | 营业部代码 | CHAR(5) | 必填,‘JZGF’ |
委托数据库第二张表,如表3-2所示,ashare_ordwth2委托确认表结构说明(该表是由委托程序读,报盘程序根据委托表信息写入)。
表3-2 ashare_ordwth2委托确认表
列名称 | 名称 | 类型 | 填写要求 |
rec_num | 记录序号 | INTEGER | 必填,从1开始 ,连续递增 .表索引(与ashare_ordwth对应记录内容相同) |
date | 日期 | CHAR(8) | 必填,数据写入日期,格式:20151013(与ashare_ordwth对应记录内容相同) |
time | 时间 | CHAR(8) | 必填,数据写入时的时间,格式:13:11:12 |
reff | 合同序号 | CHAR(10) | 必填,每笔委托合同序号唯一并递增,格式:0000000001(与ashare_ordwth对应记录内容相同) |
acc | 股东代码 | CHAR(10) | 必填,委托程序前端输入,格式:A000000001(与ashare_ordwth对应记录内容相同) |
stock | 股票代码 | CHAR(6) | 必填,6位数字组成,格式:600446(与ashare_ordwth对应记录内容相同) |
bs | 买卖标志 | CHAR(1) | 必填,买入委托填‘B’,卖出委托填‘S’,大写(与ashare_ordwth对应记录内容相同) |
price | 委托价格 | CHAR(8) | 必填,大于0,小数点保留两位,例如:12.31(与ashare_ordwth对应记录内容相同) |
qty | 委托数量 | CHAR(8) | 必填,大于0,整数,例如: 2100(与ashare_ordwth对应记录内容相同) |
status | 状态 | CHAR(1) | 必填,填‘R’ |
qty2 | 撤单数量 | CHAR(8) | 必填,填空 |
remark | 备注信息 | CHAR(30) | 必填,填空 |
status1 | 状态1 | CHAR(1) | 必填,填‘R’ |
teordernum | 申请编号 | CHAR(8) | 必填,填空 |
owflag | 委托类型 | CHAR(3) | 必填,填‘ORD’ |
ordrec | 委托类型 | CHAR(8) | 必填,填空 |
firmid | 结算会员 | CHAR(5) | 必填,‘JZGF’ |
checkord | 加密校验码 | binary(16) | 必填,填 0 |
rec_num2 | Identity类型 | integer | 自动生成,不用填;自己程序实现每天复位从1开始 |
委托数据库第三张表,如表3-3所示,ashare_cjhb成交回报表结构说明(该表是由报盘程序负责写,委托程序读)。
表3-3 ashare_cjhb成交回报表
列名称 | 名称 | 类型 | 填写要求 |
gddm | 股东代码 | CHAR(10) | 字段与撮合数据库接口中【成交回报表】ashare_cjhb数据完全一致 |
gdxm | 股东姓名 | CHAR(8) | |
bcrq | 成交日期 | CHAR(8) | |
cjbh | 成交编号 | INTEGER | |
gsdm | 席位代码 | CHAR(5) | |
cjsl | 成交数量 | CHAR(10) | |
bcye | 本次余额 | CHAR(10) | |
zqdm | 股票代码 | CHAR(6) | |
sbsj | 申报时间 | CHAR(6) | |
cjsj | 成交时间 | CHAR(6) | |
cjjg | 成交价格 | CHAR(6) | |
cjje | 成交金额 | CHAR(12) | |
sqbh | 申请编号 | CHAR(10) | |
bs | 买卖标志 | CHAR(1) | |
mjbh | 马甲编号 | CHAR(5) | |
rec_num | Identity类型 | integer | 自动生成,不用填,自己程序实现每天复位从1开始 |
3.5 撮合数据库接口说明
安装SQServer数据库(版本不限),创建表脚本参见撮合数据库接口表创建脚本.sql
一共两张表:ashare_ordwth委托表ashare_cjhb成交回报表。
撮合数据库第一张,如表3-4所示,ashare_ordwth委托表结构说明(该表是由报盘程序负责写,撮合程序读)。
表3-4 ashare_ordwth委托表
列名称 | 名称 | 类型 | 填写要求 |
rec_num | 记录序号 | INTEGER | 除time字段,其他字段与委托数据库接口中委托表ashare_ordwth数据完全一致 time字段为数据写入时的时间,格式:13:11:12 |
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) | |
checkord | 加密校验码 | binary(16) | |
branchid | 营业部代码 | CHAR(5) |
撮合数据库第二张表,如表3-5所示,ashare_cjhb成交回报表结构说明(该表是由撮合程序负责写,报盘程序读)。
表3-5 ashare_cjhb成交回报表
列名称 | 名称 | 类型 | 填写要求 |
gddm | 股东代码 | CHAR(10) | 必填,对应委托记录的acc字段 |
gdxm | 股东姓名 | CHAR(8) | 必填,填空 |
bcrq | 成交日期 | CHAR(8) | 必填,数据写入时的日期,格式:20151013 |
cjbh | 成交编号 | INTEGER | 必填,由撮合程序自行生成,不允许重复 |
gsdm | 席位代码 | CHAR(5) | 必填,填‘12345’ |
cjsl | 成交数量 | CHAR(10) | 必填,不能小于等于委托记录的委托数量(一笔委托可以对应多笔成交记录,由撮合程序自行控制每笔委托对应的成交笔数,但总成交数量不能超过该笔委托的委托数量) |
bcye | 本次余额 | CHAR(10) | 必填,等于成交数量 |
zqdm | 股票代码 | CHAR(6) | 必填,对应该笔委托记录的stock字段 |
sbsj | 申报时间 | CHAR(6) | 必填,该笔成交对应委托申请写入撮合数据库委托表ashare_ordwth的时间 |
cjsj | 成交时间 | CHAR(6) | 必填,数据写入时的时间,格式:13:11:12 |
cjjg | 成交价格 | CHAR(6) | 必填,等于委托价格 |
cjje | 成交金额 | CHAR(12) | 必填,本条记录cjjg乘以cjsl,小数点保留2位 |
sqbh | 申请编号 | CHAR(10) | 必填,对应该笔委托记录的reff字段 |
bs | 买卖标志 | CHAR(1) | 必填,对应该笔委托记录的bs字段 |
mjbh | 马甲编号 | CHAR(5) | 必填,填‘JZGF’ |
rec_num | Identit类型 | integer | 自动生成,不用填,自己程序实现每天复位从1开始 |
3.6 撮合系统功能需求
登录页面实现的功能:用户根据自己的投资者账号和密码,在正确输入的前提下用户才可以进入系统,进行以后的操作。初级要求:安装SQLServer数据库,建立委托数据库(名称自定)使用委托数据库接口表创建脚本.sql建立三张接口表也可以选Oracle数据库,参考委托数据库接口表创建脚本.sql自行修正为oracle对应版本,自行选择开发语言开发委托程序,程序架构自行选择可以通过委托程序进行委托数据录入,并写入委托数据库中的委托表ashare_ordwth根据委托数据库中的委托ashare_ordwth中新增记录,按照接口说明手工添加到委托确认ashare_ordwth2和成交回ashare_cjhb中,模拟完整业务流程。委托程序要为多线程,自行考虑实现方案委托数据接口写入功能委托记录查询功能,委托确认记录查询功能,成交回报记录查询功能,委托功能要求委托数据录入要素(对输入内容要进行合法性判断,离开输入框就要判断)股东代码输入框,证券代码输入框,买卖方向选择框(只能选择买入和卖出,选择买入相关字体或者区域显示红色,选择卖出时相关字体或者区域显示绿色,自行考虑颜色变化内容,要符合一般人的审美要求),委托价格输入框(输入数字,旁边翻译成大写显示),委托数量输入框(输入数量后,旁边显示委托金额,委托价格乘以委托数量,按照千分位格式显示),确定按键:确定后,系统自动生成合同序号,把委托记录写入委托数据库ashare_ordwth,前端弹出“委托已报,合同序号为XXXXXXXX”。系统自动生成合同序号要求:每笔委托要分配一个唯一的合同序号并且递增,格式:0000000001程序关闭重开后,如何保证序号不重复?自行考虑实现。委托记录查询功能,实时查委托数据库中的委ashare_ordwth,委托确认记录查询功能实时查询委托数据库中的委托确认表ashare_ordwth2成交回报记录查询功能实时查询委托数据库中的成交回报表ashare_cjhb查询的频率如何控制查询更合理?数据量大了 如何查询?自行考虑。其他功能数据库连接、用户、密码不能写死,通过参数配置来实现。委托数据库中的委托表委托确认表,成交回报中的数据每天要清空以前的数据,要通过程序来实现,如何防止清空时误删除当天数据?自行考虑实现方法。identity类型的字段每天要复位,从1开始,自行考虑实现中级要求:完成初级要求安装SQLServer数据库,建立撮合数据库(名称自定)使用撮合数据库接口表创建脚本.sql建立两张接口表也可以选择Oracle数据库,参考撮合数据库接口表创建脚本.sql自行修正为oracle对应版本自行选择开发语言开发报盘程序和撮合程序,程序架构自行选择,基本要求参照委托程序,报盘程序要为多线程,自行考虑实现方案,撮合程序要能实现一笔委托撮合多笔成交。高级要求:在完成全部功能的基础上,追求性能,委托程序:通过配置文件存放10W笔委托数据(合同序号不能提前准备由委托程序分配),委托程序读取该配置文件,分配合同序号,以最快的速度写入委托数据库的委托表ashare_ordwth中。最低要求达到1000笔/秒(可以通过接口库的time字段进行统计,time由数据写入时取数据库时间即可)。报盘程序:委托报盘、回写委托确认、读成交回写成交能分别达到1000笔/秒,撮合程序:一笔委托对应多笔成交(1-5笔之间随机)的基础上达到1000笔/秒,程序间消息传递。实现撮合程序撮合成交后,主动通知报盘程序读取撮合数据库成交记录。