-
Notifications
You must be signed in to change notification settings - Fork 7
/
order.go
103 lines (84 loc) · 1.92 KB
/
order.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package orderbook
import (
"bytes"
"encoding/binary"
"errors"
decimal "github.com/geseq/udecimal"
)
// NewOrder creates new constant object Order
func NewOrder(orderID uint64, class ClassType, side SideType, qty, price, trigPrice decimal.Decimal, flag FlagType) *Order {
o := oPool.Get()
if class == Market {
price = decimal.Zero
}
o.ID = orderID
o.Class = class
o.Side = side
o.Flag = flag
o.Qty = qty
o.Price = price
o.TrigPrice = trigPrice
return o
}
// GetPrice returns the price of the Order
func (o *Order) GetPrice(t PriceType) decimal.Decimal {
if t == TrigPrice {
return o.TrigPrice
}
return o.Price
}
func (o *Order) Release() {
o.next = nil
o.prev = nil
o.queue = nil
o.ID = 0
o.Class = 0
o.Side = 0
o.Flag = 0
o.Qty = decimal.Zero
o.Price = decimal.Zero
o.TrigPrice = decimal.Zero
oPool.Put(o)
}
// Compose converts the order to a binary representation
func (o *Order) Compose() []byte {
buf := new(bytes.Buffer)
idbuf := make([]byte, binary.MaxVarintLen64)
n := binary.PutUvarint(idbuf, o.ID)
buf.Write(idbuf[:n])
b, _ := o.Qty.MarshalBinary()
buf.Write(b)
b, _ = o.Price.MarshalBinary()
buf.Write(b)
b, _ = o.TrigPrice.MarshalBinary()
buf.Write(b)
buf.WriteByte(byte(o.Class))
buf.WriteByte(byte(o.Side))
buf.WriteByte(byte(o.Flag))
return buf.Bytes()
}
// Decompose loads an object from its binaary representation
func (o *Order) Decompose(b []byte) error {
id, n := binary.Uvarint(b)
b = b[n:]
qty := decimal.Decimal{}
b, _ = qty.UnmarshalBinaryData(b)
price := decimal.Decimal{}
b, _ = price.UnmarshalBinaryData(b)
trigPrice := decimal.Decimal{}
b, _ = trigPrice.UnmarshalBinaryData(b)
if len(b) != 3 {
return errors.New("decompose failed: invalid bytes provided")
}
ord := Order{
ID: id,
Class: ClassType(b[0]),
Side: SideType(b[1]),
Qty: qty,
Price: price,
TrigPrice: trigPrice,
Flag: FlagType(b[2]),
}
*o = ord
return nil
}