交易撮合

2017/06/15 互联网金融
  1. 交易需求要点
  • 连续竞价,无集合竞价
  • 24小时交易(参考数字货币交易)
  • 五档行情
  • 即时行情(开盘价、收盘价、最高价、最低价、交易量、涨跌值、涨跌幅、换手率、均价)
  • 分时图(当天24小时变化)
  • 日K图
  1. 设计图

image

  1. 内存数据
    • 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>();
    }
    
  1. 缓存设计
  • redis主从服务器
  • 缓存数据格式
缓存数据 数据结构 redis_key hash_key
分时价格、交易量 hash [stockCode]_realTimeData HHmm
最新分时价格 String [stockCode]_realTimeData_latest  
日K价格、交易量 hash [stockCode]_dayTimeData yyMMdd
  • fst对象序列化(cli查看乱码,暂忽略)
    1. Matcher初始化
  • 五档行情重建
Order表->内存
  • 日K重建
StockDayData表->Redis
  • 分时重建 ``` Db->Redis
  1. 当天之前最后一笔交易价作为开盘价(Deal表、StockDayData表)
  2. 缓存分时数据第一笔
  3. 缓存分时数据最新值
  4. 填充分时交易实际交易数据(定时任务不执行此项) ```
  5. 定时任务
    • 每天0点,清空前一天分时数据、执行分时重建任务
    • 每五分钟,根据最新交易价格(latest)填充分时虚拟数据
  6. redis操作
key *
hvals 800001_realTimeData
hvals 800001_dayTimeData
get 800001_realTimeData_latest
flushdb
  1. 数据库说明
  • 涉及资金计算字段为decimal(10,2)类型
  • priceLevel表只作为对象只在内存中使用,没有持久化操作,类似还有一些变化的行情数据,如股票资产,涨跌幅等也是如此使用
  • Order表中的freezeMoney字段是买入订单的冻结资金,用来计算最后一笔解冻资金,业务补偿小数计算精度问题
  • 认购成功后会写入sotckDayData表,作为二级市场的初始数据

Search

    Table of Contents