修复重复的组以重用相同的标签

问题描述

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>

解决方法

TL; DR

标记值编码中不允许
(但在 FIXML 中是)

一些解释

我最初的误解来自FIX标记值规范中的以下语句:see here,search for "Field presence"

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

但是据我了解,这是指消息的 wire 格式,而不是消息的定义

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

标签号(字段)只能在消息中出现一次。如果它 多次出现在消息中应被视为错误 以及规范文档。

同时,当我查看NestedParties组件(强调我的)时,我什至发现它在FIXimate中提到:(link to NestedParties component in FIXimate

NestedParties组件块与Partys块相同。 嵌套时用于其他组件块和重复组中 将会发生,导致多次出现缔约方区块 在单个FIX消息中。.在这些消息下使用NestedParties 条件避免了在 FIX标记/值语法中不允许的相同消息。

顺便说一句,还有一些组件NestedParties2NestedParties3NestedParties4可以解决此问题。

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

可以在这里访问该线程,但是据我所知,只有在您是FIX TC成员的情况下,您才能访问该线程:FIX TC forum

FIX专家Hanno Klein提供了以下信息:

重构后的在线规格中的报价是指 使用tagvalue语法编码的消息的任何实例。这意味着 重复组的线格式,标签(字段)可能 出现不止一次。

FIXML没有此限制:

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

标记值可以做到

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


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

另一方面,在定义自己的重复组时,请使用NoXXX表示重复组,因为这是官方建议。 see here,search for "NumInGroup field"

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

但是,在以44/Price为例的情况下,通常会看到566/LegPrice被用作单个航段的价格,因为两者的用法不同。前者是用于执行订单的价格,后者是在定义策略分支时使用的价格。

因此,简而言之,在定义消息结构和重复组时,您应该真正考虑标记的含义对于消息中所有出现的标记是否都相同,以及使用身体和重复组中的标签完全相同。清晰度应放在首位。


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

起初我认为这是不允许的,但是主要是因为我从未见过它出现在真实消息中。但是实际上我找不到为什么不应该允许使用它的原因。规范只说:see here,search for "Field presence"

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

每个重复的组实例中,标签(字段)最多只能出现一次。

,

否,这是不允许的。建议您从http://www.quickfixengine.org获取一个大型数据字典,以XML格式将其保存到计算机中,然后执行如下命令:

grep Price FIX.xml | grep number

这样做将向您显示所有与价格相关的字段的定义。如果在消息/组件中搜索每个字段名称,则会看到每个名称都在不同的地方使用。总体结果是,每个字段在消息中仅列出一次。

,

您不能在重复组之外重复使用重复组标签。

将标签声明为重复组标签会对其施加约束,例如标签在组中的顺序以及如何将一个事件与后续事件区别对待。非重复组标签没有这种限制。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...