You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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}");
}

错误原因说明

  1. 方式一问题:未将通用Message转为具体的MarketDataSnapshotFullRefresh类型,QuickFix无法解析组结构;且硬编码只取前2组,会遗漏后续组,组索引必须从1循环到总数。
  2. 方式二问题:Tag269属于NoMDEntries组内字段,并非主消息的顶级字段,直接从主消息提取会触发"Conditionally Required Field Missing"错误。

额外注意事项

  • 确保QuickFix数据字典(XML)正确定义了MarketDataSnapshotFullRefresh消息中的NoMDEntries组,包含Tag269、270等必填字段。
  • 处理特定类型的FIX消息时,必须使用对应的具体消息类型,而非通用Message,否则无法正确解析嵌套组结构。

内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:30:01