ИСПРАВИТЬ повторяющиеся группы для повторного использования одних и тех же тегов

Позволяет ли протокол 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>

person kan    schedule 03.11.2020    source источник


Ответы (3)


TL;DR

Это не разрешено в кодировке значения тега.
(но в FIXML разрешено)

Некоторые пояснения

Первоначальное непонимание возникло из-за этого утверждения в спецификации значения тега FIX: см. здесь , найдите Полевое присутствие

Тег (поле) должен появляться в сообщении не более одного раза, за исключением случаев, когда тег появляется в повторяющейся группе.

Но, как я узнал, это относится к формату wire сообщения, а не к определению сообщения.

Принимая во внимание, что спецификация FIX5.0SP2, том 1, ссылается на определение сообщения и гласит:

Номер тега (поле) должен появляться в сообщении только один раз. Если он появляется в сообщении более одного раза, это следует рассматривать как ошибку в документе спецификации.

Тем временем я даже нашел упоминание об этом в FIXimate при просмотре компонента NestedParties (выделено мной): (ссылка на компонент NestedParties в FIXimate)

Блок компонента NestedParties идентичен блоку Party. Он используется в других блоках компонентов и повторяющихся группах, когда будет иметь место вложение, приводящее к множественным появлениям блока Сторон в одном сообщении FIX. Использование NestedParties в этих условиях позволяет избежать множественных ссылок на блок Сторон в одном и том же сообщении. что не допускается в синтаксисе тега/значения FIX.

Кстати, есть также компоненты NestedParties2, NestedParties3, NestedParties4 для решения этой проблемы.

Информация с форума сообщества FIX Trading

Доступ к ветке можно получить здесь, но, насколько я знаю, вы можете получить к ней доступ только в том случае, если вы являетесь членом FIX TC: Форум FIX TC

Эксперт FIX Ханно Кляйн предоставил следующую информацию:

Цитата из переработанной онлайн-спецификации относится к проводному формату любого экземпляра сообщения, закодированного в синтаксисе tagvalue. Это означает, что внутри проводного формата одиночной повторяющейся группы тег (поле) может появляться более одного раза.

FIXML не имеет этого ограничения:

Ограничение фактически ограничено кодировкой значения тега. Например, компонент сторон — это «Pty» для всех экземпляров в FIXML, синтаксисе/кодировке XML FIX. Это связано с тем, что синтаксис XML имеет однозначную структуру с четким путем к каждому вхождению компонента или поля. Имена XML должны быть уникальными только в пределах одного и того же элемента.

Значение тега:

Для значения тега синтаксический анализатор должен знать, когда начинается и заканчивается повторяющаяся группа. Поле NoXXX отмечает начальную точку, а поле, не входящее в группу, отмечает конечную точку. Нет явных разделителей для повторяющихся групп в значении тега, а компоненты (неповторяющиеся) вообще не видны в формате провода. Технически вы, вероятно, правы в том, что ценник может существовать в двух отдельных повторяющихся группах, не вызывая проблем с синтаксическим анализатором, но я не вижу преимущества в разрешении этого исключения из правила. Вы не можете разрешить это для двух соседних уровней, например. корень + уровень вложенности 1 или уровень вложенности x + уровень вложенности y.


Эта часть исходного ответа все еще применяется

С другой стороны, при определении собственных повторяющихся групп используйте обозначение NoXXX для повторяющихся групп, так как это официальная рекомендация. см. здесь, найдите поле NumInGroup

Рекомендуется, чтобы поля NumInGroup назывались NoXXX, например. NoContra Brokers(382).

Однако, следуя вашему примеру с 44/Price, вы обычно видите, что 566/LegPrice используется в качестве цены для отдельного этапа, поскольку они используются по-разному. Первая — это цена, используемая для исполнения ордера, вторая — при определении этапа стратегии.

Короче говоря, при определении структуры вашего сообщения и повторяющихся групп вы должны действительно подумать о том, является ли значение тега одинаковым для всех вхождений тега в сообщении и действительно ли имеет смысл использовать один и тот же тег. в теле и в повторяющихся группах. Ясность должна быть на первом месте.


неправильная (зачеркнутая) часть исходного ответа

Сначала я подумал, что этого нельзя допустить, но в основном потому, что я никогда не видел, чтобы это появлялось где-то в реальном сообщении. Но на самом деле я не смог найти причину, по которой это нельзя разрешить. В спецификации сказано только: см. здесь, ищите присутствие в поле

Тег (поле) должен появляться в сообщении не более одного раза, за исключением случаев, когда тег появляется в повторяющейся группе.

Тег (поле) должен появляться не более одного раза для каждого экземпляра повторяющейся группы.

person Christoph John    schedule 04.11.2020
comment
Итак... вывод такой.. Это разрешено стандартом, но есть неработающие реализации, которые вынуждают нас избегать использования хорошей фичи... :( Верно? - person kan; 05.11.2020
comment
@kan Я не согласен с Кристофом Джоном. Смотрите мой ответ в этом другом вопросе: stackoverflow.com/questions/56524842/ - person Ciaran McHale; 05.11.2020
comment
Разве вы не говорили, что это работает в QFJ? Однако я не вижу большого улучшения, которое это имело бы. - person Christoph John; 05.11.2020
comment
@CiaranMcHale спецификация, на которую я ссылаюсь, фактически заменяет спецификации FIX4.4 и 5.0, и я не могу найти упомянутый вами абзац в новейшей спецификации, на которую я ссылаюсь. Я не знаю, является ли обратный инжиниринг словарей данных правильным способом доказать вашу точку зрения. ;) - person Christoph John; 05.11.2020
comment
@Christoph John: По сути, последняя спецификация, на которую вы ссылаетесь, не соответствует более ранним спецификациям. Поскольку, по крайней мере, некоторые реализации FIX будут основаны на более строгих более ранних спецификациях, кажется разумным, чтобы кто-то, пишущий словарь данных, соблюдал эти более ограничительные более ранние спецификации, поскольку это обеспечит лучшую переносимость между реализациями FIX. - person Ciaran McHale; 06.11.2020
comment
@Christoph John: более внимательное прочтение новейшей спецификации, на которую вы ссылались, заставляет меня думать, что она просто плохо сформулирована, но соответствует более ранним спецификациям. В частности, в спецификации указано следующее (в дополнение к тому, что вы процитировали): Каждое поле однозначно идентифицируется целым числом, известным как тег. Теги должны быть уникальными как среди полей сообщения сеанса, так и среди полей сообщения приложения. (Поля в стандартных компонентах заголовка и стандартного трейлера являются общими для сеансовых и прикладных сообщений.) Соответствующая формулировка: Теги должны быть уникальными среди [...] полей сообщения. - person Ciaran McHale; 06.11.2020
comment
@CiaranMcHale на самом деле в документе говорится, что теги должны быть уникальными как среди полей сообщения сеанса, так и среди полей сообщения приложения, а теги с многоточием должны быть уникальными [...] среди полей сообщения. на мой взгляд не правильно. Реальное намерение состоит в том, чтобы запретить, чтобы тег одновременно определялся как часть тела, а также заголовок/трейлер. Говоря словами словаря данных: у вас не должно быть тега n в разделе <header>/<trailer>, а также в разделе <messages>. - person Christoph John; 06.11.2020
comment
Я думаю, мы можем согласиться с тем, что формулировка сбивает с толку. Однако если вы выполните поиск вхождений session в спецификации, вы увидите, что поле session = header/trailer не имеет предполагаемого значения. Скорее, сообщение session — это сообщение, в котором msgcat="admin", а сообщение application — это сообщение, в котором msgcat="app". Таким образом, я считаю, что мое использование многоточия правильно. - person Ciaran McHale; 06.11.2020
comment
Теги должны быть уникальными среди [...] полей сообщения. - звучит странно в контексте повторяющегося группового сценария. - person kan; 07.11.2020
comment
@CiaranMcHale хорошо, что я должен сказать. Спецификации постоянно заменяются и меняются, особенно в ИТ. Так что либо вы правы, и они забыли упомянуть об этом исключении в новой спецификации, либо я прав, и это действительно изменение, которое было сделано намеренно. В любом случае, я уточню это у FIX Trading Community и отчитаюсь. Кстати, голосование против, потому что вы не согласны с ответом, кажется мне немного странным, потому что мой ответ содержит ссылки на официальные спецификации и, как сообщил OP, он даже работает с QuickFIX/J. - person Christoph John; 07.11.2020
comment
@кан согласен. Формулировка ужасно запутанная/непоследовательная, и я с нетерпением жду разъяснений Кристофа Джона по этому поводу. - person Ciaran McHale; 07.11.2020
comment
@ Кристоф Джон, я понизил ваш ответ, потому что считаю его неверным. Если вы получите разъяснение от торгового сообщества FIX, которое поддерживает ваш ответ, обновите свой ответ соответствующей информацией, и я изменю свой отрицательный голос на положительный (при условии, что StackOverflow разрешает это). QuickFIX/J — лишь одна из многих реализаций FIX; Я знаю еще две реализации, с которыми словарь данных Кана не будет работать (одна из них представляет собой собственный механизм FIX, который генерирует неверный недопустимый код C++, а другая — еще не выпущенный компилятор словаря данных FIX, который я разработал). - person Ciaran McHale; 07.11.2020
comment
@CiaranMcHale, в конце концов я нашел время, чтобы обновить свой ответ. Оказалось, что вы были правы, и я неправильно понял абзац из документа спецификации значения тега. Тем не менее, я собрал некоторую информацию и надеюсь, что она, тем не менее, окажется полезной. - person Christoph John; 14.11.2020
comment
Спасибо за предоставление этого обновления. StackOverflow позволил мне изменить свой отрицательный голос на положительный. @kan Я предлагаю вам принять обновленный ответ Кристофа Джона, поскольку он содержит полезные рассуждения для объяснения ограничения и запутанной формулировки в спецификации. - person Ciaran McHale; 15.11.2020
comment
Спасибо @CiaranMcHale, очень ценю это. - person Christoph John; 16.11.2020

Нет, это не разрешено. Я предлагаю вам получить большой словарь данных с http://www.quickfixengine.org/, сохранить его в своем компьютер в формате XML, а затем выполните следующую команду:

grep Price FIX.xml | grep number

Это покажет вам определения всех полей, связанных с ценой. Если вы будете искать каждое из этих имен полей в сообщениях/компонентах, вы увидите, что каждое из них используется в другом месте. Общий результат заключается в том, что каждое поле отображается в сообщении только один раз.

person Ciaran McHale    schedule 03.11.2020
comment
Я спрашиваю о создании собственного словаря данных. Для этого я мог бы создать определяемое пользователем поле, например MyPrice. Итак, мой вопрос не конкретно о поле Price, а о дизайне протокола FIX и о том, какую структуру сообщения я мог бы иметь. - person kan; 03.11.2020
comment
@kan К сожалению, многие компиляторы словарей данных FIX выполняют неполную проверку достоверности, что означает, что если ваш словарь данных содержит ошибку, ошибка может быть не обнаружена. - person Ciaran McHale; 04.11.2020

Вы не можете повторно использовать тег повторяющейся группы вне повторяющейся группы.

Объявление тега повторяющимся групповым тегом накладывает на него ограничения, такие как его порядок в группе и то, как одно вхождение обрабатывается иначе, чем последующее вхождение. Неповторяющиеся групповые теги не имеют такого ограничения.

person user1717259    schedule 03.11.2020
comment
Я пробовал с QuickfixJ, и он отлично работает. Есть ли спецификация, которая запрещает это? Потому что с технической точки зрения сделать это не проблема. - person kan; 03.11.2020
comment
Вы только пытались создать такой словарь данных или также анализировать такие сообщения? - person Christoph John; 03.11.2020
comment
@ChristophJohn Да, я создал словарь, сгенерировал классы Java, создал сообщение FIX и проанализировал его. Это работало нормально для меня. - person kan; 05.11.2020