-
Notifications
You must be signed in to change notification settings - Fork 126
/
exchanges.go
130 lines (118 loc) · 3.67 KB
/
exchanges.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package models
import (
// "encoding/json"
"context"
"fmt"
"sort"
"strconv"
"time"
"github.com/diadata-org/diadata/pkg/dia"
)
// GetExchanges returns all available trading places.
// Comment: Think about getting the exchanges from redis.
func (datastore *DB) GetExchanges() (allExchanges []string) {
listExch := dia.Exchanges()
for _, exchange := range listExch {
if exchange != "Unknown" {
allExchanges = append(allExchanges, exchange)
}
}
sort.Strings(allExchanges)
return
}
func getKeyLastTradeTimeForExchange(asset dia.Asset, exchange string) string {
if exchange == "" {
return "dia_TLT_" + asset.Blockchain + "_" + asset.Address
} else {
return "dia_TLT_" + asset.Blockchain + "_" + asset.Address + "_" + exchange
}
}
func (datastore *DB) GetLastTradeTimeForExchange(asset dia.Asset, exchange string) (*time.Time, error) {
key := getKeyLastTradeTimeForExchange(asset, exchange)
t, err := datastore.redisClient.Get(key).Result()
if err != nil {
log.Errorln("Error: on GetLastTradeTimeForExchange", err, key)
return nil, err
}
i64, err := strconv.ParseInt(t, 10, 64)
if err == nil {
t2 := time.Unix(i64, 0)
return &t2, nil
} else {
return nil, err
}
}
func (datastore *DB) SetLastTradeTimeForExchange(asset dia.Asset, exchange string, t time.Time) error {
if datastore.redisClient == nil {
return nil
}
key := getKeyLastTradeTimeForExchange(asset, exchange)
log.Debug("setting ", key, t)
err := datastore.redisPipe.Set(key, t.Unix(), TimeOutRedis).Err()
if err != nil {
log.Printf("Error: %v on SetLastTradeTimeForExchange %v\n", err, asset.Symbol)
}
return err
}
func (rdb *RelDB) GetExchangesForSymbol(symbol string) (exchanges []string, err error) {
query := fmt.Sprintf("select distinct(exchange) from %s where symbol=$1", exchangesymbolTable)
rows, err := rdb.postgresClient.Query(context.Background(), query, symbol)
if err != nil {
return
}
for rows.Next() {
exchange := ""
err = rows.Scan(&exchange)
if err != nil {
return []string{}, err
}
exchanges = append(exchanges, exchange)
}
return
}
// Deprecating
// func (db *DB) GetExchangesForSymbol(symbol string) ([]string, error) { // TOFIX. use influx db trades on 24 hours
// var result []string
// var cursor uint64
// key := "dia_" + dia.FilterKing + "_" + symbol
// for {
// var keys []string
// var err error
// keys, cursor, err = db.redisClient.Scan(cursor, key+"*", 15).Result()
// log.Debug("GetExchangesForSymbol ", key+"*", cursor)
// if err != nil {
// log.Error("GetPairs err", err)
// return result, err
// }
// for _, value := range keys {
// log.Debug("GetExchangesForSymbol ", value)
// filteredKey := strings.Replace(strings.Replace(value, key, "", 1), "_ZSET", "", 1)
// s := strings.Split(strings.Replace(filteredKey, key, "", 1), "_")
// if len(s) == 2 {
// result = append(result, s[1])
// }
// }
// if cursor == 0 {
// log.Debugf("GetExchangesForSymbol %v returns %v", key, result)
// return result, nil
// }
// }
// }
// SetAvailablePairs stores @pairs in redis
// TO DO: Setter and getter should act on RelDB
func (datastore *DB) SetAvailablePairs(exchange string, pairs []dia.ExchangePair) error {
key := "dia_available_pairs_" + exchange
var p dia.Pairs = pairs
return datastore.redisClient.Set(key, &p, 0).Err()
}
// GetAvailablePairs a slice of all pairs available in the exchange in the internal redis db
func (datastore *DB) GetAvailablePairs(exchange string) ([]dia.ExchangePair, error) {
key := "dia_available_pairs_" + exchange
p := dia.Pairs{}
err := datastore.redisClient.Get(key).Scan(&p)
if err != nil {
log.Errorf("Error: %v on GetAvailablePairs %v\n", err, exchange)
return nil, err
}
return p, nil
}