数字交易所内存撮合、无锁并发技术源码
目录
背景介绍
什么是虚拟货币撮合交易?
撮合引擎原理
内存撮合引擎设计
初级版架构设计
中极版撮合引擎架构设计
终极版撮合引擎架构设计
性能跑分
源码
背景介绍
区块链和比特币从只有行业极客谈论的话题,目前已经变成家喻户晓。比特币进入中国,衍生出很多种交易模式,有币币交易,场外交易,法币交易模式。
特别是币币交易,每天买卖数几十亿级别以上,所以如何设计高性能电子化撮合引擎来满足当下的需求成了重要的话题。
所以撮合交易在币币交易系统中扮演者非常重要的角色。了解撮合交易的本质以及业务对于设计撮合系统至关重要。接下来,我们就详细介绍下内存撮合引擎技术的设计思想。
什么是虚拟货币撮合交易?
简单的来讲撮合交易就是:
拿身边的房产交易举例,张三想买房,李四、赵六想卖房,但是他们两个不认识也见不着,所以就出现了中介王五,这时候他们各自在王五这边告知买卖报价,在各自都能接受的报价内,相互成交。市场决定一切,张三想花钱买房,李四报价100万卖出,而赵六觉得现在房产行情不好,愿意95万就卖给张三,那么张三势必会找王赵六交易了。
币币交易撮合成交的前提是买入价必须大于或者等于卖出价。当买入价等于卖出价时,成交价就是买入价或者卖出价。当买入价大于卖出价时,计算机在撮合时实际上是根据前一笔成交价而定出最新成交价的。
选取买入价、卖出价和前一成交价三者居中的一个价格作为最新成交价(如果前一笔成交价低于或等于卖出价,那么最新成交价就是卖出价;如果前一笔成交价高于或等于买入价,那么最新成交价就是买入价;如果前一笔成交价在卖出价与买入价之间,那么最新成交价就是前一笔的成交价)。
撮合引擎原理
撮合交易算法
如图所示,撮合引擎的核心业务模块就是撮合交易算法。撮合交易算法的任务一方面是完成对客户所下订单进行公平合理的排列和撮合功能,也要保证撮合算法的公平性、高效性以及扩展性等。由于不同金融交易系统的撮合业务各有不同,因此教程对通用的撮合交易算法进行概括性描述。
订单队列
撮合交易的重要组成部分就是买卖订单,通过对买卖订单进行撮合最后形成交易记录。所以对无法立刻完成撮合的订单,需要有买入队列和卖出队列保存订单。队列按照“价格优先、同价格下时间优先”的原则。买入队列按照委托价格从低到高的顺序,卖出队列则按照委托价格从低到高的顺序排列,如图
币币交易: 以币买卖币进行交易。如使用比特币来定价以太坊:交易对 ETH/BTC,表示购买一个ETH需要多少BTC。 买入:使用BTC购买ETH,把BTC兑换成ETH;卖出ETH,把ETH兑换成BTC。
法币交易(OTC): 为了解决在线支付通道关闭的备选方案。客户A在交易所发布卖出(买入)价格。另一个客户B可以选择这个这个价格买入,然后A的币质押到交易所(中介),B可以按照A给出的银行卡,支付宝等直接C2C的转账。转成功后,后台点击确认,交易所把币设置到B方账户。
杠杆交易: 跟交易所借钱配资,放大本金。对撮合引擎不影响。
合约交易: 对未来币种合约到期的趋势判断。看涨开多单,看跌开空单。一般未来时间节点合约有当周(周五)、次周(下周五)、季(最后一个周五)等。可以进行杠杆。
限价单: 根据设定的委托单价格和数量进行交易
市价单: 设定固定额度(买入)或者数量(卖出)直接进行按照当前最优价格成交。
开盘价: 根据设定的委托单价格进行交易。
收盘价: 根据设定的委托单价格进行交易。
当前价: 最新的汇率价格或者说最新成交价。如BTC/USDT: 8500
撮合顺序
撮合引擎接收到新的买入订单,则会到卖出队列的头部查找是否存在符合价格规则的卖出订单,如果存在卖出价格小于或等于买入价格的订单,则从队列中取出此订单并撮合成一笔交易;如果卖出队列为空或队列头部不满足价格关系,则将买入订单插入买入队列中,由于买入队列是按照价格与时间先后进行排序,所以新插入的订单会经过一次排序插入到买入队列的相应位置。
相同的,当撮合引擎接收到新的卖出订单,则会到买入队列的头部査找是否存在符合价格规则的买入订单,如果存在买入价格大于或等于卖出价格的订单,则从订单队列中取出此订单并撮合成一笔交易;如果买入队列为空或队列头部不满足价格关系,则将卖出订单插入到卖出队列中,由于卖出队列也是按照价格与时间先后进行排序的所以新插入的订单会经过一次排序插入到卖出队列的相应位置[23]。结合买卖订单情况,撮合算法流程如图所示。从图所示的撮合顺序可知,买卖队列的有序性是保证撮合顺序的确定性的基础,并且撮合过程中每笔订单都可以撮合出当前最优交易。
内存撮合引擎设计
撮合引擎的质量
初级版架构设计
中极版撮合引擎架构设计
请留言作者
终极版撮合引擎架构设计
请留言作者
性能跑分
2核8G 20000 -> 4核8G 30000 -> 8核16G 50000 -> 16核32G 80000 -> 32核64G 88000
源码
数字交易所内存撮合、无锁并发技术源码相关推荐
- java 并发框架源码_某网Java并发编程高阶技术-高性能并发框架源码解析与实战(云盘下载)...
第1章 课程介绍(Java并发编程进阶课程) 什么是Disruptor?它一个高性能的异步处理框架,号称"单线程每秒可处理600W个订单"的神器,本课程目标:彻底精通一个如此优秀的 ...
- 【共享内存】基于共享内存的无锁消息队列设计
上交所技术服务 2018-09-05 https://mp.weixin.qq.com/s/RqHsX3NIZ4_BS8O30KWYhQ 目录 一.背景 二.消息队列的应用需求 (一) 通信架构的升 ...
- Java无锁并发详细教程
问题提出 有如下需求,保证 account.withdraw 取款方法的线程安全 package cn.itcast;import java.util.ArrayList; import java.u ...
- java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战
Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...
- Java中的锁大全(底层源码分析)
引用:https://tech.meituan.com/2018/11/15/java-lock.html 加锁过程:https://www.cnblogs.com/hkdpp/p/11917383. ...
- Java并发-ReentrantReadWriteLock源码分析
ReentrantLock实现了标准的互斥重入锁,任一时刻只有一个线程能获得锁.考虑这样一个场景:大部分时间都是读操作,写操作很少发生:我们知道,读操作是不会修改共享数据的,如果实现互斥锁,那么即使都 ...
- PHP短视频聚合无水印在线解析源码
PHP短视频聚合无水印在线解析源码,一键解析,方便快捷 接口是作者那边的API,不保证时效性! 有技术的朋友可以更换成自己的,将复制的分享链接粘贴到输入框即可进行解析. 链接: https://pan ...
- 基于51单片机的数字温度计ds18b20温度测量报警仿真(仿真+源码+全套资料)
资料编号:074 可以设置最低值和最高值,超过上限值LED1亮,超过下限值,LED2亮,LCD1602显示 全套资料齐全:具体请看下方演示视频 74-基于51单片机的数字温度计ds18b20温度测量 ...
- python处理回显_Python中getpass模块无回显输入源码解析
本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )
文章目录 一.用户虚拟地址空间组成 二.内存描述符 mm_struct 结构体源码 一.用户虚拟地址空间组成 " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ ...
最新文章
- mysql的主从复制原理与实现
- cmake 静态编译 简介
- 南宁网络推广浅析如何分析SEO数据,才能助力网站优化效果更“事半功倍”?...
- linux limit
- 信息学奥赛课课通VS中学生计算机,数学奥赛VS信息学奥赛 孩子们该如何选择
- epoll nio区别_高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?...
- struts启动过滤器异常_Spring 统一异常处理的方式
- cplex java_cplex-Java-样例代码解析
- (保姆级)Oracle的下载及安装详细教程
- 2015 年电赛测评试题——多种波形发生器
- 西瓜书课后题——第四章(决策树)
- python 文字快闪视频制作
- contiki学习笔记(四)、contiki系统UDP通信原理(单播、多播、RPL介绍)
- Remote 'g' packet reply is too long 错误
- 维修服务器的请示,关于更换云服务器的请示
- 前端VS后端Web开发
- FP Tree算法原理
- STM32学习之新建工程模板
- fusioncharts 集成Jquery开发插件
- 运行库:Windows下MSVC CRT运行库封装fread()函数解析