version

match-engine

介绍

match-trade超高效的交易所撮合引擎,采用伦敦外汇交易所LMAX开源的Disruptor框架,用Hazelcast进行分布式内存存取,以及原子性操作。使用数据流的方式进行计算撮合序列,才用价格水平独立撮合逻辑,实现高效大数据撮合。

优势

技术选择

描述

用户输入包括:

委托单:

撮合流程

限价撮合: 输入图片说明

市价撮合: 输入图片说明 目前就实现这两种订单撮合

订单簿为撮合簿时代码解析

这个是一个简单流盘口计算demo

//获取匹配的订单薄数据
IMap<Long, Order> outMap = hzInstance.getMap(HzltUtil.getMatchKey(coinTeam, isBuy));
/**
 * -★
 * -使用Java 8 Stream API中的并行流来计算最优
 * -能快速的拿到撮合对象,不用排序取值,降低性能消耗
 */
Order outOrder = outMap.values().parallelStream().min(HzltUtil::compareOrder).get();

//这种方式最难的,就是整理盘口深度数据了

    /**
     * -★
     * -获取行情深度
     * 
     * @param coinTeam 交易队
     * @param isBuy    是否是买
     * @return List<Depth>
     */
    public List<Depth> getMarketDepth(String coinTeam, Boolean isBuy) {
        List<Depth> depths = new ArrayList<Depth>();
        IMap<Long, Order> map = hzInstance.getMap(HzltUtil.getMatchKey(coinTeam, isBuy));
        if (map.size() > 0) {
            /**
             * -这个流:主要是安价格分组和统计,使用并行流快速归集。
             */ 
            List<Depth> list = map.entrySet().parallelStream().map(mo -> mo.getValue())
                    .collect(Collectors.groupingBy(Order::getPrice)).entrySet().parallelStream()
                    .map(ml -> new Depth(ml.getKey().toString(),
                            ml.getValue().stream().map(o -> o.getUnFinishNumber()).reduce(BigDecimal.ZERO, BigDecimal::add)
                                    .toString(),
                            "0", 1, coinTeam, isBuy))
                    .sorted((d1, d2) -> HzltUtil.compareTo(d1, d2)).collect(Collectors.toList());
            /**
             * -这个流:主要是盘口的累计计算,因涉及排序选择串行流
             */
            list.stream().reduce(new Depth("0", "0", "0", 1, coinTeam, isBuy), (one, two) -> {
                one.setTotal((new BigDecimal(one.getTotal()).add(new BigDecimal(two.getNumber()))).toString());
                depths.add(new Depth(two.getPrice(), two.getNumber(), one.getTotal(), two.getPlatform(),
                        two.getCoinTeam(), two.getIsBuy()));
                return one;
            });
        } else {
            Depth depth = new Depth("0", "0", "0", 1, coinTeam, isBuy);
            depths.add(depth);
        }
        return depths;
    }

测试结果

在我8cpu,16G内存的开发win10系统上测试结果: