-2

我已经使用 QuickFix/.NET 很长时间了,但在过去的两天里,引擎似乎两次发送了乱序消息。

这是一个示例,第三条消息是乱序的:

20171117-14:44:34.627 : 8=FIX.4.4 9=70 35=0 34=6057 49=TRD 52=20171117-14:44:34.622 56=SS 10=208

20171117-14:44:34.635 : 8=FIX.4.4 9=0070 35=0 34=6876 49=SS 56=TRD 52=20171117-14:44:34.634 10=060

20171117-14:45:04.668 : 8=FIX.4.4 9=224 35=D 34=6059 49=TRD 52=20171117-14:45:04.668 56=SS 11=AGG-171117T095204000182 38=100000 40=D 44=112.402 54=2 55=USD/XXX 59=3 60=20171117-09:45:04.647 278=2cK-3ovrjdrk00X1j8h03+ 10=007

20171117-14:45:04.668 : 8=FIX.4.4 9=70 35=0 34=6058 49=TRD 52=20171117-14:45:04.642 56=SS 10=209

我了解 QuickFix 记录器不在单独的线程中。

什么可能导致这种情况发生?

4

3 回答 3

1

消息编号是使用 quickfix/n 中的 GetNextSenderMsgSeqNum 方法生成的,该方法使用锁定。

public int GetNextSenderMsgSeqNum()
        {
            lock (sync_) { return this.MessageStore.GetNextSenderMsgSeqNum(); }
        }

在我看来,消息是按顺序生成的,您的应用程序以不同的顺序显示。在某些情况下,发送方和接收方不同步,接收方期望不同的序列号,发起方将消息发送给接收方,期望不同的序列号。

在这种情况下,可以使用方法调用将序列号更改为预期的序列号以更新序列或转到存储文件夹并打开扩展名为.seqnums 的文件并更新序列号。我希望这将有所帮助。

于 2017-11-28T22:12:04.663 回答
0

QuickFix 发送的具有相同时间戳的多条消息可能会乱序发送。

StackOverflow 上的先前答案建议在接收端重新排序,但未被接受: QuickFix - messages out of sequence

如果您决定将自己限制为每毫秒一条消息,例如在发送之间使用 sleep() 命令,请务必提高进程的调度优先级:https ://msdn.microsoft.com/en-us/library/windows /desktop/ms685100(v=vs.85).aspx 即使您只要求一毫秒,您通常也会获得很长的睡眠时间,但使用 ABOVE_NORMAL_PRIORITY_CLASS 时我得到了大约 1-2 毫秒。(视窗 10)

您可以尝试禁用 Nagle 的算法,该算法将多个 TCP 消息聚合在一起并一次发送它们。Nagle 本身并不能导致消息被乱序发送,但 QuickFix 可能会以某种奇怪的方式手动缓冲消息。尝试告诉 QuickFix 立即使用 SocketNodelay 发送它们:http: //quickfixn.org/tutorial/configuration.html

于 2017-11-28T16:29:30.327 回答
0

由于两条消息的日期时间完全相同,这可能是排序问题。这在任何两个不同项目的索引相同的排序列表中都很常见。如果这在您自己的代码中,我建议您解决它,您可以在键中包含一个额外的元素,例如序列号

于 2017-11-28T14:14:52.930 回答