- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 GDAX API Websocket Stream尝试创建完整的 LEVEL3 订单簿的副本。
我有一个使用 WebSocketSharp 的非常简单的实现,我基本上就是在做类似的事情。
private readonly WebSocket _webSocket = new WebSocket("wss://ws-feed.gdax.com");
_webSocket.OnMessage += WebSocket_OnMessage;
_webSocket.Connect();
_webSocket.Send(JsonConvert.SerializeObject(new BeginSubscriptionMessage()));
private void WebSocket_OnMessage(object sender, MessageEventArgs e)
{
var message = JsonConvert.DeserializeObject<BaseMessage>(e.Data);
switch (message.Type)
{
case "match": //A trade occurred between two orders.
MatchMessage matchMessage = JsonConvert.DeserializeObject<MatchMessage>(e.Data);
_receivedMatchQueue.Enqueue(matchMessage);
break;
case "received": //A valid order has been received and is now active. This message is emitted for every single valid order as soon as the matching engine receives it whether it fills immediately or not.
ReceivedMessage receivedMessage = JsonConvert.DeserializeObject<ReceivedMessage>(e.Data);
_receivedMessageQueue.Enqueue(receivedMessage);
break;
case "open": //The order is now open on the order book. This message will only be sent for orders which are not fully filled immediately. remaining_size will indicate how much of the order is unfilled and going on the book.
OpenMessage openMessage = JsonConvert.DeserializeObject<OpenMessage>(e.Data);
_receivedOpenQueue.Enqueue(openMessage);
break;
case "done": //The order is no longer on the order book. Sent for all orders for which there was a received message. This message can result from an order being canceled or filled.
DoneMessage doneMessage = JsonConvert.DeserializeObject<DoneMessage>(e.Data);
_receivedDoneQueue.Enqueue(doneMessage);
break;
case "change": //Existing order has been changed
ChangeMessage changeMessage = JsonConvert.DeserializeObject<ChangeMessage>(e.Data);
_receivedChangeQueue.Enqueue(changeMessage);
break;
case "activate": //Stop order placed
//Console.WriteLine("Stop Order Placed");
//ActivateMessage activateMessage = JsonConvert.DeserializeObject<ActivateMessage>(e.Data);
break;
case "subscriptions":
break;
case "ticker":
TickerMessage tickerMessage = JsonConvert.DeserializeObject<TickerMessage>(e.Data);
_receivedTickerQueue.Enqueue(tickerMessage);
break;
case "l2update":
break;
}
}
我遇到的问题是,当我查看通过 RECEIVED 和 OPEN 消息收到的序列号时,我可以看到它们不是连续的,这 ( based on the following information ) 表明消息被跳过。
基本上你最终会得到这样的结果
Open Message SequenceId: 5359746354
Open Message SequenceId: 5359746358
Open Message SequenceId: 5359746361
Open Message SequenceId: 5359746363
Open Message SequenceId: 5359746365
Open Message SequenceId: 5359746370
Open Message SequenceId: 5359746372
我已经尝试在 Azure 上对此进行测试,只是为了确保它不是我这边的带宽限制,而且结果大致相似。
鉴于此,如果消息被丢弃,如何使用“完整”websocket 流构建一个完整的“实时”订单簿?我可以安全地忽略它们吗?或者我只是以某种方式清除孤立的值?
任何做过类似事情的人的任何建议都将不胜感激。
最佳答案
很可能消息没有被丢弃,您只是对这些序列号代表的“序列”有错误的印象。
如 api 文档中所述
Most feed messages contain a sequence number. Sequence numbers are increasing integer values for each product with every new message being exactly 1 sequence number than the one before it.
因此每个 channel 都有每个产品的单独序列号(如 ETH-USD
),而不是每个消息类型(如“打开”或“接收”)。假设您订阅了产品 ETH-USD
和 ETH-EUR
的“完整” channel 。那么你应该期待这样的序列:
receive `ETH-EUR` X
open `ETH-EUR` X + 1
receive `ETH-USD` Y
done `ETH-EUR` X + 2
open `ETH-USD` Y + 1
对于全 channel ,消息类型有:received、open、done、match、change、activate(注意ticker消息属于不同的 channel ,所以有不同的顺序)。因此,为确保不跳过任何消息,您需要跟踪所有这些消息类型,并确保您收到的每个产品的最后一个序列号正好比新序列号小 1(如果您订阅了多个产品)。
验证码:
class Program {
private static readonly WebSocket _webSocket = new WebSocket("wss://ws-feed.gdax.com");
private static long _lastSequence = 0;
private static readonly HashSet<string> _expectedTypes = new HashSet<string>(
new[] { "received", "open", "done", "match", "change", "activate" });
static void Main(string[] args) {
var subMsg = "{\"type\": \"subscribe\",\"product_ids\": [\"ETH-USD\"],\"channels\": [\"full\"]}";
_webSocket.OnMessage += WebSocket_OnMessage;
_webSocket.Connect();
_webSocket.Send(subMsg);
Console.ReadKey();
}
private static void WebSocket_OnMessage(object sender, MessageEventArgs e) {
var message = JsonConvert.DeserializeObject<BaseMessage>(e.Data);
if (_expectedTypes.Contains(message.Type)) {
lock (typeof(Program)) {
if (_lastSequence == 0)
_lastSequence = message.Sequence;
else {
if (message.Sequence > _lastSequence + 1) {
Debugger.Break(); // never hits, so nothing is dropped
}
_lastSequence = message.Sequence;
}
}
}
}
}
public class BaseMessage {
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("product_id")]
public string ProductId { get; set; }
[JsonProperty("sequence")]
public long Sequence { get; set; }
}
关于c# - GDAX/Coinbase API Level3 orderbook - 跳过消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49228552/
GDAX API docs不要很好地枚举订单可以具有的可用状态。我至少看到开放、待定、事件、完成,也许已解决 [^1]。有没有人确定一个完整的列表,以及每个状态的含义? 我也尝试过查看一些可用的库,但
未从 GDAX Sandbox HTTP 连接获得任何响应。正在尝试连接 gdax 沙箱以修复连接以下订单。 连接的 URL = https://fix-public.sandbox.gdax.com
当我尝试从 GDAX 请求历史数据时,收到一条错误消息,提示“超出速率限制”。我使用 Promise 和 setInterval 从 GDAX 请求历史价格数据,如下所示: let promiseAr
我正在尝试实现这个API:https://github.com/robevansuk/gdax-java以便能够通过 Coinbase 创建订单、提取资金和存入资金并在 GDAX 中兑换比特币。我正在
我想从这个wss://ws-feed.gdax.com获取数据 我对 websocket 一无所知。我正在阅读一些教程,它使用了我不知道的 websocket 服务器、TCP 等术语。任何人都可以建议
使用 GDAX api 调用历史价格时,使用以下命令: https://api.gdax.com/products/ETH-EUR/candles?start=2017-07-02T15:25:00.
我正在尝试在 GDAX 上发出帖子请求。 但我总是收到“无效签名”消息。 用于创建请求 + 签名的 GDAX API 文档:https://docs.gdax.com/#creating-a-requ
我在签署 GDAX API 消息时遇到问题。 GDAX API 文档指出状态 400 ~“错误请求 – 请求格式无效”。你能告诉我我需要更改什么吗? 谢谢! protected Void doInBa
我有兴趣使用 Gdax (Coinbase) WebSocket 获取实时数据。我是个菜鸟,所以我正在检查他们文档中发布的示例 Gdax: import gdax, time class myWebs
我正在尝试与 GDAX-API 集成,并且我已经成功地发出 GET 调用并收到答案,但是当我尝试进行 POST 调用时,我得到以下答案{“message”:“无效签名”} 我在这里看到了一些东西:ht
我正在尝试从 GDAX 获取订单簿(链接到调用文档),但是当从 c# 可执行文件执行此操作时,我总是收到错误 400 - 错误请求。 当获取实际 URL 并将其粘贴到我的浏览器时,它工作正常。 Str
我正在使用 GDAX API Websocket Stream尝试创建完整的 LEVEL3 订单簿的副本。 我有一个使用 WebSocketSharp 的非常简单的实现,我基本上就是在做类似的事情。
我正在尝试使用 Python 3.5 和 stunnel 建立到 fix.gdax.com(文档:https://docs.gdax.com/#fix-api 或 https://docs.prime
我正在尝试使用经过身份验证的 API 请求从 GDAX Exchange 获取数据。我从简单的帐户余额检查开始。 我已经调整我的代码大约 8 个小时了,除了 400 响应之外似乎什么也得不到。谁能帮助
我有很多编码经验,但 Python 对我来说是新领域。 我正在使用 CoinbaseExchangeAuth类访问 GDAX API 的私有(private)端点。我写了一些简单的代码... api_
我用 C++ 编写了一些软件,我正在尝试获取 GDAX /products暂时列出(此时主要作为测试。) 更新:我想补充一点,连接实际上是到 cloudflare,而不是直接到 GDAX。因此,这可能
我有一个 Python 脚本,它使用以下参数调用/orders 方法: { "size": "0.01", "price": "", "side": "buy", "p
我正在尝试获取要使用的最新价格数据,使用/ticker 端点上的轮询很容易,即 rawticker = requests.get('https://api.gdax.com/products/BTC-
我用 C++ 写了一些软件,我现在正在尝试获取 GDAX /products 列表(目前主要作为测试。) 更新:我想补充一点,连接实际上是连接到 cloudflare,而不是直接连接到 GDAX。所以
显然,如果您搜索“typescript unexpected token import”,您会得到无数的结果。它们都是关于一些具体问题的,而不是关于如何解决一般问题的。因此,我无法从其他答案中学习来解
我是一名优秀的程序员,十分优秀!