1. 程式人生 > 其它 >PyTorch深度學習實踐第四講——反向傳播

PyTorch深度學習實踐第四講——反向傳播

Laravel Package for Matching Engine

快速開始

  • github地址
  • 安裝: composer require sting_bo/mengine
  • 複製配置檔案: php artisan vendor:publish

依賴

  • predis

號外

使用說明

  • 已有資料的系統如果使用此庫,可以自己寫一個初始化指令碼,先把資料跑入佇列

  • 使用者下單

  • 下單後,先存入資料庫,然後才開始下面步驟,例項化單據物件

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
也可以使用horizonsupervisor來輔助,事半功倍!

佇列消費時會進入撮合程式,大概的步驟如下:

  1. 獲取匹配委託訂單
  2. 如果沒有匹配的訂單,則進入委託池,觸發委託池變更事件,詳見第5點
  3. 如果有匹配的委託,程式撮合,更新委託池資料
  4. 交易成功會觸發事件,開發者要在監聽器裡處理有交易的委託單,比如更新資料庫資料,WebSocket通知等
    在EventServiceProvider裡為撮合成功的事件註冊監聽器:
// 撮合成功通知,引數分別是:當前訂單,被匹配的單據,交易數量
event(new MatchEvent($order, $match_order, $match_volume));

// 註冊監聽器
protected $listen = [
    'StingBo\Mengine\Events\MatchEvent' => [
        'App\Listeners\YourListener', // 你自己的監聽器,應該也使用非同步來實現
    ],
];
  1. 如果只是部分成交,則剩餘部分進入委託池,觸發委託池變更事件,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,後續將繼續優化撮合速度