-
Notifications
You must be signed in to change notification settings - Fork 2
/
orderbook.go
82 lines (62 loc) · 1.66 KB
/
orderbook.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
/*
* Copyright (C) 2019-2020 Gregor Pogačnik
*/
package entities
import (
"encoding/json"
"github.com/shopspring/decimal"
"github.com/golang/glog"
)
type ColumnQuotation int
const (
Volume ColumnQuotation = 0
Price ColumnQuotation = 1
)
// volume, price
type Quotation [][2]json.Number
type OrderBook struct {
Bids Quotation `json:"bids" description:"Bids (buy requests)"`
Asks Quotation `json:"asks" description:"Asks (sell requests)"`
}
type OrderBookResp struct {
Base
Bids Quotation `json:"bids" description:"Bids (buy requests)"`
Asks Quotation `json:"asks" description:"Asks (sell requests)"`
}
type AskOrder Quotation // also ascending
func (v AskOrder) Len() int { return len(v) }
func (v AskOrder) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
func (a AskOrder) Less(i, j int) bool {
first, err := decimal.NewFromString(a[i][Price].String())
second, err := decimal.NewFromString(a[j][Price].String())
if err != nil {
return false
}
return first.Cmp(second) < 0
}
/**
* Get liquidity in counter currency (e.g., USDT).
*/
func (me *Quotation) GetLiquidity() decimal.Decimal {
sum := decimal.New(0, 0)
for _, val := range *me {
onePrice, err := decimal.NewFromString(val[Price].String())
if err != nil {
glog.Warningf("GetLiquidity fatal error %v", err)
return sum
}
oneVolume, err := decimal.NewFromString(val[Volume].String())
if err != nil {
glog.Warningf("GetLiquidity fatal error %v", err)
return sum
}
// sum += (oneVolume * onePrice)
sum = sum.Add(oneVolume.Mul(onePrice))
}
return sum
}
func (me *Quotation) Copy() *Quotation {
created := make(Quotation, len(*me))
copy(created, *me)
return &created
}