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.
 
 

72 lines
3.1 KiB

package okx
// 深度频道 https://my.okx.com/docs-v5/zh/#order-book-trading-market-data-ws-order-book-channel
// 获取深度数据,books是400档频道,books5是5档频道, bbo-tbt是先1档后实时推送的频道,books-l2-tbt是先400档后实时推送的频道,books50-l2-tbt是先50档后实时推的频道;
// books 首次推400档快照数据,以后增量推送,每100毫秒推送一次变化的数据
// books5 首次推5档快照数据,以后定量推送,每100毫秒当5档快照数据有变化推送一次5档数据
// bbo-tbt 首次推1档快照数据,以后定量推送,每10毫秒当1档快照数据有变化推送一次1档数据
// books-l2-tbt 首次推400档快照数据,以后增量推送,每10毫秒推送一次变化的数据
// books50-l2-tbt 首次推50档快照数据,以后增量推送,每10毫秒推送一次变化的数据
// 单个连接、交易产品维度,深度频道的推送顺序固定为:bbo-tbt -> books-l2-tbt -> books50-l2-tbt -> books -> books5。
// books-l2-tbt400档深度频道,只允许交易手续费等级VIP5及以上的API用户订阅。
// books50-l2-tbt50档深度频道,只允许交易手续费等级VIP4及以上的API用户订阅.
type BooksData struct {
Ts string `json:"ts"` // 成交时间,Unix时间戳的毫秒数格式,如 1597026383085
Checksum int `json:"checksum"` // 检验和 (下方注解)
PrevSeqId int `json:"prevSeqId"` // 上一个推送的序列号。仅适用 books,books-l2-tbt,books50-l2-tbt
SeqId int `json:"seqId"` // 推送的序列号 (下方注解)
Asks [][]string `json:"asks"` // 卖方深度 asks和bids格式:[[深度价格,此价格的数量,弃用(始终为0),此价格的订单数量]]
Bids [][]string `json:"bids"` // 买方深度
}
// ChannelBooks 交易频道
type ChannelBooks struct {
cfg wsChannelConfig[*[]BooksData, *ChannelData[*[]BooksData]]
wsChannel *wsChannel[*[]BooksData, *ChannelData[*[]BooksData]]
}
func NewChannelBooks(
traceId string,
httpProxy string,
) *ChannelBooks {
cfg := wsChannelConfig[*[]BooksData, *ChannelData[*[]BooksData]]{
channelId: traceId,
httpProxy: httpProxy,
wsUrl: "/ws/v5/public",
subscribeChannels: []string{"books5"},
dataInstanceFunc: func() *[]BooksData {
var d []BooksData
return &d
},
dataMappingFunc: func(data *ChannelData[*[]BooksData]) (*ChannelData[*[]BooksData], error) {
return data, nil
},
}
return &ChannelBooks{cfg: cfg}
}
func (c *ChannelBooks) Init() (err error) {
c.wsChannel = newWsChannel(c.cfg)
return c.wsChannel.Init()
}
func (c *ChannelBooks) Consumer() <-chan *ChannelData[*[]BooksData] {
return c.wsChannel.Consumer()
}
func (c *ChannelBooks) Subscribe(instIds ...string) (err error) {
return c.wsChannel.Subscribe(instIds...)
}
func (c *ChannelBooks) Unsubscribe(instIds ...string) (err error) {
return c.wsChannel.Unsubscribe(instIds...)
}
func (c *ChannelBooks) IsSubscribe(instId string) bool {
return c.wsChannel.IsSubscribed(instId)
}
func (c *ChannelBooks) GetSubscribes() (instIds []string) {
return c.wsChannel.GetSubscribes()
}