Files
Dena/docs/zagros/order-trade-steps/matching.md
2026-08-13 19:50:53 +03:30

2.2 KiB

trading: order matching

Sprint: ?

###DOC

  • in case of reading first part processor please skip this part.

for matching and executing orders openware creates a flow that manage by RabbitMQ and its consumers. we have three consumers that works on trades:

  1. order processor:
    does preliminary calculations and works on order like locking order
  2. matching:
    match orders and pass them to executor
  3. trade executor:
    execute trades that matching creates
stateDiagram-v2
    [*] --> API
    API --> RabbitMQ
    RabbitMQ --> OrderProcessor
    OrderProcessor --> RabbitMQ
    RabbitMQ --> Matching
    Matching --> RabbitMQ
    RabbitMQ --> Executor
    Executor --> Notify
    Notify --> [*]

Order matching

what does order matching do step by step:
  1. submit order ro engine
  2. match method
    1. get orderbooks
    2. loop
      1. is order filled?(all amount)
      2. get top order of opposite order book(top means order with best price)
        • for better and faster searching they use rbtree. for more information click here
      3. check can they create a trade
      4. is trade valid?(trade validation):
        • not zero,calculation problems
      5. fill both orders:
        • decrease order volume(if the opposite order is filled, we remove it from orderbook)
        • filled order means that order completely get its needed volume
      6. send to trade executor
graph TD
    A[RabbitMQ] -->|submit payload| B(Matching)
    B -->|submit engine|C(match method)
    C --> D(get orderbooks)
    D --> E(loop)
    E --> F{order filled?}
    F --> |yes|X(break)
    F --> |no|G{opposit orderbook is blanked}
    G --> |yes|H{is it limit order?}
    H --> |yes|I(add to orderbook)
    I --> X
    H --> |no|J(cancel order)
    J --> X
    G --> |no|K(get top of opposit orderbook)
    K --> L(make trade with top of opposit)
    L --> |created trade|M{trade.blank?}
    M --> |yes|H
    M --> |no|N(validate trade)
    N --> O(fill order)
    O --> P(fill opposit order)
    O --> |publish to executor|A
    O --> E
    X --> A