PyTorch深度學習實踐第四講——反向傳播
阿新 • • 發佈:2021-01-10
Laravel Package for Matching Engine
快速開始
- 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,後續將繼續優化撮合速度