David
1
根据币安的规则:Binance API 使用文档 我创建了自己的代码,逻辑如下:
- 订阅wss://fstream.binance.com/stream?streams=btcusdt@depth@500ms
- 获取到推送首批记录之后,全部写入数据库
- 继续获取新的推送,对比这次推送的event的pu值和已经写入数据库的上一批推送的currentLastUpdatID,完全匹配时继续对比 新event的 u值 和已经写入数据库的上一批推送的currentLastUpdatID,当U <= currentLastUpdatID <= u时,开始逐一交叉对比所有记录:新价格=0 则移除表中记录,否则更新或者插入数据库。
- 当这次推送的event的pu值和已经写入数据库的上一批推送的currentLastUpdatID无法匹配时,通过API获取1000个快照,对比快照的LastUpdatID 和数据库中记录的LastUpdateID,清除所有小于快照LastUpdateID的记录。
- 继续第3步,从websocket获取新的event,对比更新
但是按照以上的逻辑,我在第3步完全无法得到能满足条件:U <= currentLastUpdatID <= u 的event,请问:
- 上述步骤有什么问题?
- 币安的代码样例,虽然是现货:https://github.com/binance/binance-toolbox-python/blob/master/manage_local_order_book.py,但是对比现货的规则,发现代码完全没有实现 “ 1. 每一个新event的
U
应该恰好等于上一个event的u
+1” 这个逻辑,代码样例和API规则到底哪个才是正确的?
谢谢!
dino
2
skyblu
4
现货和期货不一样
现货是连续的可以用你那个不等式 期货是断开的要看pu
David
5
是的,丢包是通过pu来判断,没错的,但是U <= LastUpdatID <= u 这个很难满足。基本上收到的message 都是 LastUpdatID < U < u
skyblu
6
期货不是按照你说的那个来的 他是给你pu,U-u
然后看pu是不是等于上一个u
你只需要看pu==上一个u
可以理解为一个链表
David
7
你说得完全正确,但是现在这不是我的问题,问题是“ 1. 将深度快照中的内容更新到本地orderbook副本中,并从websocket接收到的第一个U
<= lastUpdateId
且 u
>= lastUpdateId
的event开始继续更新本地副本。"
这个条件无法满足。
skyblu
8
你从websocket一直获得推送,不要停的话就会是一个完整的链表(从U1-u1, U2-u2, U3-u3…)
在此同时去获得快照,如果你的快照比第一个链表的U小,再去重新获得快照,直到你获得一个快照的id>U1,然后把链表加到这个快照上去就行
David
9
这个建议有意思,官方压根儿没提过,靠谱,感谢提醒!!