QuickFix/N: FIXT1.1 与FIX5.0 一起使用时如何输入消息?

QuickFix/N: How to have typed messages when using FIXT1.1 with FIX5.0?

上下文

我有一个测试Acceptor和Initiator。我正在使用 QuickFix/N 1.7 版本。如果我将 Acceptor 和 Initiator 配置为 FIX 4.4,一切正常。 什么也不做,只是连接,然后将 incoming/outgoing 心跳消息记录到调试控制台。一切OK,见下文

我只更改了 nothing 从 FIX 4.4 到 FIX 5.0 的两个配置文件。一切正常(我的意思是心跳消息仍然来来去去),但是回调的消息参数不再是类型化(心跳)运行时实例消息,而是基础 class.

诊断:

问题:

为什么消息实例在FIX 5.0情况下不是类型化的运行时实例消息,而在FIX 4.4情况下是类型化的? 这是预期的行为还是我遗漏了什么?

代码展示:

生成输出行的 Initiator IApplication 实现中的代码:

public void ToAdmin(Message message, SessionID sessionID)
{
    Debug.WriteLine($@"(A)OUT: {message.GetType()}{message}");
}
public void FromAdmin(Message message, SessionID sessionID)
{
    Debug.WriteLine($@"(A)IN: {message.GetType()}{message}");
}

当使用 4.4 配置时,我看到了这个:(消息类型是 QuickFix.FIX44.Heartbeat

Logon - FIX.4.4:TEST01->MYACCEPTOR
(A)IN: QuickFix.FIX44.Heartbeat8=FIX.4.4 9=5335=034=249=MYACCEPTOR52=20170715-15:00:31.59656=TEST0110=179
(A) OUT: QuickFix.FIX44.Heartbeat8=FIX.4.4 9=5335=034=249=TEST0152=20170715-15:00:31.60456=MYACCEPTOR10=169
(A) OUT: QuickFix.FIX44.Heartbeat8=FIX.4.4 9=5335=034=349=TEST0152=20170715-15:00:36.61056=MYACCEPTOR10=172
(A) IN: QuickFix.FIX44.Heartbeat8=FIX.4.4 9=5335=034=349=MYACCEPTOR52=20170715-15:00:36.61556=TEST0110=177

当使用 5.0 和配置时,我看到了这个:(消息类型只是 QuickFix.FIX50.Message

Logon - FIXT.1.1:TEST01->MYACCEPTOR
(A)IN: QuickFix.Message8=FIXT.1.19=5335=034=249=MYACCEPTOR52=20170715-15:06:16.92256=TEST0110=003
(A) OUT: QuickFix.Message8=FIXT.1.19=5335=034=249=TEST0152=20170715-15:06:16.93056=MYACCEPTOR10=002
(A) OUT: QuickFix.Message8=FIXT.1.19=5335=034=349=TEST0152=20170715-15:06:21.93656=MYACCEPTOR10=005
(A) IN: QuickFix.Message8=FIXT.1.19=5335=034=349=MYACCEPTOR52=20170715-15:06:21.94156=TEST0110=001

Intiator 的 FIX5.0 配置:

[DEFAULT]
ConnectionType=initiator
ReconnectInterval=2
FileStorePath=store
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
TransportDataDictionary=..\spec\FIXT11.xml
AppDataDictionary=..\spec\FIX50.xml
SocketConnectHost=127.0.0.1
SocketConnectPort=1111
LogoutTimeout=5
ResetOnLogon=Y
ResetOnDisconnect=Y

[SESSION]
BeginString=FIXT.1.1
DefaultApplVerID=FIX.5.0
SenderCompID=TEST01
TargetCompID=MYACCEPTOR
HeartBtInt=5

接受器的 FIX5.0 配置:

[DEFAULT]
ConnectionType=acceptor
SocketAcceptPort=1111
StartTime=00:00:00
EndTime=00:00:00
FileLogPath=log
UseDataDictionary=Y
ResetOnLogon=Y
ResetOnLogout=Y
ResetOnDisconnect=Y

[SESSION]
BeginString=FIXT.1.1
DefaultApplVerID=FIX.5.0
SenderCompID=MYACCEPTOR
TargetCompID=TEST01
FileStorePath=store
TransportDataDictionary=..\spec\FIXT11.xml
AppDataDictionary=..\spec\FIX50.xml

quickfixn repository 处的 FIX4.4 数据字典包含 -

<message name="Heartbeat" msgtype="0" msgcat="admin">
  <field name="TestReqID" required="N" />
</message>

这是Heartbeat消息的正式定义。

此定义在 FIX 5.0 数据字典中缺失,导致 quickfix 引擎将其视为通用消息。

将心跳消息定义添加到 FIX 5.0 数据字典应该可以解决您的问题。