quickfix - 修复重复组以重复使用相同的标签
问题描述
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;博士
在标签值编码中是不允许的。
(但在FIXML中是这样)
一些解释
我最初的误解来自 FIX 标记值规范中的这句话:看这里,搜索“字段存在”
一个标签(字段)在消息中最多只能出现一次,除非标签出现在重复组中。
但据我所知,这是指消息的有线格式,而不是消息的定义。
而 FIX5.0SP2 规范第 1 卷提到了消息的定义并指出:
标签号(字段)只能在消息中出现一次。如果它在消息中出现不止一次,则应将其视为规范文档的错误。
与此同时,我什至在查看NestedParties
组件时发现它在 FIXimate 中提到(强调我的):(链接到 FIXimate 中的 NestedParties 组件)
NestedParties 组件块与缔约方块相同。当嵌套将发生时,它用于其他组件块和重复组,导致在单个 FIX 消息中多次出现当事方块。在这些条件下使用 NestedParties 可以避免在同一消息中多次引用当事方块,这不是FIX 标记/值语法中允许。
顺便说一句,还有一些组件NestedParties2
,NestedParties3
来NestedParties4
解决这个问题。
来自 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
用作单个腿的价格,因为两者的使用方式不同。前者是用于执行订单的价格,后者用于定义策略的边时。
简而言之,在定义消息结构和重复组时,您应该真正考虑标签的含义是否对于消息中所有出现的标签都相同,以及在正文中使用相同的标签是否真的有意义并在重复组中。清晰应该是第一要务。
原始答案的不正确(删除线)部分
起初我认为这是不允许的,但主要是因为我从未见过它出现在真实消息的某个地方。但实际上我找不到不应该被允许的理由。规范只说:看这里,搜索“现场存在”
一个标签(字段)在消息中最多只能出现一次,除非标签出现在重复组中。
一个标签(字段)必须在每个重复组实例中最多出现一次。
推荐阅读
- node.js - NPM 有问题吗,我的程序中有这些大问题吗?
- sql - Snowflake CTE 重复所有可能组合的每个父子行
- java - 如何将带有数据库的java应用程序打开到另一台计算机
- python - 在 Python 中正确设置变量
- java - 我应该在 IntelliJ 社区中使用什么数据库?
- android - Rust 库在目标 armv7-linux-androideabi 上崩溃
- android - Android recyclerview 不会立即观察数据,直到我在短时间内刷新或观察使用处理程序
- amazon-ec2 - Global Accelerator+EC2 如何配置EC2进行健康检查?
- javascript - 如何在 socket.io 4.x 版中获取有关套接字的一些信息
- html - 如何使用级联下拉列表中的最后一个选择作为 src 变量