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 市场深度通道有时不发送消息移除价格水平的主要内容,如果未能解决你的问题,请参考以下文章

重磅福利!CoinEX8推出免费上币活动

Reactor Netty websocket 通道过早关闭

Netty:如何限制每秒 websocket 通道消息?

在 Redux 中存储 websocket(通道)连接对象

Gorilla Websocket 示例在处理另一个通道时尝试将数据发送到通道时挂起?

通过 websocket 或使用 WebRTC 的数据通道逐个字符发送?