You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

86 lines
2.5 KiB

package vmts
import (
"fmt"
"sig-pub/pkg/types"
"github.com/bytedance/sonic"
)
var (
rawValueLimit = 5 // 避免单行数据过大
)
type Metric struct {
Metric map[string]string `json:"metric"` // {"__name__":"open","instance":"DOGE-USDT-SWAP"}
Values []float64 `json:"values"`
Timestamps []int64 `json:"timestamps"`
}
func NewMetric(name string, tags ...string) *Metric {
if len(tags)%2 != 0 {
panic(fmt.Sprintf("%s error length tags: %v", name, tags))
}
metric := map[string]string{"__name__": name}
for i := 0; i < len(tags); i += 2 {
metric[tags[i]] = tags[i+1]
}
return &Metric{
Metric: metric,
}
}
func (m *Metric) AddTag(name, value string) {
m.Metric[name] = value
}
func (m *Metric) AddTsValue(ts int64, value float64) {
m.Timestamps = append(m.Timestamps, ts)
m.Values = append(m.Values, value)
}
func (m *Metric) ToRowJson() ([]byte, error) {
return sonic.Marshal(m)
}
func Kline2Metrics(inst types.TradeInstance, klines []*types.Kline) (metrics []*Metric) {
instMetrics := make(map[string][6]*Metric)
// id := inst.InstId
// inst.InstId = "doge_udst"
// defer func() {
// inst.InstId = id
// }()
for _, kline := range klines {
ms, ok := instMetrics[inst.InstId]
if !ok || (rawValueLimit > 0 && len(ms[0].Values) >= rawValueLimit) {
ms = [6]*Metric{
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "open"),
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "high"),
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "low"),
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "close"),
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "vol"),
NewMetric(inst.InstId, "interval", string(kline.Interval), "exchange", string(inst.Exchange), "kind", "volQuote"),
}
instMetrics[inst.InstId] = ms
for i := range len(ms) {
metrics = append(metrics, ms[i])
}
}
// TODO open sz price
open, _ := kline.Open.Float64()
high, _ := kline.High.Float64()
low, _ := kline.Low.Float64()
close, _ := kline.Close.Float64()
vol, _ := kline.Vol.Float64()
volQuote, _ := kline.VolQuote.Float64()
ms[0].AddTsValue(kline.Ts, open)
ms[1].AddTsValue(kline.Ts, high)
ms[2].AddTsValue(kline.Ts, low)
ms[3].AddTsValue(kline.Ts, close)
ms[4].AddTsValue(kline.Ts, vol)
ms[5].AddTsValue(kline.Ts, volQuote)
}
return
}