Sometimes fields of the same tag number can appear multiple times in the same message within a so-called repeating group.
The following diagram depicts a general structure of the repeating group in a FIX message:
Each repeating group starts from the field which identifies the number of repeating entries within a repeating group. Such a leading field must precede immediately the repeating group entries. In the referenced example, the leading field is defined by the NoRoutingIDs
tag.
Each entry of a repeating group has a selected leading field, which in turn identifies the beginning of a new group entry. This field must occur in the raw message before any other tag from a single repeating group entry. In other words, these fields separate repeating group entries from each other. The RoutingType
field is an example of such a separator.
Important aspects of FIX repeating groups structure:
OnixS C++ FIX Engine exposes the OnixS::FIX::Group class to encapsulate all aspects that are related to handling FIX repeating groups.
Since a repeating group is identified by the leading field, which defines the number of repeating instances, C++ FIX Engine follows this approach in handling repeating groups. In particular, the OnixS::FIX::Group object is accessed, using its leading (number of instances) field. Changing the value of this field affects the length of the repeating group. Removing this field from a message or other repeating group removes all entries of the repeating group.
To create a new repeating group or modify the number of instances, the OnixS::FIX::Message::setGroup method is available.
To obtain a reference to the OnixS::FIX::Group object, that represents an existing repeating group of the message, the OnixS::FIX::Message::getGroup method is available.
The OnixS::FIX::Group class works with fields, as well as with embedded repeating groups, in the same manner as the OnixS::FIX::Message class. The only difference in accessing field values is the availability of an additional parameter, which defines the index of the repeating group entry whose field is being accessed. The indexing entry starts from zero. Additionally, you can use the OnixS::FIX::Group::Iterator class to iterate over all group entries of a repeating group.
A group can also be traversed using range-based for loop:
To remove an entire repeating group together with its leading tag, the OnixS::FIX::FieldSet::erase method is exposed by OnixS::FIX::Message and the OnixS::FIX::Group class.
Due to the design of the FIX protocol, the FIX repeating group cannot be parsed properly without the additional information that describes its structure. This is a well-known feature/flaw of the FIX protocol - and is applicable to any software that parses FIX repeating groups. If the FIX destination you work with uses non-standard (custom) fields in the repeating group, then the FIX Engine needs the corresponding XML-based FIX Dialect description file. In a well-formed repeating group, the declared number of repeated instances (defined by the number of instances field) should be equal to the actual number of instances. By default, the FIX Engine reports an error if the incoming message does not meet this requirement. This behavior could be changed via the OnixS::FIX::EngineSettings::validateRepeatingGroupEntryCount setting.
By default, the FIX Engine does not check that each repeating group instance starts with the correct leading field. This behavior could be changed via the OnixS::FIX::EngineSettings::validateRepeatingGroupLeadingTag setting. It is also possible to detect the ill-formed repeating group using the OnixS::FIX::Message::validate method.