- 交易需求要点
- 连续竞价,无集合竞价
- 24小时交易(参考数字货币交易)
- 五档行情
- 即时行情(开盘价、收盘价、最高价、最低价、交易量、涨跌值、涨跌幅、换手率、均价)
- 分时图(当天24小时变化)
- 日K图
- 设计图
- 内存数据
- Stock:有买入和卖出档位列表、五档数据出于此
public class TStock extends BaseTStock<TStock> {
// 买入的价格队列. Double 是优先级而非价格
private TreeMap<Double, TPriceLevel> buyPriceList = null;
// 卖出的价格队列. Double 是优先级而非价格
private TreeMap<Double, TPriceLevel> sellPriceList = null;
}
- PriceLevel:除了显示的price和accumulateQuantity外,还包含订单列表
public class TPriceLevel extends BaseTPriceLevel<TPriceLevel> { public LinkedList<TOrder> orderList = new LinkedList<TOrder>(); }
- 缓存设计
- redis主从服务器
- 缓存数据格式
缓存数据 | 数据结构 | redis_key | hash_key |
---|---|---|---|
分时价格、交易量 | hash | [stockCode]_realTimeData | HHmm |
最新分时价格 | String | [stockCode]_realTimeData_latest | |
日K价格、交易量 | hash | [stockCode]_dayTimeData | yyMMdd |
- fst对象序列化(cli查看乱码,暂忽略)
- Matcher初始化
- 五档行情重建
Order表->内存
- 日K重建
StockDayData表->Redis
- 分时重建 ``` Db->Redis
- 当天之前最后一笔交易价作为开盘价(Deal表、StockDayData表)
- 缓存分时数据第一笔
- 缓存分时数据最新值
- 填充分时交易实际交易数据(定时任务不执行此项) ```
- 定时任务
- 每天0点,清空前一天分时数据、执行分时重建任务
- 每五分钟,根据最新交易价格(latest)填充分时虚拟数据
- redis操作
key *
hvals 800001_realTimeData
hvals 800001_dayTimeData
get 800001_realTimeData_latest
flushdb
- 数据库说明
- 涉及资金计算字段为decimal(10,2)类型
- priceLevel表只作为对象只在内存中使用,没有持久化操作,类似还有一些变化的行情数据,如股票资产,涨跌幅等也是如此使用
- Order表中的freezeMoney字段是买入订单的冻结资金,用来计算最后一笔解冻资金,业务补偿小数计算精度问题
- 认购成功后会写入sotckDayData表,作为二级市场的初始数据