首页 > 解决方案 > 修复重复组以重复使用相同的标签

问题描述

FIX 协议是否允许在消息和重复组中重用相同的标签?即我可以有类似的东西

        <message name='Quote' msgtype='S' msgcat='app'>
            <field name='Price' required='Y'/><!-- i.e. total price for the whole quote-->
    ...
            <group name='NumLegs' required='Y'>
                <field name='Price' required='Y'/><!-- i.e. leg price -->
    ...
                <group name='NumLegDetails' required='Y'>
                    <field name='Price' required='Y'/><!-- i.e. leg component price -->
    ...
                </group>
    ...
            </group>
        </message>

标签: quickfixfix-protocolquickfixj

解决方案


TL;博士

在标签值编码中是不允许。 (但在FIXML中是这样)

一些解释

我最初的误解来自 FIX 标记值规范中的这句话:看这里,搜索“字段存在”

一个标签(字段)在消息中最多只能出现一次,除非标签出现在重复组中。

但据我所知,这是指消息的有线格式,而不是消息的定义

而 FIX5.0SP2 规范第 1 卷提到了消息的定义并指出:

标签号(字段)只能在消息中出现一次。如果它在消息中出现不止一次,则应将其视为规范文档的错误。

与此同时,我什至在查看NestedParties组件时发现它在 FIXimate 中提到(强调我的):(链接到 FIXimate 中的 NestedParties 组件

NestedParties 组件块与缔约方块相同。当嵌套将发生时,它用于其他组件块和重复组,导致在单个 FIX 消息中多次出现当事方块。在这些条件下使用 NestedParties 可以避免在同一消息中多次引用当事方块,这不是FIX 标记/值语法中允许。

顺便说一句,还有一些组件NestedParties2,NestedParties3NestedParties4解决这个问题。

来自 FIX 交易社区论坛的信息

可以在此处访问该线程,但据我所知,如果您是 FIX TC 成员,则只能访问它:FIX TC 论坛

FIX 专家Hanno Klein给出了以下信息:

重构的在线规范中的引用是指以 tagvalue 语法编码的任何消息实例的有线格式。这意味着 单个重复组的连线格式中,标签(字段)可能会出现多次。

FIXML 没有这个限制:

该限制实际上仅限于标记值编码。例如,FIXML 中的所有实例的当事方组件都是“Pty”,FIX 的 XML 语法/编码。这是因为 XML 语法具有明确的结构,其中每个组件或字段的出现都有不同的路径。XML 名称只需要在同一元素中是唯一的。

标记值可以:

对于标记值,解析器需要知道重复组何时开始和结束。NoXXX 字段标记起点,不属于组的字段标记终点。tagvalue 中的重复组没有明确的分隔符,并且组件(非重复)在有线格式中根本不可见。从技术上讲,您可能是正确的,价格标签可以存在于两个不同的重复组中而不会导致解析器问题,但我没有看到允许此规则例外的好处。您不能允许它用于两个相邻的级别,例如根 + 嵌套级别 1 或嵌套级别 x + 嵌套级别 y。


原始答案的这部分仍然适用

另一方面,在定义您自己的重复组时,请使用重复组的符号NoXXX,因为这是官方建议。看到这里,搜索“NumInGroup 字段”

建议将 NumInGroup 字段命名为 NoXXX,例如 NoContraBrokers(382)。

但是,按照您的示例,44/Price您通常会看到566/LegPrice用作单个腿的价格,因为两者的使用方式不同。前者是用于执行订单的价格,后者用于定义策略的边时。

简而言之,在定义消息结构和重复组时,您应该真正考虑标签的含义是否对于消息中所有出现的标签都相同,以及在正文中使用相同的标签是否真的有意义并在重复组中。清晰应该是第一要务。


原始答案的不正确(删除线)部分

起初我认为这是不允许的,但主要是因为我从未见过它出现在真实消息的某个地方。但实际上我找不到不应该被允许的理由。规范只说:看这里,搜索“现场存在”

一个标签(字段)在消息中最多只能出现一次,除非标签出现在重复组中。

一个标签(字段)必须在每个重复组实例中最多出现一次。


推荐阅读