在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:match-trade开源软件地址:https://gitee.com/flying-cattle/match-trade开源软件介绍:match-engine介绍match-trade超高效的交易所撮合引擎,采用伦敦外汇交易所LMAX开源的Disruptor框架,分布式内存存取,以及原子性操作。使用数据流的方式进行计算撮合序列,才用价格水平独立撮合逻辑,实现高效大数据撮合。PS:这不是一个具备生产上线的项目,仅供学习参考。生产级项目见:mxs-exchange 优势
技术选择
描述用户输入包括:
委托单:
撮合流程限价撮合: 市价撮合:目前就实现这两种订单撮合 代码执行流程图(感谢读者提供的图)订单簿为撮合簿时代码解析这个是一个简单流盘口计算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系统上测试结果:
学习讨论群想实现内存集群,或者撮合集群的(保证多台撮合,其中一台宕机,撮合正常),请加群。重点:这套代码只是适合小量的交易场景,因分布式内存受RPC的性能影响全局TPS必然不可能很高,所以本套代码仅供参考。 |
请发表评论