我正在实现基于QuickFIX的客户端服务器集。当我尝试发送包含“缔约方”重复组的消息时,收到带有以下描述的拒绝:“58 =未为此消息类型定义标签| 371 = 447 |”

我尝试发送的消息类型是OrderCancelReplaceRequest。

代码示例是:

FIX44::OrderCancelReplaceRequest order(FIX::MsgType("G"));

FIX44::OrderCancelReplaceRequest::NoPartyIDs party;
// 448-PartyID
party.set(FIX::PartyID("PartyId"));
// 447-PartyIDSource
party.set(FIX::PartyIDSource('B'));
// 452-PartyRole
party.set(FIX::PartyRole(1));
// 802-NoPartySubIDs
party.set(FIX::NoPartySubIDs(0));

order.addGroup(party);

...

如果该消息不包含“参与者”组,则服务器已成功验证该消息。

此外,即使它包含FIX44::OrderCancelReplaceRequest::NoAllocs组,它也已成功验证:
 FIX44::OrderCancelReplaceRequest::NoAllocs alloc;
 // 79-AllocAccount
 alloc.set(FIX::AllocAccount("Alloc Account"));
 // 80-AllocQty
 alloc.set(FIX::AllocQty(4.2));
 order.addGroup(alloc);

因此,只有在尝试使用“缔约方”组时,我才看到此问题。

服务器的配置文件为:
[DEFAULT]
ConnectionType=acceptor
SocketAcceptPort=28663
SocketReuseAddress=Y
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=<some path here>/FIX44.xml
FileLogPath=QuickFixServerLog
ValidateUserDefinedFields=N

[SESSION]
BeginString=FIX.4.4
SenderCompID=EXECUTOR
TargetCompID=CLIENT1
FileStorePath=store

客户端的配置文件为:
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=1
FileStorePath=store
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=<some path here>/FIX44.xml
HttpAcceptPort=9911
ValidateUserDefinedFields=N
ResetOnLogout=Y
ResetOnLogon=Y

[SESSION]
BeginString=FIX.4.4
SenderCompID=CLIENT1
TargetCompID=EXECUTOR
SocketConnectHost=127.0.0.1
SocketConnectPort=28663
HeartBtInt=15

更新。

服务器重新发送的请求示例(来自服务器日志)是:
8=FIX.4.4|9=234|35=G|34=2|49=CLIENT1|52=20150417-10:49:07.715|56=EXECUTOR|1=Account|11=Id123|38=11.11|40=1|41=OrigId321|44=4.2|54=2|55=Symbol|60=20150417-10:49:07|78=2|79=AllocAccount1|79=AllocAccount2|80=10|80=20|447=B|448=PartyId|452=1|453=1|802=0|10=185|

该请求的响应为:
8=FIX.4.4|9=124|35=3|34=2|49=EXECUTOR|52=20150417-10:49:07.719|56=CLIENT1|45=2|58=Tag not defined for this message type|371=447|372=G|373=2|10=060|

最佳答案

正如您在评论部分中的交谈后所指出的那样, <Parties> component block 组中字段的顺序不正确。重复组(或<Parties>中的组件块)中的字段顺序应保留。您可以在该主题的博客文章here上找到它,说明重复组中场序的重要性。

在您的情况下,对消息的客户端修改会破坏<Parties>组的字段顺序,从而导致服务器发出Reject消息。

关于c++ - QuickFIX不验证重复组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29682235/

10-10 20:13