php引擎,PHP撮合引擎

Laravel Package for Matching Engine

Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎

快速开始 github地址

安装: composer require sting_bo/mengine

复制配置文件: php artisan vendor:publish

依赖 predis

号外 已经出Golang微服务撮合啦,欢迎使用并提issue

使用说明 已有数据的系统如果使用此库,可以自己写一个初始化脚本,先把数据跑入队列

用户下单

下单后,先存入数据库,然后才开始下面步骤,实例化单据对象 use StingBoMengineCoreOrder;

$uuid = 3; // 用户唯一标识

$oid = 4; // 订单唯一标识

$symbol = 'abc2usdt'; // 交易对

$transaction = 'buy'; // 交易方向,buy/sale

$price = 0.4; // 交易价格,会根据设置精度转化为整数

$volume = 15; // 交易数量,会根据设置精度转化为整数

$order = new Order($uuid, $oid, $symbol, $transaction, $volume, $price);

交易方向与交易精度可在配置文件灵活设置return [

'mengine' => [

// 交易类型,不可更改

'transaction' => [

'buy',

'sale',

],

// 精度,可更改

'accuracy' => 8, //default

'test2usdt_accuracy' => 4, //设置交易对精度则使用,没有则取accuracy

],

]; push到队列,队列任务需要手动开启 use StingBoMengineServicesMengineService;

$ms = new MengineService();

$ms->pushQueue($order);

开启队列任务: php artisan queue:work --queue=abc2usdt 也可以使用horizon与supervisor来辅助,事半功倍!

队列消费时会进入撮合程序,大概的步骤如下:获取匹配委托订单

如果没有匹配的订单,则进入委托池,触发委托池变更事件,详见第5点

如果有匹配的委托,程序撮合,更新委托池数据

交易成功会触发事件,开发者要在监听器里处理有交易的委托单,比如更新数据库数据,WebSocket通知等 在EventServiceProvider里为撮合成功的事件注册监听器: // 撮合成功通知,参数分别是:当前订单,被匹配的单据,交易数量

event(new MatchEvent($order, $match_order, $match_volume));

// 注册监听器

protected $listen = [

'StingBoMengineEventsMatchEvent' => [

'AppListenersYourListener', // 你自己的监听器,应该也使用异步来实现

],

]; 如果只是部分成交,则剩余部分进入委托池,触发委托池变更事件,K线或者深度列表变更通知等, 注册监听器如下: // 委托池数据变更事件

event(new PushQueueEvent($order));

// 注册监听器

protected $listen = [

'StingBoMengineEventsPushQueueEvent' => [

'AppListenersYourListener', // 你自己的监听器,应该也使用异步来实现

],

]; 用户撤单

撤单流程应该是先查询数据库确认是否可撤销,再从redis里删除数据成功,最后更新回数据库$order = new Order($uuid, $oid, $symbol, $transaction, $volume, $price);

$ms = new MengineService();

$ms->deleteOrder($order);

此撮合引擎没有实现像数据库那样的锁机制,为了防止有单子在被撮合时又有撤销的命令出现,所以下单与撤单都走的同一个队列,保证了顺序性,每个交易对是隔离的队列,效率也有一定的保证,但开发需要实现异步通知用户功能,注册监听器如下:// 撤单成功通知

event(new DeleteOrderSuccEvent($order));

// 注册监听器

protected $listen = [

'StingBoMengineEventsDeleteOrderSuccEvent' => [

'AppListenersYourListener', // 你自己的监听器,应该也使用异步来实现

],

]; 获取某个交易对买/卖深度列表 $symbol = 'abc2cny';

$transaction = 'buy';

$ms = new MengineService();

$ms->getDepth($symbol, $transaction);

总结

本地垃圾笔记本上测试,交易对撮合速度平均在200笔/s,后续将继续优化撮合速度

487174d52e9aab19fd5b85c447c9578c.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值