数据清洗

因为程序执行错误导致数据库里有好多重复记录,现需要删除多余的重复记录。 主要是record表和record_detail表。

查询重复的sql语法如下

Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1

因为交易记录表和交易详情表中数据存在错误的数据,导致根据交易记录进行重算的时候 ,没有办法获取正确的结果 。

数据清洗逻辑如下。

当前情况上不会出现平仓的数据,所以强制平仓的数据要先删除 。

DELETE FROM  `tbl_trans_record_details` WHERE trans_id IN (SELECT trans_id FROM `tbl_trans_record`  WHERE product_name='强制平仓')
DELETE FROM tbl_trans_record WHERE product_name='强制平仓'

删除交易详情中多作的数据,就是id不在交易记录表中的数据 。之前record表中存在数据,已经删除了。但是record_detail表中的数据没有删除 。

DELETE FROM  `tbl_trans_record_details` WHERE trans_id NOT IN (SELECT trans_id FROM `tbl_trans_record`  )

删除record_detail表中的的重复记录,只保留最小id的数据, 因为id是自增的,只保留最小id的记录就可以了 。

--查询大于2条记录的数据
SELECT * FROM  `tbl_trans_record_details` WHERE trans_id  IN (SELECT trans_id FROM tbl_trans_record_details GROUP BY trans_id HAVING COUNT(1)>1)

--只保留重复记录中的第一条记录
DELETE FROM tbl_trans_record_details WHERE trans_detail_id NOT IN (SELECT dt.id FROM (SELECT MIN(trans_detail_id) id  FROM tbl_trans_record_details GROUP BY trans_id) dt
)

数据重算与昨日收益计算

1.数据重算是在数据出错的情况下,根据交易记录对进行的交易进行数据重新计算。来保证数据的正确性,以及程序出现以后,对数据的恢复性。

2.昨日收益计算:是每天定时对昨天持有的资金,贵金属,活期收益等进行收益计算,存入收益表,每天都按产品类型进行收益的统计 。

两个可以调用同一个方法,除了日期不同之个。数据重算是按天把所有日期进行重新计算 ,昨日收益计算是只计算昨天一天的。 但因为有做空机制的存在,涉及到保证金。 重算的时候 预先把可用余额全借给做空来做保证金,之后通过记录来记录转入和转出的,但是在最后,要把初始的可用余额再减 去才可以的。

所以重新和昨日调用同一方法的时候 要注意区分,

如果是数据重算,则先对资金表,做空表,活期收益等相关记录进行清0,初始化操作。然后再按天计算 。 最后再把借给做空的保证金减去。

但是昨日收益计算就不能调用 数据清0操作,也不能调用减去数据做空保证金的操作。

强制平仓

因为有做机制,要涉及到强制平仓操作,但因为目前的行情,基本上平仓数据不可能发生。 但是如果发生的时候 ,逻辑判断 要注意区分如下。

  1. 做空的总资产是不能小于0的,如果小于0,一定时程序有问题了。
  2. 做空的交易冻结如果是0,表示没有持有该类产品,可以不用去判断该产品 是否需要平仓操作。
  3. 通过数据拉取现在黄金价格的时候 ,要考虑到0点,如果拉取不到的情况,比如可以休息一分钟再试着接取。

本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论