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.
128 lines
3.7 KiB
128 lines
3.7 KiB
package types |
|
|
|
import ( |
|
"fmt" |
|
"sig-pub/api/pb" |
|
"sig-pub/pkg/types/decimals" |
|
|
|
"github.com/govalues/decimal" |
|
) |
|
|
|
// 时序数据 k线 |
|
|
|
type Kline struct { |
|
// InstId string `json:"instId"` // 交易产品id |
|
// Tid int64 `json:"tid"` // ts除interval |
|
// Exchange string `json:"exchange"` // 交易所 |
|
Interval Interval `json:"interval"` // 周期 |
|
Ts int64 `json:"ts"` // k线时间戳ms |
|
Open decimal.Decimal `json:"open"` // 开盘 |
|
High decimal.Decimal `json:"high"` // 最高 |
|
Low decimal.Decimal `json:"low"` // 最低 |
|
Close decimal.Decimal `json:"close"` // 收盘 |
|
Vol decimal.Decimal `json:"vol"` // 交易量 如果是币币,数值为交易货币的数量。 |
|
VolQuote decimal.Decimal `json:"volQuote"` // 交易额 (交易量,以计价货币为单位) |
|
Confirm bool `json:"confirm"` // k线是否完结 |
|
} |
|
|
|
// okx.CandleData{[]string{"1746842757000", "0.20545", "0.20545", "0.2054", "0.2054", "7.57", "7570", "1555.2542", "1"}} |
|
|
|
func (k *Kline) ParsePBKline(exchange pb.ExchangeType, kline *pb.Kline) { |
|
// k.Exchange = exchange.String() |
|
k.Ts = kline.Time |
|
k.Interval = Interval(kline.Interval) |
|
k.Confirm = kline.Confirm |
|
// k.Open = decimal.MustParse(kline.Open) |
|
// k.High = decimal.MustParse(kline.High) |
|
// k.Low = decimal.MustParse(kline.Low) |
|
// k.Close = decimal.MustParse(kline.Close) |
|
// k.Vol = decimal.MustParse(kline.Vol) |
|
// k.VolQuote = decimal.MustParse(kline.VolQuote) |
|
k.Open = decimals.MustFromFloat64(kline.Open) |
|
k.High = decimals.MustFromFloat64(kline.High) |
|
k.Low = decimals.MustFromFloat64(kline.Low) |
|
k.Close = decimals.MustFromFloat64(kline.Close) |
|
k.Vol = decimals.MustFromFloat64(kline.Vol) |
|
k.VolQuote = decimals.MustFromFloat64(kline.VolQuote) |
|
} |
|
|
|
func (k Kline) ToPBKline() (kline *pb.Kline) { |
|
kline = &pb.Kline{ |
|
Time: k.Ts, |
|
Interval: string(k.Interval), |
|
Confirm: k.Confirm, |
|
Open: decimals.MustToFloat64(k.Open), |
|
High: decimals.MustToFloat64(k.High), |
|
Low: decimals.MustToFloat64(k.Low), |
|
Close: decimals.MustToFloat64(k.Close), |
|
Vol: decimals.MustToFloat64(k.Vol), |
|
VolQuote: decimals.MustToFloat64(k.VolQuote), |
|
} |
|
return |
|
} |
|
|
|
func (k Kline) OpenF64() float64 { |
|
return decimals.MustToFloat64(k.Open) |
|
} |
|
|
|
func (k Kline) CloseF64() float64 { |
|
return decimals.MustToFloat64(k.Close) |
|
} |
|
|
|
func (k Kline) HighF64() float64 { |
|
return decimals.MustToFloat64(k.High) |
|
} |
|
|
|
func (k Kline) LowF64() float64 { |
|
return decimals.MustToFloat64(k.Low) |
|
} |
|
|
|
func (k Kline) VolF64() float64 { |
|
return decimals.MustToFloat64(k.Vol) |
|
} |
|
|
|
func (k Kline) VolQtyF64() float64 { |
|
return decimals.MustToFloat64(k.VolQuote) |
|
} |
|
|
|
func (k Kline) HL2() float64 { |
|
return (k.HighF64() + k.LowF64()) / 2 |
|
} |
|
|
|
func (s Kline) Price(t KPriceType) float64 { |
|
switch t { |
|
case KPriceTypeOpen: |
|
return s.OpenF64() |
|
case KPriceTypeClose: |
|
return s.CloseF64() |
|
case KPriceTypeHigh: |
|
return s.HighF64() |
|
case KPriceTypeLow: |
|
return s.LowF64() |
|
case KPriceTypeVol: |
|
return s.VolF64() |
|
case KPriceTypeVolQuote: |
|
return s.VolQtyF64() |
|
default: |
|
panic(fmt.Errorf("kline price type %s not support", t)) |
|
} |
|
} |
|
|
|
type KPriceType string |
|
|
|
const ( |
|
KPriceTypeHigh KPriceType = "high" |
|
KPriceTypeLow KPriceType = "low" |
|
KPriceTypeOpen KPriceType = "open" |
|
KPriceTypeClose KPriceType = "close" |
|
KPriceTypeVol KPriceType = "vol" |
|
KPriceTypeVolQuote KPriceType = "volQuote" |
|
KPriceTypeDefault KPriceType = KPriceTypeClose |
|
) |
|
|
|
// ChannelKline k线订阅消息 |
|
type ChannelKline struct { |
|
ExgInstId string `json:"instId"` // 交易所交易产品id,如 BTC_USDT_SWAP |
|
Exchange pb.ExchangeType `json:"exchange"` // 交易所 |
|
Klines []*Kline `json:"klines"` |
|
}
|
|
|