代码拉取完成,页面将自动刷新
同步操作将从 kinbug/match-trade 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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系统上测试结果:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。