构建本地期货OrderBook,新的event无法满足U <= lastUpdateId 且 u >= lastUpdateId

根据币安的规则:Binance API 使用文档 我创建了自己的代码,逻辑如下:

  1. 订阅wss://fstream.binance.com/stream?streams=btcusdt@depth@500ms
  2. 获取到推送首批记录之后,全部写入数据库
  3. 继续获取新的推送,对比这次推送的event的pu值和已经写入数据库的上一批推送的currentLastUpdatID,完全匹配时继续对比 新event的 u值 和已经写入数据库的上一批推送的currentLastUpdatID,当U <= currentLastUpdatID <= u时,开始逐一交叉对比所有记录:新价格=0 则移除表中记录,否则更新或者插入数据库。
  4. 当这次推送的event的pu值和已经写入数据库的上一批推送的currentLastUpdatID无法匹配时,通过API获取1000个快照,对比快照的LastUpdatID 和数据库中记录的LastUpdateID,清除所有小于快照LastUpdateID的记录。
  5. 继续第3步,从websocket获取新的event,对比更新

但是按照以上的逻辑,我在第3步完全无法得到能满足条件:U <= currentLastUpdatID <= u 的event,请问:

  1. 上述步骤有什么问题?
  2. 币安的代码样例,虽然是现货:https://github.com/binance/binance-toolbox-python/blob/master/manage_local_order_book.py,但是对比现货的规则,发现代码完全没有实现 “ 1. 每一个新event的U应该恰好等于上一个event的u+1” 这个逻辑,代码样例和API规则到底哪个才是正确的?

谢谢!

https://binance-docs.github.io/apidocs/futures/cn/#1654ad2dd2
请按照合约这里介绍的具体步骤实现。

现货和期货不一样
现货是连续的可以用你那个不等式 期货是断开的要看pu

是的,丢包是通过pu来判断,没错的,但是U <= LastUpdatID <= u 这个很难满足。基本上收到的message 都是 LastUpdatID < U < u

期货不是按照你说的那个来的 他是给你pu,U-u
然后看pu是不是等于上一个u
你只需要看pu==上一个u
可以理解为一个链表

你说得完全正确,但是现在这不是我的问题,问题是“ 1. 将深度快照中的内容更新到本地orderbook副本中,并从websocket接收到的第一个U <= lastUpdateId u >= lastUpdateId 的event开始继续更新本地副本。"
这个条件无法满足。

你从websocket一直获得推送,不要停的话就会是一个完整的链表(从U1-u1, U2-u2, U3-u3…)
在此同时去获得快照,如果你的快照比第一个链表的U小,再去重新获得快照,直到你获得一个快照的id>U1,然后把链表加到这个快照上去就行

这个建议有意思,官方压根儿没提过,靠谱,感谢提醒!!