From 2334620c9040ae862dd828fc8d895f4a4e02230d Mon Sep 17 00:00:00 2001 From: mfey619 Date: Fri, 2 Sep 2022 13:53:57 +0200 Subject: [PATCH 1/3] Added ISO files and changes --- v2-0-RC3/doc/01Introduction.md | 74 ++++++++++++++++++++- v2-0-RC3/doc/02FieldEncoding.md | 32 +++++++++ v2-0-RC3/doc/03MessageStructure.md | 2 + v2-0-RC3/doc/ISOBiblio.md | 25 +++++++ v2-0-RC3/doc/ISOCopyright.md | 15 +++++ v2-0-RC3/doc/ISOForeword.md | 19 ++++++ v2-0-RC3/doc/ISOIntro.md | 9 +++ v2-0-RC3/doc/ISO_TechStd_Style_MASTER.docx | Bin 0 -> 43085 bytes v2-0-RC3/doc/SBE.sh | 10 +++ v2-0-RC3/doc/SBE_ISO.yaml | 9 +++ 10 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 v2-0-RC3/doc/ISOBiblio.md create mode 100644 v2-0-RC3/doc/ISOCopyright.md create mode 100644 v2-0-RC3/doc/ISOForeword.md create mode 100644 v2-0-RC3/doc/ISOIntro.md create mode 100644 v2-0-RC3/doc/ISO_TechStd_Style_MASTER.docx create mode 100644 v2-0-RC3/doc/SBE_ISO.yaml diff --git a/v2-0-RC3/doc/01Introduction.md b/v2-0-RC3/doc/01Introduction.md index 40f28d5..ede3b42 100644 --- a/v2-0-RC3/doc/01Introduction.md +++ b/v2-0-RC3/doc/01Introduction.md @@ -1,4 +1,74 @@ -# Introduction +# Scope + +This document provides the normative specification of Simple Binary Encoding (SBE), which is one of the possible syntaxes for FIX messages, but not limited to FIX messages. The scope comprises the encoding (wire format) and the message schema for SBE. + +# Normative references + +The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies. + +--- IETF RFC 2119 -- *Key words for use in RFCs to Indicate Requirement Levels* March 1997 + +# Terms and definitions + +For the purposes of this document, the terms and definitions given in ISO/IEC 11404 and the following apply. + +ISO and IEC maintain terminological databases for use in standardization at the following addresses: + +—-- ISO Online browsing platform: available at [https://www.iso.org/obp](https://www.iso.org/obp) + +—-- IEC Electropedia: available at [http://www.electropedia.org/](http://www.electropedia.org/) + + +## datatype +field type with its associated encoding attributes + +Note 1 to entry: Includes backing primitive types and valid values or range. Some types +have additional attributes, e.g. epoch of a date. + +## encoding +message format for interchange + +Note 1 to entry: The term is commonly used +to mean the conversion of one data format to another, such as text to +binary. However, SBE strives to use native binary +datatypes in order to make conversion unnecessary, or at least trivial. + +Note 2 to entry: Encoding also refers to the act of formatting a message, as opposed to decoding. + +## message schema +metadata that specifies messages and their data types and identifiers + +Note 1 to entry: Message schemas may be disseminated out of band. + +Note 2 to entry: For SBE, message schemas are expressed as an XML +document that conforms to an XML schema that is published as part of this standard. + +## message template +metadata that specifies the fields that belong to one particular message type + +Note 1 to entry: A message template is contained by a +message schema. + +## session protocol +protocol concerned with the reliable delivery of messages over a transport. + +Note 1 to entry: FIX makes a distinction between +session protocol and the encoding of a message payload, as described by +this document. See the [specifications section](https://www.fixtrading.org/standards/) of the FIX Protocol web site +for supported session protocols and encodings. + +## XML schema +defines the elements and attributes that may appear in an XML document. + +Note 1 to entry: The SBE message schema is defined in W3C (XSD) schema +language since it is the most widely adopted format for XML schemas. + +## Specification terms +These key words in this document are to be interpreted as described in IETF RFC 2119. + +# Objectives + +## General FIX Simple Binary Encoding (SBE) targets high performance trading systems. It is optimized for low latency of encoding and decoding while @@ -94,6 +164,8 @@ language since it is the most widely adopted format for XML schemas. ## Documentation +### General + This document explains: - The binary type system for field encoding diff --git a/v2-0-RC3/doc/02FieldEncoding.md b/v2-0-RC3/doc/02FieldEncoding.md index ddcebd1..e2ed462 100644 --- a/v2-0-RC3/doc/02FieldEncoding.md +++ b/v2-0-RC3/doc/02FieldEncoding.md @@ -2,6 +2,8 @@ ## Field aspects +### General + A field is a unit of data contained by a FIX message. Every field has the following aspects: semantic data type, encoding, and metadata. They will be specified in more detail in the sections on data type encoding @@ -124,6 +126,8 @@ references are derived. ## Common field schema attributes +### General + Schema attributes alter the range of valid values for a field. Attributes are optional unless specified otherwise. @@ -145,6 +149,8 @@ FIX data types. In that case, the fields that use the encoding will not have a ` ## Integer encoding +### General + Integer encodings should be used for cardinal or ordinal number fields. Signed integers are encoded in a two's complement binary format. @@ -267,6 +273,8 @@ Wire format of uint32 null value 2^32^ - 1 ## Decimal encoding +### General + Decimal encodings should be used for prices and related monetary data types like PriceOffset and Amt. @@ -276,6 +284,8 @@ is appropriate to the application or market. ### Composite encodings +#### General + Prices are encoded as a scaled decimal, consisting of a signed integer mantissa and signed exponent. For example, a mantissa of 123456 and exponent of -4 represents the decimal number 12.3456. @@ -409,6 +419,8 @@ Schema attribute exponent = -2 ## Float encoding +### General + Binary floating point encodings are compatible with IEEE Standard for Floating-Point Arithmetic (IEEE 754-2008). They should be used for floating point numeric fields that do not represent prices or monetary @@ -475,6 +487,8 @@ Wire format of double 255.678 ## String encodings +### General + Character data may either be of fixed size or variable size. In Simple Binary Encoding, fixed-length fields are recommended in order to support direct access to data. Variable-length encoding should be reserved for @@ -483,6 +497,8 @@ also be used for multi-byte encodings. ### Character +#### General + Character fields hold a single character of a single-byte character set. They are most commonly used for fields with character code enumerations. See section [*Enumeration encoding*](#enumeration-encoding) below for discussion of enum fields. @@ -534,6 +550,8 @@ Wire format of char encoding of "A" (value 65, hexadecimal 41) ### Fixed-length character array +#### General + Character arrays are allocated a fixed space in a message, supporting direct access to fields. A fixed size character array is distinguished from a variable length string by the presence of a length schema @@ -667,6 +685,8 @@ M S F T ## Data encodings +### General + Raw data is opaque to SBE. In other words, it is not constrained by any value range or structure known to the messaging layer other than length. Data fields simply convey arrays of octets. @@ -679,6 +699,8 @@ is not known until run-time. ### Fixed-length data +#### General + Data arrays are allocated as a fixed space in a message, supporting direct access to fields. A fixed size array is distinguished from a variable length data by the presence of a length schema attribute rather @@ -775,6 +797,8 @@ M S F T ## MonthYear encoding +### General + MonthYear encoding contains four members representing respectively year, month, and optionally day or week. A field of this type is not constrained to one date format. One message may contain only year and @@ -831,6 +855,8 @@ Wire format of MonthYear 2014 June week 3 as hexadecimal ## Date and time encoding +### General + Dates and times represent Coordinated Universal Time (UTC). This is the preferred date/time format, except where regulations require local time with time zone to be reported (see time zone encoding below). @@ -980,6 +1006,8 @@ The standard encoding specification for LocalMktDate ## Local time encoding +### General + Time with time zone encoding should only be used when required by market regulations. Otherwise, use UTC time encoding (see above). @@ -1065,6 +1093,8 @@ Wire format of TZTimeOnly 8:30 with Chicago time zone offset (-6:00) ## Enumeration encoding +### General + An enumeration conveys a single choice of mutually exclusive valid values. @@ -1208,6 +1238,8 @@ Wire format of null Boolean (or N/A) value as hexadecimal ## Multi-value choice encoding +### General + A multi-value field conveys a choice of zero or more non-exclusive valid values. ### Primitive type encodings diff --git a/v2-0-RC3/doc/03MessageStructure.md b/v2-0-RC3/doc/03MessageStructure.md index 1c7db9a..a00276c 100644 --- a/v2-0-RC3/doc/03MessageStructure.md +++ b/v2-0-RC3/doc/03MessageStructure.md @@ -2,6 +2,8 @@ ## Message Framing +### General + SBE messages have no defined message delimiter. SBE makes it possible to walk the elements of a message to determine its limit, even when the message has been extended. Nevertheless, since internal framing depends on a correct starting point and not encountering malformed messages, it may be desirable to use an external framing protocol when used with transports that do not preserve message boundaries, such as when they are transmitted on a streaming session protocol or when persisting messages in storage. diff --git a/v2-0-RC3/doc/ISOBiblio.md b/v2-0-RC3/doc/ISOBiblio.md new file mode 100644 index 0000000..712215f --- /dev/null +++ b/v2-0-RC3/doc/ISOBiblio.md @@ -0,0 +1,25 @@ +::: {custom-style="Annex"} +**Bibliography** +::: + +[1] Simple Open Framing Header (SOFH) Draft Standard v1.0, *Message framing standard for FIX messages* [https://www.fixtrading.org/standards/fix-sofh/](https://www.fixtrading.org/standards/fix-sofh/) + +[2] FIX Latest, *Normative specification of the FIX Protocol* [https://www.fixtrading.org/online-specification/](https://www.fixtrading.org/online-specification/) + +[3] IEEE 754, *IEEE Standard for Binary Floating-Point Arithmetic* [https://ieeexplore.ieee.org/document/8766229](https://ieeexplore.ieee.org/document/8766229) + +[4] ISO 639-1, *Codes for the representation of names of languages — Part 1: Alpha-2 code* [https://www.iso.org/standard/22109.html](https://www.iso.org/standard/22109.html) + +[5] ISO 3166-1, *Codes for the representation of names of countries and their subdivisions — Part 1: Country codes* [https://www.iso.org/standard/63545.html](https://www.iso.org/standard/63545.html) + +[6] ISO 4217, *Codes for the representation of currencies and funds* [https://www.iso.org/standard/64758.html](https://www.iso.org/standard/64758.html) + +[7] ISO 8601, *Data elements and interchange formats - Information interchange — Representation of dates and times* [https://www.iso.org/standard/40874.html](https://www.iso.org/standard/40874.html) + +[8] ISO 10383, *Securities and related financial instruments — Codes for exchanges and market identification (MIC)* [https://www.iso.org/standard/61067.html](https://www.iso.org/standard/61067.html) + +[9] ISO/IEC 11404, *Information technology — General-Purpose Datatypes (GPD)* [https://www.iso.org/standard/39479.html](https://www.iso.org/standard/39479.html) + +[10] W3C XML Schema, *XML 1.1 schema standards* [http://www.w3.org/XML/Schema.html#dev](http://www.w3.org/XML/Schema.html#dev) + +[11] IETF RFC 2119, *Keywords for use in RFCs to Indicate Requirement Levels March 1997* [https://datatracker.ietf.org/doc/html/rfc2119](https://datatracker.ietf.org/doc/html/rfc2119) diff --git a/v2-0-RC3/doc/ISOCopyright.md b/v2-0-RC3/doc/ISOCopyright.md new file mode 100644 index 0000000..5be0485 --- /dev/null +++ b/v2-0-RC3/doc/ISOCopyright.md @@ -0,0 +1,15 @@ +::: {custom-style="TextBox"} +© ISO 2022\ +\ +All rights reserved. Unless otherwise specified, or required in the context of its implementation, no part of this publication may be reproduced or utilized otherwise in any form or by any means, electronic or mechanical, including photocopying, or posting on the internet or an intranet, without prior written permission. Permission can be requested from either ISO at the address below or ISO’s member body in the country of the requester.\ +\ +        ISO copyright office\ +        CP 401 • Ch. de Blandonnet 8\ +        CH-1214 Vernier, Geneva\ +        Phone: +41 22 749 01 11\ +        Fax: +41 22 749 09 47\ +        Email: copyright@iso.org\ +        Website: www.iso.org\ +\ +Published in Switzerland +::: diff --git a/v2-0-RC3/doc/ISOForeword.md b/v2-0-RC3/doc/ISOForeword.md new file mode 100644 index 0000000..6d100b4 --- /dev/null +++ b/v2-0-RC3/doc/ISOForeword.md @@ -0,0 +1,19 @@ +::: {custom-style="NewPageWithTOC"} +**Foreword** +::: + +ISO (the International Organization for Standardization) is a worldwide federation of national standards bodies (ISO member bodies). The work of preparing International Standards is normally carried out through ISO technical committees. Each member body interested in a subject for which a technical committee has been established has the right to be represented on that committee. International organizations, governmental and non-governmental, in liaison with ISO, also take part in the work. ISO collaborates closely with the International Electrotechnical Commission (IEC) on all matters of electrotechnical standardization. + +The procedures used to develop this document and those intended for its further maintenance are described in the ISO/IEC Directives, Part 1. In particular the different approval criteria needed for the different types of ISO documents should be noted. This document was drafted in accordance with the editorial rules of the ISO/IEC Directives, Part 2 (see [www.iso.org/directives](www.iso.org/directives)). + +Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. ISO shall not be held responsible for identifying any or all such patent rights. Details of any patent rights identified during the development of the document will be in the Introduction and/or on the ISO list of patent declarations received (see [www.iso.org/patents](www.iso.org/patents)). + +Any trade name used in this document is information given for the convenience of users and does not constitute an endorsement. + +For an explanation on the voluntary nature of standards, the meaning of ISO specific terms and expressions related to conformity assessment, as well as information about ISO's adherence to the World Trade Organization (WTO) principles in the Technical Barriers to Trade (TBT) see the following URL: [www.iso.org/iso/foreword.html](www.iso.org/iso/foreword.html). + +This document was prepared by Technical Committee ISO/TC 68, *Financial Services*, Subcommittee SC 9, *Information Exchange* + +A list of all parts in the ISO ##### series can be found on the ISO website. + +Any feedback or questions on this document should be directed to the user’s national standards body. A complete listing of these bodies can be found at [www.iso.org/members.html](www.iso.org/members.html). diff --git a/v2-0-RC3/doc/ISOIntro.md b/v2-0-RC3/doc/ISOIntro.md new file mode 100644 index 0000000..b46e934 --- /dev/null +++ b/v2-0-RC3/doc/ISOIntro.md @@ -0,0 +1,9 @@ +::: {custom-style="NewPageWithTOC"} +Introduction +::: + +The Financial Information eXchange Simple Binary Encoding (SBE) targets high performance trading systems. It is optimized for low latency of encoding and decoding while keeping bandwidth utilization reasonably small. For compatibility, it is intended to represent all FIX semantics. SBE is primarily a fixed length wire format but also supports variable length fields and repeating groups with fixed length entries. The wire format does not contain any meta-data other than length information for variable elements. The meta-data is a message schema provided out-of-band as an XML Schema Definition (XSD) file. + +::: {custom-style="NewPage"} +**Financial Services -- Financial Information eXchange -- Simple Binary Encoding** +::: diff --git a/v2-0-RC3/doc/ISO_TechStd_Style_MASTER.docx b/v2-0-RC3/doc/ISO_TechStd_Style_MASTER.docx new file mode 100644 index 0000000000000000000000000000000000000000..ec57d588dc4e9ef1202fbaed11ae02f48cc11042 GIT binary patch literal 43085 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 literal 0 HcmV?d00001 diff --git a/v2-0-RC3/doc/SBE.sh b/v2-0-RC3/doc/SBE.sh index bac68c5..4f6c6be 100755 --- a/v2-0-RC3/doc/SBE.sh +++ b/v2-0-RC3/doc/SBE.sh @@ -16,6 +16,16 @@ WPFOLDER="/wp-content/uploads/2020/03/" pandoc "$DISCLAIMER" $FILES -o "$TARGET/docx/Simple-Binary-Encoding-v2-RC3.docx" --reference-doc="$STYLE" --metadata-file="$YAML" --toc --toc-depth=4 echo SBE document version created +# Create ISO document version with copyright etc. +ISOYAML="$SOURCE/SBE_ISO.yaml" +ISOSTYLE="ISO_TechStd_Style_MASTER.docx" +ISOCOPYRIGHT="ISOCopyright.md" +ISOFOREWORD="ISOForeword.md" +ISOINTRO="ISOIntro.md" +ISOBIBLIO="ISOBiblio.md" +pandoc "$ISOCOPYRIGHT" "$ISOFOREWORD" "$ISOINTRO" $FILES "$ISOBIBLIO" -o "$TARGET/docx/ISOSimple_Binary_Encoding.docx" --reference-doc="$ISOSTYLE" --metadata-file="$ISOYAML" --filter pandoc-plantuml --toc --toc-depth=3 +echo SBE document version created for ISO + # Create base online version without disclaimer pandoc $FILES -o "$TARGET/debug/SBEONLINE.html" -s --metadata-file="$YAML" --toc --toc-depth=2 diff --git a/v2-0-RC3/doc/SBE_ISO.yaml b/v2-0-RC3/doc/SBE_ISO.yaml new file mode 100644 index 0000000..143b7a4 --- /dev/null +++ b/v2-0-RC3/doc/SBE_ISO.yaml @@ -0,0 +1,9 @@ +--- +title: "Financial Services -- Financial Information eXchange -- Simple Binary Encoding" +subtitle: "DIS stage" +author: +- "\x0D" +- Warning for WDs and CDs +- This document is not an ISO International Standard. It is distributed for review and comment. It is subject to change without notice and may not be referred to as an International Standard. +- Recipients of this draft are invited to submit, with their comments, notification of any relevant patent rights of which they are aware and to provide supporting documentation. +--- From 979034b972f0120b0a24ec1f1f8683b575ebc727 Mon Sep 17 00:00:00 2001 From: mfey619 Date: Wed, 21 Sep 2022 15:18:05 +0200 Subject: [PATCH 2/3] Changes to align with v1.0 Added more General chapters and changed some typos --- v2-0-RC3/doc/01Introduction.md | 114 +-------------------- v2-0-RC3/doc/02FieldEncoding.md | 100 +++++++++--------- v2-0-RC3/doc/03MessageStructure.md | 18 +++- v2-0-RC3/doc/04MessageSchema.md | 36 +++++-- v2-0-RC3/doc/05SchemaExtensionMechanism.md | 6 +- v2-0-RC3/doc/07Examples.md | 2 + 6 files changed, 102 insertions(+), 174 deletions(-) diff --git a/v2-0-RC3/doc/01Introduction.md b/v2-0-RC3/doc/01Introduction.md index ede3b42..d42420e 100644 --- a/v2-0-RC3/doc/01Introduction.md +++ b/v2-0-RC3/doc/01Introduction.md @@ -70,7 +70,7 @@ These key words in this document are to be interpreted as described in IETF RFC ## General -FIX Simple Binary Encoding (SBE) targets high performance trading +SBE targets high performance trading systems. It is optimized for low latency of encoding and decoding while keeping bandwidth utilization reasonably small. For compatibility, it is intended to represent all FIX semantics. @@ -80,7 +80,7 @@ Thus, it provides a standard for interoperability between communicating parties. Users are free to implement the standard in a way that best suits their needs. Implementers may use the most appropriate techniques and idioms of programming languages to access data off the wire and manipulate it in applications. -The encoding standard is complimentary to other FIX standards for +The encoding standard is complementary to other FIX standards for session protocol and application level behavior. ## Binary type system @@ -88,7 +88,7 @@ session protocol and application level behavior. In order to support traditional FIX semantics, all the documented field types are supported. However, instead of printable character representations of tag-value encoding, the type system binds to native -binary data types, and defines derived types as needed. +binary datatypes, and defines derived types as needed. The binary type system has been enhanced in these ways: @@ -107,7 +107,7 @@ The binary type system has been enhanced in these ways: The message design strives for direct data access without complex transformations or conditional logic. This is achieved by: -- Usage of native binary data types and simple types derived from +- Usage of native binary datatypes and simple types derived from native binaries, such as prices and timestamps. - Preference for fixed positions and fixed length fields, supporting @@ -126,42 +126,6 @@ such as constant values. Message schemas may be based on standard FIX message specifications or may be customized as needed by agreement between counterparties. -## Glossary - -**Character set** - A mapping between a sequence of octets and a sequence of characters. - -**Data type** - A field type with its associated encoding attributes, -including backing primitive types and valid values or range. Some types -have additional attributes, e.g. epoch of a date. - -**Encoding** - a message format for interchange. The term is commonly used -to mean the conversion of one data format to another, such as text to -binary. However, Simple Binary Encoding strives to use native binary -data types in order to make conversion unnecessary, or at least trivial. -Encoding also refers to the act of formatting a message, as opposed to -decoding. - -**Message schema** - metadata that specifies messages and their data -types and identifiers. Message schemas may be disseminated out of band. -For Simple Binary Encoding, message schemas are expressed as an XML -document that conforms to an XML schema that is published as part of -this standard. - -**Message template** - metadata that specifies the fields that belong to -one particular message type. A message template is contained by a -message schema. - -**Session protocol** - a protocol concerned with the reliable delivery of -messages over a transport. FIX protocol makes a distinction between -session protocol and the encoding of a message payload, as described by -this document. See the [specifications section](https://www.fixtrading.org/standards/) of the FIX protocol web site -for supported protocols. The original FIX session protocol is known as -FIXT. - -**XML schema** - defines the elements and attributes that may appear in an -XML document. The SBE message schema is defined in W3C (XSD) schema -language since it is the most widely adopted format for XML schemas. - ## Documentation ### General @@ -174,28 +138,7 @@ This document explains: and relationship to a message header that may be provided by a session protocol. -- The Simple Binary Encoding message schema. - -### Specification terms - -These key words in this document are to be interpreted as described in -[Internet Engineering Task Force RFC2119](http://www.apps.ietf.org/rfc/rfc2119.html). These terms indicate -an absolute requirement for implementations of the standard: "**must**", -or "**required**". - -This term indicates an absolute prohibition: "**must not**". - -These terms indicate that a feature is allowed by the standard but not -required: "**may**", "**optional**". An implementation that does not -provide an optional feature must be prepared to interoperate with one -that does. - -These terms give guidance, recommendation or best practices: -"**should**" or "**recommended**". A recommended choice among -alternatives is described as "**preferred**". - -These terms give guidance that a practice is not recommended: "**should not**" -or "**not recommended**". +- The SBE message schema. ### Document format @@ -212,50 +155,3 @@ This is sample data as it would be transmitted on the wire `10270000` -## References - -### Related FIX Standards - -[Simple Open Framing Header](https://www.fixtrading.org/standards/fix-sofh/) -FIX Protocol, Limited. Version 1.0 Draft Standard - -[FIX Latest](https://www.fixtrading.org/online-specification/) -Normative specification of the application layer of the FIX Protocol. - -### Dependencies on other standards - -SBE is dependent on several industry standards. Implementations must -conform to these standards to interoperate. Therefore, they are -normative for SBE. - -[IEEE 754-2008](http://ieeexplore.ieee.org/servlet/opac?punumber=4610933) A -Standard for Binary Floating-Point Arithmetic - -[IETF RFC 2978](https://tools.ietf.org/html/rfc2978) -IANA Charset Registration Procedures. See [Character Sets](https://www.iana.org/assignments/character-sets/character-sets.xml) - -[ISO 639-1:2002](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=22109) -Codes for the representation of names of languages - Part 1: Alpha-2 -code - -[ISO 3166-1:2013](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=63545) -Codes for the representation of names of countries and their -subdivisions - Part 1: Country codes - -[ISO 4217:2015](https://www.iso.org/standard/64758.html) -Codes for the representation of currencies and funds - -[ISO 8601:2004](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=40874) -Data elements and interchange formats - Information interchange - -Representation of dates and times - -[ISO/IEC 8859-1:1998](https://www.iso.org/standard/28245.html) -8-bit single-byte coded graphic character sets -- Part 1: Latin alphabet No. 1 - -[ISO 10383:2012](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=61067) -Securities and related financial instruments - Codes for exchanges and -market identification (MIC) - -*W3C XML Schema version 1.0* [Part 1](https://www.w3.org/TR/xmlschema-1/) [Part 2](https://www.w3.org/TR/xmlschema-2/) - -[W3C XML Inclusions (XInclude) Version 1.0](https://www.w3.org/TR/xinclude/) diff --git a/v2-0-RC3/doc/02FieldEncoding.md b/v2-0-RC3/doc/02FieldEncoding.md index e2ed462..9a84c99 100644 --- a/v2-0-RC3/doc/02FieldEncoding.md +++ b/v2-0-RC3/doc/02FieldEncoding.md @@ -5,15 +5,15 @@ ### General A field is a unit of data contained by a FIX message. Every field has -the following aspects: semantic data type, encoding, and metadata. They -will be specified in more detail in the sections on data type encoding +the following aspects: semantic datatype, encoding, and metadata. They +will be specified in more detail in the sections on datatype encoding and message schema but are introduced here as an overview. -### Semantic data type +### Semantic datatype -The FIX semantic data type of a field tells a data domain interpreted at the application layer, for example, whether it is numeric or character data, or whether it represents a time or price. Simple Binary Encoding represents most of -the semantic data types that FIX protocol has defined across all -encodings. In field specifications, FIX data type is declared with +The FIX semantic datatype of a field tells a data domain interpreted at the application layer, for example, whether it is numeric or character data, or whether it represents a time or price. Simple Binary Encoding represents all of +the semantic datatypes that FIX protocol has defined across all +encodings. In message specifications, FIX datatype is declared with attribute `semanticType`. See the section [*Data type summary*](#data-type-summary) below for a listing of FIX types with the usual mapping to SBE encodings. Implementations should not restrict a semantic type to a specific encoding. Message designers may wish to imply a conversion or specialized interpretation at the application layer. @@ -22,13 +22,13 @@ See the section [*Data type summary*](#data-type-summary) below for a listing of Encoding tells how a data element is encoded on the wire. Encoding belongs strictly to the presentation layer. It is context-free and carries no business semantics. -An encoding maps a FIX data type to either a simple, primitive +An encoding maps a FIX datatype to either a simple, primitive data type, such as a 32 bit signed integer, or to a composite type. A composite type is composed of two or more simple primitive types. For -example, the FIX data type Price is encoded as a decimal, a composite +example, the FIX datatype Price is encoded as a decimal, a composite type containing a mantissa and an exponent. Note that many fields may -share a data type and an encoding. The sections that follow explain the -valid encodings for each data type. +share a datatype and an encoding. The sections that follow explain the +valid encodings for each datatype. ### Metadata @@ -41,7 +41,7 @@ application developers. Elements of field metadata are: - Field name, as it is known in FIX specifications -- The FIX semantic data type and encoding type that it maps to +- The FIX semantic datatype and encoding type that it maps to - Valid values or data range accepted @@ -60,7 +60,7 @@ See section [*Message Schema*](#message-schema-1) below for a detailed message s By default, fields are assumed to be required in a message. However, fields may be specified as optional. To indicate that a value is not set, a special null indicator value is sent on the wire. The null value -varies according to data type and encoding. Global defaults for null +varies according to datatype and encoding. Global defaults for null value may be overridden in a message schema by explicitly specifying the value that indicates nullness. @@ -138,9 +138,9 @@ Attributes are optional unless specified otherwise. | presence=constant | The field has a constant value that need not be transmitted on the wire. Mutually exclusive with nullValue, minValue, and maxValue attributes. | | presence=optional | The field need not be populated. A special null value indicates that a field is not set. The presence attribute may be specified on either on a field or its encoding. | | nullValue | A special value that indicates that an optional value is not set. See encodings below for default nullValue for each type. Mutually exclusive with presence=required and constant. | -| minValue | The lowest valid value of a range. Applies to scalar data types, but not to String or data types. | -| maxValue | The highest valid value of a range (inclusive unless specified otherwise). Applies to scalar data types, but not to String or data types. | -| semanticType | Tells the semantic interpretation of a field in the FIX data type taxonomy. | +| minValue | The lowest valid value of a range. Applies to scalar datatypes, but not to String or datatypes. | +| maxValue | The highest valid value of a range (inclusive unless specified otherwise). Applies to scalar datatypes, but not to String or datatypes. | +| semanticType | Tells the semantic interpretation of a field in the FIX datatype taxonomy. | ### Non-FIX types @@ -156,9 +156,9 @@ Signed integers are encoded in a two's complement binary format. ### Primitive type encodings -Numeric data types may be specified by range and signed or unsigned +Numeric datatypes may be specified by range and signed or unsigned attribute. Integer types are intended to convey common platform -primitive data types as they reside in memory. An integer type should be +primitive datatypes as they reside in memory. An integer type should be selected to hold the maximum range of values that a field is expected to hold. @@ -175,7 +175,7 @@ hold. ### Range attributes for integer fields -The default data ranges and null indicator are listed below for each +The default data range and null indicator are listed below for each integer encoding. A message schema may optionally specify a more restricted range of valid @@ -201,7 +201,7 @@ components, is specified globally in a message schema. Little-Endian order is the default encoding, meaning that the least significant byte is serialized first on the wire. -See section [*Message Schema*](#message-schema-1) for specification of message schema attributes, +See section [*Message Schema*](#message-schema-1) for specification of Message schema attributes, including byteOrder. Message schema designers should specify the byte order most appropriate to their system architecture and that of their counterparties. @@ -307,9 +307,9 @@ fixed-point decimal specifies a fixed exponent in a message schema. A constant negative exponent specifies a number of assumed decimal places to the right of the decimal point. -Implementations should support both 32 bit and 64 bit mantissa. The +Implementations should support both 32-bit and 64-bit mantissa. The usage depends on the data range that must be represented for a -particular application. It is expected that an 8 bit exponent should be +particular application. It is expected that an 8-bit exponent should be sufficient for all FIX uses. | Encoding type | Description | Backing primitives | Length (octets) | @@ -381,7 +381,7 @@ encoding. See section [*Message Schema*](#message-schema-1) below. Examples show encoded bytes on the wire as hexadecimal digits, little-endian. -FIX Qty data type is a float type, but a decimal may be constrained to +FIX Qty datatype is a float type, but a decimal may be constrained to integer values by setting exponent to zero. ```xml @@ -422,7 +422,7 @@ Schema attribute exponent = -2 ### General Binary floating point encodings are compatible with IEEE Standard for -Floating-Point Arithmetic (IEEE 754-2008). They should be used for +Floating-Point Arithmetic (IEEE 754-2019). They should be used for floating point numeric fields that do not represent prices or monetary amounts. Examples include interest rates, volatility and dimensionless quantities such as ratios. On the other hand, decimal prices should be @@ -431,10 +431,10 @@ encoded as decimals; see section [*Decimal encoding*](#decimal-encoding) above. ### Primitive types Both single and double precision encodings are supported as primitive -data types. See the IEEE 754-2008 standard for ranges and details of the +datatypes. See the IEEE 754-2019 standard for ranges and details of the encodings. -| Primitive type | Description | IEEE 754-2008 format | Length (octets) | +| Primitive type | Description | IEEE 754-2019 format | Length (octets) | |----------------|---------------------------------|----------------------|----------------:| | float | Single precision floating point | binary32 | 4 | | double | Double precision floating point | binary64 | 8 | @@ -449,7 +449,7 @@ encoding. Technically, it indicated by the so-called quiet NaN. Like integer encodings, floating point encodings follow the byte order specified by message schema. See section [*Message Schema*](#message-schema-1) for specification of -message schema attributes, including byteOrder. +Message schema attributes, including byteOrder. ### Float encoding specifications @@ -503,7 +503,7 @@ Character fields hold a single character of a single-byte character set. They ar for fields with character code enumerations. See section [*Enumeration encoding*](#enumeration-encoding) below for discussion of enum fields. -| FIX data type | Description | Backing primitive | Length (octet) | +| FIX datatype | Description | Backing primitive | Length (octet) | |---------------|--------------------|-------------------|---------------:| | char | A single character | char | 1 | @@ -557,9 +557,9 @@ direct access to fields. A fixed size character array is distinguished from a variable length string by the presence of a length schema attribute or a constant attribute. -| FIX data type | Description | Backing primitives | Length (octets) | Required schema attribute | +| FIX datatype | Description | Backing primitives | Length (octets) | Required schema attribute | |---------------|-----------------|-----------------------------------------------------------------------------------------------------------------------------|-------------------------------|--------------------------------------------------------------------| -| String | character array | Array of char of specified length, padded by NUL character if a string is shorter than the length specified for a field. | Specified by length attribute | length | +| String | character array | Array of char of specified length, padded by NUL character if a string is shorter than the length specified for a field. | Specified by length attribute | length (except may be inferred from a constant value, if present) | A length attribute set to zero indicates variable length. See section [*Variable-length string*](#variable-length-string-encoding). @@ -620,7 +620,7 @@ is made at an encoding layer between an empty string and a null string. Semantics of an empty variable-length string should be specified at an application layer. -| FIX data type | Description | Backing primitives | Length (octets) | +| FIX datatype | Description | Backing primitives | Length (octets) | |---------------|---------------------------------------|----------------------------------------------------------------------------------------------------------------------------|-----------------| | Length | The length of variable data in octets | primitiveType="uint8" or "uint16" May not hold null value. | 1 or 2 | | data | Raw data | Array of octet of size specified in associated Length field. The data field itself should be specified as variable length. primitiveType="uint8" length="0" indicates variable length | variable | @@ -693,7 +693,7 @@ Data fields simply convey arrays of octets. Data may either be of fixed-length or variable-length. In Simple Binary Encoding, fixed-length data encoding may be used for data of -predetermined length, even though it does not represent a FIX data type. +predetermined length, even though it does not represent a FIX datatype. Variable-length encoding should be reserved for raw data when its length is not known until run-time. @@ -706,7 +706,7 @@ direct access to fields. A fixed size array is distinguished from a variable length data by the presence of a length schema attribute rather than sending length on the wire. -| FIX data type | Description | Backing primitives | Length (octets) | Required schema attribute | +| FIX datatype | Description | Backing primitives | Length (octets) | Required schema attribute | |---------------|-------------|-------------------------------------|-------------------------------|---------------------------| | data | octet array | Array of uint8 of specified length. | Specified by length attribute | length | @@ -741,7 +741,7 @@ case, no space is reserved for the data. Semantics of an empty variable-length data element should be specified at an application layer. -| FIX data type | Description | Backing primitives | Length (octets) | +| FIX datatype | Description | Backing primitives | Length (octets) | |---------------|---------------------------------------|----------------------------------------------------------------------------------------------------------------------------|-----------------| | Length | The length of variable data in octets | primitiveType="uint8" or "uint16" May not hold null value. | 1 or 2 | | data | Raw data | Array of octet of size specified in associated Length member. The varData member should be specified as variable length. primitiveType="uint8" | variable @@ -826,7 +826,7 @@ elements within the composite encoding. See section [*Element offset within a co ### Encoding specifications for MonthYear -MonthYear data type is based on a composite encoding that carries its +MonthYear datatype is based on a composite encoding that carries its required and optional elements. The members must listed with the names and in the order shown. The standard encoding specification for MonthYear @@ -879,7 +879,7 @@ the other hand, if all timestamps have the same precision, then time unit may be set to a constant in the message schema. Then it need not be sent on the wire. -| FIX data type | Description | Backing primitives | Length (octets) | Schema attributes | +| FIX datatype | Description | Backing primitives | Length (octets) | Schema attributes | |---------------|--------------------------------------------------------------------------|--------------------|----------------:|------------------------| | UTCTimestamp | UTC date/time Default: nanoseconds since Unix epoch Range Jan. 1, 1970 - July 21, 2554 | uint64 time | 8 | epoch=”unix” (default) | | | | | | timeUnit = second or millisecond or microsecond or nanosecond May be constant | uint8 unit | 1 | | @@ -994,7 +994,7 @@ Wire format of UTCDateOnly Local date is encoded the same as UTCDateOnly, but it represents local time at the market instead of UTC time. -| FIX data type | Description | Backing primitives | Length (octets) | Schema attributes | +| FIX datatype | Description | Backing primitives | Length (octets) | Schema attributes | |---------------|-------------------------------------------------------------------------------|--------------------|----------------:|------------------------------------| | LocalMktDate | Local calendar date Default: days since Unix epoch. Range: Jan. 1, 1970 - June 7, 2149 local time | uint16 | 2 | epoch=”unix” (default) @@ -1019,7 +1019,7 @@ format ±hhmm. A binary UTCTimestamp followed by a number representing the time zone indicator as defined in ISO 8601:2004. -| FIX data type | Description | Backing primitives | Length (octets) | Schema attributes | +| FIX datatype | Description | Backing primitives | Length (octets) | Schema attributes | |---------------|--------------------------------------------------------------------------|--------------------|----------------:|------------------------------------| | TZTimestamp | date/time with timezone Default: nanoseconds since Unix epoch Range Jan. 1, 1970 - July 21, 2554 | uint64 | 8 | epoch=”unix” (default) Represents Jan. 1, 1970 local time | | | timeUnit = second or millisecond or microsecond or nanosecond May be constant | uint8 | 1 | | @@ -1047,7 +1047,7 @@ Standard TZTimestamp encoding specification ``` Wire format of TZTimestamp 8:30 17 September 2013 with Chicago time zone -offset (-6:00) +offset (-6:00) and nanosecond timeunit `0050d489fea22413fa00` @@ -1060,7 +1060,7 @@ The time zone hour offset tells the number of hours different to UTC time. The time zone minute tells the number of minutes different to UTC. The sign telling ahead or behind UTC is on the hour member. -| FIX data type | Description | Backing primitives | Length (octets) | Schema attributes | +| FIX datatype | Description | Backing primitives | Length (octets) | Schema attributes | |---------------|------------------------------------------------------------|--------------------|----------------:|-------------------| | TZTimeOnly | Time of day only with time zone Default: nanoseconds since midnight today, local time | uint64 | 8 | None | | | timeUnit = second or millisecond or microsecond or nanosecond May be constant | uint8 | 1 | None | @@ -1112,15 +1112,15 @@ allow more choices. ### Value encoding -If a field is of FIX data type char, then its valid values are +If a field is of FIX datatype char, then its valid values are restricted to single-byte printable characters. See section [*Character encoding*](#character) above. -If the field is of FIX data type int, then a primitive integer data type +If the field is of FIX datatype int, then a primitive integer datatype should be selected that can contain the number of choices. For most -cases, an 8 bit integer will be sufficient, allowing 255 possible +cases, an 8-bit integer will be sufficient, allowing 255 possible values. -Enumerations of other data types, such as String valid values specified +Enumerations of other datatypes, such as String valid values specified in FIX, should be mapped to an integer wire format in SBE. ### Encoding specification of enumeration @@ -1129,13 +1129,13 @@ In a message schema, the choices are specified a `` members of an ``. An `` specification must contain at least one ``. -The name and value of a validValue element must be unique within an +The name and value of a `` element must be unique within an enumeration. An `` element must have an encodingType attribute to specify the type of its values. Two formats of encodingType are acceptable: -- In-line style: the value of encodingType is its primitive data type. +- In-line style: the value of encodingType is its primitive datatype. - Reference style: the value of encodingType is the name of a `` element that specifies the wire format. @@ -1259,7 +1259,7 @@ of valid choices. Like other integer-backed encodings, multi-value encodings follow the byte order specified by message schema when serializing to the wire. See -section [*Message Schema*](#message-schema) for specification of message schema attributes, including +section [*Message Schema*](#message-schema) for specification of Message schema attributes, including byteOrder. ### Value encoding @@ -1277,7 +1277,7 @@ than to set all bits off when no choices are selected. ### Encoding specification of multi-value choice In a message schema, the choices are specified as `` members of -an `` element. Choices are assigned values as an ordinal of bits in +a `` element. Choices are assigned values as an ordinal of bits in the bit set. The first Choice "0" is assigned the least significant bit; choice "1" is the second bit, and so forth. @@ -1286,12 +1286,12 @@ The name and value (bit position) must be unique for element of a set. A `` element must have an encodingType attribute to specify the wire format of its values. Two formats of encodingType are recognized : -- In-line style: the value of encodingType is its primitive data type. +- In-line style: the value of encodingType is its primitive datatype. - Reference style: the value of encodingType is the name of a `` element that specifies the wire format. -The length of a `` associated to an bitset must be 1. That is, +The length of a `` associated to a bitset must be 1. That is, bitsets should not be specified as arrays. ### Multi-value example @@ -1341,7 +1341,7 @@ session protocol. |-------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| | Field value less than minValue | The encoded value falls below the specified valid range. | | Field value greater than maxValue | The encoded value exceeds the specified valid range. | -| Null value set for required field | The null value of a data type is invalid for a required field. | +| Null value set for required field | The null value of a datatype is invalid for a required field. | | String contains invalid characters | A character or character array contains controls characters or a string contains an invalid sequence if a different characterEncoding is specified. | | Required members not populated in MonthYear | Year and month must be populated with non-null values, and the month must be in the range 1-12. | | UTCTimeOnly exceeds day range | The value must not exceed the number of time units in a day, e.g. greater than 86400 seconds. | diff --git a/v2-0-RC3/doc/03MessageStructure.md b/v2-0-RC3/doc/03MessageStructure.md index a00276c..647a116 100644 --- a/v2-0-RC3/doc/03MessageStructure.md +++ b/v2-0-RC3/doc/03MessageStructure.md @@ -50,6 +50,8 @@ wire formats. ## SBE Message Encoding Header +### General + The purpose of the message encoding header is to tell which message template was used to encode the message and to give information about the size of the message body to aid in decoding, even when a message @@ -77,7 +79,7 @@ The fields of the SBE message header are: Block length is specified in a message schema, but it is also serialized on the wire. By default, block length is set to the sum of the sizes of body fields in the message. However, it may be increased to force -padding at the end of block. See section [*Padding*](#padding-at-end-of-a-message-or-group). +padding at the end of block. See section [*Padding*](#padding-at-end-of-a-message-or-group) for details. ### Message header schema @@ -86,7 +88,7 @@ position as shown below. Each of these fields must be encoded as an unsigned integer type. The encoding must carry the name "messageHeader". The message header is encoded in the same byte order as the message -body, as specified in a message schema. See section [*Message Schema*](#message-schema). +body, as specified in a message schema. See section [*Message schema attributes*](#message-schema) for the specification. Recommended message header encoding @@ -121,7 +123,7 @@ The total space reserved for the root level of the message not counting any repeating groups or variable-length fields. (Repeating groups have their own block length; see section [*Group block length*](#group-block-length) below. Length of a variable-length Data field is given by its corresponding Length field; -see section [*Variable-length string*](#variable-length-string-encoding).) Block length only represents message body +see section [*Variable-length string*](#variable-length-string-encoding) for details.) Block length only represents message body fields; it does not include the length of the message header itself, which is a fixed size. @@ -157,6 +159,8 @@ A count of the variable-length fields at the root level of the message. The coun ## Message Body +### General + The message body conveys the business information of the message. ### Data only on the wire @@ -293,6 +297,8 @@ Example of blockLength specification for 24 octets ## Repeating Groups +### General + A repeating group is a message structure that contains a variable number of entries. Each entry contains fields specified by a message schema. @@ -430,6 +436,8 @@ that case, no NumInGroup is encoded on the wire for the child groups. ### Group dimension encoding +#### General + Every repeating group must be immediately preceded on the wire by its dimensions. The two dimensions are the count of entries in a repeating group and the space reserved for each entry of the group. @@ -484,7 +492,7 @@ The number of entries in this repeating group, called NumInGroup in FIX. #### Number of repeating groups -A count nested repeating groups in this repeating group. +A count of the nested repeating groups in this repeating group. #### Number of variable-length fields @@ -513,7 +521,7 @@ specified with this sequence of message body elements: 1. Fixed-length fields that reside at the root level of the message (that is, not members of repeating groups), including any of the - following, in the order specified by the message schema:: + following, in the order specified by the message schema: a. Fixed-length scalar fields, such as integers diff --git a/v2-0-RC3/doc/04MessageSchema.md b/v2-0-RC3/doc/04MessageSchema.md index c091fba..587bfe1 100644 --- a/v2-0-RC3/doc/04MessageSchema.md +++ b/v2-0-RC3/doc/04MessageSchema.md @@ -31,6 +31,8 @@ run-time ## Name convention +### General + All symbolic names in a message schema are restricted to alphanumeric characters plus underscore without spaces. This is the same restriction applied to all names in FIX specifications. @@ -46,13 +48,15 @@ schema parsers. ## Root element +### General + The root element of the XML document is ``. ### `` attributes The root element provides basic identification of a schema. -The `byteOrder` attribute controls the byte order of integer encodings +The `byteOrder` attribute controls the byte order of integer and float encodings within the schema. It is a global setting for all specified messages and their encodings. @@ -109,6 +113,8 @@ sequence: ### Encoding name +#### General + The namespace for encoding names is global across all encodings included in a schema, including simple, composite and enumeration types. That is, the name must be unique among all encoding instances. @@ -131,6 +137,8 @@ Example of XML include usage to import common encoding types ### Simple encodings +#### General + A simple encoding is backed by either a scalar type or an array of scalars, such as a character array. One or more simple encodings may be defined, each specified by a `` element. @@ -145,7 +153,7 @@ the encoding. ##### Constant value The element value represents a constant if attribute -`presence="constant"`. In this case, the value is required. +`presence="constant"`. In this case, the value is conditionally required. #### `` attributes @@ -171,6 +179,8 @@ Simple type examples ### Composite encodings +#### General + Composite encoding types are composed of two or more simple types. #### `` attributes @@ -223,6 +233,8 @@ mantissa element indicates that the price is null. ### Reference to reusable types +#### General + A composite type often has its elements defined in-line within the `` XML element as shown in the example above. Alternatively, a common type may be defined once on its own, and then referred to by name with the composite type using a `` element. #### `` attributes @@ -239,7 +251,7 @@ A composite type often has its elements defined in-line within the `` **Reference to an enum** -In this example, a futuresPrice is encoded as 64 bit integer mantissa, 8 bit exponent, and a reused enum type. +In this example, a futuresPrice is encoded as 64-bit integer mantissa, 8-bit exponent, and a reused enum type. ```xml @@ -256,7 +268,7 @@ In this example, a futuresPrice is encoded as 64 bit integer mantissa, 8 bit ex **Reference to a composite type** -In this example, a nested composite is formed by using a reference to another composite type. It supports the expresson of a monetary amount with its currency, such as USD150.45. Note that a reference may carry an offset within the composite encoding that contains it. +In this example, a nested composite is formed by using a reference to another composite type. It supports the expression of a monetary amount with its currency, such as USD 150.45. Note that a reference may carry an offset within the composite encoding that contains it. ```xml @@ -272,6 +284,8 @@ In this example, a nested composite is formed by using a reference to another co ### Enumeration encodings +#### General + An enumeration explicitly lists the valid values of a data domain. Any number of fields may share the same enumeration. @@ -313,7 +327,7 @@ the encoding, such as an integer. Enumeration example (not all valid values listed) -This enumeration is encoded as an 8 bit unsigned integer value. Others +This enumeration is encoded as an 8-bit unsigned integer value. Others are encoded as char codes. ```xml @@ -329,6 +343,8 @@ are encoded as char codes. ### Multi-value choice encodings (bitset) +#### General + An enumeration explicitly lists the valid values of a data domain. Any number of fields may share the same set of choices. @@ -382,7 +398,9 @@ Multi-value choice example, The choice is encoded as a bitset. ``` -## Message templates +## Message template + +### General A `` element contains a set of message templates. A message schema may have multiple instances of ``, if desired, to organize them by categories. Each `` element may have an associated `package` name. @@ -431,7 +449,7 @@ The number of members of each type is unbound. The order that fields are listed in the message schema governs the order that they are encoded on the wire. -### `` element attributes +### `` element attributes #message-element-attributes | `` attribute | Description | XML type | Usage | Valid values | |-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------|--------------------|-------------|--------------------------------------------------------------------------| @@ -495,7 +513,7 @@ Field that uses a composite encoding ## Repeating group schema A `` has the same attributes as a `` element since they -both inherit attributes from the blockType XML type. A group has the +both inherit attributes from the blockType XML type. See section [*Message element attributes*](#message-element-attributes) for details. A group has the same child members as a message, and they must appear in the same order: 1. Element `` defines a fixed-length field @@ -536,6 +554,8 @@ above. ## Schema validation +### General + The first level of schema validation is enforced by XML schema validation tools to make sure that a schema is well-formed according to XSD schema rules. Well-formed XML is necessary but insufficient to prove diff --git a/v2-0-RC3/doc/05SchemaExtensionMechanism.md b/v2-0-RC3/doc/05SchemaExtensionMechanism.md index 775f27b..7165865 100644 --- a/v2-0-RC3/doc/05SchemaExtensionMechanism.md +++ b/v2-0-RC3/doc/05SchemaExtensionMechanism.md @@ -2,6 +2,8 @@ ## Objective +### General + It is not always practical to update all message publishers and consumers simultaneously. Within certain constraints, messages and repeating groups can be extended in a controlled way. Consumers using an @@ -77,7 +79,7 @@ sent on the wire to consumers. Likewise, a repeating group has a blockLength attribute to tell how much space is reserved for group entries, and the value is sent on the wire. It is encoded in the schema as part of the NumInGroup field encoding. -See section [*Encoding of repeating group dimensions*](#encoding-of-repeating-group-dimensions) above. +See section [*Encoding of repeating group dimensions*](#encoding-of-repeating-group-dimensions) above for details. ### Deprecated elements @@ -92,7 +94,7 @@ migration to replacement message layouts. ### Block size The length of the root level of the message is sent on the wire in the -SBE message header. See section [*Root block length*](#root-block-length) above. Therefore, if new fields +SBE message header. See section [*Root block length*](#root-block-length) above for details. Therefore, if new fields were appended in a later version of the schema, the consumer would still know how many octets to consume to find the next message element, such as repeating group or variable-length Data field. Without the current diff --git a/v2-0-RC3/doc/07Examples.md b/v2-0-RC3/doc/07Examples.md index d8bad81..ef8b0b3 100644 --- a/v2-0-RC3/doc/07Examples.md +++ b/v2-0-RC3/doc/07Examples.md @@ -1,5 +1,7 @@ # Examples +## General + The example messages are preceded by Simple Open Framing Header. Note that SOFH encoding is always big-endian, regardless of the byte order of the SBE message body. See that FIX standard for details. From cb4ffb9e6aad22b52c571779bf92a66f041218f8 Mon Sep 17 00:00:00 2001 From: mfey619 Date: Wed, 21 Sep 2022 15:19:28 +0200 Subject: [PATCH 3/3] Updated 07Examples.md Added a General header --- v2-0-RC3/doc/07Examples.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/v2-0-RC3/doc/07Examples.md b/v2-0-RC3/doc/07Examples.md index ef8b0b3..b44d039 100644 --- a/v2-0-RC3/doc/07Examples.md +++ b/v2-0-RC3/doc/07Examples.md @@ -138,6 +138,8 @@ Not all FIX enumeration values are listed in the samples. ## Flat, fixed-length message +### General + This is an example of a simple, flat order message without repeating groups or variable-length data.