-
Notifications
You must be signed in to change notification settings - Fork 2
/
api_wrapper.go
114 lines (106 loc) · 3.14 KB
/
api_wrapper.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
104
105
106
107
108
109
110
111
112
113
114
package coinbasepro
import (
"fmt"
"github.com/chain-bot/prices/app/pkg/api/common"
"github.com/chain-bot/prices/app/pkg/models"
"github.com/chain-bot/prices/app/utils"
"strings"
"time"
)
// GetAllOHLCVMarketData get CandleStick data from [startTime, endTime) with pagination
func (apiClient *ApiClient) GetAllOHLCVMarketData(
symbol models.Symbol,
interval time.Duration,
startTime time.Time,
endTime time.Time,
) ([]*models.OHLCVMarketData, error) {
if endTime.IsZero() {
endTime = time.Now()
}
var result []*models.OHLCVMarketData
for startTime.Before(endTime) {
newEndTime := startTime.Add(maxLimit * interval)
if newEndTime.After(endTime) {
newEndTime = endTime
}
ohlcvMarketData, err := apiClient.GetOHLCVMarketData(
symbol,
interval,
startTime,
newEndTime)
if err != nil {
return nil, err
}
result = append(result, ohlcvMarketData...)
startTime = newEndTime
}
return result, nil
}
func (apiClient *ApiClient) GetSupportedPairs() ([]*models.Symbol, error) {
products, err := apiClient.getProducts()
if err != nil {
return nil, err
}
var result []*models.Symbol
for i := range products {
product := products[i]
quote := product.QuoteCurrency
normalizedQuote := strings.ToUpper(quote)
base := product.BaseCurrency
normalizedBase := strings.ToUpper(base)
if _, ok := coinbaseProInstrumentFilter[normalizedBase]; ok {
continue
}
if _, ok := coinbaseProInstrumentFilter[normalizedQuote]; ok {
continue
}
newPair := &models.Symbol{
RawBase: base,
NormalizedBase: normalizedBase,
RawQuote: quote,
NormalizedQuote: normalizedQuote,
ProductID: product.ID,
}
result = append(result, newPair)
}
return common.FilterSupportedAssets(result), nil
}
func (apiClient *ApiClient) GetRawMarketData() ([]*models.RawMarketData, error) {
return nil, fmt.Errorf("not implemented")
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Helpers
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// GetOHLCVMarketData get CandleStick data from [startTime, endTime]
func (apiClient *ApiClient) GetOHLCVMarketData(
symbol models.Symbol,
durationInterval time.Duration,
startTime time.Time,
endTime time.Time,
) ([]*models.OHLCVMarketData, error) {
candleStickData, err := apiClient.getCandleStickData(
int(durationInterval.Seconds()), startTime, endTime, symbol.ProductID)
if err != nil {
return nil, err
}
var result []*models.OHLCVMarketData
for i := range candleStickData {
candle := candleStickData[i]
candleEnd := time.Unix(int64(candle.CloseTime), 0)
result = append(result, &models.OHLCVMarketData{
MarketData: models.MarketData{
Source: apiClient.GetExchangeIdentifier(),
BaseCurrency: symbol.NormalizedBase,
QuoteCurrency: symbol.NormalizedQuote,
},
StartTime: candleEnd.Add(-durationInterval),
EndTime: candleEnd,
OpenPrice: candle.OpenPrice,
HighPrice: candle.ClosePrice,
LowPrice: candle.LowPrice,
ClosePrice: candle.ClosePrice,
Volume: candle.Volume,
})
}
return utils.Reverse(result), nil
}