您好,登录后才能下订单哦!
这篇文章主要介绍“PHP中的撮合引擎是什么”,在日常操作中,相信很多人在PHP中的撮合引擎是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中的撮合引擎是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎
github地址
安装: composer require sting_bo/mengine
复制配置文件: php artisan vendor:publish
predis
已经出Golang微服务撮合啦,欢迎使用并提issue
已有数据的系统如果使用此库,可以自己写一个初始化脚本,先把数据跑入队列
下单后,先存入数据库,然后才开始下面步骤,实例化单据对象
use StingBo\Mengine\Core\Order; $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 StingBo\Mengine\Services\MengineService; $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 = [ 'StingBo\Mengine\Events\MatchEvent' => [ 'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现 ], ];
如果只是部分成交,则剩余部分进入委托池,触发委托池变更事件,K线或者深度列表变更通知等, 注册监听器如下:
// 委托池数据变更事件 event(new PushQueueEvent($order)); // 注册监听器 protected $listen = [ 'StingBo\Mengine\Events\PushQueueEvent' => [ 'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现 ], ];
撤单流程应该是先查询数据库确认是否可撤销,再从redis里删除数据成功,最后更新回数据库
$order = new Order($uuid, $oid, $symbol, $transaction, $volume, $price); $ms = new MengineService(); $ms->deleteOrder($order);
此撮合引擎没有实现像数据库那样的锁机制,为了防止有单子在被撮合时又有撤销的命令出现,所以下单与撤单都走的同一个队列,保证了顺序性,每个交易对是隔离的队列,效率也有一定的保证,但开发需要实现异步通知用户功能,注册监听器如下:
// 撤单成功通知 event(new DeleteOrderSuccEvent($order)); // 注册监听器 protected $listen = [ 'StingBo\Mengine\Events\DeleteOrderSuccEvent' => [ 'App\Listeners\YourListener', // 你自己的监听器,应该也使用异步来实现 ], ];
$symbol = 'abc2cny'; $transaction = 'buy'; $ms = new MengineService(); $ms->getDepth($symbol, $transaction);
本地垃圾笔记本上测试,交易对撮合速度平均在200笔/s,后续将继续优化撮合速度
到此,关于“PHP中的撮合引擎是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。