国王小组:开发交易所源码需要用到的开源框架

简介: 区块链交易所开发详细丨区块链交易所系统开发(开发方案)丨区块链交易所源码案例部署Uniswap交易所开发稳定版丨Uniswap交易所系统开发(开发模板)丨Uniswap交易所系统源码案例部署数字货币交易所开发详情版丨数字货币交易所系统开发(web3.0技术开发)丨数字货币交易所开发源码成品交易所APP开发功能丨交易所系统开发(成熟及案例)丨交易所系统源码平台DAPP交易所系统开发(开发案例)丨DAPP交易所系统开发(源码及方案)

交流核心
开发交易所源码需要用到的开源框架

Exchange-core是一个基于LMAX Disruptor、Eclipse Collections(ex. Goldman Sachs GS Collections)、Real Logic Agrona、OpenHFT Chronicle-Wire、LZ4 Java和Adaptive Radix Trees的开源市场交换核心。

Exchange-core包括。

订单匹配引擎
风险控制和会计模块
磁盘日记和快照模块
交易、管理和报告API
设计用于在高负荷条件下的高可扩展性和无暂停的24/7操作,并提供低延迟的响应。

区块链交易所开发详细丨区块链交易所系统开发(开发方案)丨区块链交易所源码案例部署
Uniswap交易所开发稳定版丨Uniswap交易所系统开发(开发模板)丨Uniswap交易所系统源码案例部署
数字货币交易所开发详情版丨数字货币交易所系统开发(web3.0技术开发)丨数字货币交易所开发源码成品
交易所APP开发功能丨交易所系统开发(成熟及案例)丨交易所系统源码平台
DAPP交易所系统开发(开发案例)丨DAPP交易所系统开发(源码及方案)
DAPP数字货币交易所开发逻辑,DAPP数字货币交易所系统开发(案例及源码)
DAPP交易所开发稳定版丨DAPP交易所系统开发(开发案例)丨DAPP交易所系统源码部署
数字货币去中心化交易所开发详情版丨数字货币去中心化交易所系统开发(原生开发)丨数字货币去中心化交易所现成源码模板
去中心化交易所开发丨去中心化交易所系统开发(功能及逻辑)丨去中心化交易所系统源码部署
海外版数字货币交易所系统开发(逻辑及功能)丨多语言数字货币交易所系统开发(案例及源码)
数字货币交易所系统开发(功能版)丨数字货币交易所开发源码案例部署
交易所系统开发(原生开发)丨 交易所系统开发(多语言)丨交易所源码详情
总共有3个用户,1千万个账户
10万个订单簿(符号),共有400万个待处理订单
对于每秒100万以上的操作量,最差的线对线目标延迟小于1ms
大型市场订单的每次匹配时间为150ns
单个订单簿配置能够在10年的硬件(Intel® Xeon® X5690)上每秒处理5百万次操作,并有适度的延迟下降。
rate 50.0% 90.0% 95.0% 99.0% 99.9% 99.99% worst
125K 0.6µs 0.9µs 1.0µs 1.4µs 4µs 24µs 41µs
250K 0.6µs 0.9µs 1.0µs 1.4µs 9µs 27µs 41µs
500K 0.6µs 0.9µs 1.0µs 1.6µs 14µs 29µs 42µs
1M 0.5µs 0.9µs 1.2µs 4µs 22µs 31µs 45µs
2M 0.5µs 1.2µs 3.9µs 10µs 30µs 39µs 60µs
3M 0.7µs 3.6µs 6.2µs 15µs 36µs 45µs 60µs
4M 1.0µs 6.0µs 9µs 25µs 45µs 55µs 70µs
5M 1.5µs 9.5µs 16µs 42µs 150µs 170µs 190µs
6M 5µs 30µs 45µs 300µs 500µs 520µs 540µs
7M 60µs 1.3ms 1.5ms 1.8ms 1.9ms 1.9ms 1.9ms
image.png
基准配置。

单一符号订单簿。
3,000,000条入站信息分布如下。9%的GTC订单,3%的IOC订单,6%的取消指令,82%的移动指令。所有信息中约有6%触发了一个或多个交易。
1,000个活跃用户账户。
平均~1,000个限价订单是活跃的,放置在~750个不同的价格槽中。
延迟结果只针对风险处理和订单匹配。其他东西,如网络接口延迟,IPC,日记不包括在内。
测试数据不是突发的,这意味着命令之间有恒定的间隔(0.2~8µs,取决于目标吞吐量)。
在整个测试过程中,BBO价格没有明显变化。没有雪崩命令。
延迟基准没有协调遗漏效应。任何处理延迟都会影响接下来的消息的测量。
在运行每个基准周期(3,000,000条消息)之前/之后都会触发GC。
RHEL 7.5,网络延迟调整-adm配置文件,双X5690 6核3.47GHz,一个插座隔离和无痒,禁用光谱/熔断保护。
Java 8u192版本,较新的Java 8版本可能有一个性能错误。
特点
HFT优化。优先级是限序移动操作的平均延迟(目前~0.5µs)。取消操作需要~0.7µs,下新订单~1.0µs。
会计数据和订单簿的内存工作状态。
事件源 - 支持磁盘日志和日志重放,状态快照(序列化)和恢复操作,LZ4压缩。
无锁和无争夺的订单匹配和风险控制算法。
无浮点运算,不可能有意义损失。
匹配引擎和风险控制操作是原子性的和确定性的。
管道式多核处理(基于LMAX Disruptor):每个CPU核负责某些处理阶段、用户账户碎片或符号订单簿碎片。
两种不同的风险处理模式(每个符号指定):直接交易和保证金交易。
制作者/接受者费用(以报价货币单位定义)。
两种订单簿实现方式:简单实现("Naive")和性能实现("Direct")。
订单类型。即时或取消(IOC),直到取消(GTC),可填可杀预算(FOK-B)。
测试--单元测试、集成测试、压力测试、完整性/一致性测试。
低GC压力,对象池,单环缓冲区。
线程亲和性(需要JNA)。
用户暂停/恢复操作(减少内存消耗)。
核心报告API(用户余额、未偿付利息)。
安装
通过运行mvn install将库安装到Maven的本地仓库中。
在你项目的pom.xml中添加以下Maven依赖项。

<groupId>exchange.core2</groupId>
<artifactId>exchange-core</artifactId>
<version>0.5.3</version>


另外,你也可以克隆这个仓库并运行示例测试。

使用实例
创建并启动空的交换核心。
// simple async events handler
SimpleEventsProcessor eventsProcessor = new SimpleEventsProcessor(new IEventsHandler() {

@Override
public void tradeEvent(TradeEvent tradeEvent) {
    System.out.println("Trade event: " + tradeEvent);
}

@Override
public void reduceEvent(ReduceEvent reduceEvent) {
    System.out.println("Reduce event: " + reduceEvent);
}

@Override
public void rejectEvent(RejectEvent rejectEvent) {
    System.out.println("Reject event: " + rejectEvent);
}

@Override
public void commandResult(ApiCommandResult commandResult) {
    System.out.println("Command result: " + commandResult);
}

@Override
public void orderBook(OrderBook orderBook) {
    System.out.println("OrderBook event: " + orderBook);
}

});

// default exchange configuration
ExchangeConfiguration conf = ExchangeConfiguration.defaultBuilder().build();

// no serialization
Supplier serializationProcessorFactory = () -> DummySerializationProcessor.INSTANCE;

// build exchange core
ExchangeCore exchangeCore = ExchangeCore.builder()

    .resultsConsumer(eventsProcessor)
    .serializationProcessorFactory(serializationProcessorFactory)
    .exchangeConfiguration(conf)
    .build();

// start up disruptor threads
exchangeCore.startup();

// get exchange API for publishing commands
ExchangeApi api = exchangeCore.getApi();
Create new symbol:
// currency code constants
final int currencyCodeXbt = 11;
final int currencyCodeLtc = 15;

// symbol constants
final int symbolXbtLtc = 241;

// create symbol specification and publish it
CoreSymbolSpecification symbolSpecXbtLtc = CoreSymbolSpecification.builder()

    .symbolId(symbolXbtLtc)         // symbol id
    .type(SymbolType.CURRENCY_EXCHANGE_PAIR)
    .baseCurrency(currencyCodeXbt)    // base = satoshi (1E-8)
    .quoteCurrency(currencyCodeLtc)   // quote = litoshi (1E-8)
    .baseScaleK(1_000_000L) // 1 lot = 1M satoshi (0.01 BTC)
    .quoteScaleK(10_000L)   // 1 price step = 10K litoshi
    .takerFee(1900L)        // taker fee 1900 litoshi per 1 lot
    .makerFee(700L)         // maker fee 700 litoshi per 1 lot
    .build();

future = api.submitBinaryDataAsync(new BatchAddSymbolsCommand(symbolSpecXbtLtc));
Create new users:

// create user uid=301
future = api.submitCommandAsync(ApiAddUser.builder()

    .uid(301L)
    .build());

// create user uid=302
future = api.submitCommandAsync(ApiAddUser.builder()

    .uid(302L)
    .build());

Perform deposits:

// first user deposits 20 LTC
future = api.submitCommandAsync(ApiAdjustUserBalance.builder()

    .uid(301L)
    .currency(currencyCodeLtc)
    .amount(2_000_000_000L)
    .transactionId(1L)
    .build());

// second user deposits 0.10 BTC
future = api.submitCommandAsync(ApiAdjustUserBalance.builder()

    .uid(302L)
    .currency(currencyCodeXbt)
    .amount(10_000_000L)
    .transactionId(2L)
    .build());

Place orders:

// first user places Good-till-Cancel Bid order
// he assumes BTCLTC exchange rate 154 LTC for 1 BTC
// bid price for 1 lot (0.01BTC) is 1.54 LTC => 1_5400_0000 litoshi => 10K * 15_400 (in price steps)
future = api.submitCommandAsync(ApiPlaceOrder.builder()

    .uid(301L)
    .orderId(5001L)
    .price(15_400L)
    .reservePrice(15_600L) // can move bid order up to the 1.56 LTC, without replacing it
    .size(12L) // order size is 12 lots
    .action(OrderAction.BID)
    .orderType(OrderType.GTC) // Good-till-Cancel
    .symbol(symbolXbtLtc)
    .build());

// second user places Immediate-or-Cancel Ask (Sell) order
// he assumes wost rate to sell 152.5 LTC for 1 BTC
future = api.submitCommandAsync(ApiPlaceOrder.builder()

    .uid(302L)
    .orderId(5002L)
    .price(15_250L)
    .size(10L) // order size is 10 lots
    .action(OrderAction.ASK)
    .orderType(OrderType.IOC) // Immediate-or-Cancel
    .symbol(symbolXbtLtc)
    .build());

Request order book:

future = api.requestOrderBookAsync(symbolXbtLtc, 10);
GtC orders manipulations:

// first user moves remaining order to price 1.53 LTC
future = api.submitCommandAsync(ApiMoveOrder.builder()

    .uid(301L)
    .orderId(5001L)
    .newPrice(15_300L)
    .symbol(symbolXbtLtc)
    .build());
    

// first user cancel remaining order
future = api.submitCommandAsync(ApiCancelOrder.builder()

    .uid(301L)
    .orderId(5001L)
    .symbol(symbolXbtLtc)
    .build());

Check user balance and GtC orders:

Future report = api.processReport(new SingleUserReportQuery(301), 0);
Check system balance:

// check fees collected
Future totalsReport = api.processReport(new TotalCurrencyBalanceReportQuery(), 0);
System.out.println("LTC fees collected: " + totalsReport.get().getFees().get(currencyCodeLtc));

测试
延迟测试:mvn -Dtest=PerfLatency#testLatencyMargin测试
吞吐量测试:mvn -Dtest=PerfThroughput#testThroughputMargin测试
打嗝测试:mvn -Dtest=PerfHiccups#testHiccups测试
序列化测试:mvn -Dtest=PerfPersistence#testPersistenceMargin测试
待办事项
市场数据馈送(完整的订单日志、二级市场数据、BBO、交易)。
清算和结算
报告
集群
FIX和REST API网关
加密货币支付网关
更多测试和基准
NUMA感知和CPU布局的自定义配置

相关文章
|
消息中间件 前端开发 算法
交易所开发系统如何采用分布式架构(国王小组)
交易所开发系统如何采用分布式架构(国王小组)
交易所开发系统如何采用分布式架构(国王小组)
|
消息中间件 NoSQL 网络协议
国王小组:搭建交易所开发需要的服务器架构
区块链交易所开发详细、区块链交易所系统开发(开发方案)、区块链交易所源码案例部署 数字货币交易所开发详情版、数字货币交易所系统开发(web3.0技术开发)、数字货币交易所开发源码成品交易所服务器是一个具有高速性能的交易后台,专为加密货币交易所设计。它可以支持每秒10000次的交易,并通过websocket实时通知用户/市场数据。
国王小组:搭建交易所开发需要的服务器架构
|
消息中间件 JavaScript Java
国王小组:交易所搭建|如何解决事件驱动架构
介绍 还是先举例子,在平常的生活中事件驱动架构也是比较常见的。一般情况下的人与人之间的沟通都是以一个人说一个人听的关系进行,并同时可以交换听者与说着。伴随着听者听到说者所表述的内容后,做出的心理,行为上的反应就是事件在接受者中的处理过程。
国王小组:交易所搭建|如何解决事件驱动架构
|
存储 SQL 消息中间件
国王小组:区块链交易所搭建|如何用微服务替代单服务架构
本篇文章一共分为三个部分,分别是微服务架构的演进过程、具体实践微服务的应用技术和领域驱动设计的意识转变。微服务架构已经渗透到互联网应用的方方面面,而领域驱动设计也逐渐被业界所接收。
国王小组:区块链交易所搭建|如何用微服务替代单服务架构
国王小组:开发交易所搭建|如何实现分布式事务
开发交易所搭建|如何实现分布式事务 在 Hyperf 中,您可以使用 dtm-client 库在您的应用程序中实现分布式事务。 以下是如何使用 dtm-client 为用户下订单编写交易代码的示例:
|
Ubuntu 固态存储 网络安全
国王小组:数字货币交易所开发中使用的开源框架
永续合约/秒合约/合约交易所开发详情,永续合约/秒合约/合约交易所系统开发技术方案 深入分析代币合约流动性质押挖矿分红系统开发实现技术原理及源码部署 交易所系统开发如何开发?数字货币交易所系统开发成熟技术案例 去中心化交易所系统开发技术原理丨数字货币去中心化交易所系统开发(说明案例) 数字货币交易所系统 数字货币交易所系统开发成品案例 数字货币交易所现成源码部署 交易所系统开发案例说明丨数字货币交易所系统开发技术方案详情 数字货币交易所系统开发方案详细丨数字货币交易所开发成品技术源码 合约交易系统设计与开发|永续合约交易所搭建,合约平台开发|永续合约交易所开发技术|特点介绍
|
开发框架 Serverless API
国王小组:交易所开发框架
概述ExchangeSharp是一个C#框架/lib和控制台应用程序,用于加密货币资产的交易和与各种交易所API端点的通信。支持许多交易所,以及网络套接字、提款等
|
存储 网络协议 数据处理
国王小组:开发数字货币交易所搭建中所使用的数据处理程序
处理多个加密货币交易所的数据馈送,并将规范化和标准化的结果返回给客户注册的回调,如交易、账簿更新、股票更新等事件。尽可能利用网络套接字,但如果没有提供网络套接字,也可以通过REST端点轮询数据。
|
消息中间件 存储 区块链
国王小组:开发数字货币交易所源码搭建交易所中需要使用的插件
永续合约/秒合约/合约交易所开发详情,永续合约/秒合约/合约交易所系统开发技术方案 深入分析代币合约流动性质押挖矿分红系统开发实现技术原理及源码部署 交易所系统开发如何开发?数字货币交易所系统开发成熟技术案例 去中心化交易所系统开发技术原理丨数字货币去中心化交易所系统开发(说明案例) 数字货币交易所系统 数字货币交易所系统开发成品案例 数字货币交易所现成源码部署 交易所系统开发案例说明丨数字货币交易所系统开发技术方案详情