Skip to content

Commit 7f71213

Browse files
author
greensheng
committed
simplify
1 parent 7642513 commit 7f71213

File tree

2 files changed

+46
-77
lines changed

2 files changed

+46
-77
lines changed

matching/order_book.go

Lines changed: 34 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"fmt"
2020
"github.com/emirpasic/gods/maps/treemap"
2121
"github.com/gitbitex/gitbitex-spot/models"
22-
"github.com/gitbitex/gitbitex-spot/utils"
2322
"github.com/shopspring/decimal"
2423
"github.com/siddontang/go-log/log"
2524
"math"
@@ -30,68 +29,51 @@ const (
3029
)
3130

3231
type orderBook struct {
33-
// 每一个product都会对应一个order book
32+
// one product corresponds to one order book
3433
product *models.Product
3534

36-
// 深度,asks & bids
35+
// depths: asks & bids
3736
depths map[models.Side]*depth
3837

39-
// 严格连续递增的交易id,用于在trade的主键id
38+
// strictly continuously increasing transaction ID, used for the primary key ID of trade
4039
tradeSeq int64
4140

42-
// 严格连续递增的日志seq,用于写入撮合日志
41+
// strictly continuously increasing log SEQ, used to write matching log
4342
logSeq int64
4443

45-
// 防止order被重复提交到orderBook中,采用滑动窗口去重策略
44+
// to prevent the order from being submitted to the order book repeatedly,
45+
// a sliding window de duplication strategy is adopted.
4646
orderIdWindow Window
4747
}
4848

49-
// orderBook快照,定时保存快照用于快速启动恢复
5049
type orderBookSnapshot struct {
51-
// 对应的product id
50+
// order book product id
5251
ProductId string
5352

54-
// orderBook中的全量订单
53+
// all orders
5554
Orders []BookOrder
5655

57-
// 当前tradeSeq
56+
// trade seq at snapshot time
5857
TradeSeq int64
5958

60-
// 当前logSeq
59+
// log seq at snapshot time
6160
LogSeq int64
6261

63-
// 去重窗口
62+
// state of de duplication window
6463
OrderIdWindow Window
6564
}
6665

67-
type PriceLevel struct {
68-
Price decimal.Decimal
69-
Size decimal.Decimal
70-
OrderCount int64
71-
}
72-
7366
type priceOrderIdKey struct {
7467
price decimal.Decimal
7568
orderId int64
7669
}
7770

78-
type BookOrder struct {
79-
OrderId int64
80-
Size decimal.Decimal
81-
Funds decimal.Decimal
82-
Price decimal.Decimal
83-
Side models.Side
84-
Type models.OrderType
85-
}
86-
8771
func NewOrderBook(product *models.Product) *orderBook {
8872
asks := &depth{
89-
levels: treemap.NewWith(utils.DecimalAscComparator),
9073
queue: treemap.NewWith(priceOrderIdKeyAscComparator),
9174
orders: map[int64]*BookOrder{},
9275
}
9376
bids := &depth{
94-
levels: treemap.NewWith(utils.DecimalDescComparator),
9577
queue: treemap.NewWith(priceOrderIdKeyDescComparator),
9678
orders: map[int64]*BookOrder{},
9779
}
@@ -112,14 +94,7 @@ func (o *orderBook) ApplyOrder(order *models.Order) (logs []Log) {
11294
return logs
11395
}
11496

115-
takerOrder := &BookOrder{
116-
OrderId: order.Id,
117-
Size: order.Size,
118-
Funds: order.Funds,
119-
Price: order.Price,
120-
Side: order.Side,
121-
Type: order.Type,
122-
}
97+
takerOrder := newBookOrder(order)
12398

12499
// If it's a Market-Buy order, set price to infinite high, and if it's market-sell,
125100
// set price to zero, which ensures that prices will cross.
@@ -286,35 +261,17 @@ func (o *orderBook) nextTradeSeq() int64 {
286261
}
287262

288263
type depth struct {
289-
// 保存所有正在book上的order
264+
// all orders
290265
orders map[int64]*BookOrder
291266

292-
// 价格优先的priceLevel队列,用于获取level2
293-
// Price -> *PriceLevel
294-
levels *treemap.Map
295-
296-
// 价格优先,时间优先的订单队列,用于订单match
267+
// price first, time first order queue for order match
297268
// priceOrderIdKey -> orderId
298269
queue *treemap.Map
299270
}
300271

301272
func (d *depth) add(order BookOrder) {
302273
d.orders[order.OrderId] = &order
303-
304274
d.queue.Put(&priceOrderIdKey{order.Price, order.OrderId}, order.OrderId)
305-
306-
val, found := d.levels.Get(order.Price)
307-
if !found {
308-
d.levels.Put(order.Price, &PriceLevel{
309-
Price: order.Price,
310-
Size: order.Size,
311-
OrderCount: 1,
312-
})
313-
} else {
314-
level := val.(*PriceLevel)
315-
level.Size = level.Size.Add(order.Size)
316-
level.OrderCount++
317-
}
318275
}
319276

320277
func (d *depth) decrSize(orderId int64, size decimal.Decimal) error {
@@ -327,29 +284,35 @@ func (d *depth) decrSize(orderId int64, size decimal.Decimal) error {
327284
return errors.New(fmt.Sprintf("order %v Size %v less than %v", orderId, order.Size, size))
328285
}
329286

330-
var removed bool
331287
order.Size = order.Size.Sub(size)
332288
if order.Size.IsZero() {
333289
delete(d.orders, orderId)
334-
removed = true
335-
}
336-
337-
// 订单被移除出orderBook,清理priceTime队列
338-
if removed {
339290
d.queue.Remove(&priceOrderIdKey{order.Price, order.OrderId})
340291
}
341292

342-
val, _ := d.levels.Get(order.Price)
343-
level := val.(*PriceLevel)
344-
level.Size = level.Size.Sub(size)
345-
if level.Size.IsZero() {
346-
d.levels.Remove(order.Price)
347-
} else if removed {
348-
level.OrderCount--
349-
}
350293
return nil
351294
}
352295

296+
type BookOrder struct {
297+
OrderId int64
298+
Size decimal.Decimal
299+
Funds decimal.Decimal
300+
Price decimal.Decimal
301+
Side models.Side
302+
Type models.OrderType
303+
}
304+
305+
func newBookOrder(order *models.Order) *BookOrder {
306+
return &BookOrder{
307+
OrderId: order.Id,
308+
Size: order.Size,
309+
Funds: order.Funds,
310+
Price: order.Price,
311+
Side: order.Side,
312+
Type: order.Type,
313+
}
314+
}
315+
353316
func priceOrderIdKeyAscComparator(a, b interface{}) int {
354317
aAsserted := a.(*priceOrderIdKey)
355318
bAsserted := b.(*priceOrderIdKey)

pushing/order_book.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ type OrderBookFullSnapshot struct {
5757
Orders []matching.BookOrder
5858
}
5959

60+
type PriceLevel struct {
61+
Price decimal.Decimal
62+
Size decimal.Decimal
63+
OrderCount int64
64+
}
65+
6066
func newOrderBook(productId string) *orderBook {
6167
b := &orderBook{
6268
productId: productId,
@@ -74,7 +80,7 @@ func (s *orderBook) saveOrder(logOffset, logSeq int64, orderId int64, newSize, p
7480
panic(newSize)
7581
}
7682

77-
var changedLevel *matching.PriceLevel
83+
var changedLevel *PriceLevel
7884

7985
priceLevels := s.depths[side]
8086
order, found := s.orders[orderId]
@@ -92,14 +98,14 @@ func (s *orderBook) saveOrder(logOffset, logSeq int64, orderId int64, newSize, p
9298

9399
val, found := priceLevels.Get(price)
94100
if !found {
95-
changedLevel = &matching.PriceLevel{
101+
changedLevel = &PriceLevel{
96102
Price: price,
97103
Size: newSize,
98104
OrderCount: 1,
99105
}
100106
priceLevels.Put(price, changedLevel)
101107
} else {
102-
changedLevel = val.(*matching.PriceLevel)
108+
changedLevel = val.(*PriceLevel)
103109
changedLevel.Size = changedLevel.Size.Add(newSize)
104110
changedLevel.OrderCount++
105111
}
@@ -120,7 +126,7 @@ func (s *orderBook) saveOrder(logOffset, logSeq int64, orderId int64, newSize, p
120126
panic(fmt.Sprintf("%v %v %v %v", orderId, price, newSize, side))
121127
}
122128

123-
changedLevel = val.(*matching.PriceLevel)
129+
changedLevel = val.(*PriceLevel)
124130
changedLevel.Size = changedLevel.Size.Sub(decrSize)
125131
if changedLevel.Size.IsZero() {
126132
priceLevels.Remove(price)
@@ -149,11 +155,11 @@ func (s *orderBook) SnapshotLevel2(levels int) *OrderBookLevel2Snapshot {
149155
Bids: make([][3]interface{}, utils.MinInt(levels, s.depths[models.SideBuy].Size())),
150156
}
151157
for itr, i := s.depths[models.SideBuy].Iterator(), 0; itr.Next() && i < levels; i++ {
152-
v := itr.Value().(*matching.PriceLevel)
158+
v := itr.Value().(*PriceLevel)
153159
snapshot.Bids[i] = [3]interface{}{v.Price.String(), v.Size.String(), v.OrderCount}
154160
}
155161
for itr, i := s.depths[models.SideSell].Iterator(), 0; itr.Next() && i < levels; i++ {
156-
v := itr.Value().(*matching.PriceLevel)
162+
v := itr.Value().(*PriceLevel)
157163
snapshot.Asks[i] = [3]interface{}{v.Price.String(), v.Size.String(), v.OrderCount}
158164
}
159165
return &snapshot

0 commit comments

Comments
 (0)