Indexes

Message Layouts
Session
PreTrade
Trade
PostTrade
Infrastructure

  • Documentation

  • Financial Information Exchange Protocol

    Version: 4.2 with Errata Date: May 1, 2001

    Errata Purpose:

    This document includes a list of minor adjustments to the FIX 4.2 Specification document due to typographical errors or ambiguities. The nature and scope of Errata adjustments do not introduce new functionality, additional fields, new values for existing fields, or new messages. Regretably some functionality was introduced in FIX 4.2 which contained errors that required a new value or field on a specific message in order to make the intended functionality implementable. Any such exceptions to the “do not introduce” “additional fields” or “new messages” Errata rule were kept to an absolute minimum using the “required to make the intended functionality implementable” rationale. All of the items specified in this document will be incorporated in the next release of the FIX Protocol. The list of items has been reviewed and approved by the FIX Technical Committee and Steering Committees. Implementers of FIX version 4.2 should refer to this document to ensure the most consistent implementation and clearest understanding of the FIX protocol.

    The specific adjustments made to the original FIX version 4.2 specification as a result of the Errata can be seen and printed via Microsoft Word’s revision feature of this document. A separate document with an itemized list of changes is available via the FIX website.


    Table of Contents


    Back to top ↑

    DISCLAIMER

    THE INFORMATION CONTAINED HEREIN AND THE FINANCIAL INFORMATION EXCHANGE PROTOCOL (COLLECTIVELY, THE "FIX PROTOCOL") ARE PROVIDED "AS IS" AND NO PERSON OR ENTITY ASSOCIATED WITH THE FIX PROTOCOL MAKES ANY REPRESENTATION OR WARRANTY, EXPRESS OR IMPLIED, AS TO THE FIX PROTOCOL (OR THE RESULTS TO BE OBTAINED BY THE USE THEREOF) OR ANY OTHER MATTER AND EACH SUCH PERSON AND ENTITY SPECIFICALLY DISCLAIMS ANY WARRANTY OF ORIGINALITY, ACCURACY, COMPLETENESS, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SUCH PERSONS AND ENTITIES DO NOT WARRANT THAT THE FIX PROTOCOL WILL CONFORM TO ANY DESCRIPTION THEREOF OR BE FREE OF ERRORS. THE ENTIRE RISK OF ANY USE OF THE FIX PROTOCOL IS ASSUMED BY THE USER.

    NO PERSON OR ENTITY ASSOCIATED WITH THE FIX PROTOCOL SHALL HAVE ANY LIABILITY FOR DAMAGES OF ANY KIND ARISING IN ANY MANNER OUT OF OR IN CONNECTION WITH ANY USER'S USE OF (OR ANY INABILITY TO USE) THE FIX PROTOCOL, WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL (INCLUDING, WITHOUT LIMITATION, LOSS OF DATA, LOSS OF USE, CLAIMS OF THIRD PARTIES OR LOST PROFITS OR REVENUES OR OTHER ECONOMIC LOSS), WHETHER IN TORT (INCLUDING NEGLIGENCE AND STRICT LIABILITY), CONTRACT OR OTHERWISE, WHETHER OR NOT ANY SUCH PERSON OR ENTITY HAS BEEN ADVISED OF, OR OTHERWISE MIGHT HAVE ANTICIPATED THE POSSIBILITY OF, SUCH DAMAGES.

    No proprietary or ownership interest of any kind is granted with respect to the FIX Protocol (or any rights therein).

    Copyright 2001 FIX Protocol Limited, all rights reserved


    Back to top ↑

    Preface

    The Financial Interface eXchange (FIX) effort was initiated in 1992 by a group of institutions and brokers interested in streamlining their trading processes. These firms felt that they, and the industry as a whole, could benefit from efficiencies derived through the electronic communication of indications, orders and executions. The result is FIX, an open message standard controlled by no single entity, that can be structured to match the business requirements of each firm. The benefits are:

    • From the business flow perspective, FIX provides institutions and brokers a means of reducing the clutter of unnecessary telephone calls and scraps of paper, and facilitates targeting high quality information to specific individuals.

    • For technologists, FIX provides an open standard that leverages the development effort so that they can efficiently create links with a wide range of counter-parties.

    • For vendors, FIX provides ready access to the industry, with the incumbent reduction in marketing effort and increase in potential client base.

    Openness has been the key to FIX's success. For that reason, while encouraging vendors to participate with the standard, FIX has remained vendor neutral. Similarly, FIX avoids over-standardization. It does not demand a single type of carrier (e.g., it will work with leased lines, frame relay, Internet, etc.), nor a single security protocol. It leaves many of these decisions to the individual firms that are using it. We do expect that, over time, the rules of engagement in these non-standardized areas will converge as technologies mature.

    FIX is now used by a variety of firms and vendors. It has clearly emerged as the inter-firm messaging protocol of choice. Periodic Technical Forum meetings are held to discuss modification of the specification and are open for all to attend. Those interested in providing input to the protocol are encouraged to contact the Technical Committee Chairpersons, Scottt Atwell, American Century Investments, (US) 816-340-7053 (scott_atwell@americancentury.com) or Peter White, Goldman, Sachs & Co., (UK) 011-44-207-552-1315 (peter.white@gs.com). Periodic Technical Forum meetings are announced via email and on the WWW, go to http://www.fixprotocol.org for details.

    We look forward to your participation.

    FIX Protocol Ltd

    May, 2001

    US Steering CommitteeEuropean Steering CommitteeJapanese Steering CommitteeAsia/Pacific Steering Committee
    Alliance CapitalAbn Amro Bank NV.Barclays Capital Japan Ltd.American Century Investments
    American CenturyAlliance CapitalDaiwa Securities Group Inc.Barring Asset Management
    Capital ResearchCapital Research
    Credit Suisse Asset ManagementBaillie GiffordGoldman Sachs (Japan) Ltd.Credit Suisse First Boston
    Credit Suisse First BostonBarclays Global InvestorsLehman Brothers TokyoDeutche Securities Asia Ltd.
    Fidelity Capital MarketsBarclays StockbrokersMerrill Lynch Japan IncorporatedDresdner RCM Global Investors (Asia) Ltd.
    Fidelity Mgmt & Res. Co.Cazenove & Co.Morgan Stanley Dean Witter Japan LimitedFidelity Investments HK
    The Goldman Sachs Group, Inc.Nikko Asset Management Co., Ltd.oldman Sachs
    Merrill LynchCommerzbank AGNikko Salomon Smith BarneyING-Baring
    Morgan Stanley DW&DCredit Suisse First BostonJanus International (Asia) Ltd.
    Nomura Asset Management Co., Ltd.JF Asset Management
    Putnam InvestmentsNomura Securities Co., LtdJardine Fleming Securities Ltd.
    Salomon Smith BarneyDresdner RCM Global InvestorsThe Chuomitsui Trust and BankingMerrill Lynch Asia
    State Street Global AdvisorsThe Mitsubishi Trust and Banking CorporationMorgan Stanley Dean Witter
    UBS WarburgForeign and Colonial Mgmt LimitedSalomon Smith Barney
    Goldman, Sachs InternationalThe Sumitomo Trust & Banking Co., Ltd.UBS Warburg
    HSBCUBS Warburgblah
    Instinet
    ITG Europe
    J.P. Morgan Investment Mgmt, Inc.
    Merrill Lynch
    Merrill Lynch Investment Management
    Morgan Stanley DW&D
    SG Securities London
    Salomon Smith Barney
    UBS Warburg

    Back to top ↑

    Release Notes

    Minor Adjustments to the Protocol Specification Document:

    Adjusted DateSectionItemAdjustment
    4/23/2001SecurityStatus[E20000608_1]
    Typographical Error in Security Status Message - Tag #292
    The SecurityStatus Message (MsgType = f) - Tag#292, has a typographical error “CorporationAction” which should read “CorporateAction”.

    Correct typographical error in the SecurityStatus Message replacing “CorporationAction” with “CorporateAction”.
    4/23/2001New Order Single, etc.[E20001104_1]
    GTBookingInst - Tag #427 should appear on Order Messages
    Tag 427 GTBookingInst is a booking instruction and currently is only present on the Execution Report message - it was intended that this could be conveyed on the order. It should, therefore, be added to the New Order Single, Order Cancel/Replace Request (and Order Cancel Request if we decide that this message should have all the same fields as the New Order Single and Order Cancel/Replace Request). It should not be made an amendable field on the order. Add GTBookingInst - Tag #427 as a non-amendable field to New Order Single, Order Cancel/Replace Request, and New Order List. Note that Good Till functionality defined for FIX 4.2 cannot be implemented without this correction and error was made in its ommission.
    4/24/2001Exchange Appendix match website[E20001114_3]
    Amend Appendix C - Reuters Exchange Mnemonics to match the FIX website's "Tech Resources", "Exchange Codes" section.
    Added “SWX Swiss Exchange” with value of “S”. Removed “Zurich Stock Exchange”. Renamed “Swiss Options and Financial Futures Exchange (SOFFEX)” as “Eurex Switzerland (SFF)” keeping “Z” value. Renamed “Deutsche Terminboerse (DTB)” as “Eurex Germany (DTB)” keeping “d” value. Added custom value of “15” for “International Securities Market Association (ISMA)”.
    4/24/2001Exchange Appendix match website[E20000411_1]
    Add Exchange Code OJ (for Nasdaq Japan) to Appendix C.
    According to the information from Reuters, they assign OJ as the market of NASDAQ-Japan (new market which will open this June).

    Added to website Tech Resources, Exchange Codes section on 4/11/2000. Added to Appendix C.
    4/24/2001Exchange Appendix match website[E20000417_1]
    Assign "custom" Exchange Code of "12" for "NYMEX".
    Assigned "custom" Exchange Code of "12" for "NYMEX". Added to website Tech Resources, Exchange Codes.
    4/24/2001Exchange Appendix match website[E20000925_1]
    Assign “custom” Exchange Code of “14” for “Jiway”
    Added “Jiway” with custom exchange code of “14” to the website and [Appendix C(#appendix-c)]. Jiway is a new pan-European exchange registered in London.
    4/24/2001Exchange Appendix match website[E20010412_1]
    Additional Exchange Code: virt-x as VX
    Added “virt-x” with Reuters exchange code of “VX” to FIX website and Appendix C.
    4/24/2001Exchange Appendix match website[E20010424_1]
    Modify Website and Appendix C Reuters Exchange Codes to reflect new, defunct, and renamed exchanges per information provided by Reuters
    Added, removed (defunct), and renamed numerous exchange codes from the FIX website and Appendix C based upon review and recommendation from Reuters.
    4/23/2001OrdQty[E19990915_1]
    OrdQty should be expressed in shares vs. contracts for Options?
    Add to the OrdQty[38] definition: "The number of shares for equities, normal convention is to use number of contracts for options, futures, convertible bonds, etc."
    4/23/2001Tag #431 (ListOrderStatus)[E20001114_2]
    Field Definitions for Tag #431 ListOrderStatus lists value “4” twice, “All Done” should be value “6”
    Note that value 4 is listed twice. Value "4 - All Done" should be "6 - All Done".

    Change From:
    Valid values:
    1 - InBiddingProcess
    2 - ReceivedForExecution
    3 - Executing
    4 - Canceling
    5 - Alert
    6 - All Done
    7 - Reject

    Change To:
    Valid values:
    1 - InBiddingProcess
    2 - ReceivedForExecution
    3 - Executing
    4 - Canceling
    5 - Alert
    6 - All Done
    7 - Reject
    4/23/2001QuoteRequest[E20000607_1]
    Add Currency to Quote and QuoteRequest
    Tag #15 (Currency) should be present in the Quote and QuoteRequest messages as it is referenced in the message definition text and was intended to be in place for messages with price fields.

    Added Currency as non-required field to the Quote Request message.
    4/26/2001Liquidity in Pgm trading[E20000308_1]
    Correct text entry for Liquidity field in Program Trading
    Replace “Liquidity1 and Liquidity2” with “LiquidityPctLow and LiquidityPctHigh” in LiquidityNumSecurities and LiquidityValue field descriptions in Bid Request message and in the LiquidityValue Field Definitions entry.
    4/23/2001Standard MessageHeader XML fields[E20000710_4]
    Add comment to Standard Message Header that Tag #212(XmlDataLen) and Tag #213(XmlData) may be embedded within encryption data
    Note that XmlDataLen and XmlData may appear within encrypted data.
    4/23/2001Field Definitions[E20000710_2]
    Typographical error in Field Definition of Tag #412(OutMainCntryUIndex)
    Tag #412(OutSideMainCountryIndex) is on the Bid Request message, but in Field Definitions, that name is "OutMainCntryUIndex", and It may be a different thing?

    Change Field Definition for Tag #412 from, " OutSideMainCountryIndex ", to read, “OutMainCntryUIndex”.
    4/23/2001Bid Request[E20000519_1]
    FutSettDate and Account are missing Y or N values in “Req’d” column on the Bid Request message
    In the BidDescriptors repeating group, Tag #64(FutSettDate) or Tag #1(Account) are not indicated as “req’d”.

    Add “N” to “Req’d” column for Tag #64(FutSettDate) and Tag #1 (Account) on BidRequest message.
    4/23/2001Reject[E19991110_2of3]
    Clarify wording regarding sequence numbers in comment on retransmitting rejected messages
    "If the sending application chooses to retransmit the rejected message, it should be assigned a new sequence number" is unclear, being interpreted as you should not resend with the same sequence number.

    Reword the paragraph in question adding: “If the sending application chooses to retransmit the rejected message, it should be assigned a new sequence number and sent with PossResend=Y.”
    4/23/2001UnderlyingContractMultiplier and UnderlyingCouponRate[E20000710_1]
    Tag #'s are reversed for UnderlyingContractMultiplier and UnderlyingCouponRate
    The message reads:
    Tag #435(UnderlyingContractMultiplier)
    Tag #436(UnderlyingCouponRate)

    But in Field Definitions, those are reversed
    Tag #435 (UnderlyingCouponRate)
    Tag #436 (UnderlyingContractMultiplier)

    The same problem exists in the Quote Acknowledgement, Security Definition Request and Security Definition messages.

    These tags are repeatable, so sequence is important

    The Field Definitions should take precedence over a particular message definition section as to the tag number of the field. Thus UnderlyingCouponRate is tag 435 and UnderlyingContractMultiplier is tag 436 on Mass Quote, Quote Acknowledgement, Security Definition Request, and Security Definition messages.

    Modified all message definitions to correctly identify UnderlyingContractMultiplier as tag 436 vs. 435 and to correctly identify UnderlyingCouponRate as tag 435 vs. 436 matching the field reference. Note the order of these fields within repeating groups did not change.
    4/23/2001FIX News and Email messages[E20000426_1]
    News and Email Routing details should be a separate repeating group from RelatdSym details
    The FIX 4.2 Email & News Messages do not define the Routing information correctly. Currently, both messages define the Routing ID information as part of the Related Symbol repeating group and are missing NoRoutingIDs (tag 216).

    NoRelatedSym (146)
    RoutingType (216)
    RoutingID (217)
    RelatdSym (46)

    Should be:

    NoRoutingIDs (215)
    RoutingType (216)
    RoutingID (217)
    NoRelatedSym (146)
    RelatdSym (46)
    4/23/2001ExecutionRpt[E20000426_1]
    Unclear from the glossary definition of TransactTime or the usage provided on the "New Order - Single" message whether TransactTime is supposed to stay constant throughout the life of the order.
    The above entries currently read as follows:

    Field Definitions: "Time of execution/order creation" NewOrderSingle usage - "Time this order request was initiated/released by the trader or trading system."

    No usage is given for ExecutionReport causing ambiguity as to whether TransactTime on the ExecutionReport should be the time when the order was placed or the time execution occurred.

    Add to ExecutionReport message definition TransactTime field usage: “Time the transaction represented by this ExecutionReport occurred.”
    4/23/2001Message Definitions[E20000523_1]
    Remove a space in “MaturityMonthYear” field name in News and Email messages
    Removed a space in “MaturityMonthYear” field name in News and Email messages.
    4/23/2001EncodedIssuer tag[E20000606_2]
    Eight messages in FIX 4.2 identify EncodedIssuerLen and EncodedIssuer with incorrect tag numbers
    FIX 4.2 introduced EncodedIssuerLen (348) and EncodedIssuer (349). Eight messages incorrectly identify these two fields as being tags 354 and 355 within their message definition. These should be changed to match the tags defined in the Field Definitions. The following messages will be adjusted: News, Email, Quote Request, Mass Quote, Quote Cancel, Quote Acknowledgement, Market Data Request, Market Data - Refresh, New Order List.
    4/23/2001Message Definitions[E20000523_3]
    Remove “manual line breaks” within field names specified in message definitions
    In the definition for messages i, B, C, D there is a new line character in the field name for fields 307 (UnderlyingSecurityDesc), 308, and 310.

    Removed all “manual line breaks” within field names specified in message definitions.
    4/23/2001Message Definitions[E20000523_5]
    Rename “OrdRejectReason” as “OrdRejReason” in List Status message definition
    In the definition of the List Status message, field 103’s name is specified as “OrdRejectReason” but is “OrdRejReason” in the field definitions.

    Renamed “OrdRejectReason” as “OrdRejReason” in List Status message definition.
    4/23/2001Message Definitions[E20000523_6]
    Rename “ProgressRptReqs” as “ProgRptReqs” in List Status message definition
    In the definition of the New Order – List message, field 414’s name is ProgressRptReqs but is ProgRptReqs in the field definitions.

    Renamed “ProgressRptReqs” as “ProgRptReqs” in List Status message definition.
    4/23/2001Message Definitions[E20000710_5]
    NoQuoteEntries tag is incorrect in Quote Cancel message
    Corrected the Quote Cancel field definition to specify NoQuoteEntries as tag 295 matching the value assigned to the field in the Field Definitions.
    4/23/2001Message Definitions[E20000523_8]
    QuoteID tag is incorrect in Quote Status Request message
    Corrected Quote Status Request message definition by specifying QuoteID as tag 117 vs. 37.
    4/26/2001Message Definitions[E20010424_2]
    Quote Status Request message incorrectly lists Side as required
    Corrected Quote Status Request message definition by changing Side field’s Req’d column from Y to N.
    4/23/2001Message Definitions[E20000523_9]
    Rename “SettlCurrAmount” as “SettlCurrAmt” in Settlement Instructions message definition
    Changed all references to “SettlCurrAmount” to “SettlCurrAmt”.
    4/23/2001Message Definitions[E20000331_1]
    Bid Request message in FIX 4.2 incorrectly lists StrikeTime as tag 58 vs. 443 (field was also “missed” in the Field Definitions)
    Define StrikeTime as tag 443 in the Field Definitions. Correct the Bid Request field definition to specify StrikeTime as tag 443 matching the value assigned to the field in the Field Definitions.
    4/23/2001Message Definitions[E20000523_11]
    Rename “Commision” as “Commission” in Bid Response message definition
    In the definition for message l (lowercase L): For field 12, the field name (commission) is misspelled.

    Replaced “Commision” with “Commission”.
    4/26/2001Repeating Groups usage[E20001106_1]
    Clarification necessary for repeating groups and nested repeating groups
    Moved existing repeating group details within “Message Format” to a new subsection “Repeating Groups” within “FIX Message Format and Delivery”. Added additional clarification. Now reads:

    Repeating Groups:
    It is permissible for fields to be repeated within a repeating group (e.g. "384=2<SOH>372=6<SOH>385=R<SOH>372=7<SOH>385=R<SOH>" represents a repeating group with 2 repeating instances “delimited” by tag 372 (first field in the repeating group.).
    • If the repeating group is used, the first field of the repeating group is required. This allows implementations of the protocol to use the first field as a "delimiter" indicating a new repeating group entry.
    • The NoXXX field which specifies the number of repeating group instances occurs once for a repeating group and must immediately precede the repeating group contents.
    • If a repeating group field is listed as required, then it must appear in every repeated instance of that repeating group.
    • Repeating groups are designated within the message definition via indentation and the symbol.
      Some repeating groups are nested within another repeating group (potentially more than one level of nesting).
    • Nested repeating groups are designated within the message definition via indentation and the symbol followed by another symbol..
    • If a nested repeating group is used, then the outer repeating group must be specified
    4/23/2001Mass Quote[E20000905_2]
    The Mass Quote message definition indicates that Tag #296 (NoQuoteSets) is Required, but then indicates that the value should default to 1 if not set.
    The following statements should be removed from the Mass Quote message definition as both of the fields in question are specified as Required:

    for Tag #296 (NoQuoteSets) "Defaults to 1 quote set if not set"
    for Tag #302 (QuoteSetID). "Must be used if NoQuoteSets is used."

    Removed the above statements from Mass Quote message.
    4/23/2001SecurityDefinition[E20000626_1]
    Is Tag #311 (UnderlyingSymbol) conditionally Required only if Tag #146 (NoRelatedSym) > 0.
    Modified the Security Definition message changing UnderlyingSymbol field Req’d value from ‘Y’ to ‘N’. Replaced field comment with “Required if NoRelatedSym > 0”.
    4/26/2001Allocation - Tag# 139 (MiscFeeType)[E20010228_1]
    Clarification re: Tag #139 (MiscFeeType) and MiscFeeCurr relationship
    A clause added to the 4.1 Errata for Tag #139 "(can only occur once within a MiscFee group)" might be misleading. The idea was to prevent someone from associating a USD amt. with both Markup and VAT without itemizing how much for each. This should not be interpreted as don't provide Tag #139 more than once for the entire repeating group.

    Removed "(can only occur once within a MiscFee group)" from the MiscFeeType description in the Allocation message.
    4/26/2001UTCTimestamp[E20000808_1]
    Clarify that UTCTimestamp and UTCTimeOnly valid seconds are 0-60 vs. 0-59 to accommodate “leap seconds”
    Since the FIX document specifically mentions UTC, rather than UT or GMT, it should support a range of 0-60 for the UTC seconds field (for those times when a minute has 61 seconds).

    According to the FIX 4.2 specification of the data type UTCTimestamp (page 7), valid values for seconds are 0-59. UTC (Coordinated Universal Time) differs from plain UT (Universal Time) mainly in having leap seconds (see http://tycho.usno.navy.mil/leapsec.html).

    Modify UTCTimestamp and UTCTimeOnly data type formats to allow 0-60 vs. 0-59 for seconds. Add the following statement:

    Note that UTC includes corrections for leap seconds, which are inserted to account for slowing of the rotation of the earth. Leap second insertion is declared by the International Earth Rotation Service (IERS) and has, since 1972, only occurred on the night of Dec. 31 or Jun 30. The IERS considers March 31 and September 30 as secondary dates for leap second insertion, but has never utilized these dates. During a leap second insertion, a DateTime field may read "19981231-23:59:59", "19981231-23:59:60", "19990101-00:00:00". (see http://tycho.usno.navy.mil/leapsec.html)
    4/26/2001leading zeros[E20000825_1]
    Note that numeric fields may appear with leading zeros (e.g. sequence numbers or field tags)
    Added to int data type: “Note that int values may contain leading zeros (e.g. “00023” = “23”).”

    Added to float data type: “Note that float values may contain leading zeros (e.g. “00023.23” = “23.23”) and may contain or omit trailing zeros after the decimal point (e.g. “23.0” = “23.0000” = “23”).”
    4/23/2001using SecurityDef for list of tradable securities[E20000502_2]
    TotNumSecurities is in spec but not specified in SecurityDefinition message
    FIX 4.2 introduced the Security Definition message and due to a typographical error, the field TotNumSecurities field was not listed as part of the message. This was an oversight and is necessary to support fragmentation of large symbol lists? (SecurityResponseType=4, list of securities)

    Added TotNumSecurities (393) to the Security Definition message.
    4/23/2001RatioQuantity[E20010228_2]
    - RatioQty should be Quantity vs. float data type
    Change Field Definitions to specify RatioQty is of type Quantity vs. float (note does not change the underlying base data type).
    4/26/2001Tag #141 (ResetSeqNumFlag)[E20000908_1]
    Clarify action to take if ResetSeqNumFlag process is not followed properly
    Added “The connection should be shutdown and manual intervention taken, if this process is initiated but not followed properly.“ to the end of the “When using the ResetSeqNumFlag to maintain 24 hour connectivity and establish a new set of sequence numbers, the process should be as follows….” Paragraph.
    4/23/2001Pegged OrdType[E20000831_1]
    Add ExecInst values T and W to OrdType value “Pegged”-related statements “requires ExecInst = L, R, M, P, or O”
    The description for the Pegged OrdType said it requires certain ExecInst values. Two new pegging types, T and W, have been added to the FIX 4.2 specification.

    Removed “(requires ExecInst = L, R, M, P, O)” from the OrdStatus Field Definitions entry. Added “If OrdType=P, exactly one of the following values (ExecInst = L, R, M, P, O, T, or W) must be specified.” to the ExecInst description in the New Order Single and New Order List message definitions.
    4/23/2001Appenidx D37 - OrdStatus[E20000727_1]
    A contradiction currently exists between the instructions in Appendix D37 and the precedence list in the Exec report section of the FIX specification.
    The precedence list in the Exec report section of the FIX Specification shows OrdStatus “stopped” with a higher precedence than “partially filled”.

    Currently, when a new order is stopped, then D37 (@T=3) reports back the order status as “stopped”. If the order is part-filled, then D37 says ExecType should be partial fill and the OrdStatus should be partial fill. The order is really in 2 states (partially filled and stopped) but precedence dictates that the order is “stopped” only.

    Amend the FIX 4.2 specification, Appendix D37, Change State Matrix as follows:

    When a new order is stopped after being partially filled, D37 (@T=4) should show the OrdStatus as stopped (with ExecType = partial fill).

    Thus, the order is still in “stopped” state while ExecType makes it clear why the execution report was sent.

    Changed OrdStatus for D37, time=4 from “Partial Fill” to “Stopped”.
    4/23/2001AllocTransType formatting[E20000628_1]
    On page 144 of FIX4.2, the description of valid values for Tag #71(AllocTransType) has formatting problems.
    Added carriage returns between enums in Field Definition for AllocTransType.
    4/23/2001SecurityDefinition[E20000817_2]
    Allow value of “?” to Tag #167 (SecurityType) per the capability specified in the Security Definition Request message
    Security Definition Request message illustrates using “?” as a wildcard on a request.

    Added “?” as a valid enum for the SecurityType field in the Field Definitions with description: “ = “Wildcard” entry (used on Security Definition Request message)”.
    4/26/2001Gap Fill vs. Seq Reset Speicify Seq Reset - in normal resend processing[E20010131_1]
    Clarify use Sequence Reset - Gap Fill to mark the place of an application message which has been chosen to not be resent
    Regarding Sequence Reset (Gap Fill) Messages, the Fix 4.2 specification states, "During normal resend processing, the sending application may choose not to send a message (e.g. an aged order). The Sequence Reset can be used to mark the place of that message."

    The last sentence of the paragraph should be amended to read, “The Sequence Reset - Gap Fill is used to mark the place of that message."
    4/26/2001Seq Reset[E20000831_2]
    Stronger language and more clearly state that Sequence Reset – Reset should only be used in situations recovering from disaster
    Replaced “Note that the SeqReset-Reset message is an exception to this rule as it should be processed without regards to its MsgSeqNum.” With “Note that the SeqReset-Reset message (used only to recover from a disaster scenario vs. normal resend request processing) is an exception to this rule as it should be processed without regards to its MsgSeqNum.”

    Added “This message has two modes: “Sequence Reset- Gap Fill” when GapFillFlag is ‘Y’ and “Sequence Reset- Reset” when GapFillFlag is N or not present. The “Reset” mode should only be used to recover from a disaster situation which cannot be otherwise recovered via “Sequence Reset- Gap Fill” mode.” To opening paragraph in Sequence Reset message definition.

    Added “Sequence Reset – Reset should NOT be used as a normal response to a Resend Request (use Sequence Reset – Gap Fill).” To the end of the “During normal resend processing, …” paragraph.

    Added “Sequence Reset – Reset should NOT be used as a normal response to a Resend Request (use Sequence Reset – Gap Fill). Sequence Reset – Reset should ONLY be used to recover from a disaster situation which cannot be recovered via the use of Sequence Reset – Gap Fill. Note that the use of Sequence Reset – Reset may result in the possibility of lost messages”. To the end of the “If the GapFillFlag field is not present (or set to N),” paragraph in Sequence Reset message definition.
    4/23/2001Exec Rpt Commission[E19990708_2]
    Clarify that Commission on ExecRpt for ExecType=Partial Fill vs. Calculated
    Commission in Ex Rpt if flat amount should be amt of commission per fill if dealing w/ a partial, sum of commission on calculated

    Added “On a fill/partial fill represents value for that fill/partial fill, on ExecType=Calculated represents cumulative value for the order.” To the ExecutionRpt message’s Currency field.
    4/23/2001Exec Rpt Commission[E20001218_1]
    Clarify that Commission on ExecutionRpt should be expressed in Currency (15) field
    Clarify that Commission on ExecutionRpt should be expressed in the Currency field.

    Added “Monetary commission values expressed in Currency.” To the ExecutionRpt message’s Currency field.
    4/26/2001List Status Message[E20000609_1]
    The List Status Message specifies Text, EncodedTextLen, and EncodedText in both the message itself
    and also in the repeating group violating fundamental FIX parsing rule. Correct by adding 3 new fields Add 3 new, missing fields ListStatusText, ListStatusEncodedTextLen, and ListStatusEncodedText to the List Status message and Field Definitions to remain consistent with protocol’s parsing rule of tags should not appear more than once in a message unless within a single repeating group.

    Note justification for the change as Errata is to correct an error which violates a fundamental parsing rule of tag may only appear once within a message (unless in a repeating group) and not both within a repeating group and outside of a repeating group.
    4/23/2001SecurityDefinition Message? errors re: comments for Underlying fields[E20001211_1]
    The Security Definition message In the FIX 4.2 specification contains both Security information and Underlying Security information. There is a repeating group containing Underlying information and the comments for some of these Underlying fields are incorrect as follows
    Modify comments for UnderlyingSecurityType (310) replacing: “Symbol, SecurityType, MaturityMonthYear, PutOrCall and StrikePrice” with:

    “UnderlyingSymbol, UnderlyingSecurityType, UnderlyingMaturityMonthYear, UnderlyingPutOrCall and UnderlyingStrikePrice”

    Modify comments for UnderlyingMaturityDay (314) replacing: “MaturityMonthYear “ with: “UnderlyingMaturityMonthYear”

    Made the above changes to Security Definition Request and Security Definition messages.
    4/25/2001HeartBtInt -intervals on dual Logon exchange[E20001205_1]
    Clarify that both sides use the same heartbeat interval which is provided by the Logon initiator
    State that both sides should use the same heartbeat interval (the HeartBtInt provided on the initiator’s Logon).

    Added "The HeartBtInt value should be agreed upon by the two firms and specified by the Logon initiator and echoed back by the Logon acceptor. Note that the same heartbeat interval value is used by both sides (Logon “initiator” and Logon “acceptor” use the same value).” to the “Heartbeats” section within “FIX MESSAGE FORMAT AND DELIVERY”.

    Added “(same value used by both sides). The HeartBtInt value should be agreed upon by the two firms and specified by the Logon initiator and echoed back by the Logon acceptor.” to “The HeartBtInt (108) field is used to declare the timeout interval for generating heartbeats.” Statement in the Logon message definition. Added "" To the Logon message definition. Added “Note same value used by both sides” to the Logon message’s HeartBtInt field reference.
    4/23/2001Logon MsgType repeating group should be 372 RefMsgType vs. 35 MsgType[E20001213_1]
    Logon message error: MsgType is in both the header and the body violating fundamental FIX parsing rule. Correct replacing MsgType in body with RefMsgType (372)
    Replace MsgType (35) within Logon message body’s repeating group with RefMsgType (372). Clarify that the RefMsgType repeating group within the Logon message “should be specified from the point of view of the sender of the Logon message”.

    Note justification for the change as Errata is to correct an error which violates a fundamental parsing rule of tag may only appear once within a message (unless in a repeating group) and not both within a repeating group and outside of a repeating group.
    4/25/2001Only one, not both CashOrderQty and OrderQty specified on Order[E20001219_3]
    Clarify that either CashOrderQty or OrderQty, but not both, should be specified on the Order messages
    Added “Note that either, but not both, CashOrderQty or OrderQty should be specified.“ after “Either CashOrderQty or OrderQty is required.” On the New Order Single, Order Cancel/Replace Request, and New Order List message definitions.
    4/23/2001Field #59 TimeInFomrce (should be "(IOC)" vs. "(OC)" in Field Definitions[E20001219_4]
    Correct typo with TimeInForce value Immediate or Cancel acronym
    FIX-42.doc (Page 146) states field #59 TimeInForce should have the valid value 3=Immediate or Cancel (OC). The documentation is incorrect and it should read (IOC) and not (OC).

    Modify Field Definitions for TimeInForce replacing “(OC)” with “(IOC)”.
    4/23/2001Alloc Cancel, Reject, Replace for entire allocation vs. single order, exec, or account.[E20001222_1]
    Clarify that AllocTransType of Cancel, Reject, or Replace affects the entire Allocation message vs. a single AllocAccount instance
    Add to Allocation message definition: “Note that AllocTransType of Cancel, Reject, or Replace affects the entire Allocation message thus each AllocAccount (cannot cancel, reject, or replace a single AllocAccount instance without affecting the entire Allocation messge).”
    4/23/2001Tag #160 SettlInstMode When can value 0 be used?[E20001222_2]
    Correct Allocation message reference of valid values for SettlInstMode to include 0 (“Default”)
    Tag #160 SettlInstMode can have values 0, 1, 2, or 3 per the "Field Definitions", however, a value of 0 ("Default") would not be applicable on a Settlement Instructions message. It could be specified on the Allocation message. Note that the Allocation message specification of that field does not mention value 0, but should.

    Add to the Allocation message definition reference to SettlInstMode that “0” is a valid value.
    4/24/2001Open/Close should not state "for options only"[E20001222_3]
    Remove “for options only” from references to OpenClose field
    OpenClose currently states “for options only” but should be used to indicate open/close regardless of product type.

    Remove “for options only” from references to OpenClose field. Added “Used to indicate if the resulting position after a trade should be an opening position or closing position. Used for omnibus accounting - where accounts are held on a gross basis instead of being netted together.”
    4/23/2001Order State Matrix D31 in 4.2 incorrect[E20001228_1]
    Correct typo in Appendix D entry D31
    Order State Matrix D31 - Poss Resend order in the FIX 4.2 specification contains a minor error. The last line should read 15000 not 10000 for the Order Qty and Leaves Qty.
    4/23/2001Clarify definition of "resent message" for OrigSendingTime requirement.[E20001227_1]
    Clarify requirement for OrigSendingTime
    Modify “Standard Message header” section comment for field OrigSendingTime (122) replacing:

    “Required for message resends”
    with
    “Required for messages resent as a result of a ResendRequest”
    4/23/2001Correct Field Definition for AllocTransType usage[E20001227_2]
    Modify Field Definitions entry for AllocTransType adding “Calculated” to “required for” list
    In the Field Definitions, the comments for field #72 say “Reference identifier to be used with Replace and Cancel AllocTransType messages”. However, in the Allocation message (MsgType = J) the comments for field #72 reads “Required for AllocTransType = Calculated, Replace, or Cancel”.

    The Allocation message's comments are the correct ones in this case. The Field Definition entry for that field should include Calculated (introduced in FIX 4.1) in that list.

    Modify the Field Definitions entry for RefAllocID replacing:

    “Reference identifier to be used with Replace and Cancel AllocTransType messages”
    With:
    “Reference identifier to be used with Replace, Cancel, and Calculated AllocTransType messages”
    4/23/2001Field #15 Currency Remove "Assumed USD" from BidRequest's field definition.[E20001227_6]
    Remove USD reference on Bid Request message Currency field
    The Field Definitions the comment for field #15 Currency reads, ”Absence of this field is interpreted as the default for the security.” The Bid Request message (MsgType = k) the comment on field #15 reads, “Assumed USD in absence”.

    Modify the Bid Request message definition’s description of Currency field removing: “Assumed USD in absence” as all USD defaults references should have been removed in FIX version 4.2.
    4/26//2001Settlement Instructions[E20010102_1]
    Appendix F - Settlement Instructions Field Usage Reference clarifications
    Added “See Appendix F” to the text for the Settlement Instructions message definition.

    Replaced “(either SettlDepositoryCode or SecuritySettl*)“ with “(if SettlDepositoryCode is not specified, one of more of the SecuritySettl* fields are required)” in Appendix F.
    4/26/2001Glossary - difference between MaxShow and MaxFloor[E20010117_1]
    Clarify the difference between MaxShow and MaxFloor
    Added the following to “Appendix E - Order Handling and Instruction Semantics”:

    “Reserve Quantity” Orders

    MaxFloor: Traditionally used to indicate reserve quantity. To indicate a single level of reserve quantity, MaxFloor should be used.

    MaxShow: Used when two levels of reserve quantities are needed, e.g. one level displayed to the world (MaxFloor) and another displayed to subscribers of their ECN (MaxShow.) I.e. MaxFloor <= MaxShow <= OrderQty.
    • One may place an order for 100,000 shares (OrderQty), only want 1000 shares shown to NASDAQ at any one time (MaxFloor), but will allow other subscribers of that ECN to see 5000 shares (MaxShow).
    4/23/2001Use msg’s ID field for PossResend checking[E20010116_1]
    Clarify that PossResend duplication checking should use the unique id of the application message (e.g. ClOrdID) for the dupe check
    Add to “MESSAGE FORMAT AND DELIVERY” section’s “Possible Resends” paragraph: “The receiver of the message should check the unique id associated with the application-level message for duplication and process or not process it accordingly”.

    Replace:

    “New Order messages received with the PossResend flag set in the header should be validated by ClOrdID and order parameters (side, symbol, quantity, etc.) to determine if the order had been previously submitted."
    With:
    “New Order messages received with the PossResend flag set in the header should be validated by ClOrdID and consider checking order parameters (side, symbol, quantity, etc.) to determine if the order had been previously submitted." Adding “consider checking”.
    4/23/2001"Quote" vs. "Order" in enums for Tag #300 QuoteRejectReason[E20010127_1]
    Correct QuoteRejectReason values’ references to “Order” with “Quote Request”
    There is a typo in the description for Tag #300 QuoteRejectReason and Tag #368 QuoteEntryRejectReason.

    The following values:
    3=Order exceeds limit
    5=Unknown Order
    6=Duplicate Order

    Should read:
    3=Quote Request exceeds limit
    5=Unknown Quote
    6=Duplicate Quote

    Change the wording in the value descriptions of Field #300 QuoteRejectReason and Field #368 QuoteEntryRejectReason from “Order” to “Quote Request or Quote.
    4/23/2001Tag #423 PriceType Remove "cents" from "cents per share"[E20010131_2]
    Replace “cents per share” with “per share (e.g. cents per share)” to avoid USD references
    The current wording in the description of Tag #423 PriceType reads, "cents per share" which applies only to USD and I inaccurate if any other currency is involved.’

    Replace the phrase, “cents per share” in the description of Tag #423 PriceType to reflect some non currency specific amount such as "per share (e.g. cents per share)".
    4/26/2001Glossary - Define difference between “Market Order” and "Market Pegged Order”[E20010202_1]
    Rename Appendix E “Order Handling and Instruction Semantics” and make present “London SETS Order Types Matrix” a subsection
    Rename “Appendix E - London SETS Order Types Matrix” as “Appendix E - Order Handling and Instruction Semantics”. Make present “London SETS Order Types Matrix” a section within the appendix in preparation for other sections.
    4/26/2001Glossary - Define difference between “Market Order” and "Market Pegged Order”[E20010202_1]
    Clarify Pegged orders
    Add the following to the “Pegged Orders” section of the new “Order Handling and Instruction Semantics” Appendix (rename Appendix E and make “London SETS Order Types Matrix” a subset):

    The following are all pegging ExecInst values used when OrdType=P to specify the type of pegged order represented. Note that these fields cannot be combined; only one may be specified on a pegged order.

    L = Last peg (last sale)
    M = Mid-price peg (midprice of inside quote)
    O = Opening peg
    P = Market peg
    R = Primary peg (primary market - buy at bid/sell at offer)
    T = Fixed Peg to Local best bid or offer at time of order
    W = Peg to VWAP

    A pegged order acts like a limit order, except that the limit price fluctuates relative to another quantity, such as the last sale, midpoint, opening price, bid, offer, or VWAP (Volume Weighted Average Price). A primary peg order is priced relative to the bid if buying, the offer if selling. A market peg order is priced relative to the offer if buying, the bid if selling.

    In the absence of the PegDifference field, or when PegDifference = 0, the price of the pegged order follows the referenced quantity exactly. If PegDifference is specified, the referenced quantity + the PegDifference = the price of the order.

    Some systems allow pegged orders to be specified with a Price field. In this case, the Price field serves to put a limit on how far the pegged value can move. For instance, if the bid for a stock is 50, the offer is 50.10, the order is a primary peg to sell, PegDifference = -0.02, and Price = 45, the order will be priced to sell at the offer + (-0.02) or 50.08. If the offer falls, the order's price will fall such that it is always 0.02 less than the offer. However, once the order's price hits 45 (the limit specified in the Price field) it can fall no further.

    A pegged order with ExecInst = T (Fixed Peg to Local best bid or offer at time of order) behaves differently in two ways. First, it acts like a Primary peg, but it is relative to the local best bid or offer, not the global best bid or offer. (For instance, in an ECN environment, this would be the best bid or offer on the particular ECN, not the best price available in the national marketplace.) Second, once an initial price for the order is set, unlike normal pegged orders, the price will not move even if the best bid or offer of the local marketplace moves.
    4/26/2001Asia Regional Steerig Committee Order handling (Careful Discretion) proposal[E20010116_1]
    Careful Discretion Proposal - Asia/Pac Regional Order Handling definitions
    After discussion the Asia/Pac Regional Steering Committee proposed the following permanent definitions for Order Handling on Jan 16, 2001:

    DEALER INSTRCTION FIX ORDER TYPE/EXEC INST
    1) Careful Discretion = Market/Over the Day
    2) Market = Market/Held
    3) Trader Discretion = Market/Not Held

    Add to “Asia/Pac Regional Order Handling” section in new “Order Handling and Instruction Semantics” Appendix (rename Appendix E).
    4/25/2001Quote Request, Quote Cancel Market Data Request, New Order - List:[E20000817_3]
    Several messages’ SecurityType description erroneously refer to non-existent RelatedSymTag
    Modify Quote Request, Quote Cancel, Market Data Request, and New Order - List message’s SecurityType description replacing:

    “If a Future, RelatedSym, SecurityType, and MaturityMonthYear are required. If an Option: RelatedSym, SecurityType, MaturityMonthYear, PutOrCall, and StrikePrice are required.”
    With:
    “If a Future, Symbol, SecurityType, and MaturityMonthYear are required. If an Option: Symbol, SecurityType, MaturityMonthYear, PutOrCall, and StrikePrice are required.” Replacing references to non-existent “RelatedSym” field with “Symbol”.
    4/25/20014.1 too[E20000412_1]
    Add "Copyright FIX Protocol Ltd" to the specification doc
    Add "Copyright FIX Protocol Ltd" to the specification doc
    4/25/2001[E19990525_1]
    Clarify Logout message language regarding messages sent after Logout
    Replace "The logout initiator should not send any message after the logout" with "After sending the Logout message, the logout initiator should not send any messages unless requested to do so by the logout acceptor via a ResendRequest" in Logout message definition.
    4/25/2001[E19990823_1]
    MaturityMonthYear must be specified if MaturityDay is used
    If one sends MaturityDay, one should also send MaturityMonthYear. The premise behind why these were split was a requirement to be able to refer to "March 2000" S&P's without having to know and specify the exact date. We split them to avoid having to support some sort of "dummy" day value in a normal date format. This provides the ability to provide a specific date (by using MaturityMonthYear and Maturity Day) or a commonly agreed and well understood representation of MaturityMonthYear.

    Added to MaturityMonthYear references “Required if MaturityDay is specified.” Added to UnderlyingMaturityMonthYear references “Required if UnderlyingMaturityDay is specified.”
    4/25/2001[E19990831_1]
    Clarify that all tags must have a value
    Added “All tags must have a value specified. Optional fields without values should simply not be specified in the FIX message. A Reject message is the appropriate response to a tag with no value.” to “FIX MESSAGE FORMAT AND DELIVERY” section’s “Message Format” subsection.
    4/25/2001ClOrdID uniquness[E19990430_6]
    ClOrdID uniqueness clarification
    ClOrdID uniqueness needs to be better defined to accommodate OnBehalfOfCompID/DeliverToCompID processing and Good Till (GT) orders.

    Modify the Field Definition Section for ClOrdID replacing:

    “Unique identifier for Order as assigned by institution. Uniqueness must be guaranteed within a single trading day. Firms which electronically submit multi-day orders should consider embedding a date within the ClOrdID field to assure uniqueness across days.”
    With:
    “Unique identifier for Order (including order cancel and order Cancel/replace) as assigned by institution (identified by SenderCompID or OnBehalfOfCompID as appropriate). Uniqueness must be guaranteed within a single trading day. Firms, particularly those which electronically submit multi-day orders, trade globally or throughout market close periods, should ensure uniqueness across days, for example by embedding a date within the ClOrdID field.”
    4/25/2001Field Definitions[E19990129_26]
    Clarify that ClientID is not a substitute for OnBehalfOfCompID or DeliverToCompID
    Modify the definition of ClientID replacing:

    "Used for firm identification in third-party transactions".
    With:
    "Used for firm identification in third-party transactions (should not be a substitute for OnBehalfOfCompID/DeliverToCompID)".
    4/25/2001[E20010412_3]
    Clarify that if OnBehalfOfCompID or DeliverToCompID message source identification/routing is to be used then it must be used on all Application messages
    Add to “Standard Message header”:

    “Note that if OnBehalfOfCompID or DeliverToCompID message source identification/routing is used for a FIX session, then it must be used on all Application messages transmitted via that session accordingly (Reject message if not).”
    4/25/2001[E19990706_3]
    Clarify EndSeqNum value to match a client's ResendRequest vs. what one side views as end
    Replaced:

    “The sending application will initiate the sequence reset. The message in all situations specifies NewSeqNo to reset as the value of the next sequence number to be transmitted.”
    With:
    “The sending application will initiate the sequence reset. The message in all situations specifies NewSeqNo as the value of the next sequence number immediately following the messages and/or sequence numbers being skipped.”
    4/26/2001How to handle invalid Logon[E20001219_1]
    Clarify that sending a Logout message is optional if authentication fails
    Replaced

    “If authentication fails, the session acceptor should shut down the connection.”
    With:
    “If authentication fails, the session acceptor should shut down the connection after optionally sending a Logout message to indicate the reason of failure. Sending a Logout in this case is not required because doing so would consume a sequence number for that session, which in some cases may be problematic.”
    4/30/2001[E19990616_1]
    Clarify definition of Handlnst values
    Added “Handling Instructions (HandlInst) field” to Appendix E – Order Handling and Instructions Semantics.
    5/1/2001Request for PDF version of spec.[E20001129_1]
    Consider posting the specifications in PDF format as well as WORD format.
    We currently have an HTML version in addition to the Word format.

    Use Adobe Acrobat to create a PDF format as well for future versions.

    Back to top ↑

    Introduction

    The Financial Information Exchange (FIX) Protocol is a message standard developed to facilitate the electronic exchange of information related to securities transactions. It is intended for use between trading partners wishing to automate communications.

    The message protocol, as defined, will support a variety of business functions. FIX was originally defined for use in supporting US domestic equity trading with message traffic flowing directly between principals. As the protocol evolved, a number of fields were added to support limited cross-border and fixed income trading. Similarly, the protocol was expanded to allow third parties to participate in the delivery of messages between trading partners. As subsequent versions of FIX are released, it is expected that functionality will continue to expand.

    FIX was written to be independent of any specific communications protocol (X.25, asynch, TCP/IP, etc.) or physical medium (copper, fiber, satellite, etc.) chosen for electronic data delivery. It should be noted that if an “unreliable” or non-stream protocol is used, the Logon, Logout, and ResendRequest message processing is particularly susceptible to unordered delivery and/or message loss.

    The protocol is defined at two levels: session and application. The session level is concerned with the delivery of data while the application level defines business related data content. This document is organized to reflect the distinction.


    Back to top ↑

    FIX Message Format and Delivery

    The following section summarizes general specifications for constructing and transmitting FIX messages.

    Message Format

    The general format of a FIX message is a standard header followed by the message body fields and terminated with a standard trailer.

    Each message is constructed of a stream of <tag>=<value> fields with a field delimiter between fields in the stream. All tags must have a value specified. Optional fields without values should simply not be specified in the FIX message. A Reject message is the appropriate response to a tag with no value.

    Except where noted, fields within a message can be defined in any sequence sequence (Relative position of a field within a message is inconsequential.) The exceptions to this rule are:

    1. General message format is composed of the standard header followed by the body followed by the standard trailer.

    2. The first three fields in the standard header are BeginString (tag #8) followed by BodyLength (tag #9) followed by MsgType (tag #35).

    3. The last field in the standard trailer is the CheckSum (tag #10).

    4. Fields within repeating data groups must be specified in the order that the fields are specified in the message definition within the FIX specification document. The NoXXX field where XXX is the field being counted specifies the number of repeating group instances that must immediately precede the repeating group contents.

    In addition, certain fields of the data type MultipleValueString can contain multiple individual values separated by a space within the "value" portion of that field followed by a single "SOH" character (e.g. "18=2 9 C<SOH>" represents 3 individual values: '2', '9', and 'C').

    It is also possible for a field to be contained in both the clear text portion and the encrypted data sections of the same message. This is normally used for validation and verification. For example, sending the SenderCompID in the encrypted data section can be used as a rudimentary validation technique. In the cases where the clear text data differs from the encrypted data, the encrypted data should be considered more reliable. (A security warning should be generated).

    Field Delimiter

    All fields (including those of data type data i.e. SecureData, RawData, SignatureData, XmlData, etc.) in a FIX message are terminated by a delimiter character. The non-printing, ASCII "SOH" (#001, hex: 0x01, referred to in this document as <SOH>), is used for field termination. Messages are delimited by the “SOH” character following the CheckSum field. All messages begin with the “8=FIX.x.y<SOH>” string and terminate with “10=nnn<SOH>“.

    There shall be no embedded delimiter characters within fields except for data type data.

    Repeating Groups

    It is permissible for fields to be repeated within a repeating group (e.g. "384=2<SOH>372=6<SOH>385=R<SOH>372=7<SOH>385=R<SOH>" represents a repeating group with two repeating instances “delimited” by tag 372 (first field in the repeating group.).

    • If the repeating group is used, the first field of the repeating group is required. This allows implementations of the protocol to use the first field as a "delimiter" indicating a new repeating group entry.

    • The NoXXX field which specifies the number of repeating group instances occurs once for a repeating group and must immediately precede the repeating group contents.

    • If a repeating group field is listed as required, then it must appear in every repeated instance of that repeating group.

    • Repeating groups are designated within the message definition via indentation and the 🡪 symbol.

    Some repeating groups are nested within another repeating group (potentially more than one level of nesting).

    • Nested repeating groups are designated within the message definition via indentation and the 🡪 symbol followed by another 🡪 symbol..

    • If a nested repeating group is used, then the outer repeating group must be specified

    Data Types

    Data types (with the exception of those of type "data") are mapped to ASCII strings as follows:

    int

    Sequence of digits without commas or decimals and optional sign character (ASCII characters "-" and "0" - "9"). The sign character utilizes one byte (i.e. positive int is "99999" while negative int is "-99999"). Note that int values may contain leading zeros (e.g. “00023” = “23”).

    Examples:

    • 723 in field 21 would be mapped int as |21=723|.
    • -723 in field 12 would be mapped int as |12=-723|

    float

    Sequence of digits with optional decimal point and sign character (ASCII characters "-", "0" - "9" and "."); the absence of the decimal point within the string will be interpreted as the float representation of an integer value. All float fields must accommodate up to fifteen significant digits. The number of decimal places used should be a factor of business/market needs and mutual agreement between counterparties. Note that float values may contain leading zeros (e.g. “00023.23” = “23.23”) and may contain or omit trailing zeros after the decimal point (e.g. “23.0” = “23.0000” = “23”).

    Qty

    float field (see definition of "float" above) capable of storing either a whole number (no decimal places) of "shares" or a decimal value containing decimal places for non-share quantity asset classes.

    Price

    float field (see definition of "float" above) representing a price. Note the number of decimal places may vary.

    PriceOffset

    float field (see definition of "float" above) representing a price offset, which can be mathematically added to a "Price". Note the number of decimal places may vary and some fields such as LastForwardPoints may be negative.

    Amt

    float field (see definition of "float" above) typically representing a Price times a Qty.

    char

    Single character value, can include any alphanumeric character or punctuation except the delimiter. All char fields are case sensitive (i.e. mM).

    Boolean

    A char field (see definition of "char" above) containing one of two values:

    • 'Y' = True/Yes
    • 'N' = False/No

    String

    Alpha-numeric free format strings, can include any character or punctuation except the delimiter. All char fields are case sensitive (i.e. morstattMorstatt).

    MultipleValueString

    String field (see definition of "String" above) containing one or more space delimited values.

    Currency

    String field (see definition of "String" above) representing a currency type.

    Valid values:

    Exchange

    String field (see definition of "String" above) representing a market or exchange.

    Valid values:

    UTCTimestamp

    Time/date combination represented in UTC (Universal Time Coordinated, also known as "GMT") in either YYYYMMDD-HH:MM:SS (whole seconds) or YYYYMMDD-HH:MM:SS.sss (milliseconds) format, colons, dash, and period required.

    Valid values:

    • YYYY = 0000-9999, MM = 01-12, DD = 01-31, HH = 00-23, MM = 00-59, SS = 00-60 (60 only if UTC leap second) (without milliseconds).
    • YYYY = 0000-9999, MM = 01-12, DD = 01-31, HH = 00-23, MM = 00-59, SS = 00-60 (60 only if UTC leap second), sss=000-999 (indicating milliseconds).

    Leap Seconds: Note that UTC includes corrections for leap seconds, which are inserted to account for slowing of the rotation of the earth. Leap second insertion is declared by the International Earth Rotation Service (IERS) and has, since 1972, only occurred on the night of Dec. 31 or Jun 30. The IERS considers March 31 and September 30 as secondary dates for leap second insertion, but has never utilized these dates. During a leap second insertion, a UTCTimestamp field may read "19981231-23:59:59", "19981231-23:59:60", "19990101-00:00:00". (see http://tycho.usno.navy.mil/leapsec.html)

    UTCTimeOnly

    Time-only represented in UTC (Universal Time Coordinated, also known as "GMT") in either HH:MM:SS (whole seconds) or HH:MM:SS.sss (milliseconds) format, colons, and period required.

    Valid values:

    • HH = 00-23, MM = 00-60 (60 only if UTC leap second), SS = 00-59. (without milliseconds)
    • HH = 00-23, MM = 00-59, SS = 00-60 (60 only if UTC leap second), sss=000-999 (indicating milliseconds).

    LocalMktDate

    Date of Local Market (vs. UTC) in YYYYMMDD format.

    Valid values:

    • YYYY = 0000-9999, MM = 01-12, DD = 01-31.

    UTCDate

    Date represented in UTC (Universal Time Coordinated, also known as "GMT") in YYYYMMDD format.

    Valid values:

    • YYYY = 0000-9999, MM = 01-12, DD = 01-31.

    data

    Raw data with no format or content restrictions. Data fields are always immediately preceded by a length field. The length field should specify the number of bytes of the value of the data field (up to but not including the terminating SOH). Caution: the value of one of these fields may contain the delimiter (SOH) character. Note that the value specified for this field should be followed by the delimiter (SOH) character as all fields are terminated with an "SOH".

    month-year

    char field representing month of a year in YYYYMM format

    Valid values:

    • YYYY = 0000-9999, MM = 01-12.

    day-of-month

    int field representing a particular day of a month.

    Valid values:

    • 1-31.

    Sequence Numbers

    All FIX messages are identified by a unique sequence number. Sequence numbers are initialized at the start of each FIX session (see Session Protocol section) starting at 1 (one) and increment throughout the session. Monitoring sequence numbers will enable parties to identify and react to missed messages and to gracefully synchronize applications when reconnecting during a FIX session.

    Each session will establish an independent incoming and outgoing sequence series; participants will maintain a sequence series to assign to outgoing messages and a separate series to monitor for sequence gaps on incoming messages.

    Heartbeats

    During periods of message inactivity, FIX applications will generate Heartbeat messages at regular time intervals. The heartbeat monitors the status of the communication link and identifies incoming sequence number gaps. The Heartbeat Interval is declared by the session initiator using the HeartBtInt field in the Logon message. The heartbeat interval timer should be reset after every message is transmitted (not just heartbeats). The HeartBtInt value should be agreed upon by the two firms and specified by the Logon initiator and echoed back by the Logon acceptor. Note that the same HeartBtInt value is used by both sides, the Logon “initiator” and Logon “acceptor”.

    Ordered Message Processing

    The FIX protocol assumes complete ordered delivery of messages between parties. Implementers should consider this when designing message gap fill processes. Two options exist for dealing with gaps, either request all messages subsequent to the last message received or ask for the specific message missed while maintaining an ordered list of all newer messages. For example, if the receiver misses the second of five messages, the application could ignore messages 3 through 5 and generate a resend request for messages 2 through 5, or, preferably 2 through 0 (where 0 represents infinity). Another option would involve saving messages 3 through 5 and resending only message 2. In both cases, messages 3 through 5 should not be processed before message 2.

    Possible Duplicates

    When a FIX engine is unsure if a message was successfully received at its intended destination or when responding to a resend request, a possible duplicate message is generated. The message will be a retransmission (with the same sequence number) of the application data in question with the PossDupFlag included and set to "Y" in the header. It is the receiving application's responsibility to handle the message (i.e. treat as a new message or discard as appropriate). All messages created as the result of a resend request will contain the PossDupFlag field set to “Y”, messages lacking the PossDupFlag field or with the PossDupFlag field set to “N” should be treated as original transmissions. Note: When retransmitting a message with the PossDupFlag set to Y, it is always necessary to recalculate the CheckSum value. The only fields that can change in a possible duplicate message are the CheckSum, OrigSendingTime, SendingTime, BodyLength and PossDupFlag. Fields related to encryption (SecureDataLen and SecureData) may also require recasting.

    Possible Resends

    Ambiguous application level messages may be resent with the PossResend flag set. This is useful when an order remains unacknowledged for an inordinate length of time and the end-user suspects it had never been sent. The receiving application must recognize this flag and interrogate internal fields (order number, etc.) to determine if this order has been previously received. Note: The possible resend message will contain exactly the same body data but will have the PossResend flag and will have a new sequence number. In addition the CheckSum field will require recalculation and fields related to encryption (SecureDataLen and SecureData) may also require recasting.

    Data Integrity

    The integrity of message data content can be verified in two ways: verification of message length and a simple checksum of characters.

    The message length is indicated in the BodyLength field and is verified by counting the number of characters in the message following the BodyLength field up to, and including, the delimiter immediately preceding the CheckSum tag ("10=").

    The CheckSum integrity check is calculated by summing the binary value of each character from the “8” of “8=“ up to and including the <SOH> character immediately preceding the CheckSum tag field and comparing the least significant eight bits of the calculated value to the CheckSum value (see Appendix B - CheckSum Calculation for a complete description).

    Required Fields

    Each message within the protocol is comprised of required, optional and conditionally required (fields which are required based on the presence or value of other fields) fields. Systems should be designed to operate when only the required and conditionally required fields are present.

    Message Acknowledgment

    The FIX session protocol is based on an optimistic model; normal delivery of data is assumed (i.e. no acknowledgment of individual messages) with errors in delivery identified by message sequence number gaps. Each message is identified by a unique sequence number. It is the receiving application's responsibility to monitor incoming sequence numbers to identify message gaps for response with resend request messages.

    The FIX protocol does not support individual message acknowledgment. However, a number of application messages require explicit application level acceptance or rejection. Orders, cancel requests, cancel/replace requests and allocation require specific application level response, executions can be rejected with the DK message but do not require explicit acceptance.

    Encryption

    The exchange of sensitive data across public carrier networks may make it advisable to employ data encryption techniques to mask the application messages.

    The choice of encryption method will be determined by mutual agreement of the two parties involved in the connection.

    Any field within a message can be encrypted and included in the SecureData field, however, certain explicitly identified fields must be transmitted unencrypted. The clear (unencrypted) fields can be repeated within the SecureData field to serve as an integrity check of the clear data.

    When encryption is employed, it is recommended but not required that all fields within the message body be encrypted. If repeating groups are used within a message and encryption is applied to part of the repeating group, then the entire repeating group must be encrypted.

    Embedded in the protocol are fields, which enable the implementation of a public key signature and encryption methodology, straight DES encryption and clear text. The previously agreed upon encryption methodology is declared in the Logon message. (For more detail on implementation of various encryption techniques see the application notes section on the FIX Web Site.)

    User Defined Fields

    In order to provide maximum flexibility for its users, the FIX protocol accommodates User Defined Fields. These fields are intended to be implemented between consenting trading partners and should be used with caution to avoid conflicts, which will arise as multiple parties begin begin implementation of the protocol. It is suggested that if trading partners find that particular User Defined Fields add value, they should be recommended to the FIX Technical Committee for inclusion in a future FIX version.

    The tag numbers 5000 to 9999 have been reserved for use with user defined fields.

    The tag numbers 5000 to 9999 have been reserved for use with user defined fields, which are used as part of inter-firm communcation. These tags can be registered/reserved via the FIX website. The tag numbers greater than or equal to 10000 have been reserved for internal use (within a single firm) and do not need to be registered/reserved via the FIX website.


    Back to top ↑

    Session Protocol

    A FIX session is defined as a bi-directional stream of ordered messages between two parties within a continuous sequence number series. A single FIX session can exist across multiple physical connections. Parties can connect and disconnect multiple times while maintaining a single FIX session. Connecting parties must bi-laterally agree as to when sessions are to be started/stopped based upon individual system and time zone requirements. It is recommended that a new FIX session be established once within each 24 hour period. It is possible to maintain 24 hour connectivity and establish a new set of sequence numbers by sending a Logon message with the ResetSeqNumFlag set.

    The FIX session protocol is based on an optimistic model. Normal delivery of data is assumed (i.e. no communication level acknowledgment of individual messages) with errors in delivery identified by message sequence number gaps. This section provides details on the implementation of the FIX session layer and dealing with message sequence gaps.

    The following terms are used throughout this section:

    • Valid FIX Message is a message that is properly formed according to this specification and contains a valid body length and checksum field

    • Initiator establishes the telecommunications link and initiates the session via transmission of the initial Logon message.

    • Acceptor is the receiving party of the FIX session. This party has responsibility to perform first level authentication and formally declare the connection request “accepted” through transmission of an acknowledgment Logon message.

    A FIX session is comprised of three parts: logon, message exchange and logout.


    Logon

    Establishing a FIX connection involves three distinct operations: creation of a telecommunications level link, authentication/acceptance of the initiator by the acceptor and message synchronization (initialization). The sequence of connection follows:

    • The session initiator establishes a telecommunication link with the session acceptor.

    • The initiator sends a Logon message. The acceptor will authenticate the identity of the initiator by examining the Logon message. The Logon message will contain the data necessary to support the previously agreed upon authentication method. If the initiator is successfully authenticated, the acceptor responds with a Logon message. If authentication fails, the session acceptor should shut down the connection after optionally sending a Logout message to indicate the reason of failure. Sending a Logout in this case is not required because doing so would consume a sequence number for that session, which in some cases may be problematic. The session initiator may begin to send messages immediately following the Logon message, however, the acceptor may not be ready to receive them. The initiator must wait for the confirming Logon message from the acceptor before declaring the session fully established.

    • The initiator sends a Logon message. The acceptor will authenticate the identity of the initiator by examining the Logon message. The Logon message will contain the data necessary to support the previously agreed upon authentication method. If the initiator is successfully authenticated, the acceptor responds with a Logon message. If authentication fails, the session acceptor should shut down the connection after optionally sending a Logout message to indicate the reason of failure. Sending a Logout in this case is not required because doing so would consume a sequence number for that session, which in some cases may be problematic. The session initiator may begin to send messages immediately following the Logon message, however, the acceptor may not be ready to receive them. The initiator must wait for the confirming Logon message from the acceptor before declaring the session fully established.

    • After the initiator has been authenticated, the acceptor will respond immediately with a confirming Logon message. Depending on the encryption method being used for that session, this Logon message may or may not contain the same session encryption key. The initiator side will use the Logon message being returned from the acceptor as confirmation that a FIX session has been established. If the session acceptor has chosen to change the session encryption key, the session initiator must send a third Logon back to the other side in order to acknowledge the key change request. This also allows the session acceptor to know when the session initiator has started to encrypt using the new session key. Both parties are responsible for infinite loop detection and prevention during this phase of the session.

    • After authentication, the initiator and acceptor must synchronize their messages through interrogation of the MsgSeqNum field before sending any queued or new messages. A comparison of the MsgSeqNum in the Logon message to the internally monitored next expected sequence number will indicate any message gaps. Likewise, the initiator can detect gaps by comparing the acknowledgment Logon message MsgSeqNum to the next expected value. The section on message recovery later in this document deals with message gap handling.

    • It is recommended to wait a short period of time following the Logon or to send a TestRequest and wait for a response to it before sending queued or new messages in order to allow both sides to handle resend request processing. Failure to do this could result in a ResendRequest message being issued by one’s counterparty for each queued or new message sent.

    • It is also recommended that an engine should store out of sequence messages in a temporary queue and process them in order when the gap is closed. This prevents generating resend requests for n->m, n->m+1, n->m+2, ... which can result in many resent PossDupFlag=Y messages.

    • When using the ResetSeqNumFlag to maintain 24 hour connectivity and establish a new set of sequence numbers, the process should be as follows. Both sides should agree on a reset time and the party that will be the initiator of the process. Note that the initiator of the ResetSeqNum process may be different than the initiator of the Logon process. One side will initiate the process by sending a TestRequest and wait for a Heartbeat in response to ensure of no sequence number gaps. Once the Heartbeat has been received, the initiator should send a Logon with ResetSeqNumFlag set to Y and with MsgSeqNum of 1. The acceptor should respond with a Logon with ResetSeqNumFlag set to Y and with MsgSeqNum of 1. At this point new messages from either side should continue with MsgSeqNum of 2. It should be noted that once the initiator sends the Logon with the ResetSeqNumFlag set, the acceptor must obey this request and the message with the last sequence number transmitted “yesterday” may no longer be available. The connection should be shutdown and manual intervention taken, if this process is initiated but not followed properly.


    Message Exchange

    After completion of the initialization process, normal message exchange begins. The formats for all valid messages are detailed in the sections 'Administrative Messages' and 'Application Messages'.


    Logout

    Normal termination of the message exchange session will be completed via the exchange of Logout messages. Termination by other means should be considered an abnormal condition and dealt with as an error. Session termination without receiving a Logout should treat the counterparty as logged out.

    It is recommended that before sending the Logout message, a TestRequest should be issued to force a Heartbeat from the other side. This helps to ensure that there are no sequence number gaps.

    Before actually closing the session, the Logout initiator should wait for the opposite side to respond with a confirming Logout message. This gives the acceptor a chance to perform any Gap Fill operations that may be necessary. Once the messages from the ResendRequest have been received, the acceptor should issue the Logout. The session may be terminated if the acceptor does not respond in an appropriate timeframe.

    Note: Logging out does not affect the state of any orders. All active orders will continue to be eligible for execution after logout.


    Message Recovery

    During initialization, or in the middle of a FIX session, message gaps may occur which are detected via the tracking of incoming sequence numbers. The following section provides details on how to recover messages.

    As previously stated, each FIX participant must maintain two sequence numbers for each FIX session, one each for incoming and outgoing messages which are initialized at ‘1’ at the beginning of the FIX session. Each message is assigned a unique (by connection) sequence number, which is incremented after each message. Likewise, every message received has a unique sequence number and the incoming sequence counter is incremented after each message.

    When the incoming sequence number does not match the expected number corrective processing is required. Note that the SeqReset-Reset message (used only to recover from a disaster scenario vs. normal resend request processing) is an exception to this rule as it should be processed without regards to its MsgSeqNum. If the incoming message has a sequence number less than expected and the PossDupFlag is not set, it indicates a serious error. It is strongly recommended that the session be terminated and manual intervention be initiated. If the incoming sequence number is greater than expected, it indicates that messages were missed and retransmission of the messages is requested via the Resend Request (see the earlier section, Ordered Message Processing.

    Note: For the purposes of the following paragraphs requester refers to the party requesting the resend and resender refers to the party responding to the request. The process of resending and synchronizing messages is referred as “gap filling”.

    Upon receipt of a Resend Request, the resender can respond in one of three ways:

    1. retransmit the requested messages (in order) with the original sequence numbers and PossDupFlag set to “Y”

    2. issue a SeqReset-GapFill with PossDupFlag set to “Y” message to replace the retransmission of administrative and application messages

    3. issue a SeqReset-Reset with PossDupFlag set to “Y” to force sequence number synchronization

    During the gap fill process, certain administrative messages should not be retransmitted. Instead, a special SeqReset-GapFill message is generated. The administrative messages which are not to be resent are: Logon, Logout, ResendRequest, Heartbeat, TestRequest and SeqReset-Reset and SeqReset-GapFill. The SeqReset-GapFill can also be used to skip application messages that the sender chooses not to retransmit (e.g. aged orders). This leaves Reject as the only administrative message- which can be resent.

    All FIX implementations must monitor incoming messages to detect inadvertently retransmitted administrative messages (PossDupFlag flag set indicating a resend). When received, these messages should be processed for sequence number integrity only; the business/application processing of these message should be skipped (e.g. do not initiate gap fill processing based on a resent ResendRequest).

    If there are consecutive administrative messages to be resent, it is suggested that only one SeqReset-GapFill message be sent in their place. The sequence number of the SeqReset-GapFill message is the next expected outbound sequence number. The NewSeqNo field of the GapFill message contains the sequence number of the highest administrative message in this group plus 1. For example, during a Resend operation there are 7 sequential administrative messages waiting to be resent. They start with sequence number 9 and end with sequence number 15. Instead of transmitting 7 Gap Fill messages (which is perfectly legal, but not network friendly), a SeqReset-GapFill message may be sent. The sequence number of the Gap Fill message is set to 9 because the remote side is expecting that as the next next sequence number. The NewSeqNo field of the GapFill message contains the number 16, because that will be the sequence number of the next message to be transmitted.

    Sequence number checking is a vital part of FIX session management. However, a discrepancy in the sequence number stream is handled differently for certain classes of FIX messages. The table below lists the actions to be taken when the incoming sequence number is greater than the expected incoming sequence number.

    NOTE: In *ALL* cases except the Sequence Reset - Reset message, the FIX session should be terminated if the incoming sequence number is less than expected and the PossDupFlag is not set. A Logout message with some descriptive text should be sent to the other side before closing the session.

    Response by Message Type

    Message TypeAction to Be Taken on Sequence # mismatch
    LogonMust always be the first message transmitted. Authenticate and accept the connection. After sending a Logon confirmation back, send a ResendRequest if a message gap was detected in the Logon sequence number.
    LogoutIf a message gap was detected, issue a ResendRequest to retrieve all missing messages followed by a Logout message which serves as a confirmation of the logout request. DO NOT terminate the session. The initiator of the Logout sequence has responsibility to terminate the session. This allows the Logout initiator to respond to any ResendRequest message. If this side was the initiator of the Logout sequence, then this is a Logout confirmation and the session should be immediately terminated upon receipt. The only exception to the “do not terminate the session” rule is for an invalid Logon attempt. The session acceptor has the right to send a Logout message and terminate the session immediately. This minimizes the threat of unauthorized connection attempts.
    ResendRequestPerform the Resend processing first, followed by a ResendRequest of your own in order to fill the incoming message gap.
    SeqReset-ResetIgnore the incoming sequence number. The NewSeqNo field of the SeqReset message will contain the sequence number of the next message to be transmitted.
    SeqReset-GapFillSend a ResendRequest back. Gap Fill messages behave similar to a SeqReset message. However, it is important to insure that no messages have been inadvertently skipped over. This means that GapFill messages must be received in sequence. An out of sequence GapFill is an abnormal condition
    All Other MessagesPerform Gap Fill operations.

    Standard Message Header

    Each administrative or application message is preceded by a standard header. The header identifies the message type, length, destination, sequence number, origination point and time.

    Two fields help with resending messages. The PossDupFlag is set to Y when resending a message as the result of a session level event (i.e. the retransmission of a message reusing a sequence number). The PossResend is set to Y when reissuing a message with a new sequence number (e.g. resending an order). The receiving application should process these messages as follows:

    • PossDupFlag—if a message with this sequence number has been previously received, ignore message, if not, process normally.
    • PossResend—forward message to application and determine if previously received (i.e. verify order id and parameters).

    Note that if OnBehalfOfCompID or DeliverToCompID message source identification/routing is used for a FIX session, then it must be used on all Application messages transmitted via that session accordingly (Reject message if not).

    The following table provides examples regarding the use of SenderCompID, TargetCompID, DeliverToCompID, and OnBehalfOfCompID when using a single point-to-point FIX session between two firms. Assumption (A=sellside, B =buyside):

    SenderCompIDOnBehalfOfCompIDTargetCompIDDeliverToCompID
    A to B directlyAB
    B to A directlyBA

    The following table provides examples regarding the use of SenderCompID, TargetCompID, DeliverToCompID, and OnBehalfOfCompID when using a single FIX session to represent multiple firms. Assumption (A=sellside, B and C=buyside, Q=third party):

    SenderCompIDOnBehalfOfCompIDTargetCompIDDeliverToCompIDOnBeahlfOfSendingTime
    Send from A to B via Q
    1)A sends to QAQB
    2)Q sends to BQABA’s SendingTime
    B responds to A via Q
    1)B sends to QBQA
    2)Q sends to AQBAB’s SendingTime
    Send from A to B *AND* C via Q
    1)A sends to QAQB
    2)Q sends to BQABA’s SendingTime
    3)A sends to QAQC
    4)Q sends to CQACA’s SendingTime
    B *AND* C send to A via Q
    1)B sends to QBQA
    2)Q sends to AQBAB’s SendingTime
    3)C sends to QCQA
    4)Q sends to AQCAC’s SendingTime

    Standard Message Trailer

    Each message, administrative or application, is terminated by a standard trailer. The trailer is used to segregate messages and contains the three digit character representation of the Checksum value.


    Back to top ↑

    Administrative Messages

    The administrative messages address the utility needs of the protocol. The following section describes each message and provides the message layout.

    Administrative messages will be generated from both sides of the connection.

    Heartbeat

    The Heartbeat monitors the status of the communication link and identifies when the last of a string of messages was not received.

    When either end of a FIX connection has not sent any data for [HeartBtInt] seconds, it will transmit a Heartbeat message. When either end of the connection has not received any data for (HeartBtInt + “some reasonable transmission time”) seconds, it will transmit a Test Request message. If there is still no Heartbeat message received after (HeartBtInt + “some reasonable transmission time”) seconds then the connection should be considered lost and corrective action be initiated. If HeartBtInt is set to zero then no regular heartbeat messages will be generated. Note that a test request message can still be sent independent of the value of the HeartBtInt, which will force a Heartbeat message.

    Heartbeats issued as the result of Test Request must contain the TestReqID transmitted in the Test Request message. This is useful to verify that the Heartbeat is the result of the Test Request and not as the result of a regular timeout.

    Logon

    The logon message authenticates a user establishing a connection to a remote system. The logon message must be the first message sent by the application requesting to initiate a FIX session.

    The HeartBtInt (108) field is used to declare the timeout interval for generating heartbeats (same value used by both sides). The HeartBtInt value should be agreed upon by the two firms and specified by the Logon initiator and echoed back by the Logon acceptor.

    Upon receipt of a Logon message, the session acceptor will authenticate the party requesting connection and issue a Logon message as acknowledgment that the connection request has been accepted. The acknowledgment Logon can also be used by the initiator to validate that the connection was established with the correct party.

    The session acceptor must be prepared to immediately begin processing messages after receipt of the Logon. The session initiator can choose to begin transmission of FIX messages before receipt of the confirmation Logon, however it is recommended that normal message delivery wait until after the return Logon is received to accommodate encryption key negotiation.

    The confirmation Logon can be used for encryption key negotiation. If a session key is deemed to be weak, a stronger session key can be suggested by returning a Logon message with a new key. This is only valid for encryption protocols that allow for key negotiation. (See the FIX Web Site’s Application notes for more information on a method for encryption and key passing.)

    The Logon message can be used to specify the MaxMessageSize supported (e.g. can be used to control fragmentation rules for very large messages which support fragmentation). It can also be used to specify the MsgTypes supported for both sending and receiving.

    Test Request

    The test request message forces a heartbeat from the opposing application. The test request message checks sequence numbers or verifies communication line status. The opposite application responds to the Test Request with a Heartbeat containing the TestReqID.

    The TestReqID verifies that the opposite application is generating the heartbeat as the result of Test Request and not a normal timeout. The opposite application includes the TestReqID in the resulting Heartbeat. Any string can be used as the TestReqID (one suggestion is to use a timestamp string).

    Resend Request

    The resend request is sent by the receiving application to initiate the retransmission of messages. This function is utilized if a sequence number gap is detected, if the receiving application lost a message, or as a function of the initialization process.

    The resend request can be used to request a single message, a range of messages or all messages subsequent to a particular message.

    Note: the sending application may wish to consider the message type when resending messages; e.g. if a new order is in the resend series and a significant time period has elapsed since its original inception, the sender may not wish to retransmit the order given the potential for changed market conditions. (The Sequence Reset-GapFill message is used to skip messages that a sender does not wish to resend.)

    Note: it is imperative that the receiving application process messages in sequence order, e.g. if message number 7 is missed and 8-9 received, the application should ignore 8 and 9 and ask for a resend of 7-9, or, preferably, 7-0 (0 represents infinity). This latter approach is strongly recommended to recover from out of sequence conditions as it allows for faster recovery in the presence of certain race conditions when both sides are simultaneously attempting to recover a gap.

    • To request a single message: BeginSeqNo = EndSeqNo
    • To request a range of messages: BeginSeqNo = first message of range, EndSeqNo = last message of range
    • To request all messages subsequent to a particular message: BeginSeqNo = first message of range, EndSeqNo = 0 (represents infinity) .

    Reject

    The reject message should be issued when a message is received but cannot be properly processed due to a session-level rule violation. An example of when a reject may be appropriate would be the receipt of a message with invalid basic data (e.g. MsgType=&) which successfully passes de-encryption, CheckSum and BodyLength checks. As a rule, messages should be forwarded to the trading application for business level rejections whenever possible.

    Rejected messages should be logged and the incoming sequence number incremented.

    Note: The receiving application should disregard any message that is garbled, cannot be parsed or fails a data integrity check. Processing of the next valid FIX message will cause detection of a sequence gap and a Resend Request will be generated. Logic should be included in the FIX engine to recognize the possible infinite resend loop which may be encountered in this situation.

    Generation and receipt of a Reject message indicates a serious error that may be the result of faulty logic in either the sending or receiving application.

    If the sending application chooses to retransmit the rejected message, it should be assigned a new sequence number and sent with PossResend=Y.

    Whenever possible, it is strongly recommended that the cause of the failure be described in the Text field (e.g. INVALID DATA - FIELD 35).

    If an application-level message received fulfills session-level rules, it should then be processed at a business message-level. If this processing detects a rule violation, a business-level reject should be issued. Many business-level messages have specific “reject” messages, which should be used. All others can be rejected at a business-level via the Business Message Reject message. See the Business Message Reject message

    Note that in the event a business message is received, fulfills session-level rules, however, the message cannot be communicated to the business-level processing system, a Business Message Reject with BusinessRejectReason = “Application not available at this time” should be issued.

    Scenarios for session-level Reject:

    SessionRejectReason
    0 = Invalid tag number
    1 = Required tag missing
    2 = Tag not defined for this message type
    3 = Undefined Tag
    4 = Tag specified without a value
    5 = Value is incorrect (out of range) for this tag
    6 = Incorrect data format for value
    7 = Decryption problem
    8 = Signature problem
    9 = CompID problem
    10 = SendingTime accuracy problem
    11 = Invalid MsgType
    (Note other session-level rule violations may exist in which case SessionRejectReason is not specified)

    Sequence Reset (Gap Fill)

    The sequence reset message is used by the sending application to reset the incoming sequence number on the opposing side. This message has two modes: “Sequence Reset-Gap Fill” when GapFillFlag is ‘Y’ and “Sequence Reset-Reset” when GapFillFlag is N or not present. The “Sequence Reset-Reset” mode should ONLY be used to recover from a disaster situation which cannot be otherwise recovered via “Gap Fill” mode. The sequence reset message can be used in the following situations:

    • During normal resend processing, the sending application may choose not to send a message (e.g. an aged order). The Sequence Reset – Gap Fill is used to mark the place of that message.
    • During normal resend processing, a number of administrative messages are not resent, the Sequence Reset – Gap Fill message is used to fill the sequence gap created.
    • In the event of an application failure, it may be necessary to force synchronization of sequence numbers on the sending and receiving sides via the use of Sequence Reset - Reset

    The sending application will initiate the sequence reset. The message in all situations specifies NewSeqNo to reset as the value of the next sequence number immediately following the messages and/or sequence numbers being skipped.

    If the GapFillFlag field is not present (or set to N), it can be assumed that the purpose of the sequence reset message is to recover from an out-of-sequence condition. The MsgSeqNum in the header should be ignored (i.e. the receipt of a Sequence Reset - Reset message with an out of sequence MsgSeqNum should not generate resend requests). Sequence Reset – Reset should NOT be used as a normal response to a Resend Request (use Sequence Reset – Gap Fill). The Sequence Reset – Reset should ONLY be used to recover from a disaster situation which cannot be recovered via the use of Sequence Reset – Gap Fill. Note that the use of Sequence Reset – Reset may result in the possibility of lost messages

    If the GapFillFlag field is present (and equal to Y), the MsgSeqNum should conform to standard message sequencing rules (i.e. the MsgSeqNum of the Sequence Reset-GapFill message should represent the beginning MsgSeqNum in the GapFill range because the remote side is expecting that next message).

    The sequence reset can only increase the sequence number. If a sequence reset is received attempting to decrease the next expected sequence number the message should be rejected and treated as a serious error. It is possible to have multiple ResendRequests issued in a row (i.e. 5 to 10 followed by 5 to 11). If sequence number 8, 10, and 11 represent application messages while the 5-7 and 9 represent administrative messages, the series of messages as result of the Resend Request may appear as SeqReset-GapFill with NewSeqNo of 8, message 8, SeqReset-GapFill with NewSeqNo of 10, and message 10. This could then followed by SeqReset-GapFill with NewSeqNo of 8, message 8, SeqReset-GapFill with NewSeqNo of 10, message 10, and message 11. One must be careful to ignore the duplicate SeqReset-GapFill which is attempting to lower the next expected sequence number. This can be detected by checking to see if its MsgSeqNum is less than expected. If so, the SeqReset-GapFill is a duplicate and should be discarded.

    Logout

    The logout message initiates or confirms the termination of a FIX session. Disconnection without the exchange of logout messages should be interpreted as an abnormal condition.

    Before actually closing the session, the logout initiator should wait for the opposite side to respond with a confirming logout message. This gives the remote end a chance to perform any Gap Fill operations that may be necessary. The session may be terminated if the remote side does not respond in an appropriate timeframe.

    After sending the Logout message, the logout initiator should not send any messages unless requested to do so by the logout acceptor via a ResendRequest.


    Back to top ↑

    Application Messages

    The exchange of business related information is accomplished through the passing of application messages. The application message is composed of the standard header followed by the message body and trailer.

    Descriptions and formats of the specific messages follow.

    Advertisements

    Advertisement messages are used to announce completed transactions. The advertisement message can be transmitted in various transaction types; NEW, CANCEL and REPLACE. All message types other than NEW modify the state of a previously transmitted advertisement identified in AdvRefID.

    Indications of Interest

    Indication of interest messages market merchandise which the broker is buying or selling in either a proprietary or agency capacity. The indications can be time bound with a specific expiration value. Indications are distributed with the understanding that other firms may react to the message first and that the merchandise may no longer be available due to prior trade.

    Indication messages can be transmitted in various transaction types; NEW, CANCEL, and REPLACE. All message types other than NEW modify the state of the message identified in IOIRefID.

    News

    The news message is a general free format message between the broker and institution. The message contains flags to identify the news item's urgency and to allow sorting by subject company (symbol). The News message can be originated at either the broker or institution side.

    Email

    The email message is similar to the format and purpose of to the News message, however, it is intended for private use between two parties.

    Quote Request

    In some markets it is the practice to request quotes from brokers prior to placement of an order. The quote request message is used for this purpose.

    Quotes can be requested on specific securities or forex rates.

    Securities quotes can be requested as either market quotes or for a specific quantity and side. If OrderQty and Side are absent, a market-style quote (bid x offer, size x size) will be returned.

    If the message is used for foreign exchange, conventions for identifying the forex transaction are as follows:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
      • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
      • e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
      • CCY1 and CCY2 are ISO currency codes
    • The value of the Currency field represents the denomination of the quantity fields (e.g. JPY represents quantity of JPY).
    • See Appendix O – Foreign Exchange Trading
    • Forex quotes can be requested as indicative or at a specific quantity level. If an indicative quote is requested (OrderQty and Side are absent), the broker has discretion to quote at either a specific trade level and side or to provide an indicative quote at the mid-point of the spread. The broker can also choose to respond to an indicative quote by sending multiple quote messages specifying various levels and sides.

    Quote

    The quote message is used as the response to a Quote Request message and can be used to publish unsolicited quotes.

    Quotes supplied as the result of a Quote Request message are tagged with the appropriate QuoteReqID, unsolicited quotes can be identified by the absence of a QuoteReqID.

    The symbol used for forex quotes is, in ISO codes, “currency1.currency2” (e.g. GBP.USD) and the quote will be returned as a rate expressed as currency1/currency2. BidPx indicates the rate at which the broker is willing to buy currency1 and deliver currency2, OfferPx indicates the rate at which the broker is willing to sell currency1 and receive currency2. Indicative rates are quoted in the BidPx field and may contain a level in the BidSize field.

    If the message is used for foreign exchange, conventions for identifying the forex transaction are as follows:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
      • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
      • e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
      • CCY1 and CCY2 are ISO currency codes
    • The value of the Currency field represents the denomination of the quantity fields (e.g. JPY represents quantity of JPY).
    • See Appendix O – Foreign Exchange Trading

    Orders can be generated based on Quotes. Quoted orders include the QuoteID and are OrdType=Previously Quoted or Forex - Previously Quoted.

    Example: Quote for Single Security
    QuoteID=XXX
    QuoteReqID=YYY
    Symbol=AA
    MaturyMonthYear=199901
    StrikePrice=25.00
    PutOrCall=1
    BixPx=5.00
    OfferPx=5.25
    BidSize=10
    OfferSize=10

    Mass Quote

    The Mass Quote message can contain quotes for multiple securities to support applications that allow for the mass quoting of an option series. Two levels of repeating groups have been provided to minimize the amount of data required to submit a set of quotes for a class of options (e.g. all option series for IBM).

    A QuoteSet specifies the first level of repeating tags for the Mass Quote message. It represents a group of related quotes and can, for example, represent an option class.

    Each QuoteSet contains an optional repeating group of QuoteEntries which can represent an option series.

    It is possible the number of Quote Entries for a Quote Set (option class) could exceed one’s physical or practical message size. It may be necessary to fragment a message across multiple quote messages. Message size limits must be mutually agreed to with one’s counterparties.

    The grouping of quotes is as follows:

    • NoQuoteSets – specifies the number of sets of quotes contained in the message
      • QuoteSetID – Is a unique ID given to the quote set
      • Information regarding the security to which all of the quotes belong
      • TotQuoteEntries – defines the number of quotes for the quote set across all messages
      • NoQuoteEntries – defines the number of quotes contained within this message for this quote set
        • QuoteEntryID – Is a unique ID given to a specific quote entry
        • Information regarding the specific quote (bid/ask size and price)

    If there are too many Quote Entries for a Quote Set to fit into one physical message, then the quotes can be continued in another Mass Quote message by repeating all of the QuoteSet information and then specifying the number of Quote Entries (related symbols) in the continued message. The TotQuoteEntries is provided to optionally indicate to the counterparty the total number of Quote Entries for a Quote Set in multiple quote messages. This permits, but does not require, a receiving application to react in a stateful manner where it can determine if it has received all quotes for a Quote Set before carrying out some action. However, the overall approach to fragmentation is to permit each mass quote message to be processed in a stateless manner as it is received. Each mass quote message should contain enough information to have the Quote Entries applied to a market without requiring the next message if fragmentation has occurred. Also, a continued message should not require any information from the previous message.

    Maximum message size for fragmentation purposes can be determined by using the optional MaxMessageSize field in the Logon message or by mutual agreement between counterparties.

    Requesting Acknowledgement for Mass Quotes

    Applications can optionally support acknowledgement of quotes using the QuoteResponseLevel tag. The QuoteResponseLevel is used to specify the level of acknowledgement requested from the counterparty. A QuoteResponseLevel of 0 indicates that no acknowledgement is requested. A ResponseLevel of 1 requests acknowledgement of invalid or erroneous quotes. A QuoteResponseLevel of 2 requests acknowledgement of each Mass Quote message.

    See Appendix H: Mass Quote Message Scenarios

    Notes on usage for Options Markets:

    It is assumed that for many options markets, the Mass Quote message will be used to generate quotes in high volumes in an unsolicited manner. This means that multiple quotes will be sent to the counterparty (an exchange) without acknowledgement. The Mass Quote message can be used to send quotes for multiple classes, each with multiple series.

    Example: Multiple Option Series for a single Option Class (No Fragmentation)

    • QuoteID=XXX
    • QuoteReqID=YYY
    • NoQuoteSets=1
      • QuoteSetID=1
      • Symbol=AA
      • TotQuoteEntries=2
      • NoQuoteEntries=2
      • Other quote set fields
      • QuoteEntryID=1
        • MaturyMonthYear=199901
        • StrikePrice=25.00
        • PutOrCall=1
        • BixPx=5.00
        • OfferPx=5.25
        • BidSize=10
        • OfferSize=10
      • QuoteEntryID=2
        • MaturyMonthYear=199901
        • StrikePrice=30.00
        • PutOrCall=1
        • BixPx=3.00
        • OfferPx=3.25
        • BidSize=10
        • OfferSize=10

    Example: Multiple Option Series for a single Option Class (Fragmentation)

    First Message:

    • QuoteID=XXX
    • QuoteReqID=YYY
    • NoQuoteSets=1
      • QuoteSetID=1
      • Symbol=AA
      • TotQuoteEntries=3
      • NoQuoteEntries=2
      • Other quote set fields
      • QuoteEntryID=1
        • MaturyMonthYear=199901
        • StrikePrice=25.00
        • PutOrCall=1
        • BixPx=5.00
        • OfferPx=5.25
        • BidSize=10
        • OfferSize=10
      • QuoteEntryID=2
        • MaturyMonthYear=199901
        • StrikePrice=30.00
        • PutOrCall=1
        • BixPx=3.00
        • OfferPx=3.25
        • BidSize=10
        • OfferSize=10

    Second Message:

    • QuoteID=XXX
    • QuoteReqID=YYY
    • NoQuoteSets=1
      • QuoteSetID=1
      • Symbol=AA
      • Other quote set fields
      • TotQuoteEntries=3
      • NoQuoteEntries=1
      • QuoteEntryID=3
        • MaturyMonthYear=199901
        • StrikePrice=35.00
        • PutOrCall=1
        • BixPx=2.00
        • OfferPx=2.25
        • BidSize=10
        • OfferSize=10

    Quote Cancel

    The Quote Cancel message is used by an originator of quotes to cancel quotes.

    The Quote Cancel message supports cancelation of:

    • All quotes
    • Quotes for a specific symbol or security ID
    • All quotes for a security type
    • All quotes for an underlying

    Canceling a Quote is acccomplished by indicating the type of cancelation in the QuoteCancelType field.

    The Quote Cancelation only applies to quotes made by the current FIX user.

    Option Usage:

    Normal usage would be to cancel the quotes for a symbol. This is the reason that the use of further nesting similar to the quote is not used in this message. You are able to cancel quotes for specific series by specifying each option series in the repeating group.

    It is recommended that all Cancel messages be acknowledged using the Quote Acknowledgement message

    Quote Status Request

    The quote status request message is used by the institution to generate an execution report that contains the quote status message back from the counterparty. It is used to retrieve the status of the originating party’s quotes and not to obtain market data information.

    Option Usage:

    Quote Acknowledgement

    An optional response to Quote, Mass Quote, Quote Cancel, and Quote Request message is the Quote Acknowledgement message. The use of the Quote Acknowledgement message is optional per Quote, Mass Quote, or Quote Request message. It is intended to provide application level acknowledgement of quotes. The level of response requested from a receiver of the Quote Acknowledgement message is specified in the QuoteResponseLevel tag.

    Market Data Request

    Some systems allow the transmission of real-time quote, order, trade and/or other price information on a subscription basis. A Market Data Request is a general request for market data on specific securities or forex quotes.

    A successful Market Data Request returns one or more Market Data messages containing one or more Market Data Entries. Each Market Data Entry is a Bid, an Offer, a Trade associated with a security, the opening, closing, or settlement price of a security, the value of an index, or the trading session high price, low price, or VWAP. Market Data Entries have a price and usually a quantity associated with them. For example, in an order book environment, requesting just the top of book will result in only two active Market Data Entries at a time – one for the best Bid and one for the best Offer. For a full book, the Bid and Offer side may each have several Market Data Entries. Each Market Data Entry might represent an aggregate for each price tier, and only one Market Data Entry per side per price would be active at a time. This is referred to as an Aggregated book. Or several Market Data Entries at one price tier could each represent a broker, Market Maker, ECN or Exchange’s quote in a security, or individual orders in a book. This is a Non-Aggregated book. Alternately, a Market Data Entry could represent a completed trade in a security, the value of an index, the opening, closing, or settlement price of an instrument, or the trading session high price, low price, or VWAP.

    If the message is used for foreign exchange, conventions for identifying the forex transaction are as follows:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
    • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
    • e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
    • CCY1 and CCY2 are ISO currency codes
    • The value of the Currency field represents the denomination of the quantity fields (e.g. JPY represents quantity of JPY).
    • See Appendix O – Foreign Exchange Trading

    A Snapshot causes the current state of the market to be sent. A Snapshot + Updates causes the current state of the market to be sent, and any updates as they occur, until the client requests that the Snapshot + Updates be disabled.

    When just a Snapshot is requested, the complete data for only one security or forex quote will be returned per FIX Market Data message.

    When Snapshot + Updates is requested, updates may be full or incremental:

    • Full Refresh. This mode is optimized to trade off increased bandwidth for simplicity in processing and is intended for requests on only a few instruments. Each FIX Market Data message in response to the request will contain the complete data requested for one instrument. If more than just the top of book is requested, this means that both sides, and all price tiers, must be reported in that Market Data message.
    • Incremental Refresh. This mode is optimized for handling requests for many instruments while conserving bandwidth. Each Market Data Entry is assigned an MDEntryID unique among all other active entries, and several incremental updates of entries for different instruments can be included in one FIX Market Data message.

    One specifies whether a list of trades, a 1-sided or 2-sided book, index, opening, closing, settlement, high, low and VWAP prices should be returned by using the NoMDEntryTypes field and MDEntryType repeating group to list all MDEntryType values that should be returned.

    While this document specifies many parameters and modes in a request, the recipient of the request is not required to support all of them. A Market Data Request Reject may be sent in response to a request indicating that it cannot be honored.

    Market Data – Snapshot / Full Refresh

    The Market Data messages are used as the response to a Market Data Request message. In all cases, one Market Data message refers only to one Market Data Request. It can be used to transmit a 2-sided book of orders or list of quotes, a list of trades, index values, opening, closing, settlement, high, low, or VWAP prices, or any combination of these.

    Market Data messages sent as the result of a Market Data Request message are tagged with the appropriate MDReqID. Unsolicited Market Data messages can be sent; in such cases, MDReqID will not be present.

    If the message is used for foreign exchange, conventions for identifying the forex transaction are as follows:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
    • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
    • e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
    • CCY1 and CCY2 are ISO currency codes
    • The value of the Currency field represents the denomination of the quantity fields (e.g. JPY represents quantity of JPY).
    • See Appendix O – Foreign Exchange Trading

    Market Data messages include many fields, and not all are required to be used. A firm may, at its option, choose to send the minimum fields required, or may choose to send more information, such as tick direction, tagging of best quotes, etc.

    Market Data messages can take two forms. The first Market Data message format used for a Snapshot, or a Snapshot + Updates where MDUpdateType = Full Refresh (0) is as follows:

    • For Market Data Requests where a Bid or Offer is added, changed, or deleted, every update to a Market Data Entry results in a new Market Data message that contains the entirety of the data requested for that instrument, not just the changed Market Data Entry. In other words, both sides of the market, or just one side in the case of a request of only bids or offers, for the depth requested, must be sent in one FIX Market Data message.
    • A Market Data message may contain several trades, an index value, opening, closing, settlement, high, low, and/or VWAP price for one instrument, but only one instrument per message.
    • Messages containing bids and/or offers cannot contain trades, index value, opening, closing, settlement, high, low, and/or VWAP prices.

    Market Data – Incremental Refresh

    The second Market Data message format is used for incremental updates. Market Data Entries may have an MDEntryID unique among all currently active Market Data Entries so they can be referenced for the purposes of deleting and changing them later. When changing a Market Data Entry, it may keep the same MDEntryID, in which case only MDEntryID would be populated, or the MDEntryID may change, in which case MDEntryID will contain the new ID, and MDEntryRefID will contain the ID of the Market Data Entry being changed. An MDEntryID can be reused within a day only if it has first been deleted.

    Alternately, in the case of displaying the best quotes of Market Makers or Exchanges, and not orders in an order book, MDEntryID can be omitted for simplification. In this case, a New Market Data Entry will replace the previous best quote for that side and symbol for the specified Market Maker or Exchange. Deletion of a Market Data Entry would not specify an MDEntryID or MDRefID, and would remove the most recent Market Data Entry for the specified symbol, side, and Market Maker or Exchange. A Change of a Market Data Entry would not specify an MDEntryID or MDRefID, and would replace the most recent Market Data Entry for the specified symbol, side, and Market Maker or Exchange.

    The Market Data message for incremental updates may contain any combination of new, changed, or deleted Market Data Entries, for any combination of instruments, with any combination of trades, quotes, index values, open, close, settlement, high, low, and VWAP prices, so long as the maximum FIX message size is not exceeded. All of these types of Market Data Entries can be changed and deleted.

    Adding, Changing, or Deleting Market Data Entries requires special consideration of the MDEntryPositionNo field, if the sender wishes to specify it and the receiver wishes to process it. For example, assume ten bids for a security. Adding a bid with MDEntryPositionNo = 4 requires the receiver to shift down other Market Data Entries, i.e. the Market Data Entry in the 4th display position will shift to the 5th, the 5th shifts to the 6th, etc. until the 10th shifts to the 11th. The sender must NOT send a modification of all MDEntries in the 4th through 10th positions just to update the MDEntryPositionNo field; the recipient must infer the change. Similarly, deleting a Market Data Entry in the 7th position causes the 8th Market Data Entry to move into the 7th position, the 9th to shift into the 8th position, etc. A Change of the MDEntryPositionNo field of a Market Data Entry causes the Market Data Entries lying between the old and new positions to shift. For instance, a Market Data Entry that occupied the 5th position is changed to the 8th position. This means that the Market Data Entry in the 6th position shifts up to the 5th position, the 7th position shifts to the 6th, and what was in the 8th position shifts into the 7th to make room for the changed Market Data Entry that is being moved into the 8th position.

    Several techniques are employed to conserve bandwidth:

    • An instrument only needs to be identified when a Market Data Entry is first created.
    • In cases where the identification of an instrument is long, the sender has the option of referring to a previous active Market Data Entry of the same instrument instead of duplicating the information.
    • A new Market Data Entry will default to the same instrument of the previous Market Data Entry in the same Market Data message if neither Symbol nor MDEntryRefID are specified.
    • In the case of a change in a Market Data Entry, only the fields changing need to be sent as part of the change to the Market Data Entry; for example, a change of the MDEntrySize but not the MDEntryPx or other attributes of the Market Data Entry only requires listing the MDEntrySize field, in addition to MDUpdateAction and MDEntryID if used in the original Market Data Entry
    • When creating a new Market Data Entry with a future or option instrument similar to the instrument in the previous Market Data Entry in the same FIX message, one may send just symbol identification fields that have changed, such as MaturityMonthYear, MaturityDay, PutOrCall, StrikePrice, OptAttribute, and SecurityExchange.
    • MDEntryID can be reused within the same day after it is deleted. This is helpful for distributing order books because an order that is suspended and then reinstated can have its MDEntryID deleted upon suspension and later reused, with MDUpdateAction = New(0) upon reinstatement, thus avoiding having to re-map the MDEntryID.

    Market Data Request Reject

    The Market Data Request Reject is used when the broker cannot honor the Market Data Request, due to business or technical reasons. Brokers may choose to limit various parameters, such as the size of requests, whether just the top of book or the entire book may be displayed, and whether Full or Incremental updates must be used.

    Security Definition Request

    The Security Definition Request message is used for the following:

    1. Request a specific Security to be traded with the second party. The request security can be defined as a complex security made up of one or more underlying securities.
    2. Request a list of the Security Types that can be traded with the second party.
    3. Request a list of Securities that can be traded with the second party. This request can optionally be qualified with Symbol, TradingSessionID, SecurityExchange, and Security Type.

    See Appendix I: Security Definition, Security Status, and Trading Session Message Scenarios

    Security Definition

    The Security Definition message is used for the following:

    1. Accept the security defined in a Security Definition message.
    2. Accept the security defined in a Security Definition message with changes to the definition and/or identity of the security.
    3. Reject the security requested in a Security Definition message
    4. Return a list of Security Types
    5. Return a list of Securities

    Security Status Request

    The Security Status Request message provides for the ability to request the status of a security. One or more Security Status messages are returned as a result of a Security Status Request message.

    The Security Status Request message contains a SubscriptionRequestType field. This tells the counter party what type of request is being made:

    • 0 – indicates that the requestor only wants a snapshot or the current status.
    • 1 – indicates that the requestor wants a snapshot (the current status) plus updates as the status changes. This is similar to subscribing for information and can be implemented in applications as a subscription mechanism.
    • 2 – indicates that the requestor wishes to cancel any pending snapshots or updates – in essence making this an unsubscribe operation.

    Security Status

    The Security Status message provides for the ability to report changes in status to a security. The Security Status message contains fields to indicate trading status, corporate actions, financial status of the company. The Security Status message is used by one trading entity (for instance an exchange) to report changes in the state of a security.

    It is expected that the Security Status message that is sent as a response should indicate what type of request is being provided. If the message is being generated as a result of a RequestType =1, then the response should have a RequestType=1 to permit the requestor to determine why the message was sent.

    Trading Session Status Request

    The Trading Session Status Request is used to request information on the status of a market. With the move to multiple sessions occurring for a given trading party (morning and evening sessions for instance) there is a need to be able to provide information on what product is trading on what market.

    The Trading Session Status Request message can be used to inquire the trading status of a trading party. The Trading Session Status message can be used to subscribe to updates to the status of a trading session by setting the RequestType field to 1.

    To list the securities available during a particular trading session, see the SecurityDefinitionRequest message.

    Trading Session Status

    The Trading Session Status provides information on the status of a market. With the move to multiple sessions occurring for a given trading party (morning and evening sessions for instance) there is a need to be able to provide information on what product is trading on what market.

    The Trading Session Status can provide an optional repeating group of securities that are available for trading during that session.

    New Order - Single

    The new order message type is used by institutions wishing to electronically submit securities and forex orders to a broker for execution.

    Orders can be submitted with special handling instructions and execution instructions. Handling instructions refer to how the broker should handle the order on its trading floor (see HandlInst field). Execution instructions contain explicit directions as to how the order should be executed (see ExecInst field).

    New Order messages received with the PossResend flag set in the header should be validated by ClOrdID. Implementations should also consider checking order parameters (side, symbol, quantity, etc.) to determine if the order had been previously submitted. PossResends previously received should be acknowledged back to the client via an Execution - Status message. PossResends not previously received should be processed as a new order and acknowledged via an Execution - New message.

    The value specified in the TransactTime field should allow the receiver of the order to apply business rules to determine if the order is potentially "stale" (e.g. in the event that there have been communication problems). To support forex accommodation trades, two fields, ForexReq and SettlCurrency, are included in the message. To request a broker to execute a forex trade in conjunction with the securities trade, the institution would set the ForexReq = Y and SettlCurrency = “intended settlement currency”. The broker would then execute a forex trade from the execution currency to the settlement currency and report the results via the execution message in the SettlCurrAmt and SettlCurrency fields.

    The order message can also be used to request a straight forex trade. Conventions for identifying a forex transaction are as follows:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
    • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
    • (e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
    • CCY1 and CCY2 are ISO currency codes
    • The value of the Currency field represents the denomination of the quantity fields (e.g. JPY represents quantity of JPY).
    • In the case of a Forex - Swap (buying (or selling) a currency at one value date and selling (or buying) the same currency at a different value date), Side should represent the side of the FutSettDate2 transaction.
    • OrdType = Forex - Market, Forex - Limit, Forex- Swap, or Forex - Previously Quoted
    • Netting can be specified via the ExecInst field.
    • See Appendix O – Foreign Exchange Trading

    Orders involving or requiring Pre-Trade Allocation consist of the following steps:

    • Buyside sends a New Order request message specifying one or more AllocAccount and AllocShares values within the repeating group designated by NoAllocs.
    • Sellside sends Execution Report messages for the “New” and resulting fills.
    • Post-Trade Allocation messaging takes place

    To “take” an IOI (or Quote) from an ECN or exchange and not display the order on the book, the New Order message should contain the TimeInForce field with ImmediateOrCancel and an OrdType field with Previously Indicated ( or Previously Quoted).

    The presence of DiscretionInst on an order indicates that the trader wishes to display one price but will accept trades at another price. For example a sell order with OrdType = Limit, Price=50.00, DiscretionInst = Related to displayed price and DiscretionOffset = -0.25 means that the order should be displayed as an offer for 50.00, but will match any bid >= 49.75 Discretionary pricing can also be used when pegging an order - for example to indicate that a buy order is to be displayed as pegged to the bid minus 0.25, but can be matched by anything <= the offer, set OrdType=Pegged, ExecInst = Primary Peg, PegDifference = -0.25, DiscretionInst = Related to market price and DiscretionOffset = 0.

    See Appendix D: Order State Change Matrices

    Execution Reports

    The execution report message is used to:

    1. confirm the receipt of an order
    2. confirm changes to an existing order (i.e. accept cancel and replace requests)
    3. relay order status information
    4. relay fill information on working orders
    5. reject orders
    6. report post-trade fees calculations associated with a trade

    NOTE: Execution reports do not replace the end-of-day confirm. Execution reports are to be regarded only as replacements for the existing fill messages currently communicated via telephone.

    Each execution report contains three fields which are used to communicate both the current state of the order as understood by the broker and the purpose of the message: OrdStatus, ExecType and ExecTransType.

    In an execution report the OrdStatus is used to convey the current state of the order. If an order simultaneously exists in more than one order state, the value with highest precedence is the value that is reported in the OrdStatus field. The order statuses are as follows (in highest to lowest precedence):

    PrecedenceOrdStatusDescription
    12Pending CancelOrder with an Order Cancel Request pending, used to confirm receipt of an Order Cancel Request. DOES NOT INDICATE THAT THE ORDER HAS BEEN CANCELED.
    11Pending ReplaceOrder with an Order Cancel/Replace Request pending, used to confirm receipt of an Order Cancel/Replace Request. DOES NOT INDICATE THAT THE ORDER HAS BEEN REPLACED.
    10Done for DayOrder not, or partially, filled; no further executions forthcoming for the trading day
    9CalculatedOrder has been completed for the day (either filled or done for day). Commission or currency settlement details have been calculated and reported in this execution message
    8FilledOrder completely filled, no remaining quantity
    7StoppedOrder has been stopped at the exchange. Used when guranteeing or protecting a price and quantity
    6SuspendedOrder has been placed in suspended state at the request of the client.
    5CanceledCanceled order with or without executions
    5ExpiredOrder has been canceled in broker’s system due to time in force instructions.
    4Partially FilledOutstanding order with executions and remaining quantity
    3ReplacedReplaced order with or without executions
    2NewOutstanding order with no executions
    2RejectedOrder has been rejected by broker. NOTE: An order can be rejected subsequent to order acknowledgment, i.e. an order can pass from New to Rejected status.
    2Pending NewOrder has been received by brokers system but not yet accepted for execution. An execution message with this status will only be sent in response to a Status Request message.
    1Accepted for biddingOrder has been received and is being evaluated for pricing. It is anticipated that this status will only be used with the “Disclosed” BidType List Order Trading model.

    The ExecType is used to identify the purpose of the execution report message. To transmit a change in OrdStatus for an order, the broker(sell side) should send an Execution Report with the new OrdStatus value in both the ExecType AND the OrdStatus fields to signify this message is changing the state of the order. The only exception to this rule is that when rejecting a cancel or cancel/replace request the CancelReject message is used both to reject the request and to communicate the current OrdStatus. An ExecType of Pending Cancel or Pending Replace is used to indicate that a cancel or cancel/replace request is being processed. An ExecType of Canceled or Replace is used to indicate that the cancel or cancel/replace request has been successfully processed.

    Execution information (e.g. new partial fill or complete fill) should not be communicated in the same report as one which communicates other state changes (such as pending cancel, pending replace, canceled, replaced, accepted, done for day etc).

    Any fills which occur and need to be communicated to the customer while an order is “pending” and waiting to achieve a new state (i.e. via a Order Cancel Replace (aka Order Modification) Request) must contain the “original” (current order prior to state change request) order parameters (i.e. ClOrdID, OrderQty, Price, etc). These fills will cause the CumQty and AvgPx to be updated. An order cannot be considered replaced until it has been explicitly accepted and confirmed to have reached the replaced status via an execution report with ExecType = ‘Replace’, at which time the effect of the replacement (ClOrdID, new quantity or limit price etc) will be seen. Note that due to the precedence rules above, in reports where ExecType=Replace, OrdStatus may not = Replaced.

    Requests to cancel or cancel/replace an order are only acted upon when there is an outstanding order quantity. Requests to replace the OrderQty to a level less than the CumQty will be interpreted by the broker as requests to stop executing the order. Requests to change price on a filled order will be rejected (see Order Cancel Reject message type). The OrderQty, CumQty, LeavesQty, and AvgPx fields should be calculated to reflect the cumulative result of all versions of an order. For example, if partially filled order A were replaced by order B, the OrderQty, CumQty, LeavesQty, and AvgPx on order B’s fills should represent the cumulative result of order A plus those on order B.

    The general rule is: OrderQty = CumQty + LeavesQty.

    There can be exceptions to this rule when ExecType and/or OrdStatus are Canceled, DoneForTheDay (e.g. on a day order), Expired, Calculated, or Rejected in which case the order is no longer active and LeavesQty could be 0.

    Execution report messages are transmitted with a transaction type (ExecTransType) NEW, CANCEL, CORRECT or STATUS. Transaction types CANCEL and CORRECT modify the state of the message identified in field ExecRefID, and are used to cancel or correct a previously reported execution. Transaction type STATUS indicates that the execution message contains no new information, only summary information regarding order status.

    The NEW transaction type indicates that this message represents a new order, a change in status of the order, or a new fill against an existing order. The combination of the ExecTransType, ExecType, and OrdStatus fields will indicate how the message is to be applied to an order.

    The CANCEL transaction type applies at the execution level. The Cancel transaction will be used to cancel an execution which has been reported in error. The canceled execution will be identified in the ExecRefID field. Note: ExecTransType of Cancel should not be used to cancel a previous ExecutionRpt with ExecTransType of Cancel (e.g. cannot cancel a cancel).

    The CORRECT transaction type applies at the execution level and is used to modify an incorrectly reported fill. The incorrect execution will be identified in the ExecRefID field. If a single execution is corrected more than once, ExecRefID should refer to the ExecID of the last corrected ExecutionRpt (same convention as ClOrdID and OrigClOrdID). To correct an ExecutionRpt which was previously canceled, an ExecutionRpt with ExecTransType=New should be sent (e.g. cannot send ExecTransType=Correct for an ExecutionRpt with ExecTransType=Cancel). Note: Data reported in the CumQty, LeavesQty, and AvgPx fields represent the status of the order as of the time of the correction, not as of the time of the originally reported execution.

    See Appendix D: Order State Change Matrices for examples of key state changes, processing of cancel and cancel/replace requests, and for execution cancel/corrects.

    An ExecutionRpt with ExecType = Restated represents an ExecutionRpt sent by the sellside communicating a change in the order or a restatement of the order’s parameters without an electronic request from the customer. ExecRestatementReason must be set. This is used for GT orders and corporate actions (see below), changes communicated verbally to the sellside either due to normal business practices or as an emergency measure when electronic systems are not available, repricing of orders by the sellside (such as making Sell Short orders compliant with uptick / downtick rules), or other reasons (Broker option). ExecRestatementReason can also be used to communicate unsolicited cancels.

    The field ClOrdID is provided for institutions to affix an identification number to an order to coincide with internal systems. The OrderID field is populated with the broker-generated order number. Unlike ClOrdID/OrigClOrdID which requires a chaining through Cancel/Replaces and Cancels, OrderID and SecondaryOrderID are not required to change through changes to an order.

    The underlying business assumption of orders that can trade over multiple days, such as GTC and Good Till Date orders expiring on a future trading date (henceforth referred to as GT orders) is that a GT order that is not fully executed and has not been canceled and has not expired on a given day remains good for the broker to execute the following day. Note that the concept of day is determined by the market convention, which will be security specific. At the end of each trading day, once the order is no longer subject to execution, the broker may optionally send an Execution Report with ExecType=Done for Day(3). When the ExpireDate or ExpireTime of a Good Till Date order is reached, or a GTC order reaches a maximum age, the order is considered expired and the broker may optionally send an Execution Report with ExecType and OrdStatus=Expired(C).

    In handling GT orders, the OrderQty, CumQty and AvgPx fields will represent the entirety of the order over all days. The fields DayOrderQty, DayCumQty, and DayAvgPx can be used on days following the day of the first trade on a GT order. Prior to the start of business each day, for all GT orders that have partial fills on previous days, DayCumQty and DayAvgPx are set to zero, and DayOrderQty becomes the LeavesQty. The following relationship holds: DayOrderQty = OrderQty – (CumQtyDayCumQty). Since (CumQtyDayCumQty) represents the volume traded on all previous days, DayOrderQty = OrderQtyVolume traded on all previous days. Note that when changing the quantity of an order, both OrderQty and DayOrderQty will change. Requests to change or cancel an order will be made in terms of the total quantity for the order, not the quantity open today. For example, on an order where OrderQty=10000 and 2000 shares trade during the previous days, a request to change OrderQty to 15000 will mean that 13000 shares will be open. See Appendix D – Order State Change Matrices for examples of canceling and changing GT orders partially filled on previous days.

    A Cancel on an execution (trade bust) happening the same day of the trade will result in CumQty and DayCumQty each decreasing by the quantity busted, and LeavesQty increasing by the quantity busted. OrderQty and DayOrderQty will remain unchanged. If the business rules allow for a trade bust to be reported on a later date than the trade being busted, the OrderQty and DayCumQty will remain unchanged, the LeavesQty and DayOrderQty will increase by the quantity busted, and the CumQty will decrease by the quantity busted.

    If bilaterally agreed between counterparties, a broker may wish to transmit a list of all open GT orders, permitting reconciliation of the open orders. Typically this transmission may occur at the end of the trading day or at the start of the following trading day. There is no expected response to such retransmission; in the event of a reconciliation problem this should be resolved manually or via the DK message. Assuming no corporate actions have occurred, the broker will send an Execution Report with ExecType = Restated (D) and ExecRestatementReason = GT renewal / restatement (no corporate action) (1) for each open GT order. These Execution Reports may have DayCumQty and DayAvgPx restated to zero, and DayOrderQty restated to LeavesQty if the transmission occurs at the start of the following business day. The broker has the option of changing the OrderID and SecondaryOrderID fields, or leaving them unchanged. If they are changed, then the buy-side should use these new ID fields when sending Order Cancel Request, Order Cancel/Replace Request, and Order Status Request messages.

    In the case of a corporate action resulting in the adjustment of an open GT order, the broker will send an Execution Report with ExecType = Restated (D) and ExecRestatementReason = GT Corporate action (0) with the order’s state after the corporate action adjustment. In the case of stock splits, OrderQty, CumQty, AvgPx, and LeavesQty will be adjusted to reflect the order’s state in terms of current shares, not pre-split shares. See Appendix D – Order State Change Matrices for examples of GT order restatement with and without a corporate action.

    Don’t Know Trade

    The Don’t Know Trade (DK) message notifies a trading partner that an electronically received execution has been rejected. This message can be thought of as an execution reject message.

    This message has special utility when dealing with one-way execution reporting. If the initial Order Acknowledgment message (LastShares=0 and OrdStatus=New) does not match an existing order this message can be used to notify the broker of a potential problem order.

    Note that the decision to DK an execution lies with the institution. Some of the mismatches listed in the DKReason field may be acceptable and will not require a DK messages to be generated.

    Order Cancel/Replace Request

    The order cancel/replace request is used to change the parameters of an existing order.

    Do not use this message to cancel the remaining quantity of an outstanding order, use the Cancel Request message for this purpose.

    Cancel/Replace will be used to change any valid attribute of an open order (i.e. reduce/increase quantity, change limit price, change instructions, etc.) It can be used to re-open a filled order by increasing OrderQty.

    An immediate response to this message is required. It is recommended that an ExecutionRpt with ExecType=Pending Replace be sent unless the Order Cancel/Replace Request can be immediately accepted (ExecutionRpt with ExecType=Replaced) or rejected (Order Cancel Reject message).

    The Cancel/Replace request will only be accepted if the order can successfully be pulled back from the exchange floor without executing. Requests which cannot be processed will be rejected using the Cancel Reject message. The Cancel Reject message should provide the ClOrdID and OrigClOrdID values which were specified on the Cancel/Replace Request message for identification.

    Note that while it is necessary for the ClOrdID to change and be unique, the broker’s OrderID field does not necessarily have to change as a result of the Cancel/Replace request.

    Only a limited number of fields can be changed via the cancel/replace request message. All other fields should be retransmitted as sent in the original order. The fields which can be changed via this message are:

    ExecInstExpireDateOrderQty2
    OrderQtyExpireTimeOpenClose
    OrdTypeMinQtyCoveredOrUncovered
    PriceMaxFloorSide (i.e. sell to sell plus)
    HandlInstStopPxMaxShow
    TimeInForcePegDifferenceLocateReqd
    TradingSessionIDDiscretionInst
    EffectiveTimeDiscretionOffset
    CashOrderQty

    When modifying ExecInst fields in a replacement order, it is necessary to re-declare all ExecInst in the replacement order. ExecInst’s will not be carried forward from the original order to the replacement unless re-declared.

    Order Cancel Request

    The order cancel request message requests the cancelation of all of the remaining quantity of an existing order. Note that the Order Cancel/Replace Request should be used to partially cancel (reduce) an order).

    The request will only be accepted if the order can successfully be pulled back from the exchange floor without executing.

    A cancel request is assigned a ClOrdID and is treated as a separate entity. If rejected, the ClOrdID of the cancel request will be sent in the Cancel Reject message, as well as the ClOrdID of the actual order in the OrigClOrdID field. The ClOrdID assigned to the cancel request must be unique amongst the ClOrdID assigned to regular orders and replacement orders.

    An immediate response to this message is required. It is recommended that an ExecutionRpt with ExecType=Pending Cancel be sent unless the Order Cancel Request can be immediately accepted (ExecutionRpt with ExecType=Canceled) or rejected (Order Cancel Reject message).

    Order Cancel Reject

    The order cancel reject message is issued by the broker upon receipt of a cancel request or cancel/replace request message which cannot be honored. Requests to change price or decrease quantity are executed only when an outstanding quantity exists. Filled orders cannot be changed (i.e quantity reduced or price change. However, the broker/sellside may support increasing the order quantity on a currently filled order).

    When rejecting a Cancel/Replace Request, the Cancel Reject message should provide the ClOrdID and OrigClOrdID values which were specified on the Cancel/Replace Request message for identification

    The execution message responds to accepted cancel request and cancel/replace request messages.

    Order Status Request

    The order status request message is used by the institution to generate an order status message back from the broker.

    Allocation

    The Allocation message provides the ability to specify how an order or set of orders should be subdivided amongst one or more accounts. It can also be used as a confirmation message through which third parties can communicate execution and settlement details between trading partners. In addition, the allocation message can be sent by the broker to communicate fees and other details that can only be computed once the sub-account breakdowns are known.

    Allocation is typically communicated Post-Trade (after fills have been received and processed). It can, however, also be communicated Pre-Trade (at the time the order is being placed) to specify the account(s) and their respective order quantities which make up the order. This is a regulatory requirement in certain markets and for certain types of securities.

    An allocation message can be submitted as preliminary, calculated, calculated without preliminary, new, cancel or replace. The AllocTransType field indicates the purpose of the message. When submitting calculated, replace, or cancel AllocTransType messages the RefAllocID field is required. Note that AllocTransType of Cancel, Reject, or Replace affects the entire Allocation message thus each AllocAccount (cannot cancel, reject, or replace a single AllocAccount instance without affecting the entire Allocation messge). Replacement allocation messages must contain all data for the replacement allocation. Calculated allocations should have a unique AllocID and use RefAllocID to specify the AllocID from the preliminary. Calculated without preliminary are sent unsolicited from the sellside and do not require RefAllocID.

    The allocation message contains repeating fields for each order, sub-account and individual execution. The repeating fields are shown below in typeface Bold-Italic and indented with the 🡪 symbol. The field’s relative position in the message is important. For example, each instance of allocation must be in the order shown below.

    • The total shares allocated must equal the Shares value which must equal the total executed quantity of the original order. If present, the total shares in the execution section must also be equal to this value.
    • The number of sub-account instances is indicated in NoAllocs.
    • Multiple orders can be combined for allocation by identifying the number of orders in the NoOrders field and each individual order in the OrderID fields. Combined orders must have the same ticker, trade date, settlement date and side.

    Pre-Trade Allocation consists of the following steps:

    • Buyside sends a New Order request message specifying one or more AllocAccount and AllocShares values within the repeating group designated by NoAllocs.
    • Sellside sends Execution Report messages for the “New” and resulting fills.
    • Post-Trade Allocation messaging takes place

    Post-Trade Allocation can be computed via one of two methods:

    1. Using Average Price: Each AllocAccount has a single AllocAvgPx
    2. Using Executed Price: Combination of each AllocAccount and AllocPrice (unique LastPx) (e.g. Japan)

    Post-Trade Allocation supports three different message flows:

    1. Buyside initiated without Misc Fees
    2. Buyside-initiated with Misc Fee computation
    3. Sellside-initiated

    See Appendix K: Example Usage of Allocations for more examples and details.

    Allocation ACK

    The allocation ACK message is used to acknowledge the receipt and status of an allocation message received from the institution.

    It is possible that multiple Allocation ACK messages can be generated for a single allocation to detail the receipt and then the acceptance or rejection of the allocation.

    Settlement Instructions

    The Settlement Instructions message provides either the broker’s or the institution’s instructions for trade settlement. The SettlInstSource field indicates if the settlement instructions are the broker’s or the institution’s. This message has been designed so that it can be sent from the broker to the institution, from the institution to the broker, or from either to an independent “standing instructions” database or matching system.

    The Settlement Instructions message can be used in one of two modes (SettlInstMode):

    1. To provide “standing instructions” for the settlement of trades occurring in the future, messages should include some combination of.
    • AllocAccount
    • LastMkt
    • Side
    • SecurityType
    • SettlLocation
    • SettlDeliveryType
    • EffectiveTime
    1. To provide settlement instructions for a specific Allocation Account either as overriding or standing instructions to support matching. The following key should be used to tie the settlement instructions to the corresponding Allocation message.

      (TradeDate + AllocID + AllocAccount)

    The Settlement Instruction detail can be either explicitly specified (via SecuritySettl* and CashSettl* fields) or can exist on within an independent standing instructions database and can be referenced via the StandInstDbType, StandInstDbName, and StandInstDbID fields.

    See Appendix F – Settlement Instructions Field Usage Matrix

    Bid Request

    The BidRequest Message can be used in one of two ways depending on which market conventions are being followed.

    In the “Non disclosed” convention (e.g. US/European model) the BidRequest message can be used to request a bid based on the sector, country, index and liquidity information contained within the message itself. In the “Non disclosed” convention the entry repeating group is used to define liquidity of the program. See Appendix N – Program/Basket/List Trading for an example.

    In the “Disclosed” convention (e.g. Japanese model) the BidRequest message can be used to request bids based on the ListOrderDetail messages sent in advance of BidRequest message. In the “Disclosed” convention the list repeating group is used to define which ListOrderDetail messages a bid is being sort for and the directions of the required bids.

    The pair of fields SideValue1 and SideValue2 are used to show the monetary total value in either direction (buy or sell) of the transaction without revealing whether it is the buy-side institution intention to buy or sell.

    The two repeating groups, NoEntries and NoBidComponents are mutually exclusive and a function of which bidding model is being used. If the “Non Disclosure” method is being used the portfolio of stocks being traded is described by a number of “bid desciptors” entries. If the “Disclosure” Method is being used the portfolio is fully disclosed, except for side, by a number of “list” entries enumerating the lists that list the stocks to be traded.

    A BidRequest message with BidRequestTransType cancel may be used to indicate to sell side firms that they no longer need to store details of the BidRequest as they have either lost the bid or the List has been canceled.

    Bid Response

    The Bid Response message can be used in one of two ways depending on which market conventions are being followed.

    In the “Non disclosed” convention the Bid Response message can be used to supply a bid based on the sector, country, index and liquidity information contained within the corresponding bid request message. See Appendix N – Program/Basket/List Trading for an example.

    In the “Disclosed” convention the Bid Response message can be used to supply bids based on the List Order Detail messages sent in advance of the corresponding Bid Request message.

    New Order - List

    The NewOrderList Message can be used in one of two ways depending on which market conventions are being followed.

    In the “Non disclosed” convention the New Order - List message is sent after the bidding process has been completed, by telephone or electronically. The New Order - List message enumerates the stocks, quantities, direction for the trade and may contain pre-allocation information.

    This message may also be used as the first message for the transmission of a program trade where the bidding process has been done by means other than FIX. In this scenario the messages may either be used as a staging process, in which case the broker will start execution once either a ListExecute is received or for immediate execution, in which case the orders will be executed on receipt.

    In the “Disclosed” convention the New Order - List message is sent before the bidding process is started, by telephone or electronically. The New Order - List message enumerates the stocks and quantities from the bidding process, and may contain pre-allocation information. The direction of the trade is disclosed after the bidding process is completed.

    See Appendix N – Program/Basket/List Trading for an example.

    List Strike Price

    The strike price message is used to exchange strike price information for principal trades. It can also be used to exchange reference prices for agency trades.

    List Status

    The list status message is issued as the response to a List Status Request message sent in an unsolicited fashion by the sell-side. It indicates the current state of the orders within the list as they exists at the broker's site.

    Orders within the list are statused at the summary level. Individual executions are not reported, rather, the current state of the order is reported.

    The message contains repeating fields for each. The relative position of the repeating fields is important in this message, i.e. each instance of ClOrdID, CumQty, LeavesQty, CxlQty and AvgPx must be in the order shown below.

    Description of ListOrderStatus field values:

    • “InBiddingProcess”: indicates that a list has been received and is being evalutated for pricing. It is envisaged that this status will only be used with the "Disclosed" List Order Trading model.
    • “ReceivedForExecution”: indicates that a list has been received and the sell side is awaiting the instruction to start working the trade. It is envisaged that this status will be used under both models.
    • “Executing”: indicates that a list has been received and the sell side is working it.
    • “Canceling”: indicates that a List Cancel Message has been received and the sell side is in the process of pulling any orders that were being worked. The status of individual order can be found out from the detail repeating group.
    • “AllDone”: indicates that a list has been executed as far as possible for the day.
    • “Alert”: used whenever any of the individual orders have a status that requires something to be done. For instance alert would be used when a buy-side firm has submitted a list that has individual stock reject that have not been addressed.
    • “Rejected” used when a response cannot be generated. For example when the ListID is not recognised. The text field should include an explanation of why the Request s been rejected.

    List Execute

    The list execute message type is used by institutions to instruct the broker to begin execution of a previously submitted list. This message may or may not be used, as it may be mirroring a phone conversation.

    List Cancel Request

    The list cancel request message type is used by institutions wishing to cancel previously submitted lists either before or during execution.

    After the list has been staged with the broker, it can be canceled via the submission of the List Cancel message. If the list has not yet been submitted for execution, the List Cancel message will instruct the broker not to execute it, if the list is being executed, the List Cancel message should trigger the broker's system to generate cancel requests for the remaining quantities of each order within the list. Individual orders within the list can be canceled via the Order Cancel Request message.

    List Status Request

    The list status request message type is used by institutions to instruct the broker to generate status messages for a list.

    Fragmentation for List Order Messages

    The messages used in program trading support fragmentation for the same reason and in the same way as some other FIX messages (e.g. Mass Quote). If there are too many entries within a repeating group to fit into one physical message, then the entries can be continued in another message by repeating all of the top level information and then specifying the number of entries in the continued message. A “Total Entries” field is provided to specify the total number of entries in a repeating group which is split over multiple messages. This permits, but does not require, a receiving application to react in a stateful manner where it can determine if it has received all entries in a repeating group before carrying out some action. However, the overall approach to fragmentation is to permit each message to be processed in a stateless manner as it is received. Each message should contain enough information to have the entries applied to a system without requiring the next message if fragmentation has occurred. Also, a continued message should not require any information from the previous message. The messages that support fragmentation and the repeating groups supporting it are listed in the table below.

    Message“Total Entries” fieldRepeating group that may be fragmented
    New Order - ListTotNoOrdersOrders repeating group following the NoOrders field in the message definition table
    List Strike PriceTotNoStrikesStrike price repeating group following the NoStrikes field in the message definition table
    List StatusTotNoOrdersStatus per order repeating group following the NoOrders field in the message definition table

    Maximum message size for fragmentation purposes can be determined by using the optional MaxMessageSize field in the Logon message or by mutual agreement between counterparties.

    Note: The TotNoOrders field has been added to the List Status message to support fragmentation in same way as other FIX messages. The NoRpts and Rpt``Seq fields are preserved to backwards compatibility with previous versions of FIX which supported a stateful form of fragmentation.

    Business Message Reject

    The Business Message Reject message can reject an application-level message which fulfills session-level rules and cannot be rejected via any other means. Note if the message fails a session-level rule (e.g. body length is incorrect), a session-level Reject message should be issued.

    See the session-level Reject message

    It should NOT be used in the following situations:

    Session-level problem meeting the criteria of the session-level Reject messageUse the session-level Reject message (MsgType=3)
    In response to
    • New Order - Single
    • Order Status Request
    • New Order - List
    • List Execute
    Use the Execution Report message
    In response to:
    • Order Cancel Request
    • Order Cancel/Replace Request
    • List Cancel Request
    Use the Order Cancel Reject message
    In response to:
    • Execution Report
    Use the Don’t Know Trade (DK) message
    In response to:
    • Allocation
    Use the Allocation ACK message
    In response to:
    • List Status Request
    Use the List Status message
    In response to:
    • Quote Request
    • Quote
    • Mass Quote
    • Quote Cancel
    • Quote Status Request
    Use the Quote Acknowledgment message
    In response to:
    • Market Data Request
    Use the Market Data Request Reject message
    In response to:
    • Security Definition Request
    Use the Security Definition message
    In response to:
    • Security Status Request
    Use the Security Status message
    In response to:
    • Trading Session Status Request
    Use the Trading Session Status message

    Note the only exception to this rule is in the event a business message is received, fulfills session-level rules, however, the message cannot be communicated to the business-level processing system. In this situation a Business Message Reject with BusinessRejectReason = “Application not available at this time” can be issued if the the system is unable to send the specific “reject” message listed above due to this condition.

    Messages which can be referenced via the Business Message Reject message are:

    (the “ID” field BusinessRejectRefID refers to noted in [ ])
    • Indication of Interest (IOI) [IOIid]
    • Advertisement [AdvId]
    • News [Headline]
    • Email [EmailThreadID]
    • Order Cancel Reject [ClOrdID]
    • Allocation ACK [AllocID]
    • List Status [ListID]
    • Don’t Know Trade (DK) – may respond with Order Cancel Reject if attempting to cancel order [ExecID]
    • Settlement Instructions [SettlInstID]
    • Market Data-Snapshot/Full Refresh [MDReqID]
    • Market Data-Incremental Refresh [MDReqID]
    • Market Data Request Reject [MDReqID]
    • Quote Acknowledgment [QuoteID]
    • Security Definition [SecurityResponseID]
    • Security Status [SecurityStatusReqID]
    • Trading Session Status [TradSesReqID]

    Scenarios for Business Message Reject:

    BusinessRejectReason
    0 = Other
    1 = Unknown ID
    2 = Unknown Security
    3 = Unsupported Message Type (receive a valid, but unsupported MsgType)
    4 = Application not available
    5 = Conditionally Required Field Missing

    Whenever possible, it is strongly recommended that the cause of the failure be described in the Text field (e.g. “UNKNOWN SYBMOL: XYZ”).


    Back to top ↑

    Appendix A

    Valid Currency Codes

    Currency codes used in FIX are those defined in ISO 4217 standard. To obtain the current valid list please contact the ISO 4217 secretariat at +44-181-996-9000.

    Note: Prices defined in FIX messages should be made consistent with the currency code used. In some markets, prices are quoted as multiples or fractions of the currency, FIX messages should normalize the amount to coincide with the indicated code (e.g. UK securities are quoted in pence but must be represented in FIX messages as pounds).


    Back to top ↑

    Appendix B

    CheckSum Calculation

    The checksum of a FIX message is calculated by summing every byte of the message up to but not including the checksum field itself. This checksum is then transformed into a modulo 256 number for transmission and comparison. The checksum is calculated after all encryption is completed, i.e. the message as transmitted between parties is processed.

    For transmission, the checksum must be sent as printable characters, so the checksum is transformed into three ASCII digits.

    For example, if the checksum has been calculated to be 274 then the modulo 256 value is 18 (256 + 18 = 274). This value would be transmitted a |10=018| where "10=" is the tag for the checksum field.

    A sample code fragment to generate the checksum field is as follows:

      
      char *GenerateCheckSum( char *buf, long bufLen )    
      {
        static char tmpBuf[ 4 ];
        long idx;
        unsigned int cks;
      
        for( idx = 0L, cks = 0; idx < bufLen; cks += (unsigned int)buf[ idx++ ] );
        sprintf( tmpBuf, "%03d", (unsigned int)( cks % 256 ) );
        return( tmpBuf );
      }

    Back to top ↑

    Appendix C

    Reuters Exchange Mnemonics

    Exchanges A–L

    ExchangeMnemonic
    Abidjan Stock ExchangeCI
    American Stock ExchangeA
    Amman Stock ExchangeAM
    AEX Options and Futures ExchangeE
    AEX Stock ExchangeAS
    Australian Stock ExchangeAX
    Bahrain Stock ExchangeBH
    Barcelona Stock Exchange – Floor TradingBC
    Barcelona Stock Exchange – CATS FeedMC
    Beirut Stock ExchangeBY
    Belfoxb
    Berlin Stock ExchangeBE
    Berne Stock ExchangeBN
    Bilbao Stock ExchangeBI
    Bombay Stock ExchangeBO
    Boston Stock ExchangeB
    Botswana Share MarketBT
    Bremen Stock ExchangeBM
    Brussels Stock ExchangeBR
    Calcutta Stock ExchangeCL
    Canadian Ventures ExchangeV
    Channel IslandsCH
    Chicago Board Options ExchangeW
    Chicago Stock ExchangeMW
    Chile Electronic ExchangeCE
    Cincinnati Stock ExchangeC
    Colombo Stock ExchangeCM
    Copenhagen Stock ExchangeCO
    Dehli Stock ExchangeDL
    Doha Securities MarketQA
    Dubai Financial MarketDU
    Dusseldorf Stock ExchangeD
    Electronic Stock Exchange of VenezuelaEB
    Eurex Germany (DTB)d
    Eurex Switzerland (SFF)Z
    Frankfurt Stock ExchangeF
    Fukuoka Stock ExchangeFU
    Ghana Stock ExchangeGH
    Hamburg Stock ExchangeH
    Hanover Stock ExchangeHA
    Helsinki Stock ExchangeHE
    Hong Kong Stock ExchangeHK
    Iceland Stock ExchangeIC
    Interbolsa (Portugal)IN
    Irish Stock ExchangeI
    Istanbul Stock ExchangeIS
    Jakarta Stock ExchangeJK
    Japanese Securities Dealers Association (JASDAQ)Q
    Johannesburg Stock ExchangeJ
    Karachi Stock ExchangeKA
    KASDAQ (Korea)KQ
    Kazakhstan Stock ExchangeKZ
    Korea Stock ExchangeKS
    Kuala Lumpur Stock ExchangeKL
    Kuwait Stock ExchangeKW
    Kyoto Stock ExchangeKY
    Lagos Stock ExchangeLG
    Latin American Market in Spain (LATIBEX)LA
    Le Nouveau MarcheLN
    Lima Stock ExchangeLM
    Lisbon Stock Exchange (Portugal)LS
    London Stock ExchangeL
    Lusaka Stock ExchangeLZ
    Luxembourg Stock ExchangeLU

    Exchanges M–Z

    ExchangeMnemonic
    Madras Stock ExchangeMD
    Madrid Stock Exchange – Floor TradingMA
    Madrid Stock Exchange – CATS FeedMC
    Malta Stock ExchangeMT
    Mauritius Stock ExchangeMZ
    Medellin Stock ExcahngeML
    Mexican Stock ExchangeMX
    Milan Stock ExchangeMI
    MONEP Paris Stock Optionsp
    Montreal ExchangeM
    Moscow Inter Bank Currency ExchangeMM
    Moscow Stock ExchangeMO
    Munich Stock ExchangeMU
    Muscat Stock ExchangeOM
    Namibia Stock ExchangeNM
    Nagoya Stock ExchangeNG
    Nairobi Stock ExchangeNR
    NASDAQO
    NASDAQ Dealers – Bulletin BoardOB
    NASDAQ JapanOJ
    National Stock Exchange of IndiaNS
    New York Stock ExchangeN
    New Zealand Stock ExchangeNZ
    NewEx (Austria)NW
    Occidente Stock ExchangeOD
    Osaka Stock ExchangeOS
    Oslo Stock ExchangeOL
    Pacific Stock ExchangeP
    Paris Stock ExchangePA
    Philadelphia Stock ExchangePH
    Philadelphia Stock Exchange – OptionsX
    Philippine Stock ExchangePS
    Prague Stock ExchangePR
    Pink Sheets (National Quotation Bureau)PNK
    RASDAQ (Romania)RQ
    Riga Stock ExchangeRI
    Rio de Janeiro OTC Stock Exchange (SOMA)SO
    Russian Trading SystemRTS
    Santiago Stock ExchangeSN
    Sao Paulo Stock ExchangeSA
    Sapporo Stock ExchangeSP
    Saudi Stock ExchangeSE
    SBI Stock Exchange (Sweden)SBI
    Singapore Stock ExchangeSI
    Shanghai Stock ExchangeSS
    Shenzhen Stock ExchangeSZ
    Stockholm Stock ExchangeST
    Stuttgart Stock ExchangeSG
    St. Petersburg Stock ExchangePE
    Surabaya Stock ExchangeSU
    SWX Swiss ExchangeS
    Taiwan OTC Securities ExchangeTWO
    Taiwan Stock ExchangeTW
    Tallinn Stock ExchangeTL
    Tel Aviv Stock ExchangeTA
    Thailand Stock ExchangeBK
    Third MarketTH
    Tokyo Stock ExchangeT
    Toronto Options ExchangeK
    Toronto Stock ExchangeTO
    Tradepoint Stock ExchangeTP
    Tunis Stock ExchangeTN
    Ukraine PFTSPFT
    Valencia Stock ExchangeVA
    Vilnus Stock ExchangeVL
    virt-xVX
    Vienna Stock ExchangeVI
    Zimbabwe Stock ExchangeZI

    Other

    ExchangeNumeric Value
    None0
    American Stock Exchange Options1
    Chicago Mercantile Exchange (CME)2
    London International Financial Futures Exchange (LIFFE)3
    POSIT4
    London Traded Options Market5
    Montreal Exchange Options (MOE)6
    Pacific Stock Exchange Options (PAO)8
    Vancouver Options Exchange (VAO)9
    NYSE BBSS (broker booth system)10
    Non-exchange-based Over The Counter Market11
    New York Mercantile Exchange (NYMEX)12
    NYFIX Millennium13
    Jiway14
    International Securities Market Association(ISMA)15
    MEFF Renta Variable16
    Stockholm Options Market17
    MEFF Renta Variable??
    Stockholm Options Market??

    Back to top ↑

    Appendix D

    Order State Change Matrices

    The following matrices are included to clarify the sequence of messages and the status of orders involved in the submission and processing of new orders, executions, cancel requests, cancel/replace requests and order status requests. The matrices have been arranged in groups as follows:

    RefGroupDescription
    D1VanillaFilled order
    D2VanillaPart-filled day order, done for day
    D3CancelCancel request issued for a zero-filled order
    D4CancelCancel request issued for a part-filled order – executions occur whilst cancel request is active
    D5CancelCancel request issued for an order that becomes filled before cancel request can be accepted
    D6Replace to increase qtyZero-filled order, cancel/replace request issued to increase order qty
    D7Replace to increase qtyPart-filled order, followed by cancel/replace request to increase order qty, execution occurs whilst order is pending replace
    D8Replace to increase qtyFilled-order followed by cancel/replace request to increase order quantity
    D9Replace not for qty changeCancel/replace request (not for quantity change) is rejected as a fill has occurred
    D10Replace to decrease qtyCancel/replace request sent whilst execution is being reported – the requested order qty exceeds the cum qty . Order is replaced then filled
    D11Replace to decrease qtyCancel/replace request sent whilst execution is being reported – the requested order qty equals the cum qty – order qty is amended to cum qty
    D12Replace to decrease qtyCancel/replace request sent whilst execution is being reported – the requested order qty is below cum qty – order qty is amended to cum qty
    D13Replace - sequenceOne cancel/replace request is issued which is accepted – another one is issued which is also accepted
    D14Replace - sequenceOne cancel/replace request is issued which is rejected before order becomes pending replace – then another one is issued which is accepted
    D15Replace - sequenceOne cancel/replace request is issued which is rejected after it is in pending replace – then another one is issued which is accepted
    D16Replace - chainingOne cancel/replace request is issued followed immediately by another – broker processes sequentially
    D17Replace - chainingOne cancel/replace request is issued followed immediately by another – broker rejects the second as order is pending replace
    D18Unsolicited reportsTelephoned order
    D19Unsolicited reportsUnsolicited cancellation of a part-filled order
    D20Unsolicited reportsUnsolicited replacement of a part-filled order
    D21Unsolicited reportsUnsolicited reduction of order quantity by sell side
    D22Order rejectOrder rejected due to duplicate ClOrdID
    D23Order rejectOrder rejected because the order has already been verbally submitted
    D24StatusOrder status request rejected for unknown order
    D25StatusStatus request followed by "Nothing done".
    D26StatusOrder sent, immediately followed by a status request. Subsequent status requests sent
    D27GTGTC order partially filled, restated (renewed) and partially filled the following day
    D28GTGTC order with partial fill, a 2:1 stock split then a partial fill and fill the following day
    D29GTGTC order partially filled, restated(renewed) and canceled the following day
    D30GTGTC order partially filled, restated(renewed) followed by replace request to increase quantity
    D31ResendPoss resend
    D32TIFFill or kill order that cannot be filled
    D33TIFImmediate or Cancel order that cannot be immediately hit
    D34Execution correct/cancelFilled order, followed by correction and cancellation of executions
    D35Execution correct/cancelA cancel of a partially filled order followed by an execution cancel(bust) and new execution.
    D36Execution correct/cancelGTC order partially filled, restated (renewed) and partially filled the following day, with corrections of quantity on both executions.
    D37Stopped/GuaranteeA stopped (execution price guarantee) report followed by execution.

    The Table below shows which state transitions have been illustrated by the matrices in this Appendix (marked with an asterisk). The row represents the current value of OrdStatus and the column represents the next value as reported back to the buy-side via an execution report or order cancel reject message. Next to each OrdStatus value is its precedence – this is used when the order exists in a number of states simultaneously to determine the value that should be reported back. Note that absence of a scenario should not necessarily be interpreted as meaning that the state transition is not allowed:

    OrdStatus (precedence value)New (2)Partially Filled (4)Filled (8)Done For Day (10)Pending Cancel (12)Pending Replace (11)Replaced (3)Canceled (5)Rejected (2)Stopped (7)
    Pending New (2)**
    New (2)*********
    Partially Filled (4)******
    Filled (8)***
    Done for Day (10)*
    Pending Cancel (12)*****
    Pending Replace (11)******
    Replaced (3)*
    Canceled (5)
    Rejected (2)
    Stopped (7)*

    How to read the Order State Change Matrices:

    • The ‘Execution Report’ message is referred to simply as ‘Execution’
    • The ‘Order Cancel/Replace Request’ and ‘Order Cancel Request’ messages are referred to as ‘Replace Request’ and ‘Cancel Request’ respectively
    • The shaded rows represent messages sent from buy-side to the sell-side
    • In general where two lines of a matrix share the same time, this means either
      • that there are two possible paths (e.g. a request is accepted or rejected) – in this case the first row of the two possible paths is the reject case which is italicized. The non-italicized row is the path that is continued by the remainder of the matrix
      • that two messages are being sent at the same time but in different directions such that the messages cross on the connection (e.g. a cancel request is sent at the same time as the sell-side is sending an execution) – in this case both lines have bold text
    • For scenarios involving cancel requests or cancel/replace requests ‘ X’ refers to the original order, ‘Y’ refers to the cancel/replacing order. A similar convention is used for corrections or cancels to executions

    D1 - Filled order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    Exec
    Type
    OrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by sales
    2Execution(X)NewNewNew100000100000
    3Execution(X)RejectedRejectedNew10000000If order is rejected by trader/exchange
    3Execution(X)Partial FillPartially FilledNew10000200080002000Execution of 2000
    4Execution(X)Partial FillPartially FilledNew10000300070001000Execution of 1000
    5Execution(X)FillFilledNew100001000007000Execution of 7000

    D2 - Part-filled day order, done for day

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000200080002000Execution of 2000
    4Execution(X)Partial FillPartially FilledNew10000300070001000Execution of 1000
    5Execution(X)Done for DayDone for DayNew10000300000Assuming day order. See other examples which cover GT orders

    D3 - Cancel request issued for a zero-filled order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected
    2Execution(X)NewNewNew100000100000
    3Cancel Request(Y,X)10000
    4Cancel Reject (Y,X)New10000If rejected by salesperson
    4Execution (Y,X)Pending CancelPending CancelNew100000100000
    5Cancel Reject (Y,X)New10000If rejected by trader/exchange
    5Execution (Y,X)CanceledCanceledNew10000000

    D4 - Cancel request issued for a part-filled order - executions occur whilst cancel request is active

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    4Cancel Request(Y,X)10000
    4Execution(X)Partial FillPartially FilledNew10000500050003000Execution for 3000. This execution passes the cancel request on the connection
    5Cancel Reject (Y,X)Partially Filled10000If request is rejected
    5Execution (Y,X)Pending CancelPending CancelNew10000500050000‘Pending cancel’ order status takes precedence over ‘partially filled’ order status
    6Execution(X)Partial FillPending CancelNew10000600040001000Execution for 1000 whilst order is pending cancel – ‘pending cancel’ order status takes precedence over ‘partially filled’ order status
    7Cancel Reject (Y,X)Partially Filled10000If request is rejected
    7Execution (Y,X)CanceledCanceledNew10000600000‘Canceled’ order status takes precedence over ‘partially filled’ order status

    D5 - Cancel request issued for an order that becomes filled before cancel request can be accepted

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    4Cancel Request(Y,X)10000
    4Execution(X)Partial FillPartially FilledNew10000500050003000Execution for 3000. This execution passes the cancel request on the connection
    5Cancel Reject (Y,X)Partially Filled10000If request is rejected
    5Execution (Y,X)Pending CancelPending CancelNew10000500050000‘Pending cancel’ order status takes precedence over ‘partially filled’ order status
    6Execution(X)FillPending CancelNew100001000005000Execution for 5000 whilst order is pending cancel. ‘Pending cancel’ order status takes precedence over ‘filled’ order status
    7Cancel Reject (Y,X)Filled10000Cancel request rejected – CxlRejectReason = 0 (too late to cancel)

    D6 - Zero-filled order, cancel/replace request issued to increase order qty

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Replace Request(Y,X)11000Request to increase order qty to 11000
    4Cancel Reject (Y,X)New10000If request is rejected by salesperson
    4Execution (Y,X)Pending ReplacePending ReplaceNew100000100000
    5Cancel Reject (Y,X)New10000If rejected by trader/exchange
    5Execution (Y,X)ReplaceReplacedNew110000110000‘Replaced’ order status takes precedence over ‘new’ order status
    6Execution (Y)Partial FillPartially FilledNew110001000100001000Execution for 1000
    7Execution (Y)Partial FillPartially FilledNew11000300080002000Execution for 2000

    D7 - Part-filled order, followed by cancel/replace request to increase order qty, execution occurs whilst order is pending replace

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)12000Request increase in order quantity to 12000
    5Cancel Reject (Y,X)Partially Filled10000If request is rejected
    5Execution (Y,X)Pending ReplacePending ReplaceNew10000100090000‘Pending replace’ order status takes precedence over ‘partially filled’ order status
    6Execution(X)Partial FillPending ReplaceNew1000011008900100Execution for 100 before cancel/replace request is responded to
    7Cancel Reject (Y,X)Partially Filled10000If request is rejected
    7Execution (Y,X)ReplacePartially FilledNew120001100109000‘Partially filled’’ order status takes precedence over ‘replaced’ order status
    8Execution(Y)FillFilledNew1200012000010900Execution for 10900

    D8 - Filled order, followed by cancel/replace request to increase order quantity

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)FillFilledNew1000010000010000Execution for 10000
    4Replace Request(Y,X)12000Request increase in order quantity to 12000
    5Cancel Reject (Y,X)Filled10000If request is rejected
    5Execution (Y,X)Pending ReplacePending ReplaceNew100001000000‘Pending replace’ order status takes precedence over ‘partially filled’ order status
    6Cancel Reject (Y,X)Filled10000If request is rejected
    6Execution (Y,X)ReplacePartially FilledNew120001000020000‘Partially filled’ order status takes precedence over ‘replaced’ order status.
    7Execution(Y)FillFilledNew120001200002000Execution for 2000

    D9 - Cancel/replace request (not for quantity change) is rejected as a fill has occurred

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)10000Assume in this scenario that client does not wish to increase qty (e.g. client wants to amend limit price)
    4Execution (X)FillFilledNew100001000009000Execution for 9000 – the replace request message and this execution report pass each other on the connection
    5Cancel Reject (Y,X)Filled10000CxlRejectReason = 0 (too late to cancel)

    D10 - Cancel/replace request sent whilst execution is being reported – the requested order qty exceeds the cum qty. Order is replaced then filled

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request a decrease order quantity to 8000 (leaving 7000 open)
    4Execution(X)Partial FillPartially FilledNew1000015008500500Execution for 500 sent. Replace request and this execution report pass each other on the connection
    5Cancel Reject (Y,X)Partially Filled10000If request is rejected by salesperson
    5Execution (Y,X)Pending ReplacePending ReplaceNew10000150085000‘Pending replace’ order status takes precedence over ‘partially filled’ order status
    6Execution(X)Partial FillPending ReplaceNew1000016008400100Execution for 100 occurs before cancel/replace request is accepted
    7Cancel Reject (Y,X)Partially Filled10000If request is rejected by trader/exchange
    7Execution (Y,X)ReplacePartially FilledNew8000160064000‘Partially filled’ order status takes precedence over ‘replaced’ order status. Replace is accepted as requested order qty exceeds cum qty
    8Execution (Y)FillFilledNew8000800006400Execution for 6400.

    D11 – Cancel/replace request sent whilst execution is being reported – the requested order qty equals the cum qty – order qty is amended to cum qty

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Replace Request(Y,X)7000Client wishes to amend order qty to 7000 shares
    3Execution(X)Partial FillPartially FilledNew10000700030007000Execution for 7000 - the replace message and this execution report pass each other on the connection
    4Execution (Y,X)ReplaceFilledNew7000700000The replace request is interpreted as requiring the balance of the order to be canceled – the ‘filled’ order status takes precedence over ‘canceled’ or ‘replaced’

    D12 – Cancel/replace request sent whilst execution is being reported – the requested order qty is below cum qty – order qty is amended to cum qty

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Replace Request(Y,X)7000Client wishes to amend order qty to 7000 shares
    3Execution(X)Partial FillPartially FilledNew10000800020008000Execution for 8000 - the replace message and this execution report pass each other on the connection
    4Execution (Y,X)ReplaceFilledNew8000800000The replace request is interpreted as requiring the balance of the order to be canceled – the ‘filled’ order status takes precedence over ‘canceled’ or ‘replaced’

    D13 – One cancel/replace request is issued which is accepted – another one is issued which is also accepted

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request decrease in order quantity to 8000, leaving 7000 open
    5Execution (Y,X)Pending ReplacePending ReplaceNew10000100090000‘Pending replace’ order status takes precedence over ‘partially filled’ order status
    6Execution(X)Partial FillPending ReplaceNew1000015008500500Execution for 500
    7Execution (Y,X)ReplacePartially FilledNew8000150065000‘Partially filled’ order status takes precedence over ‘replaced’ order status
    8Execution (Y)Partial FillPartially FilledNew8000350045002000Execution for 2000
    9Replace Request(Z,Y)6000Request decrease in order quantity to 6000, leaving 2500 open
    10Execution (Z,Y)Pending ReplacePending ReplaceNew8000350045000
    11Execution (Z,Y)ReplacePartially FilledNew6000350025000‘Partially filled’ order status takes precedence over ‘replaced’ order status
    12Execution(Z)FillFilledNew6000600002500Execution for 2500

    D14 – One cancel/replace request is issued which is rejected before order becomes pending replace – then another one is issued which is accepted

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request decrease in order quantity to 8000, leaving 7000 open
    5Cancel Reject (Y,X)Partially Filled10000Request is rejected
    6Execution(X)Partial FillPartially FilledNew1000015008500500Execution for 500
    7Execution(X)Partial FillPartially FilledNew10000350065002000Execution for 2000
    8Replace Request(Z,X)6000Request decrease in order quantity to 6000, leaving 2500 open. Note that OrigClOrdID = X
    9Execution (Z,X)Pending ReplacePending ReplaceNew10000350065000Note that OrigClOrdID = X
    10Execution (Z,X)ReplacePartially FilledNew6000350025000Note that OrigClOrdID = X
    11Execution(Z)Partial FillPartially FilledNew6000500010001500Execution for 1500

    D15 - One cancel/replace request is issued which is rejected after it is in pending replace - then another one is issued which is accepted

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request decrease in order quantity to 8000, leaving 7000 open
    5Execution (Y,X)Pending ReplacePending Replace10000100090000
    6Execution(X)Partial FillPending ReplaceNew1000015008500500Execution for 500. ‘Pending replace’ order status takes precedence over ‘partially filled’ order status
    7Cancel Reject (Y,X)Partially Filled10000Request is rejected (e.g. by trader/exchange)
    8Execution(X)Partial FillPartially FilledNew10000350065002000Execution for 2000
    9Replace Request(Z,X)6000Request decrease in order quantity to 6000, leaving 2500 open. Note that OrigClOrdID = X
    10Execution (Z,X)Pending ReplacePending ReplaceNew10000350065000
    11Execution (Z,X)ReplacePartially FilledNew6000350025000
    12Execution(Z)Partial FillPartially FilledNew6000500010001500Execution for 1500

    D16 - One cancel/replace request is issued followed immediately by another - broker processes sequentially

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request decrease in order quantity to 8000, leaving 7000 open
    5Replace Request(Z,Y)7000Request decrease in order quantity to 7000, leaving 6000 open
    6Execution (Y,X)Pending ReplacePending ReplaceNew10000100090000Broker processes Replace (Y,X) first
    7Execution (Y,X)ReplacePartially FilledNew8000100070000Broker processes Replace (Y,X) first
    8Execution (Z,Y)Pending ReplacePending ReplaceNew8000100070000Broker then processes Replace (Z,Y)
    9Execution (Z,Y)ReplacePartially FilledNew7000100060000Broker then processes Replace (Z,Y)
    10Execution(Z)FillFilledNew7000700006000Execution for 6000

    D17 - One cancel/replace request is issued followed immediately by another - broker rejects the second as order is pending replace

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Replace Request(Y,X)8000Request decrease in order quantity to 8000, leaving 7000 open
    5Replace Request(Z,Y)7000Request decrease in order quantity to 7000, leaving 6000 open
    6Execution (Y,X)Pending ReplacePending ReplaceNew10000100090000
    7Cancel Reject (Z,Y)Pending Replace10000Rejected because broker does not support processing of order cancel replace request whilst order is pending cancel. CxlRejReason = ‘Order already in pending cancel or pending replace status’
    8Execution (Y,X)ReplacePartially FilledNew8000100070000‘Partially filled’ order status takes precedence over ‘replaced’ order status
    9Execution (Y)Partial FillPartially FilledNew8000300050002000Execution for 2000

    This matrix illustrates the case where the broker does not support multiple outstanding order cancel or order cancel/replace requests

    D18 – Telephoned order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1Order for 10000 shares phoned to broker
    2ExecutionNewNewNew10000000Confirm that the broker has accepted the order – note that broker does not need to capture a ClOrdID
    3ExecutionPartial FillPartially FilledNew10000200080002000Execution of 2000
    4ExecutionPartial FillPartially FilledNew10000300070001000Execution of 1000
    5ExecutionFillFilledNew100001000007000Execution of 7000

    D19 – Unsolicited cancel of a part-filled order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Broker verbally agrees to cancel order
    5Execution(X)CanceledCanceledNew10000100000Broker signifies that order has been canceled - ExecRestatementReason = Verbal change

    This scenario might occur if the buy-side has not implemented order cancel requests or alternatively there is an electronic communication problem at the point that the buy-side wishes to send a cancel request.

    D20 – Unsolicited replacement of a part-filled order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Broker verbally agrees to increase order quantity to 11000
    4Execution(X)RestatedNewNew11000000Broker signifies that order has been replaced ExecRestatementReason = Verbal
    5Execution(X)Partial FillPartially FilledNew110001000100001000Execution for 1000
    6Broker verbally agrees to increase order quantity to 12000
    7Execution(X)RestatedPartially FilledNew120001000110000Broker signifies that order has been replaced ExecRestatementReason = Verbal change

    This scenario might occur if the buy-side has not implemented order cancel/replace requests or alternatively there is an electronic communication problem at the point that the buy-side wishes to send a cancel replace request

    D21 - Unsolicited reduction of order quantity by sell side ( e.g. for US ECNs to communicate Nasdaq SelectNet declines)

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)RestatedNewNew9000090000ExecRestatementReason="Partial Decline of OrderQty"
    4Execution(X)FillFilledNew9000900009000

    D22 - Order rejected due to duplicate ClOrdID

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4New Order(X)10000Order submitted with the same order id
    5Execution(X)RejectedPartially FilledNew10000100090000OrdRejReason = duplicate order

    D23 - Order rejected because the order has already been verbally submitted

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000Order for 10000 sent electronically
    2Order passed verbally as there is communication problem and order does not arrive. The verbally passed order starts getting executed
    3Execution(X)RejectedRejectedNew10000000Order finally arrives and is detected as a duplicate of a verbal order and is therefore rejected. OrdRejReason = duplicate of a verbal order

    Note that the sell-side may employ a number of mechanisms to detect that the electronic order is potentially a duplicate of a verbally passed order, e.g. :

    • Checking the possdup flag on the order message header
    • Checking the incoming order details against other orders from the same client (e.g. side, quantity)
    • Looking at the transact time on the order as a guide to 'staleness'

    D24 - Order status request rejected for unknown order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Status Request (Y)
    5Execution(Y)RejectedRejectedStatus000OrdRejReason = unknown order
    LastShares not required when ExecTransType=Status

    D25 - Transmitting a CMS-style "Nothing Done" in response to a status request

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Status Request(X)
    4Execution(X)NewNewStatus100000100000Text="Nothing Done"

    D26 - Order sent, immediately followed by a status request. Subsequent status requests sent during life of order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Status Request (X)
    3Execution(X)Pending NewPending NewStatus10000010000Sent in response to status request. LastShares not required when ExecTransType=status
    4Execution(X)RejectedRejectedNew10000000If order is rejected
    4Execution(X)NewNewNew100000100000
    5Status Request (X)
    6Execution(X)NewNewStatus10000010000Sent in response to status request
    7Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    8Status Request (X)
    9Execution(X)Partial FillPartially FilledStatus1000020008000Sent in response to status request
    10Execution(X)FillFilledNew100001000008000Execution for 8000
    11Status Request (X)
    12Execution(X)FillFilledStatus10000100000Sent in response to status request
    13Replace Request(Y,X)12000Request to increase order qty
    14Execution (Y,X)Pending ReplacePending ReplaceNew100001000000
    15Execution (Y,X)ReplacePartially FilledNew120001000020000
    16Status Request (X)
    17Execution (Y,X)Partial FillPartially FilledStatus12000100002000Sent in response to status request. Note reference to X to allow tie back of execution report to status request
    18Status Request (Y)
    19Execution(Y)Partial FillPartially FilledStatus12000100002000Sent in response to status request

    D27 - GTC order partially filled, restated (renewed) and partially filled the following day

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesDayOrderQtyDayCumQtyComment
    Day 1,1New Order(X)10000
    Day 1,2Execution(X)NewNewNew100000100000
    Day 1,3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    Day 1,4Execution(X)Done for DayDone for DayNew10000200080000Optional at end of trading day
    Day 2,1Execution(X)RestatedPartially FilledNew1000020008000080000ExecRestatementReason = GTC renewal/restatement (no change) – optionally sent the following morning
    Day 2,2Execution(X)Partial FillPartially FilledNew1000030007000100080001000Execution for 1000

    D28 - GTC order with partial fill, a 2:1 stock split then a partial fill and fill the following day

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesDayOrderQtyDayCumQtyComment
    Day 1,1New Order(X)10000
    Day 1,2Execution(X)NewNewNew100000100000
    Day 1,3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000 @ 50
    Day 1,4Execution(X)Done for DayDone for DayNew10000200080000Optional at end of trading day
    Day 2,1Execution(X)RestatedPartially FilledNew200004000160000160000Sent the following morning after the split ExecRestatementReason = GTC corporate action. AvgPx=25, DayAvgPx=0
    Day 2,2Execution(X)Partial FillPartially FilledNew200009000110005000160005000Execution for 5000
    Day 2,3Execution(X)FillFilledNew20000200000110001600016000Execution for 11000

    D29 - GTC order partially filled, restated(renewed) and canceled the following day

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesDayOrderQtyDayCumQtyComment
    Day 1,1New Order(X)10000
    Day 1,2Execution(X)NewNewNew100000100000
    Day 1,3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    Day 1,4Execution(X)Done for DayDone for DayNew10000200080000Optional at end of trading day
    Day 2,1Execution(X)RestatedPartially FilledNew1000020008000080000ExecRestatementReason = GTC renewal/restatement (no change) – optionally sent the following morning
    Day 2,2Cancel Request (Y,X)10000
    Day 2,3Cancel Reject (Y,X)Partially Filled10000If rejected by salesperson
    Day 2,3Execution (Y,X)Pending CancelPending Cancel1000020008000080000
    Day 2,4Cancel Reject (Y,X)Partially Filled10000If rejected by trader/exchange
    Day 2,4Execution (Y,X)CanceledCanceled1000020000080000

    D30 - GTC order partially filled, restated(renewed) followed by replace request to increase quantity

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesDayOrderQtyDayCumQtyComment
    Day 1,1New Order(X)10000
    Day 1,2Execution(X)NewNewNew100000100000
    Day 1,3Execution(X)Partial FillPartially FilledNew10000200080002000Execution for 2000
    Day 1,4Execution(X)Done for DayDone for DayNew10000200080000Optional at end of trading day
    Day 2,1Execution(X)RestatedPartially FilledNew1000020008000080000ExecRestatementReason = GTC renewal/restatement (no change) – optionally sent the following morning
    Day 2,2Replace Request(Y,X)15000Increasing qty
    Day 2,3Cancel Reject (Y,X)Partially Filled10000If rejected by salesperson
    Day 2,3Execution (Y,X)Pending ReplacePending Replace1000020008000080000
    Day 2,4Execution (X)Partial FillPending Replace1000030007000100080001000Execution for 1000
    Day 2,5Cancel Reject (Y,X)Partially Filled10000If rejected by trader/exchange
    Day 2,5Execution (Y,X)ReplacePartially Filled150003000120000130001000

    D31 - Poss resend order

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000
    3New Order(X)10000PossResend=Y
    4Execution(X)NewNewStatus10000010000Because order X has already been received, confirm back the current state of the order. Last shares not required when ExecTransType = Status
    5New Order(Y)15000PossResend=Y
    6Execution(Y)NewNewNew150000150000Because order Y has not been received before, confirm back as a new order.

    D32 - Fill or Kill order cannot be filled

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000Order is FOK
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)CanceledCanceledNew10000000If order cannot be immediately filled

    D33 – Immediate or Cancel order that cannot be immediately hit

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000Order is IOC
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillPartially FilledNew10000100090001000Execution for 1000
    4Execution(X)CanceledCanceledNew10000100000If order cannot be immediately hit

    D34 – Filled order, followed by correction and cancellation of executions

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyAvgPxLastSharesLastPxExecId (ExecRefID)Comment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000AIf order is rejected by broker
    2Execution(X)NewNewNew1000001000000B
    3Execution(X)Partial FillPartially FilledNew10000100090001001000100CExecution for 1000 @ 100
    4Execution(X)FillFilledNew100001000001099000110DExecution for 9000 @ 110
    5Execution(X)Partial FillPartially FilledCancel100009000100011000E (C)Cancel execution for 1000
    6Execution(X)Partial FillPartially FilledCorrect10000900010001009000100F (D)Correct price on execution for 9000 to 100
    7Execution(X)FillFilledNew100001000001021000120GExecution for 1000 @ 120
    8Execution(X)FillFilledCorrect100001000001209000120H(F)Correct price on execution for 9000 to 120
    9Replace Request (Y,X)12000Request to increase order qty
    10Execution (Y,X)Pending ReplacePending ReplaceNew1000010000012000I
    11Execution (Y,X)ReplacePartially FilledNew1200010000200012000J
    12Execution(Y)Partial FillPartially FilledCorrect120001050015001209500120K(H)Correct execution of 9000 @ 120 to 9500 @ 120

    D35 - A canceled order followed by a busted execution and a new execution

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesExecID (ExecRefIDComment
    1New Order(X)10000
    2Execution(X)NewNewNew100000100000A
    3Execution(X)Partial FillPartially FilledNew10000500050005000BLastPx=50
    4Cancel Request(Y,X)10000
    5Execution (Y,X)Pending CancelPending CancelNew10000500050000C
    6Execution (Y,X)CanceledCanceledNew10000500000D
    7Execution(Y)Partial FillCanceledCancel10000000E(B)Cancel of the execution. ‘Canceled’ order status takes precedence over ‘New’
    8Execution(Y)Partial FillCanceledNew10000400004000FFill for 4000. LastPx=51

    D36 - GTC order partially filled, restated (renewed) and partially filled the following day, with corrections of quantity on both executions

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesDayOrderQtyDayCumQtyExecID (ExecRefID)Comment
    Day 1,1New Order(X)10000
    Day 1,2Execution(X)NewNewNew100000100000A
    Day 1,3Execution(X)Partial FillPartially FilledNew10000200080002000BExecution for 2000
    Day 1,4Execution(X)Done for DayDone for DayNew10000200080000COptional at end of trading day
    Day 2,1Execution(X)RestatedPartially FilledNew1000020008000080000DExecRestatementReason = GTC renewal/restatement (no change) – optionally sent the following morning
    Day 2,2Execution(X)Partial FillPartially FilledNew1000030007000100080001000EExecution for 1000
    Day 2,3Execution(X)Partial FillPartially FilledCorrect1000025007500150085001000F (B)Correct quantity on previous day’s execution from 2000 to 1500
    Day 2,4Execution(X)Partial FillPartially FilledCorrect10000200080005008500500G (E)Correct quantity on today’s execution from 1000 to 500

    D37 – Transmitting a guarantee of execution prior to execution

    TimeMessage Received
    (ClOrdID, OrigClOrdID)
    Message Sent
    (ClOrdID, OrigClOrdID)
    ExecTypeOrdStatusExecTransTypeOrderQtyCumQtyLeavesQtyLastSharesComment
    1New Order(X)10000
    2Execution(X)RejectedRejectedNew10000000If order is rejected by broker
    2Execution(X)NewNewNew100000100000
    3Execution(X)Partial FillStoppedNew100000100001000Text="You are guaranteed to buy 1000 at 50.10"; LastPx=50.10. This is similar to the concept of a ‘protected’ trade
    4Execution(X)Partial FillStoppedNew10000100090001000LastPx=50
    * executed price is better than guaranteed

    Back to top ↑

    Appendix E

    London SETS Order Types Matrix

    The table below presents the representation of the London Stock Exchange Trading System (SETS) order types in the FIX protocol:

    LSE Order TypeOrdTypeTimeInForceExpireTimePriceComment
    At Best13n/aNo
    Fill or Kill - no limit price14n/aNo
    Fill or Kill - limit price24n/aYes
    Limit - day2n/a, 0n/aYes
    Limit - good until26Good Till DateYes
    Execute and Eliminate23n/aYes
    Market Orders - day1n/a, 0N/aNoSETS Release 3.1 Only
    Market Orders -good until16Good Till DateNoSETS Release 3.1 Only

    Back to top ↑

    Appendix F

    Settlement Instruction Field Usage Matrix

    Trade Settlement TypeF.I.X. Fields RequiredF.I.X. Fields Optional
    Standing Instructions Provided (i.e. to be stored in an internal or third-party standing instructions database)SettlInstID
    SettlInstTransType
    SettlInstRefID (if SettlInstTransType=Cancel or Replace)
    SettlInstMode=1
    SettlInstSource
    AllocAccount
    (some combination of)
    * LastMkt
    * Side
    * SettlLocation
    * SecurityType
    * SettlDeliveryType
    * EffectiveTime
    TransactTime
    StandInstDbType
    (either SettlDepositoryCode or SecuritySettl*)
    SettlBrkrCode
    SettlInstCode
    ClientID
    ExecBroker
    Text
    StandInstDbName
    StandInstDbID
    SettlDepositoryCode
    SecuritySettlAgentName
    SecuritySettlAgentCode
    SecuritySettlAgentAcctNum
    SecuritySettlAgentContactName
    SecuritySettlAgentContactPhone
    (CashSettl* only if SecuritySettl* fields provided)
    CashSettlAgentName
    CashSettlAgentCode
    CashSettlAgentAcctNum
    CashSettlAgentContactName
    CashSettlAgentContactPhone
    Specific Allocation Account (trade) referencing existing Standing InstructionsSettlInstID
    SettlInstTransType
    SettlInstRefID (if SettlInstTransType=Cancel or Replace)
    SettlInstMode=2
    SettlInstSource
    AllocAccount
    TradeDate
    AllocID
    LastMkt
    Side
    TransactTime
    StandInstDbType
    StandInstDbID
    SettlBrkrCode
    SettlInstCode
    SettlLocation
    SecurityType
    ClientID
    ExecBroker
    Text
    StandInstDbName
    Specific Allocation Account (trade) providing details for settlement at a depositorySettlInstID
    SettlInstTransType
    SettlInstRefID (if SettlInstTransType=Cancel or Replace)
    SettlInstMode=2
    SettlInstSource
    AllocAccount
    SettlLocation
    TradeDate
    AllocID
    LastMkt
    Side
    TransactTime
    SettlDepositoryCode
    SettlBrkrCode
    SettlInstCode
    SecurityType
    ClientID
    ExecBroker
    Text
    SettlDeliveryType
    Specific Allocation Account (trade) providing details for a Single Agent (bank) for the securitySettlInstID
    SettlInstTransType
    SettlInstRefID (if SettlInstTransType=Cancel or Replace)
    SettlInstMode=2
    SettlInstSource
    AllocAccount
    SettlLocation
    TradeDate
    AllocID
    LastMkt
    Side
    TransactTime
    SettlBrkrCode
    SettlInstCode
    SecuritySettlAgentName
    SecuritySettlAgentCode
    SecuritySettlAgentAcctNum
    SecurityType
    ClientID
    ExecBroker
    Text
    SettlDeliveryType
    SecuritySettlAgentContactName
    SecuritySettlAgentContactPhone
    Specific Allocation Account (trade) providing details for a Two Agents (banks) one for the security and one for cashSettlInstID
    SettlInstTransType
    SettlInstRefID (if SettlInstTransType=Cancel or Replace)
    SettlInstMode=2
    SettlInstSource
    AllocAccount
    SettlLocation
    TradeDate
    AllocID
    LastMkt
    Side
    TransactTime
    SettlDeliveryType=Free
    SettlBrkrCode
    SettlInstCode
    SecuritySettlAgentCode
    SecuritySettlAgentAcctNum
    CashSettlAgentCode
    CashSettlAgentAcctNum
    SecurityType
    ClientID
    ExecBroker
    Text
    SecuritySettlAgentName
    SecuritySettlAgentContactName
    SecuritySettlAgentContactPhone
    CashSettlAgentName
    CashSettlAgentContactName
    CashSettlAgentContactPhone

    Back to top ↑

    Appendix G

    Rule80A (aka OrderCapacity) Usage by Market

    Note that the name of the Rule80A field is changing to “OrderCapacity” as Rule80A is a very US market-specific term. Other world markets need to convey similar information, however, often a subset of the US values. This appendix documents the market-specific usage of this field.

    United States Listed Equity Markets

    Rule80A’s values and usage details are documented in SEC Rule11Ac1-1/4. Note the purpose behind the rule is to restrict prices from rising or falling too fast providing more stability in the market. See Investments by Sharpe, 6th edition p. 50. Indicates the order type upon which exchange Rule 80A is applied.

    The following values are valid and applicable when using FIX to communicate with the New York Stock Exchange (NYSE) or other US listed equity exchanges per the SuperDOT Notification document. The values and usage details when used for US trading are documented in SEC Rule11Ac1-1/4.

    Valid values:
    A = Agency single order
    B = Short exempt transaction (refer to A type)
    C = Program Order, non-index arb, for Member firm/org
    D = Program Order, index arb, for Member firm/org
    E = Registered Equity Market Maker trades
    F = Short exempt transaction (refer to W type)
    H = Short exempt transaction (refer to I type)
    I = Individual Investor, single order
    J = Program Order, index arb, for individual customer
    K = Program Order, non-index arb, for individual customer
    L = Short exempt transaction for member competing market-maker affiliated with the firm clearing the trade (refer to P and O types)
    M = Program Order, index arb, for other member
    N = Program Order, non-index arb, for other member
    O = Competing dealer trades
    P = Principal
    R = Competing dealer trades
    S = Specialist trades
    T = Competing dealer trades
    U = Program Order, index arb, for other agency
    W = All other orders as agent for other member
    X = Short exempt transaction for member competing market-maker not affiliated with the firm clearing the trade (refer to W and T types)
    Y = Program Order, non-index arb, for other agency
    Z = Short exempt transaction for non-member competing market-maker (refer to A and R types)

    Japanese Equity Markets

    Used to specify whether order is Agency or Principal.

    Valid values:
    A = Agency single order
    P = Principal

    Other Markets

    All or a subset of the Rule80A (aka OrderCapacity) field values defined in the field reference may be applicable for other markets. Future markets will be included in this section as they are defined and brought forward to the FIX Technical Committee.


    Back to top ↑

    Appendix H

    Mass Quote Message Scenarios

    Scenario 1 - Unsolicited quote(s) no response requested

    Mass Quote is sent from first party to second party. The quote has the QuoteResponseLevel set to 0 or omitted. The second party does not acknowledge the quote. If the quote is later hit, resulting in a trade, an Execution Report is sent to the first party.

    First PartySecond Party
    Mass Quote message
    Options:
    One or more sets of quotes
    Set QuoteResponseLevel is set to 0 or omitted
    Interprets quotes applies them to a market
    Interprets Response Level – provides response accordingly
    No response is sent
    Execution Report
    Quote Results in Trade

    Scenario 2 - Unsolicited quote(s) negative response only requested

    Mass Quote is sent from first party to second party. The quote has the QuoteResponseLevel set to 1. The second party only acknowledges the quote if there is an error. If an error is encountered by the second party while processing the quote a Quote Acknowledgement message is sent with the QuoteRejectReason set to the error encountered.

    First PartySecond Party
    Mass Quote message
    Options:
    One or more sets of quotes
    Set Response Level to 1
    Interprets quotes applies them to a market
    Interprets Quote Acknowledgement
    If error – then send revised quote
    Quote Acknowledgement
    If an error is encountered
    Mass Quote messageInterprets quotes applies them to a market

    Scenario 3 - Unsolicited quote(s) full response requested

    Mass Quote is sent from first party to second party. The quote has the QuoteResponseLevel set to 2. The second party acknowledges each quote.

    First PartySecond Party
    Mass Quote message
    Options:
    One or more sets of quotes
    Set Response Level to 2
    Interprets quotes applies them to a market
    Interpret Quote AcknowledgementQuote Acknowledgement

    Scenario 4 - Cancel All Quotes

    The First Party asks the second party to cancel all quotes. A Quote Acknowledgement is sent back to the first party by the second party after quotes are canceled.

    First PartySecond Party
    Quote Cancel message

    QuoteCancelType = 4 (Cancel all quotes)
    Interprets Quote Cancel message and cancels quotes.
    Interpret Quote AcknowledgementQuote Acknowledgement

    Back to top ↑

    Appendix I

    Security Definition, Security Status, and Trading Session Message Scenarios

    Overview

    A set of messages has been defined for the definition and dissemination of securities information traded between two parties. These messages allow for the ability to define complex, multi-leg financial securities, such as options strategies, futures spreads, underlying-derivative combinations, indexes, and baskets. Security Definition Request message is used to define a security to the counterparty for trading and to retrieve definitions for securities available for trading with the counterparty.

    The Security Definition message can also be used to query a list of securities offered by a trading party. This message is useful for obtaining lists of products that are traded on a market. Although intended to support exchange style trading – this capability should also be of use in trading between any two trading partners.

    Two additional messages have been added for status purposes:The Security Status message and the Trading Session Status message. The Security Status message is based upon the Trade Related message proposal from SIAC.

    The Security Status message ,based upon the SIAC Trade Related message proposal, has been addedto provide solicited or unsolicited status information on securities. An exchange can use this message to transmit change in trading state of a product. The Security Status Request message can be used to query the state of a product.

    The Trading Session Status message has been added to provide status on a market. An exchange can use this to indicate status on the overall market and to provide a list of securities traded during that trading session. Two trading parties can also use this message to communicate information on two-party trading. The Trading Session Status Request message is used to query the state of a product.

    Both the Security Status message and Trading Session Status message include a SubscriptionRequestType field, which is used to tell the counterparty application if the requesting application wants to receive a snapshot of status or wants to subscribe for unsolicited messages as the status of the security (or trading session) changes.

    Background

    The motivation behind these messages was to identify a method to be able to trade derivative strategies (butterfly spread, vertical spread, calendar spread, covered write, etc.) and to provide a mechanism to define FLEX Options using the FIX protocol. Most exchange trading systems have some type of product definition service. Although the motivation for the new messages was to support the communication between trading party and exchange, it was important to make any message flexible enough to support a variety of applications, including the ability to retrieve information about securities available for trading with a counterparty. The ability to query for a list of securities is very important in an exchange environment – where the retrieval of “standing data” from the exchange is needed by many trading systems.

    Definitions
    • Strategy - A group of related securities that are traded atomically at a net price.

      Examples:

      • Vertical Spread
      • Butterfly Spread
      • Calendar Spread
      • Covered Write
    • Strategy Leg - One Security within a strategy

    • Spread - combination of derivative securities whose maturity date or strike price is spread, creating a synthetic Security.

    • Synthetic - A financial security that is the result of holding positions in multiple securities.

    • Combination - alias for spread or strategy.

    Approach

    A Security Definition Request message can be used to make the following requests:

    • Define and/or Request a specific Security to be traded with the second party.
    • Request a list of the Security Types that can be traded with the second party (these Securities can include derivative trading strategies).
    • Request a list of Securities that can be traded with the second party.
    • Request a list of Securities for a specified Security Type that can be traded with the second party.
    • Request a list of Securities available for trading during a specific trading session.

    The Security Definition message is used to:

    • Indicate acceptance of a Security defined in a previous Security Definition Request message.
    • Indicate acceptance of a Security defined in a previous Security Definition Request message with changes to the definition and/or symbol or security ID.
    • Reject the request for security.
    • Return a list of security types.
    • Return a list of securities.
    • Return a list of securities for a security type.
    Extensions to other messages

    One additional field, MultiLegReportingType, is to be used on the Execution Report to indicate if the Execution Report is for the multileg security itself or an individual leg of the multileg security. Absence of this field in the Execution Report implies that the report pertains to the entire security – not an individual leg.

    The agreement on how parties report multileg security execution is left to individual trading parties and is to be configured out of band. The FIX protocol will not provide a mechanism to specify how multileg execution reporting should be done.

    For an example:

    A straddle is an option strategy that consists of simultaneously buying a call option and a put option at the same strike price and maturity date. The straddle is defined for trading using the Security Definition Request Message. Once the straddle is defined, via receipt of the Security Definition Message from the counterparty (in this case an options exchange), a New Order – Single is used to submit the order to trade this newly defined multileg security. If the parties agree to report multileg execution by individual legs– then an execution report will be generated for each leg of the option strategy. If the parties agree to report multileg execution by multileg security only, then only one Execution Report will be issued for the fill.

    Reporting by leg is required for equity options as clearing houses will only understand the individual option series legs. Reporting by legs permits the trading parties to accurately maintain positions.

    Rules
    • The Security identification negotiated during the session is, by default, assumed valid only during the session. This eliminates the requirement for, but does not prevent the use, of a service to define and keep Securities persistent.
    • Once a Security is defined, it will be traded as a regular Security
    • Once a Security is defined, it will be traded at a single net price
    • Once a Security is defined, it can be traded by FIX 4.1 compatible systems (This provides for backward compatibility and the ability to maintain Security information outside of FIX so that FIX 4.1 engines can participate).
    Specifying Derivative Trading Strategies using the Security Definition message

    The Security Definition message can be used to specify multiple legs of a derivative trading strategy. The first set of security related tags are used to name and identify the proposed strategy. This is followed by the NoRelatedSym tag (146), which indicates the number of legs in the proposed security. After the NoRelatedSym tag, security related fields are repeated for each leg in the proposed security.

    Two additional pieces are needed specify the strategy.

    • RatioQty is a quantity field that indicates the ratio of the leg to other legs in the strategy.
    • Side indicates if that particular leg will be bought or sold as part of the strategy.

    Example using RatioQty and Side:

    A Butterfly strategy consists of simultaneously:

    • Buying 1 Call at Strike Price #1
    • Selling 2 Calls at the next higher strike price (Strike Price #2)
    • Buying 1 call at the next higher strike price (Strike Price #3)

    The Legs that would describe this strategy are as follows:

    PutOrCallRatioQtySide
    1=Call11=Buy
    1=Call22=Sell
    1=Call11=Buy

    Scenario 1 - Typical use of Security Definition message in placing an Order

    This scenario has the first party defining a strategy order using a Security Definition message.

    First PartySecond Party
    Security Definition Request message
    SecurityRequest = 1
    Propose an identity for the Security or Request an identity for the Security from second party
    Interprets Security request
    If second party accepted Security then the first party is free to use the Security in a tradeSecurity Definition message
    SecurityResponse = 0
    New Order – Single message
    Product = Security information from the Security Definition message
    Order is handled by exchange
    Execution Report
    Order received
    (Most likely will need to add Security information to the Execution report)
    Execution Report
    Fill Information on Order

    Scenario 2 - Inquire Securities Types Available

    This scenario has the first party requesting a list of Security types supported by the second party

    First PartySecond Party
    Security Definition Request message
    SecurityRequest = 2
    Processes Security Definition message
    First party can use this to select a list of messagesSecurity Definition message
    In this scenario, the trading party only trades three types of securities
    SecurityResponseType = 2
    NoRelatedSym = 3
    UnderlyingSecuritySymbol = SecurityType#1
    UnderlyingSecuritySymbol = SecurityType#2
    UnderlyingSecuritySymbol = SecurityType#3

    Scenario 3 – Inquire Common Stocks Available for Trading with Counterparty

    This example shows how the Security Definition Request Message and Security Definition Messages can be used to return a list of common stocks available for trading with a counterparty. The first party specifies the SecurityRequest equal to 3 and specifies the SecurityType of common stock. The second party returns a list of common stocks available on its market. Note: This is intended to return standing data (static data) or a list of products available for trading – it is not intended to return an order book (see Market Data messages for this purpose). This is most applicable but not limited, to the case when the second party is an exchange.

    First PartySecond Party
    Security Definition Request message
    In this scenario the initiator wants to obtain a list of common stock available for trading with the counterparty.
    SecurityRequest = 3
    SecurityType = "CS"
    Processes Security request
    Create a list of common stocks that are available for trading.
    First party can use this to select a list of messagesSecurity Definition message
    Contains list of common stocks available for trading with the second party
    SecurityResponse = 3
    NoRelatedSym = 25
    UnderlyingSecuritySymbol = "AOL" … Other tags for this security
    UnderlyingSecuritySymbol = "GM" … Other tags for this security
    UnderlyingSecuritySymbol = "IBM" … Other tags for this security

    Scenario 4 - Inquire all securities traded by a trading party

    This scenario has the first party requesting a list of Security types supported by the second party.

    First PartySecond Party
    Security Definition Request message
    SecurityRequest = 3
    Processes Security request
    Create a list of the Securities available for the specified SecurityType
    First party can use this to select a list of messagesSecurity Definition message
    Contains list of Securities available for the specified Security Types supported by second party
    SecurityResponse = 3
    NoRelatedSym = XX
    Security information for each security is provided for each of the XX securities.

    Scenario 5 – Inquire Option Classes Available for Trading with Counterparty

    This example shows how the Security Definition Request Message and Security Definition Messages can be used to return a list of option classes available for trading with a counterparty. The first party specifies a Security Request Type equal to 3 (Request List of Securities) and the SecurityType of options. The second party returns a list of option classes available on its markets. Note: This is intended to return standing data (static data) or a list of products available for trading – it is not intended to return an order book (see Market Data messages).

    First PartySecond Party
    Security Definition Request message
    In this scenario the initiator wants to see a list of option series for IBM that are traded by the counterparty (that may be an exchange)
    SecurityRequest = 3
    SecurityType = "OPT"
    Processes Security request
    Create a list of common stocks that are available for trading.
    First party can use this to select a list of messagesSecurity Definition message
    Contains list of common stocks available for trading with the second party
    SecurityResponse = 3
    NoRelatedSym = 25
    UnderlyingSecuritySymbol = "AOL"
    UnderlyingSecuritySymbol = "GM"
    UnderlyingSecuritySymbol = "IBM"

    Scenario 6 - Inquire list of option series for a class

    This scenario has the first party requesting a list of option classes by setting the SecurityRequest equal to 3, the SecurityType to “OPT”, and a security symbol = “IBM”. Because a symbol is given, the second party sends back a list of option series for the class specified with a symbol or securityID.

    First PartySecond Party
    Security Definition Request message
    SecurityRequest = 3
    SecurityType = "OPT"
    Symbol = "IBM"
    Any of the security identification fields can be populated for this query
    Processes Security request
    Because a symbol is provided the second party sends back a list of option series.
    First party can use this to select a list of messagesSecurity Definition message
    Contains list of option series available for the specified the class specified in the request.
    SecurityResponse = 3
    NoRelatedSym = XX
    Security information for each security is provided for each of the XX securities.

    Back to top ↑

    Appendix J

    Example Usage of Encoded Fields For Japanese Language Support

    Example 1 - Specify the ASCII/English value as Issuer plus Japanese character set as EncodedIssuer

    TagField NameValue
    …Other Standard Header fields
    347MessageEncodingShift_JIS
    …Other Standard Header fields
    …Other Message Body fields
    106IssuerHITACHI
    348EncodedIssuerLen10
    349EncodedIssuer日立製作所
    …Other Message Body fields

    Example 2 - Specify the ASCII/English value as Issuer plus Japanese character set as EncodedIssuer. Specify the ASCII/English value as Text plus Japanese character set as EncodedText.

    TagField NameValue
    …Other Standard Header fields
    347MessageEncodingShift_JIS
    …Other Standard Header fields
    …Other Message Body fields
    106IssuerHITACHI
    348EncodedIssuerLen10
    349EncodedIssuer日立製作所
    …Other Message Body fields
    58TextHITACHI
    356EncodedTextLen17
    357EncodedTextこれはテストです。
    …Other Message Body fields

    Precautions when using UNICODE

    There is the possibility that an SOH may be included in the character data when using UNICODE encoding. To avoid parsing problems, a FIX engine should use the EncodedLen value to extract the proper number of bytes.


    Back to top ↑

    Appendix K

    Example Usage of Allocations

    The Allocation message provides the the ability to specify how an order or set of orders should be subdivided amongst one or more accounts.

    Allocation is typically communicated Post-Trade (after fills have been received and processed). It can, however, also be communicated Pre-Trade (at the time the order is being placed) to specify the account(s) and their respective order quantities which make up the order. This is a regulatory requirement in certain markets and for certain types of securities.

    Pre-Trade Allocation

    Orders involving Pre-Trade Allocation consist of the following steps:

    • Buyside sends a New Order request message specifying one or more AllocAccount and AllocShares values within the repeating group designated by NoAllocs.

    • Sellside sends Execution Report messages for the “New” and resulting fills.

    • Post-Trade Allocation messaging takes place

    The typical flow for Pre-Trade allocation is as follows:

    InstitutionNew Order-Single (OrderQty=35000, NoAllocs=2, AllocAccount=ACCT1, AllocShares=10000, AllocAccount=ACCT2, AllocShares=25000)Broker
    Execution Report (ExecType = “0” [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Post-Trade Allocation Processing (see examples below)

    Post-Trade Allocation

    Post-Trade Allocation can be computed via one of two methods:

    1. Using Average Price: Each AllocAccount has a single AllocAvgPx (e.g. US and European) (see examples 1-1, 2-1, 3-1)
    2. Using Executed Price: Combination of each AllocAccount and AllocPrice (unique LastPx) (e.g. Japan) (see examples 1-2, 2-2, 3-2)

    Post-Trade Allocation supports three different message flows:

    Buyside initiated without Misc Fees (see examples 1-1 and 1-2)

    The typical flow for US domestic trading (without MiscFees) is as follows:

    InstitutionAllocation (AllocTransTyp=New)Broker
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)
    Settlement Instructions (optional) (SettlInstSource=Institution’s)
    Settlement Instructions (optional) (SettlInstSource=Broker’s)

    *Settlement Instructions may occur anywhere in the flow and may represent standing instructions.

    Buyside-initiated with Misc Fee computation (see examples 2-1 and 2-2)

    The typical flow for international trading (with MiscFees) is as follows:

    InstitutionAllocation (AllocTransTyp=Preliminary, AllocAccounts provided without MiscFees or NetMoney)Broker
    AllocationACK (AllocStatus=Received Not Yet Processed)
    Allocation (AllocTransTyp=Calculated, MiscFees and NetMoney provided by AllocAccount)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)
    Settlement Instructions (optional) (SettlInstSource=Institution’s)
    Settlement Instructions (optional) (SettlInstSource=Broker’s)

    *Settlement Instructions may occur anywhere in the flow and may represent standing instructions.

    Sellside-initiated (see examples 3-1 and 3-2)

    The typical flow for sellside-initiated (unsolicited by the buyside) is as follows:

    InstitutionAllocation (AllocTransTyp=Calculated without preliminary, MiscFees and NetMoney provided by AllocAccount)Broker
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)
    Settlement Instructions (optional*) (SettlInstSource=Institution’s)
    Settlement Instructions (optional*) (SettlInstSource=Broker’s)

    *Settlement Instructions may occur anywhere in the flow and may represent standing instructions.

    Example 1-1: Buyside-initiated flow without MiscFee computation, using Average Price (all AllocAccounts with same AvgPx)

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0” [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Allocation (AllocTransTyp=New)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    IBMBuyN52020300100.003000
    301100.251000
    302100.003000
    303100.502000

    Allocation Msg

    SymbolB/SMktOrder sectionAvgPxRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocSharesCommission
    IBMBuyN99952020100.1389300100.003000F13000150
    301100.251000F23000150
    302100.003000F33000150
    303100.502000

    Example 1-2: Buyside-initiated flow without MiscFee computation, using Executed Price**

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0”) [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Allocation (AllocTransTyp=New)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    IBMBuyN52020300100.003000
    301100.251000
    302100.003000
    303100.502000

    Allocation Msg

    SymbolB/SMktOrder sectionRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocPriceAllocSharesCommission
    IBMBuyN99952020300100.003000F1100.002000100
    301100.251000F1100.25100050
    302100.003000F2100.002000100
    303100.502000F2100.50100050
    F3100.002000100
    F3100.50100050

    Example 2-1: Buyside-initiated flow with MiscFee computation, using Average Price (all AllocAccounts with same AvgPx)

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0” [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Allocation (AllocTransTyp=Preliminary, AllocAccounts provided without MiscFees or NetMoney)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    Commission/ Fee Calc
    Allocation (AllocTransTyp=Calculated, MiscFees and NetMoney provided by AllocAccount)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    HNS.LBuyL520203003.9809100000
    3013.980925000

    Allocation Msg

    SymbolB/SMktOrder sectionRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocSharesCommissionRepeating fields
    (NoMiscFees=2)
    HNS.LBuyL999520203003.9809100000MiscFeeTypeMiscFeeAmt
    3013.980925000F142200335.9885830.9699
    6.25
    F282800652.93751648.0926
    6.25

    Example 2-2: Buyside-initiated flow with MiscFee computation, using Executed Price

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0”) [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Allocation (AllocTransTyp=Preliminary, AllocAccounts provided without MiscFees or NetMoney)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    Commission/ Fee Calc
    Allocation (AllocTransTyp=Calculated, MiscFees and NetMoney provided by AllocAccount)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    1234BuyT5202030013003000
    30113131000
    30213003000
    30313202000

    Allocation Msg

    SymbolB/SMktOrder sectionRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocPriceAllocSharesCommissionRepeating fields
    (NoMiscFees=1)
    1234BuyT9995202030013003000MiscFeeTypeMiscFeeAmt
    30113131000F1130020002506191253
    30213003000F113131000126569632
    30313202000F2130020002505891252
    F213201000127229636
    F3130020002505891252
    F313201000127229636

    Note: This example’s values are for a Japanese Domestic Trade, and for actual use, you need to set any other required fields.

    Example 3-1: Sellside-initiated flow, single Account, using Average Price

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0”) [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Commission/ Fee Calc
    Allocation (AllocTransTyp=Calculated without preliminary, MiscFees and NetMoney provided by AllocAccount)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    IBMBuyNF15202030013003000
    30113131000
    30213003000
    30313202000

    Allocation Msg

    SymbolB/SMktOrder sectionAvgPxRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocSharesCommission
    IBMBuyN999520201305.88930013003000F19000113277
    30113131000
    30213003000
    30313202000

    Example 3-2: Sellside-initiated flow, single Account, using Executed Price

    BUYSIDESELLSIDE
    New Order-Single
    Execution Report (ExecType = “0”) [New]
    Execution Report (ExecType = “1”) [Partial Fill]
    Execution Report (ExecType = “2”) [Filled]
    (optional Execution Report (ExecType = “3”) [Done for day]
    Allocate
    Commission/ Fee Calc
    Allocation (AllocTransTyp=Calculated without preliminary, MiscFees and NetMoney provided by AllocAccount)
    AllocationACK (AllocStatus=Received Not Yet Processed)
    AllocationACK (AllocStatus=Accepted or Rejected)

    SymbolB/SMktOrder MessageExecution Rpt Messages
    AccountOrdIDClOrdIDExecIDLastPxLastShares
    1234BuyTF15202030013003000
    30113131000
    30213003000
    30313202000

    Allocation Msg

    SymbolB/SMktOrder sectionRepeating fieldsRepeating fields
    IDOrdIDClOrdIDExecIDLastPxLastSharesAllocAccountAllocPriceAllocSharesCommissionRepeating fields
    (NoMiscFees=1)
    1234BuyT9995202030013003000MiscFeeTypeMiscFeeAmt
    30113131000F1130060006144193072
    30213003000F113131000103429517
    30313202000F1132020002079691039

    Note: This example’s values are for a Japanese Domestic Trade, and for actual use, you need to set any other required fields.


    Back to top ↑

    Appendix L

    Pre-Trade Message Targeting/Routing

    Three fields, NoRoutingID, RoutingType, and RoutingID have been added to support list processing on third party networks. Vendor "indication of interest" systems generally have list management capabilities. These capabilities include blocking and targeting. To mirror the functionality of the vendor indication systems both blocking and targeting were supported.

    Targeting

    Targeting relates to the message that contains a list of targeted firms or targeted vendor maintained list identifiers to receive the indication. Generally, most vendor "indication of interest" systems maintain list identifiers that contain firm identifiers for their broker connections. For example, a broker has a list called "JapanList" that contains three institutions JapaneseFirm1, JapaneseFirm2, and JapaneseFirm3. The three firm identifiers are created by the vendor.

    Targeting allows for the definition of the universe of firms to receive the indication of interest. A indication of interest message without the targeting identifiers (either firm or list) is assumed to be sent to the whole list of indication receiving firms managed by the vendor (i.e. every institution connected to the broker).

    Specific targeting can be accomplished through the combination of firm identifiers and list identifiers. For example, a broker needs to send an indication of interest to a vendor maintained list of U.K. based clients called "UKList" and two U.S. based firms. The targeting section of the indication of interest would look as follows:

    215=3^216=1^217=USFirm1^216=1^217=USFirm2^216=2^217=UKList^

    Note: The ^ character represents the SOH delimiter.

    Tag Explanation

    215=3Three pairs of routing types and IDs to be processed
    216=1Target ID to follow
    217=USFirm1Target ID named USFirm1
    216=1Target ID to follow
    217=USFirm2Target ID named USFirm2
    216=2Target list to follow
    217=UKListTarget list named UKList

    The vendor would assemble the destination list based on the two firm identifiers and the one list identifier.

    Blocking

    An indication with blocking contains a list of firm identifiers or vendor maintained list identifiers that will be excluded from the targeted list of indication receiving firms managed by the vendor. Using the blocking fields without targeting fields implies that indication of interest is being blocked from the whole universe of institutions available to the broker (i.e. everyone on the vendor's system but these firms).

    Many "indication of interest" systems have sophisticated list handling mechanisms that need to be replicated. Blocking is not always performed from the whole universe of firms on the system (i.e. ALL).

    Using a combination of targeting and blocking fields can allow for sophisticated list management capabilities. For example, let's assume that the broker intends to send an indication of interest to the universe defined by the broker's UKList and two U.S. based firms. However, the broker needs to exclude one UK based firm from the UKList. The targeting and blocking section would appear as follows:

    215=4^216=2^217=UKList^216=1^217=USFirm1^216=1^217=USFirm2^216=3^217=UKFirm1^

    Note: The ^ character represents the SOH delimiter.

    Tag Explanation

    215=4Four pairs of routing types and IDs to be processed
    216=2Target list to follow
    217=UKListTarget list named UKList
    216=1Target firm to follow
    217=USFirm1Target firm named USFirm1
    216=1Target firm to follow
    217=USFirm2Target firm named USFirm2
    216=3Blocked firm to follow
    217=UKFirm1UKFirm1 is blocked from receiving IOI

    The vendor would assemble the targets based on the supplied UKList and two firm identifiers (USFirm1 and USFirm2) and then remove UKFirm1 from the combined list.

    Other Issues

    It is expected that every indication of interest message will have a unique IOIid for the fix session usually the trading day.

    For canceling and replacing, the vendor system would cancel or replace every destination that has been identified on the previous indication of interest by the IOIid. Blocking and targeting information would not be required on the canceled or replaced indication of interest.

    The use of vendor based firm identifiers requires periodic updates to the brokers to ensure proper blocking and targeting. It is expected that vendors will provide file base transfers of firm identifiers and company names until a more automated solution becomes available.


    Back to top ↑

    Appendix M

    FIXML Support

    The FIX Technical Committee has added two new fields XMLDataLen and XMLData to the Standard FIX Header to facilitate the creation of FIXML pilots.

    The FIXML Working Group has been conducting a "proof of concept" pilot project to demonstrate evolution of FIX tag-value application messages to FIXML, a markup grammar based on the Extensible Markup Language (XML). This pilot, following the FIXML white paper and FIXML DTD, is the third deliverable in the process of creating a FIXML standard for the FIX Protocol.

    The addition of these new fields will allow users to:

    • Modify an existing FIX engine by adding a validating XML parser to allow FIXML to be sent enclosed in a traditional FIX header and trailer.
    • Connect the modified FIX engine to an application that has the ability to send and receive FIX messages.
    • Measure the ease with which FIX engines can be ported over to FIXML.
    • Prove that FIXML messages will not break existing FIX engines. The same engine should be able to handle FIXML and FIX messages.

    Back to top ↑

    Appendix N

    Program/Basket/List Trading

    Overview

    A set of messages allow for the automation of program trading. While it is hoped that the message set is comprehensive enough, to automate the complete cycle, it is expected that not all messages will be used in all transactions. Although the message set may appear to be quite complex at first glance, most of the complexity arises from developing one message set that can be used to support two different business models for list trading. The two models, the “Disclosed” and “Non Disclosed” models, are described in the next two sections. The “Disclosed” model is commonly used in Japan while the “Non Disclosed” model is commonly used in Europe and America.

    “Non Disclosed” model (e.g. US/European)

    The buy-side details to the sell-side information about the sector, country and potential market impact of the stocks to be bought or sold. Using this information the sell-side firms bid for the trade. If successful the buy-side firm gives the sell-side firm a detailed list of the stocks to be traded and the sell-side firm executes the trades.

    The important point in the “Non Disclosed” model is that the stocks in the list are not disclosed until a particular sell-side firm has won the portfolio.

    “Disclosed” model (e.g. Japanese)

    The buy-side details the exact stocks and sizes to be traded and the sell-side firm offers the buy-side firm a two-way price, to buy or to sell the indicated stocks. The buy-side firm then tells the successful sell-side firm to buy or sell on its behalf.

    The important point in the “Disclosed” model is that all sell-side firms see all of the stocks and quantities in the portfolio during the bidding phase regardless of whether or not they win the business.

    The New Order - List message can be used, with the side omitted as part of the bidding process, as is the practice in “Disclosed” model or once the bidding has been completed to exchange the list of stocks that make up the program to be traded. Pre-trade allocation is handled via a repeating group within the repeating order block.

    Order modification and cancelation of a portfolio is a major change to the agreement between the buy-side and sell-side firms and as such this change should be conducted by telephone. If an automated route for dealing with amendment/cancelation is required then the existing messages can be used – List Cancel, Order Cancel/Replace Request.

    The New Order - List message is based on the single order message and message flows for canceling a single stock line within a program trade should be those used to support order cancelation in the single order model (e.g. Order Cancel/Replace Request, etc). The ListID in those systems should be used to assist in identifying the order as part of a list trade. Similarly, the Order Status Request message can be used to request the status of a single order in a portfolio trade.

    The List Strike Price Message details the prices that a principal trade is being executed at. In some transactions this appears to be generated by the sell side and checked by the buy-side, in others the reverse is true, and in other cases this information is not passed until the final execution reports

    Pre-trade allocation is much more common place in the program trading community than it is in block trading. For the purposes of pre-trade allocation, a repeating group covering account and number of shares has been added to the order message. It is assumed that participants will use the either FIX allocation messages and message flows for post trade allocation or their existing allocation systems. (e.g. in the event of a pre-allocation basket trade).

    At any stage in the processing of a list message the buy-side may request the status of the list from the sell-side using the List Status Request message. The sell-side responds with a List Status Response message. The sell-side can also send the List Status Response message in an unsolicited fashion according to the requirements passed in the bidding phase or in the List message. The List Status Response message provides summary detail about each of the orders in the List. The sell-side should acknowledge any list request from the buy-side with a List Status Response message providing the current state.

    Once the portfolio has been executed by the sell-side and a List Status Response message has been sent to the buy-side indicating “DONE” for each of the orders in the List, the list can be allocated. If pre-allocation information was provided with the original orders and the orders were fully executed then the allocation information is already known to the sell-side. If the pre-trade allocations are no longer appropriate post trade allocation may be preformed either using FIX Allocation messages or existing allocation systems.

    Message Flow Diagrams

    Overview of logical stages
    1) Buy Side Selects Sell Side2) Buy-Side has chosen Sell-Side3) Selected Sell-Side has list4) Sell-Side begins execution

    The diagram above shows the logical stages involved in the execution of a program trade.


    TransitionDescription
    1→2This transition can occur in the following ways:
    • Buy-side has preferred list which means the business will be directed to a specific Sell-Side
    • Buy-Side provides details of the program to a number of sell-sides. This can be achieved using a mixture of telephone, fax, modem links, and FIX Bid messages.
    2→3Details of the program are transmitted to the chosen Sell-side using telephone, fax, modem links, or FIX New Order - List message.
    3→4This transition can occur in the following ways:
    • Buy-Side and Sell-Side communicate by telephone to confirm content of the program and the Buy-Side instructs the Sell-Side to begin execution.
    • Buy-Side sends a List Execute FIX message to instruct Sell-Side to begin execution.
    4Once the list is being executed the FIX List status messages may be used to notify/request status of the list
    Flow 1-1: Order Details sent via FIX (Bidding Outside of FIX)
    Buy Side InstitutionNew Order - List Message (1 broker)Sell Side Broker Dealer
    2) List Order Status (ACK)
    Flow 1-2: “Disclosed” Bid and Program Trade
    Buy Side Institution1) New Order - List Message (N brokers)Sell Side Broker Dealer
    2) List Order Status (ACK) (1 per broker)
    3) Bid Request Message (N brokers)
    4) Bid Response (1 per broker)
    5) Cancel bid sent to (N − 1) brokers
    Flow 1-3: “Non Disclosed” Bid and Program Trade
    Buy Side Institution1) Bid Request Message (N brokers)Sell Side Broker Dealer
    2) Bid Response (1 per broker)
    Buy-side selects one Sell-side and sends order detail for execution
    3a) Bid Request Cancel (N − 1 brokers)
    3b) New Order - List Message (1 sell-side)
    4) List Status Response (ACK)

    Message Flows once a buy-side has chosen a single sell-side and transmitted New Order - List messages

    The following message flows can occur in any order relative to each other and some may occur many times.

    Flow 2-1: Optional notification to begin execution (may occur zero or one times)
    Buy Side Institution1) List Execute message (1 sell-side)Sell Side Broker Dealer
    2) List Order Status (Ack) Response
    Flow 2-2: Optional transfer of Principal Portfolio Trade prices from buy-side to sell-side (may occur zero or one times)
    Buy Side Institution1) List Strike Price messageSell Side Broker Dealer
    2) List Status message
    Flow 2-3: Optional transfer of Principal Portfolio Trade prices from sell-side to buy-side (may occur zero or one times)
    Buy Side Institution1) List Strike Price messageSell Side Broker Dealer
    2) List Status message
    Flow 2-4: Optional Execution Report status update (may occur zero or N times)
    Buy Side Institution1) Execution Reports (if requested)Sell Side Broker Dealer
    Flow 2-5: Optional List Status Request (may occur zero or N times)
    Buy Side Institution1) List Status Request messageSell Side Broker Dealer
    2) List Status message
    Flow 2-6: Optional Sell-Side unsolicited Status update (may occur zero or N times)
    Buy Side Institution2) List Status messageSell Side Broker Dealer

    Scenario 1: Bidding performed by Telephone and List provided via FIX

    MessageDescriptionPurpose
    New Order - List Message from B/S to S/SDetails the list of stocks that an institution wishes to trade. Normally side is omitted and an indicator is set to show that this message is part of a bid
    List Status Response (Acknowledgement)List status response indicates that the sell-side has received the New Order - List message. The status of each order in the list should indicate a status of bid or rejected. The former if the stock is recognised and the latter if the stock is not recognised.
    may be omittedList Execute MessageDetails the specific bid that has been accepted.

    The specific bid indicates the direction of the list to be executed.
    Required if previous providedList Status ResponseDetails the status of each order in the list. The status should be executing for each order.
    Status updates may optionally follow

    Scenario 2: Fully Disclosed Program Trade – with bidding stage through FIX

    MessageDescriptionPurpose
    New Order - List Message from B/S to S/SDetails the list of stocks that an institution wishes to trade. Normally side is omitted and an indicator is set to show that this message is part of a bid
    List Status Response (Acknowledgement)List status response indicates that the sell-side has received the New Order - List message. The status of each order in the list should indicate a status of bid or rejected. The former if the stock is recognised and the latter if the stock is not recognised.
    Bid Request Message from B/S to S/SDetails the types of bids required, eg Side, Execution Type etc
    may be omittedBid Response MessageDetails the bid response for a program
    may be omittedList Execute MessageDetails the specific bid that has been accepted.

    The specific bid indicates the direction of the list to be executed.
    Required if previous providedList Status ResponseDetails the status of each order in the list. The status should be executing for each order.
    Status updates may optionally follow

    Scenario 3: Non-Disclosed Program Trade – with bidding stage through FIX

    MessageDescriptionPurpose
    may be omitted done by phoneBid Request from B/S to S/SDetails the liquidity information about the stocks that an institution wishes to trade. It does not identify the stocks in the program.
    may be omitted done by phoneBid Response Message from S/S to B/SDetails the bid response for a program
    List Message Detail Message from B/S to S/SDetails the list of stocks that an institution wishes to trade including the stock, quantity, and direction for each order.
    Required if previous providedList Status ResponseDetails the status of each order in the list. The status should be awaiting execution, executing or rejected for each order.
    may be omitted done by phoneList Execute Message from B/S to S/SDetails the bid for a program
    required if previous providedList Status ResponseDetails the status of each order in the list. The status should be executing for each order.

    Illustration of liquidity indicator fields usage

    Normally details, by country and by sector, as number at <5%, no in 5-10%, no in 10-30% and number at > 30% eg 1@ 70%, 1 @ 600% For example

    Country<5%5 – 10%10 - 30%> 30%
    DEM1 Sec $10000004 Sec $20000007 Sec $15000001 Sec @60%, $3000000
    1 Sec @300%
    $8000000
    ESP4 Sec $30000005 Sec $30000003 Sec $3500000
    UK3 Sec $45000006 Sec $36000002 Sec $50000001 Sec @450%
    $9000000

    Sector<5%5 – 10%10 - 30%> 30%
    Industrials2 Sec $1500000541 Sec @300%
    $8000000
    Parmacetical4 Sec331 Sec @450%
    $9000000
    Hotels2751 Sec @60%, $3000000

    **X1.. 9 and Y1 .. 9 simply represent the numbers of stocks in each category.

    The liquidity indicator fields are used to describe the shape of a basket trade in terms of the liquidity and classification of the stocks contained within the list. Thus a list that may be described by the following to tables.

    List liquidity information by country

    % columns refer to percentage of average daily volume.

    Country<5%5 – 10%10 - 30%> 30%
    DEM1 Security Value $10000004 Security Value $20000007 Security Value $15000001 Security Value $3M @ 60%
    1 Security Value $8M @300%
    ESP4 Security Value $30000005 Security Value $30000003 Security Value $3500000
    UK3 Security Value $45000006 Security Value $36000002 Security Value $50000001 Security Value
    $9M @ 450%
    List liquidity information by Security Sector

    % columns refer to percentage of average daily volume.

    Sector<5%5 – 10%10 - 30%> 30%
    Industrials2 Security Value $15000005 Security Value $26000004 Security Value $30000001 Security Value
    $8M @300%
    Pharmaceutical4 Security Value $30000003 Security Value $30000003 Security Value $15000001 Security Value
    $9M @450%
    Hotels2 Security Value $40000007 Security Value $30000005 Security Value $25000001 Security Value $3M @60%

    Would be represented by the following BidRequest Message.

    BidRequest Message (Non Disclosed bid, basket of securites, not an exchange for physical trade)

    Client Bid IDBid Request Trans TypeTotal Num SecuritiesBid TypeSide Value 1Repeating fields
    Bid Descriptor TypeBid DescriptorSide Value IndLiquidity ValueLiquidity Num SecuritiesLiquidity Pct LowLiquidity Pct High
    1001N381371000002DEM1100000010.000.05
    2DEM1200000040.050.10
    2DEM1150000070.100.30
    2DEM1300000010.60*- NP
    2DEM1800000013.00*- NP
    2ESP1300000040.000.05
    2ESP1300000050.050.10
    2ESP1350000030.100.30
    2UK1450000030.000.05
    2UK1360000060.050.10
    2UK1200000020.100.30
    2UK1900000014.50*- NP
    1Ind1150000020.000.05
    1Ind1260000050.050.10
    1Ind1300000040.100.30
    1Ind1800000013.00*- NP
    1Pharm1300000040.000.05
    1Pharm1300000030.050.10
    1Pharm1150000030.100.30
    1Parm1900000014.50*- NP
    1Hotels1400000020.000.05
    1Hotels1300000070.050.10
    1Hotels1250000050.100.30
    1Hotels1300000010.60*- NP

    Notes

    • *- NP field not present in repeating group as entry is describing a single stock at a specific liquidity
    • Where the BidDescriptorType set to 1 the entry in the BidDescriptor field is free text, the sector names Pharmaceuticals and Industrials have been shorten to make every thing fit.

    Back to top ↑

    Appendix O

    Foreign Exchange (F/X) Trading

    Notes:

    • The forex Symbol is defined in "EBS" (Electronic Banking System) format: "CCY1/CCY2".
      • Rates are expressed as "currency1 in currency2" (or "currency2 per currency1") and are calculated as CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
    • (e.g. "GBP/USD" represents a rate expressed as USD per GBP, "USD/JPY" represents a rate expressed as JPY per USD, etc.).
      • CCY1 and CCY2 are ISO currency codes
    • OrderQty represents the amount expressed in units of currency specified by the Currency field. Note OrderQty must be capable of representing large values with at least 2 decimal places.
    • The value of the Currency field represents the denomination of the quantity field(s).
    • The Rate (specified as a “Price” field) represents CCY2 divided by CCY1 (NOT CCY1 divided by CCY2)
    • The “unknown quantity” can be calculated using the following rules:
      • If Currency field value = CCY1 then as: (OrderQty * Rate)
      • If Currency field value = CCY2 then as: (OrderQty / Rate)
    Verbal representationSideOrderQtyCurrencySymbol (CCY1/CCY2)RateRate "Style""Resulting" Quantity
    Sell 1,000,000 USD for JPYSell1,000,000USDUSD/JPY105.92Normal105,920,000
    JPY/USD0.009441088Inverted
    Sell 50,000,000 JPY for USDSell50,000,000JPYUSD/JPY105.92Normal472,054.38
    JPY/USD0.009441088Inverted
    Buy 50,000,000 JPY for USDBuy50,000,000JPYUSD/JPY105.92Normal472,054.38
    JPY/USD0.009441088Inverted
    Buy 1,000,000 USD for JPYBuy1,000,000USDUSD/JPY105.92Normal105,920,000
    JPY/USD0.009441088Inverted
    Sell 1,000,000 USD for CADSell1,000,000USDUSD/CAD1.437Normal1,437,000.00
    CAD/USD0.695894224Inverted
    Sell 50,000,000 CAD for USDSell50,000,000CADUSD/CAD1.437Normal34,794,711.20
    CAD/USD0.695894224Inverted
    Buy 50,000,000 CAD for USDBuy50,000,000CADUSD/CAD1.437Normal34,794,711.20
    CAD/USD0.695894224Inverted
    Buy 1,000,000 USD for CADBuy1,000,000USDUSD/CAD1.437Normal1,437,000.00
    CAD/USD0.695894224Inverted
    Sell 1,000,000 USD for GBPSell1,000,000USDGBP/USD1.6368Normal610,948.19
    USD/GBP0.610948192Inverted
    Sell 50,000,000 GBP for USDSell50,000,000GBPGBP/USD1.6368Normal81,840,000.00
    USD/GBP0.610948192Inverted
    Buy 50,000,000 GBP for USDBuy50,000,000GBPGBP/USD1.6368Normal81,840,000.00
    USD/GBP0.610948192Inverted
    Buy 1,000,000 USD for GBPBuy1,000,000USDGBP/USD1.6368Normal610,948.19
    USD/GBP0.610948192Inverted
    Sell 1,000,000 USD for EURSell1,000,000USDEUR/USD1.001Normal999,001.00
    USD/EUR0.999000999Inverted
    Sell 50,000,000 EUR for USDSell50,000,000EUREUR/USD1.001Normal50,050,000.00
    USD/EUR0.999000999Inverted
    Buy 50,000,000 EUR for USDBuy50,000,000EUREUR/USD1.001Normal50,050,000.00
    USD/EUR0.999000999Inverted
    Buy 1,000,000 USD for EURBuy1,000,000USDEUR/USD1.001Normal999,001.00
    USD/EUR0.999000999Inverted
    Sell 1,000,000 EUR for GBPSell1,000,000EUREUR/GBP.6111Normal611,100.00
    GBP/EUR1.636393389Inverted
    Sell 50,000,000 GBP for EURSell50,000,000GBPEUR/GBP.6111Normal81,819,669.45
    GBP/EUR1.636393389Inverted
    Buy 50,000,000 GBP for EURBuy50,000,000GBPEUR/GBP.6111Normal81,819,669.45
    GBP/EUR1.636393389Inverted
    Buy 1,000,000 EUR for GBPBuy1,000,000EUREUR/GBP.6111Normal611,100.00
    GBP/EUR1.636393389Inverted
    Sell 1,000,000 EUR for CHFSell1,000,000EUREUR/CHF1.6125Normal1,612,500.00
    CHF/EUR0.620155039Inverted
    Sell 50,000,000 CHF for EURSell50,000,000CHFEUR/CHF1.6125Normal31,007,751.94
    CHF/EUR0.620155039Inverted
    Buy 50,000,000 CHF for EURBuy50,000,000CHFEUR/CHF1.6125Normal31,007,751.94
    CHF/EUR0.620155039Inverted
    Buy 1,000,000 EUR for CHFBuy1,000,000EUREUR/CHF1.6125Normal1,612,500.00
    CHF/EUR0.620155039Inverted

    Back to top ↑

    Glossary

    Business Terms

    The following glossary is an attempt to identify business terms used in this document or related to implementing FIX globally. Requests for new terms and/or suggested definitions should be posted in the FIX Web Site’s Discussion section.

    All or NoneA round-lot market or limit-price order that must be executed in its entirety or not at all; unlike Fill or Kill orders, AON orders are not treated as canceled if they are not executed as soon as represented in the Trading Crowd.
    [ExecInst]
    At the OpeningA market or limit-price order to be executed at the opening of the stock or not at all; all or part of any order not executed at the opening is treated as canceled.
    [TimeInForce]
    Basis PriceA price established by joint agreement of odd-lot dealers in 100-share-unit stocks when:
    - no round-lot has occurred during the trading session,
    - the spread between the closing bid and offer is two points or more, and
    - on odd-lot the dealer has been given a “basis-price” order.
    [OrdType]
    Buy MinusA round-lot market order to buy “minus” is an order to buy a stated amount of a stock provided that its price is:
    - not higher than the last sale if the last sale was a “minus” or “zero minus” tick and
    - not higher than the last sale minus the minimum fractional change in the stock if the last sale was a “plus” or “zero plus” tick.

    A limit price order to buy “minus” also states the highest price at which it can be executed.
    [Side]
    Day OrderA buy or sell order that, if not executed expires at the end of the trading day on which it was entered.
    [TimeInForce]
    Do Not IncreaseA limit order to buy, a stop order to sell, or a stop-limit order to sell which is not to be increased in shares on the ex-dividend date as a result of a stock dividend or distribution.
    [ExecInst]
    Do Not ReduceA limit order to buy, a stop order to sell, or a stop-limit order to sell that is not to be reduced in price by the amount of an ordinary cash dividend on the ex-dividend date. A do-not-reduce order applies only to ordinary cash dividends; it should be reduced for other distributions - such as when a stock goes “ex” stock dividend or “ex” rights.
    [ExecInst]
    Fill or KillA market or limit-price order that is to be executed in its entirety as soon as it is represented in the Trading Crowd; if not so executed, the order is to be canceled. Not to be confused with Immediate or Cancel.
    [TimeInForce]
    Good Till CanceledAn order to buy or sell that remains in effect until it is either executed or canceled; sometimes called an “open order”.
    [TimeInForce]
    Good Till ExecutedAn order to buy or sell that remains in effect until it is executed.
    Immediate or CancelA market or limit-price order that is to be executed in whole or in part as soon as it is represented in the Trading Crowd; any portion not so executed is to be canceled. Not to be confused with Fill or Kill.
    [TimeInForce]
    Limit or BetterIndicates an order to
    - buy a security at the indicated limit price or lower, or to
    - sell a security at the indicated limit price or higher.
    [OrdType]
    Limit With or WithoutAn order to be executed at a limit price, with or without round-lot sales; valid only for odd lot orders.
    [OrdType]
    MarketIndicates an order to buy or sell a stated amount of a security at the most advantageous price obtainable after the order is represented in the Trading Crowd.
    [OrdType]
    Market On CloseA round-lot order to be executed at - or as near to as practical - the close of the market.
    [OrdType]
    Market Or BetterIndicates an order to buy or sell a stated amount of a security at the quoted market or better.
    [OrdType]
    On CloseAn odd-lot order to buy or sell to be filled at the price of the closing round-lot offer
    - plus the differential, for a buy order, or
    - minus the differential, for a sell order,
    or
    A crossing session order to buy or sell at the closing price.
    [OrdType]
    Sell PlusA round-lot market order to sell “plus” is an order to sell a stated amount of a stock provided that its price is:
    - not lower than the last sale if the last sale was a “plus” or “zero plus” tick and
    - not lower than the last sale minus the minimum fractional change in the stock if the last sale was a “minus” or “zero minus” tick.

    A limit-price order to sell “plus” also states the lowest price at which it can be executed.
    [OrdType]
    Sell ShortAn order to sell a security that the seller does not own; a sale effected by delivering a security borrowed by, or for the account of, the seller. Can only be executed on a “plus” or “zero plus” tick.
    [OrdType]
    Sell Short ExemptShort sale exempt from short-sale rules.
    [OrdType]
    StopA stop order to buy which becomes a market order when the security trades at - or above - the stop price after the order is represented in the Trading Crowd. A stop order to sell which becomes a market order when the security trades at - or below - the stop price after the order is represented in the Trading Crowd.
    [OrdType]
    Stop LimitA stop order to buy which becomes a limit order at the limit price when the security trades at - or above - the stop price after the order is represented in the Trading Crowd. A stop order to sell which becomes a limit order at the limit price when the security trades at - or below- the stop price after the order is represented in the Trading Crowd.
    [OrdType]

    Back to top ↑

    Orchimate Copyright 2026 Atomic Wire Technology Limited
    Orchestra Copyright 2026 FIX Protocol Ltd
    Terms of Service|Privacy Policy