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() }