-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorder_book.go
55 lines (47 loc) · 1.24 KB
/
order_book.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package main
type OrderBook struct {
ask *OneSideOrderBook
bid *OneSideOrderBook
// stores all orders even if the order has been cancelled or fully filled
orderPerOrderId map[string]*Order
}
func (ob *OrderBook) Add(order *Order) (trades []Trade, closedOrderIds []string) {
if _, exist := ob.orderPerOrderId[order.id]; exist {
panic("duplicate order ID")
}
switch order.side {
case Bid:
trades, closedOrderIds = ob.ask.Match(order)
if order.quantity > 0 {
ob.bid.Add(order)
}
case Ask:
trades, closedOrderIds = ob.bid.Match(order)
if order.quantity > 0 {
ob.ask.Add(order)
}
}
ob.orderPerOrderId[order.id] = order
if order.quantity == 0 {
closedOrderIds = append(closedOrderIds, order.id)
}
return trades, closedOrderIds
}
func (ob *OrderBook) Cancel(id string) {
if _, exist := ob.orderPerOrderId[id]; !exist {
panic("non-existent order ID")
}
switch order := ob.orderPerOrderId[id]; order.side {
case Bid:
ob.bid.Cancel(order)
case Ask:
ob.ask.Cancel(order)
}
}
func NewOrderBook(orders ...*Order) *OrderBook {
orderBook := &OrderBook{ask: NewAskSideOrderBook(), bid: NewBidSideOrderBook(), orderPerOrderId: make(map[string]*Order)}
for _, order := range orders {
orderBook.Add(order)
}
return orderBook
}