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