有时我的 quickfixN 引擎会失去与交换机的连接,当它重新连接时,交换机会意识到缺少消息并要求重新发送。然后我的引擎发送消息。
然而,订单通常是旧的,而且我通常会随后发送一个 orderCancellation 请求。然而,当交易所在重新发送消息时按顺序执行消息时,订单很有可能会被执行。
处理这个问题的正确方法是什么?即,我怎样才能告诉交易所不要执行这些订单,或者,我怎样才能阻止 quickfixN 重新发送旧订单?
有时我的 quickfixN 引擎会失去与交换机的连接,当它重新连接时,交换机会意识到缺少消息并要求重新发送。然后我的引擎发送消息。
然而,订单通常是旧的,而且我通常会随后发送一个 orderCancellation 请求。然而,当交易所在重新发送消息时按顺序执行消息时,订单很有可能会被执行。
处理这个问题的正确方法是什么?即,我怎样才能告诉交易所不要执行这些订单,或者,我怎样才能阻止 quickfixN 重新发送旧订单?
我不知道是否有一种普遍“正确”的方式来处理这个问题。
在我们的系统中,我们总是,总是以填隙响应,即
交换:“嘿,我们缺少序列 537 到 542!”
我们:“别担心。接下来期待序列 545。”
545 不是错字——我们可能已经发送了 543 和 544,而它们的重新发送请求正在传输。
这种技术是为了避免你面临的那种困境。通过拒绝发送旧消息,您至少可以保留对执行的控制权。
为了说明更大的视角,我们所做的是,当我们对订单启动任何操作时,我们会将订单标记为“正在进行中”,这意味着它不能以任何方式进一步执行(修改/首席财务官或取消)。只有当我们收到一个 ACK,即一个执行报告时,我们才会移除这个状态。因此,如果交易所错过了与该订单有关的消息,则该订单最终会“卡住”(并在前端突出显示)。不理想,但同样,至少它没有失控。然后交易者只需重新输入所需的订单。(请注意,这是我们不会重新发送消息的保证,使交易者能够安全地重新输入订单。)没有系统,它只是重试和继续,不需要复杂的序列场景解析。
资料来源:开发连接到超过 10 家加拿大交易所的订单输入系统,被超过 50 家加拿大经纪人使用。