使用QuickFix的C#服务无法提取35=W消息中Tag269/270值求助
问题
在C# Windows服务应用中使用QuickFix组件时,无法从接收到的35=W(MarketDataSnapshotFullRefresh)消息中提取Tag269(MDEntryType)和Tag270(MDEntryPx)的值。
收到的35=W消息内容:
20230725-07:36:02.762 : 8=FIX.4.4 9=566 35=W 56=INI-DEMO 49=SERVERDEMO34=994 52=20230725-07:36:02.654 262=20230727073534134USDSGD 55=USD/SGD 167=SPOT 64=20230727 7250=SP 268=6 269=0 270=341.46 271=1000000 278=20230727073534134USDSGD.86.29_B 269=1 270=341.63 271=1000000 278=20230727073534134USdSGD.86.29_B 269=0 270=341.457 271=3000000 278=20230727073534134USDSGD.86.29_C 269=1 270=341.633 271=3000000 278=20230727073534134USDSGD.86.29_C 269=0 270=341.451 271=5000000 278=20230727073534134USDSGD.86.29_D 269=1 270=341.639 271=5000000 278=20230727073534134USDSGD.86.29_D 60=20230725-07:36:02.654 10=044
尝试过两种提取方式均无效,还收到35=j的错误消息:
尝试的代码方式一:
var group = new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries(); MDEntryType MDEntryType = new MDEntryType(); MDEntryPx MDEntryPx = new MDEntryPx(); message.getGroup(1, group); group.get(MDEntryType); group.get(MDEntryPx); message.getGroup(2, group); group.get(MDEntryType); group.get(MDEntryPx);
尝试的代码方式二:
QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries noMDEntries = new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries(); MarketDataRequest.NoMDEntryTypes mdEntryType = new MarketDataRequest.NoMDEntryTypes(); mDEntryType = message.getField(new MDEntryType()).getValue();
收到的错误消息:
35=j: 20230725-07:36:02.765 : 8=FIX.4.4 9=155 35=j 34=1015 49=INI-DEMO 52=20230725-07:36:02.764 56=SERVERDEMO 263=1 264=0 265=0 45=994 58=Conditionally Required Field Missing (269) 372=W 380=5 10=091
请问如何正确提取Tag269和Tag270的值?是否需要通过父Tag268处理重复的Tag269?
解决方案
问题核心是未正确处理QuickFix的重复组结构:Tag268是组计数器,代表后续包含的NoMDEntries组数量,每组对应一组269、270等字段。正确流程是先获取组总数,再循环提取每组内的字段:
正确的C#代码示例
// 将通用Message转为具体的MarketDataSnapshotFullRefresh类型,确保组结构能被正确识别 var snapshotMsg = new QuickFix44.MarketDataSnapshotFullRefresh(); message.CopyTo(snapshotMsg); // 获取组的总数(对应Tag268的值) int groupCount = snapshotMsg.GetInt(QuickFix.Fields.Tags.NoMDEntries); // 循环处理每个组 for (int i = 1; i <= groupCount; i++) { var mdEntryGroup = new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries(); snapshotMsg.GetGroup(i, mdEntryGroup); // 提取MDEntryType(Tag269) QuickFix.Fields.MDEntryType entryType = new QuickFix.Fields.MDEntryType(); mdEntryGroup.Get(entryType); string entryTypeValue = entryType.getValue(); // 提取MDEntryPx(Tag270) QuickFix.Fields.MDEntryPx entryPx = new QuickFix.Fields.MDEntryPx(); mdEntryGroup.Get(entryPx); decimal entryPxValue = entryPx.getValue(); // 此处可根据业务需求处理提取到的值,比如打印或存储 Console.WriteLine($"组{i}: MDEntryType={entryTypeValue}, MDEntryPx={entryPxValue}"); }
错误原因说明
- 方式一问题:未将通用
Message转为具体的MarketDataSnapshotFullRefresh类型,QuickFix无法解析组结构;且硬编码只取前2组,会遗漏后续组,组索引必须从1循环到总数。 - 方式二问题:Tag269属于
NoMDEntries组内字段,并非主消息的顶级字段,直接从主消息提取会触发"Conditionally Required Field Missing"错误。
额外注意事项
- 确保QuickFix数据字典(XML)正确定义了
MarketDataSnapshotFullRefresh消息中的NoMDEntries组,包含Tag269、270等必填字段。 - 处理特定类型的FIX消息时,必须使用对应的具体消息类型,而非通用
Message,否则无法正确解析嵌套组结构。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

