Coinex WebSocket 市场深度通道有时不发送消息移除价格水平
Posted
技术标签:
【中文标题】Coinex WebSocket 市场深度通道有时不发送消息移除价格水平【英文标题】:Coinex WebSocket market depth channel sometimes does not send message to remove price level 【发布时间】:2020-06-11 23:25:21 【问题描述】:我正在编写一个 Node.js 应用程序,它尝试使用他们的 Websocket 为 ETH-USDT 重新创建 Coinex 订单簿。我的应用程序订阅了市场深度频道,并在内存中保存了一份持续更新的订单簿本地副本。
我有一个可行的实现,但我注意到我的订单簿的本地副本似乎总是最终与交易所不同步。我已经运行该应用程序长达 2 小时而没有看到任何问题,但最终并且总是在我的本地副本中得到一个“陈旧”的价格水平,该价格水平在某个时候从交易所中删除。
我相当肯定删除级别的 WS 消息从未发送过,因为我已经运行了多个测试,其中记录了测试期间发送的每条 WS 消息。我可能可以排除我的系统存在一些错误的明显问题。
这只是 Coinex 方面的问题吗?还有其他方式我需要使消息过期吗?假设这是 Coinex Websocket 的问题,我怎样才能最好地检测和处理这个问题?
【问题讨论】:
嘿@oliakaoil,你能提供一些你得到的代码或错误吗?不查看一些代码就很难理解你的问题。 @kartiktyagi 我可以肯定的是,删除级别的 WS 消息从未发送过,因为我已经运行了多个测试,其中记录了测试期间发送的每条 WS 消息。 @oliakaoil 我对 coinex WS 上的身份验证有疑问,我无法发送带有身份验证数据的自定义标头。你是怎么解决的? 【参考方案1】:我查找了一些可能对解决您的问题有用的资源。但首先,每次执行 WebSocket 并不是一个值得信赖的解决方案。还有一些其他更好的方法可以完成相同的任务。当您询问有关删除消息的建议时,我鼓励您在 coinex-exchange-api here 中查找演示应用程序和实现。
IMO,使用setInterval()
只是这个解决方案的临时替代品。你需要一个更好的指令来做到这一点。
CryptoCurrency eXchange WebSockets 是调用实时数据的另一种更好的方法。它是一个 javascript 库,用于连接所有加密货币交易所的实时公共 API。使用以下命令安装和使用它:
npm install ccxws
更多详情,请访问:blocktap.io。
【讨论】:
这个答案似乎只是一些关于使用加密货币 REST API 和 Websocket 连接的非常一般信息,而不是专门解决我具体问题的任何部分。我也很困惑,因为您似乎首先建议不要使用 Websocket,但后来建议使用它们。【参考方案2】:您是否在使用 Coinex 的 depth.update
response 中的“完整结果”标志(即 - params[0]
)?服务器偶尔会发送一份完整的订单簿副本(不超过您请求中的计数限制),将此标志设置为true
。设置此标志时完全重置您的本地订单簿状态应该让您保持同步。
另一件事可能是您如何以特定价格处理 0 量的深度更新(即 - 将该价格的值设置为 0 与从地图中删除密钥)。
这是我如何处理更新的 Java 示例(地图的大小与请求中最初发送的计数限制保持一致):
@AllArgsConstructor
@Data
public class LimitOrderBook
private double last;
private final SortedMap<Double, Double> asks;
private final SortedMap<Double, Double> bids;
private int time;
public void handleUpdate(final LimitOrderBookUpdate update)
if (update.isFullUpdate())
asks.clear();
bids.clear();
last = update.getLast();
update.getAskUpdates().forEach(p -> updateMap(asks, p));
update.getBidUpdates().forEach(p -> updateMap(bids, p));
time = update.getTime();
private void updateMap(final SortedMap<Double, Double> map, final Pair<Double, Double> pair)
if (pair.getValue() == 0)
map.remove(pair.getKey());
else
map.put(pair.getKey(), pair.getValue());
【讨论】:
【参考方案3】:我在其他交易所也遇到了同样的问题。
很遗憾,由于多种原因(通常与交易所绑定),我们不能 100% 信任 websocket API。
我发现(并且仍在使用)的最佳解决方案是通过 websocket API 跟踪更改,以在我的服务器上保持几乎对齐书,另外(在setInterval
下)我会定期下载整本书以重新同步我的书。
希望这会有所帮助。
【讨论】:
我一直在考虑类似的方法,但考虑到这个问题,我想知道 Coinex 如何在他们的市场页面上保持他们自己的基于 Web 的订单簿同步。以上是关于Coinex WebSocket 市场深度通道有时不发送消息移除价格水平的主要内容,如果未能解决你的问题,请参考以下文章
Reactor Netty websocket 通道过早关闭