You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fully Lock-Free Design: Based on Crossbeam Epoch's lock-free data structures and atomic operations
Multi-threaded Concurrency: Independent order processor and matching engine threads
Multiple Order Type Support:
Limit Orders
Market Orders
Stop Orders
Stop-Limit Orders
Immediate or Cancel (IOC/FOK)
Iceberg Orders
DAY Orders (Valid Today)
GTC Orders (Good Till Cancelled)
High Performance: Skip-list order tree + lock-free queues
Real-time Statistics: Order book depth, matching statistics, queue status monitoring
Architecture Overview
OrderBook
├── OrderTree (Bids) - Skip-list based lock-free buy side order tree
├── OrderTree (Asks) - Skip-list based lock-free sell side order tree
├── OrderQueue - Lock-free order queue at each price level
├── MatchEngine - Multi-order type matching engine
│ ├── LimitOrderHandler - Limit order handler
│ ├── MarketOrderHandler - Market order handler
│ ├── StopOrderHandler - Stop order handler
│ ├── StopLimitOrderHandler - Stop-limit order handler
│ ├── ImmediateOrderHandler - IOC/FOK order handler
│ ├── IcebergOrderHandler - Iceberg order handler
│ ├── DayOrderHandler - DAY order handler
│ └── GTCOrderHandler - GTC order handler
├── order_processor_threads - Order processing thread pool
└── matching_threads - Matching execution threads
Quick Start
Create Order Book
use orderbook::OrderBook;use std::sync::Arc;fnmain(){// Create new order booklet orderbook = Arc::new(OrderBook::new("BTC/USDT"));// Set matching callback
orderbook.set_match_callback(|match_result| {println!("Match executed: {:?}", match_result);});}
Add Orders
use orderbook::order::{Order,OrderDirection,OrderType};use atomic_plus::AtomicF64;use std::sync::Arc;use std::sync::atomic::AtomicU64;usecrate::orderbook::order::{AtomicOrderStatus,OrderStatus};fncreate_order() -> Arc<Order>{Arc::new(Order{id:"order_001".to_string(),symbol:"BTC/USDT".to_string(),price:AtomicF64::new(50000.0),direction:OrderDirection::Buy,quantity:AtomicF64::new(1.0),remaining:AtomicF64::new(1.0),filled:AtomicF64::new(0.0),crt_time: chrono::Utc::now().to_rfc3339(),status:AtomicOrderStatus::new(OrderStatus::Pending),expiry:None,order_type:OrderType::Limit,ex:Some("exchange".to_string()),version:AtomicU64::new(1),timestamp_ns:0,parent_order_id:None,priority:0,})}// Add single orderlet order = create_order();
orderbook.add_order_async(order.clone())?;// Batch add orderslet orders = vec![order1, order2, order3];
orderbook.add_orders_batch(orders)?;