Financial Information Exchange Protocol
Version: 4.1 with Errata
Date: June 30, 1999
Table of Contents
- Financial Information Exchange Protocol
- Table of Contents
- DISCLAIMER
- Preface
- Release Notes
- Introduction
- FIX Message Format and Delivery
- Session Protocol
- Administrative Messages
- Application Messages
- Advertisements
- Indications of Interest
- News
- Quote Request
- Quote
- New Order - Single
- Execution Reports
- Don’t Know Trade
- Order Cancel/Replace Request
- Order Cancel Request
- Order Cancel Reject
- Order Status Request
- Allocation
- Allocation ACK
- Settlement Instructions
- New Order - List
- List Status
- List Execute
- List Cancel Request
- List Status Request
- Appendix A
- Appendix B
- Appendix C
- Appendix D
- Order State Change Matrices
- Filled Order
- Partially Filled Order
- Canceled Order
- Partially Filled Order followed by Replace Request to Decrease Order Quantity
- Replaced Order
- Filled Order followed by a CancelReject
- Partially Filled Order followed by a Cancel Request
- Partially Filled Order followed by Replace Request to Increase Quantity
- Filled Order followed by Replace Request to Increase Quantity
- Rejected Order due to Duplicate ClOrdID
- Order State Change Matrices
- Appendix E
- Appendix F
- Appendix G
- Glossary
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).
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, 816-340-7053 (scott_atwell@americancentury.com) or Sam Johnson, Goldman, Sachs & Co., 212-357-1186 (sam.johnson@gs.com). Technical Committee 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
June, 1999
| US Steering Committee | European Steering Committee | Japanese Steering Committee |
|---|---|---|
| Alliance Capital | Alliance Capital | Dai-ichi Life Asset Management Co.,Ltd. |
| American Century | Axa Sun Life | Daiwa Securities Co.,Ltd |
| Donaldson, Lufkin & Jenrette | BT Alex Brown | Goldman Sachs (Japan) Ltd. |
| Fidelity Capital Markets | Credit Suisse First Boston | Merrill Lynch Japan Incorporated |
| Fidelity Mgmt & Res. Co. | Dresdner RCM Global Investors | Morgan Stanley Japan Limited |
| The Goldman Sachs Group, Inc. | Fidelity International | Nikko Salomon Smith Barney |
| Merrill Lynch | Foreign and Colonial Mgmt Limited | Nippon Life Insurance Company |
| Morgan Stanley DW&D | Goldman, Sachs International | Nomura Asset Management Co., Ltd. |
| Paine Webber | HSBC | The Mitsubishi Trust and Banking Corporation |
| Putnam Investments | Instinet | The Sumitomo Trust & Banking Co., Ltd. |
| Salomon Smith Barney | Invesco | |
| State Street Global Advisors | Mercury Asset Management | |
| Warburg Pincus | Merrill Lynch | |
| Morgan Stanley Dean Witter | ||
| Prudential | ||
| Robert Fleming | ||
| Royal Sun Alliance | ||
| Salomon Smith Barney | ||
| Warburg Dillon-Read |
Release Notes
This document includes a list of minor adjustments to the FIX 4.1 Specification document due to typographical errors or ambiguities. The nature and scope of these adjustments do not introduce new functionality, additional fields, new values for existing fields, or new messages. 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.1 should refer to this document to ensure the most consistent implementation and clearest understanding of the FIX protocol.
Minor Adjustments to the Protocol Specification Document
| Adjusted Date | Section | Item | Adjustment |
|---|---|---|---|
| 8/24/1998 | Field Reference / Order Messages | [E19980824_1] ExecInst field clarification | Usage of ExecInst=D (percent of volume) needs to be clarified in the specification. This doesn't mean a specific percentage; rather it is an indicator that the sender doesn't want to be all of the volume on the floor. Add “(indicates that the sender does not want to be all of the volume on the floor vs. a specific percentage)” to the Field Reference ExecInst field description. |
| 5/4/1999 | Field Reference / Order State Matrices | [E19990129_1] ExecType field clarification | Wording in field reference for ExecType doesn’t list the enumerations or say same as OrdStatus. Also issues with “Partially Filled” vs. “Partial Fill” and “Replaced” vs. “Replace” semantics for matrices and enumeration names. Add the same list of enumerations from ExecType to OrdStatus in the field reference except OrdStatus will use the term “Partially Filled” and “Replaced” and ExecType will use the term “Partial Fill” and “Replace” although the enumerations will be the same. Ensure that the “Order State Matrices” represent those terms. |
| 5/4/1999 | Allocation Message | [E19990129_2] MiscFees in Allocation message clarification | Specify that within a MiscFees repeating group the MiscFeeType field cannot be repeated. Add “(can only occur once within a MiscFee group)” to the Allocation Message “MiscFeeType” listing. |
| 5/4/1999 | Allocation Message | [E19990129_3] LastCapacity typo in Allocation message | LastCapacity in Execs repeating group in Allocation message should be bolded. Bold LastCapacity in Execs repeating group in Allocation message. |
| 5/4/1999 | News and Email Messages | [E19990129_4] NoRelatedSym typo (should be not required) for News and Email | A typo was introduced in version 4.1 when the field NoRelatedSym was added with status of required to News and Email. Since the body of the repeating group is not required, the number of instances field should not be required. This is consistent with the other messages (such as Allocation) which have had optional repeating groups. Change News and Email message’s “Req’d” column to N for NoRelatedSym. |
| 5/4/1999 | Field Reference | [E19990129_5] Clarification re: number of decimal places for “price” fields | The Field Reference of the spec specifies all of the "price" fields as within the range of “0 – 99999999.9999”, however, the number of decimal places are not limited to four. It is important to note that the value should be specified in decimal format vs. scientific notation. The “Data Types” section in the beginning of the FIX spec specifies that float fields have a “15 significant digit” limit. The number of decimal places used should be a factor of business/market needs and mutual agreement between counterparties. Add “(number of decimal places may vary)” to Field Reference. Add “The number of decimal places used should be a factor of business/market needs and mutual agreement between counterparties” to the “Data Types” section. |
| 5/4/1999 | Session | [E19990129_6] Clarification re: handling of termination without Logout | Session termination without receiving a Logout should assume that the counterparty has logged out. Add “Session termination without receiving a Logout should treat the counterparty as logged out” to the “Logout” portion within the “Session Protocol” section. |
| 5/4/1999 | Allocation Message | [E19990129_7] Adjust the order of fields in the Execs repeating group of the Allocation message. | FIX version 4.1 attempted to adjust the order of fields within a repeating group if necessary in order to make the first field of a repeating group required if the repeating group is used. This allows a parser to use the presence of that field as a “delimiter” between instances of the repeating group. It was noted that the “Execs” repeating group in the Allocation Message. Change the order of fields in the Allocation Message “Execs” repeating group so that “LastShares” (required if NoExecs > 0) is listed prior to “ExecID” (not required and currently the first field listed). |
| 5/4/1999 | Exchange Appendix | [E19990129_9] Additional Exchange Code: Tradepoint | Value should be “TP” (as defined by Reuters). Add to FIX website listing of exchange codes and Appendix C. |
| 5/4/1999 | Exchange Appendix | [E19990129_10] Additional Exchange Code: Le Nouveau Marche (France) | Value should be “LN” (as defined by Reuters). Add to FIX website listing of exchange codes and Appendix C. |
| 5/4/1999 | Field Reference | [E19990129_11] PossResend field clarification | The Field Reference description of the “PossResend” field does not list the valid values. Add to “PossResend” field description in the Field Reference: Valid Values: Y= Possible resend N=Original transmission |
| 5/4/1999 | Field Reference | [E19990129_12] OpenClose field clarification | The Field Reference description of the “OpenClose” field does not list the valid values. Add to “OpenClose” field description in the Field Reference: Valid Values: O=Open C=Close |
| 5/4/1999 | IOI Message | [E19990129_13] IOI message clarification | In the description table for the IOI message, property Side (54) is described as "Side of Indication, Valid values: 1=Buy, 2=Sell". If you look at the table of all field definitions, Side (54) has 2 new values, "7=Undisclosed (for IOIs)" and "8=Cross (orders where counterparty is an exchange)". The description table for the IOI message is wrong and should say that "7=Undisclosed" is also a valid value (not just buy and sell). Add “7 = Undisclosed (for IOIs)” to “Side” field note in the Indication of Interest Message. |
| 5/4/1999 | Message construction | [E19990129_14] Message construction clarification | Message construction specifically header + body + trailer vs. "any order" needs clarification. Note the “Message Format” section currently states: “The general format of a FIX message is a standard header followed by the message body fields and terminated with a standard trailer”, however it also states “Except where noted, fields within a message can be defined in any sequence…Any exceptions are explicitly defined otherwise…” The first statement should apply as a noted exception but needs to be stressed. Add “, and general message format of standard header followed by body followed by standard trailer.” to the list of bolded, stated exceptions to fields in any sequence. Add “Note if encryption used, the SecureData field is a header field and thus the body data will appear between the header and trailer.” |
| 5/4/1999 | Settlement Instructions | [E19990129_15] Settlement Instructions message clarification | The use of "broker's" in the Field Reference description for tags 176-187 is misleading. The SettlInstSource field specifies whether the instructions provided are the broker's or institution’s. If the SettlInstSource = "Institution's Settlement Instructions" then the SecuritySettlAgentAcctNum (tag 179) would represent the Institution's account at the local agent back not the Broker's. To see both sides of the instructions you would have two Settlement Instruction messages with different SettlInstSource values. Change the Field Reference use of the word “broker” to “SettlInstSource” in tags 176-187. |
| 5/4/1999 | Standard Header | [E19990129_16] Standard Header addressing clarification | Examples regarding the use of SenderCompID, TargetCompID, DeliverToCompID, and OnBehalfOfCompID are needed for clarity. a) Without Q involved, sending A to B:
b) Without Q involved, sending B to A:
c) Send from A to B via Q
d) B responds to A via Q:
e) Send from A to B *AND* C via Q
f) B *AND* C send to A via Q
|
| 5/4/1999 | Session Protocol Section | [E19990129_17] Clarification re: session initiation | Add language to the “Logon” sub-section within the “SESSION PROTOCOL” section to stress the fact that both initiator and acceptor must ensure that sequence numbers have been synchronized before sending any queued or new messages. Recommend waiting a short period of time or sending a TestRequest and waiting for response to it in order to allow both sides to handle resend request processing before sending queued and new messages. Recommend that an engine should store out of sequence messages in a temp 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 would result in many resent PossDupFlag=Y messages. Add to the “Logon” sub-section within the “SESSION PROTOCOL”: “ before sending any queued or new messages” to “After authentication, the initiator and acceptor must synchronize their messages through the interrogation of the MsgSeqNum field” and bold the sentence. Add “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.” Add “It is also recommended that an engine should store out of sequence messages in a temp 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.” |
| 5/4/1999 | Session Protocol Section | [E19990129_19] ResetSeqNumFlag processing clarification | The description of ResetSeqNum processing within the “Logon” sub-section within the “SESSION PROTOCOL” section uses the terms “initiator” and “acceptor” with a different context than the prior bullet points in the section. Replace “Both sides should be agree on a reset time” with “Both sides should agree upon 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.” |
| 5/4/1999 | Field Reference / Business Messages | [E19990129_20] Side field clarification | FIX version 4.1 introduced two new enumerations for the Side field. Clarification is necessary to specify that “7=Undisclosed” is only valid for IOI messages and that “8=Cross” is valid for all messages other than IOIs. Modify the field reference for the Side field adding “(valid for IOI messages only)” after “7=Undisclosed” and adding “(valid for all messages except IOIs)” after “8=Cross”. |
| 5/4/1999 | Order Messages / Order State Matrices | [E19990129_22] Order Messages/Matrix Clarifications | Clarify that when a “Fill Or Kill” (FOK) order cannot be filled or an “Immediate Or Cancel” (IOC) order cannot be immediately hit, the proper response to "kill" the order is an ExecutionRpt with ExecType=”Cancelled”. Note that this is the equivalent of an “UNSOLICITED UR OUT” CMS message. Clarify that the equivalent of a “NOTHING DONE” CMS message should be sent as a “status report”, i.e. an ExecutionRpt message with ExecTransType=“Status” and ExecType/OrdStatus that of the previous ExecutionRpt message for this order (usually “New” or “Replaced” when “nothing has been done”). Add the above to the Order State Matrices. |
| 5/4/1999 | ExecutionRpt Message | [E19990129_23] ExecutionRpt message clarification | In the ExecutionRpt message, LastShares is defined as "Quantity of shares bought/sold on this fill" and LastPx is "Price of last fill". "This fill" and "last fill" in these two phrases relate to LAST ExecutionReport of THIS fill. The ExecutionRpt could be sent just to inform status of the order (in this case LastPx and LastShares both will be set to zero). Modify LastShares comment to state “Quantity of shares bought/sold on this (last) fill”. Modify LastPx comment to state “Price of this (last) fill”. |
| 5/4/1999 | Field Reference | [E19990129_24] ExecInst field clarification | Clarification is necessary for the “ExecInst” field and two of its values: “No cross” and “OK to cross”. If a customer specifies “No cross” then the broker is forbidden to cross even if in certain circumstances (i.e. a cross reported to the exchange within the spread using electronic interfaces could meet or better the customer’s order). Add “(cross is forbidden)” to “ExecInst” field’s value “A=No cross” in the Field Reference. |
| 5/4/1999 | Order messages / Order State Matrices | [E19990129_25] Order message handling clarification | Clarification is necessary regarding how partial or complete fills should be communicated back to the customer while the customer’s order is in a “pending” state. Specifically it needs to be clarified as to whether or not the partials should be reported against the “original” or “replaced” order while the “original” is pending and waiting to achieve the “replaced” status. Description of the OrigClOrdID field within the ExecutionRpt message should indicate that it is conditionally required for “Pending Cancel, Replace, or Canceled ExecType values” vs. “OrdStatus”. Add and bold: “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, LeavesQty, Price, etc). An order cannot be considered replaced until it has been explicitly accepted and confirmed to have reached the replaced status (i.e OrdStatus = “Replaced”)--Care should be taken as the replaced order could still have reports coming which will update the CumQty and AvgPx of both the original and replacement, however, the effect on the replacement (ClOrdID, new quantity or limit price, etc.) will not be seen until a report on the replacement has been generated.” to the ExecutionRpt message. Add to Order State Matrices. Modify the description of the OrigClOrdID field within the ExecutionRpt message replacing “Pending Cancel, Replaced, or Canceled OrdStatus values” with “Pending Cancel, Replace, or Canceled ExecType values”. |
| 5/4/1999 | Field Reference / Business Messages | [E19990430_2] Currency field reference | The Currency field in the field reference and Allocation Message currently states that absence of the field should be interpreted as US Dollars. Replace “Absence of this field is interpreted as US dollars” with “Absence of this field is interpreted as the default for the security. It is recommended that systems provide the currency value whenever possible.” in the Field Reference. Remove “Absence of this field in a message is interpreted as US dollars” from the various business message’s “Currency” listing. |
| 5/4/1999 | Field Reference / Appendix | [E19990430_4] Clarify Rule80A field as OrderCapacity | Rule80A was originally created as a New York Stock Exchange-specific field. Other markets need to convey similar values, however, each market may have specific rules which govern the applicable values. This field would have been better named “OrderCapacity”. Thus “(aka OrderCapacity)” should be added to the “Rule80A” references in the Field Reference and elsewhere in the spec. Note that for US trading, Rule80A’s values and usage details are documented in SEC Rule11Ac1-1/4. Also note the purpose behind the rule is to restrict prices from rising or falling too fast providing more stability in the market. Add “(aka OrderCapacity)” to the “Rule80A” entry in the Field Reference and elsewhere in the spec. Add note to see “Rule80A (aka OrderCapacity) Usage by Market” appendix. Add an appendix section for “Rule80A (aka OrderCapacity) Usage by Market”. Note that for US trading, Rule80A’s values and usage details are documented in SEC Rule11Ac1-1/4. Add “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.” Add Japanese-specific implementation values recommended by the local Japanese FIX working group for Japanese markets. |
| 5/4/1999 | Exchange Appendix | [E19990430_7] Additional Exchange Code: Lisbon Stock Exchange (Portugal) | Value should be “LS” (as defined by Reuters) Add to FIX website listing of exchange codes and Appendix C. |
| 5/4/1999 | Exchange Appendix | [E19990430_8] Additional Exchange Code: Interbolsa (Portugal) | Value should be “IN” (as defined by Reuters). Add to FIX website listing of exchange codes and Appendix C. |
| 5/4/1999 | Session Protocol Section | [E19990430_9] Typographical Error in Session Protocol Section—Logout | The “Logout” sub-section within the “SESSION PROTOCOL” has a typographical error “acceptora” which should read “acceptor a”. Correct typographical error in the “Logout” sub-section within the “SESSION PROTOCOL” replacing “acceptora” with “acceptor a”. |
| 5/4/1999 | Field Reference / Appendix | [E19990504_1] Rule80A field clarification and missing values for usage with the NYSE |
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.
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.
Except where noted, fields within a message can be defined in any sequence (Relative position of a field within a record is inconsequential.) Any exceptions are explicitly defined otherwise: four header/trailer fields (BeginString, BodyLength, MsgType, and CheckSum), fields within repeating data groups, and general message format of standard header followed by body followed by standard trailer..
It is permissible for fields to be repeated. In the case where a field allows multiple values, these repeating fields are logically added together to form the data for that field. 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).
All fields (including those of data type data i.e. SecureData, RawData, SignatureData, etc.) in a FIX message are terminated by a delimiter character. The non-printing, ASCII "SOH" (#001), is used for field termination. Records are delimited by the “SOH” character following the CheckSum field. All records begin with the “8=FIX.x.y” string and terminate with “10=nnn<SOH>“.
There shall be no embedded delimiter characters within fields except for data type data.
Data Types
Data types 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").
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.
char
Alpha-numeric free format strings, can include any character or punctuation except the delimiter. All char fields are case sensitive (i.e. morstatt ≠ Morstatt).
time
Time/date combination in YYYYMMDD-HH:MM:SS format, colons and dash required.
Valid values:
- YYYY = 0000-9999, MM = 01-12, DD = 01-31, HH = 00-23, MM = 00-59, SS = 00-59.
date
Date 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).
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. 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 record length and a simple checksum of characters.
The record 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 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.
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 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.
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. 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.
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. 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:
retransmit the requested messages (in order) with the original sequence numbers and PossDupFlag set to “Y”
issue a SeqReset-GapFill with PossDupFlag set to “Y” message to replace the retransmission of administrative and application messages
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, 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 Type | Action to Be Taken on Sequence # mismatch |
|---|---|
| Logon | Must 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. |
| Logout | If 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. |
| ResendRequest | Perform the Resend processing first, followed by a ResendRequest of your own in order to fill the incoming message gap. |
| SeqReset-Reset | Ignore the incoming sequence number. The NewSeqNo field of the SeqReset message will contain the sequence number of the next message to be transmitted. |
| SeqReset-GapFill | Send 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 Messages | Perform Gap Fill operations. |
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 helps 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).
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):
| SenderCompID | OnBehalfOfCompID | TargetCompID | DeliverToCompID | |
|---|---|---|---|---|
| A to B directly | A | B | ||
| B to A directly | B | A |
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):
| SenderCompID | OnBehalfOfCompID | TargetCompID | DeliverToCompID | ||
|---|---|---|---|---|---|
| Send from A to B via Q | |||||
| 1) | A sends to Q | A | Q | B | |
| 2) | Q sends to B | Q | A | B | |
| B responds to A via Q | |||||
| 1) | B sends to Q | B | Q | A | |
| 2) | Q sends to A | Q | B | A | |
| Send from A to B *AND* C via Q | |||||
| 1) | A sends to Q | A | Q | B | |
| 2) | Q sends to B | Q | A | B | |
| 3) | A sends to Q | A | Q | C | |
| 4) | Q sends to C | Q | A | C | |
| B *AND* C send to A via Q | |||||
| 1) | B sends to Q | B | Q | A | |
| 2) | Q sends to A | Q | B | A | |
| 3) | C sends to Q | C | Q | A | |
| 4) | Q sends to A | Q | C | A |
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.
Administrative Messages
The administrative messages are 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 monitos 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.
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.)
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.
- 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= 999999
Reject
The reject message should be issued when a message is received butcannot be passed through to the application level. 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 disregbard 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.
Whenever possible, it is strongly recommended that the cause of the failure be described in the Text field (e.g. INVALID DATA - FIELD 35).
Sequence Reset (Gap Fill)
The sequence reset message is used by the sending application to reset the incoming sequence number on the opposing side. 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 can be used to mark the place of that message.
- During normal resend processing, a number of administrative messages are not resent, the Sequence Reset 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
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.
If the GapFill 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 message with an out of sequence MsgSeqNum should not generate resend requests).
If the Gap Fill field is present (and equal to Y), the MsgSeqNum should conform to standard message sequencing rules (i.e. the MsgSeqNum of the SequenceReset-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.
The logout initiator should not send any messages after the logout.
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 record can be originated at either the broker or institution side.
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.
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.
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.
Orders can be generated based on Quotes. Quoted orders include the QuoteID and are OrdType=Previously Quoted or Forex - Previously Quoted.
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 and 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.
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 ISO codes, as “held-currency.new-currency” (e.g. “USD.GBP” indicates a desire to convert a held amount of USD to GPB)
Sideis defined in terms of whether the OrderQty is currency required or currency held (e.g. a forex order can be expressed as either “S 3,200,000 USD for GPB” or “B 2,000,000 GBP for USD”, at a rate of 1.6 USD/GBP, these trades are equivalent in that the broker is receiving 3,200,000 USD and delivering 2,000,000 GBP). 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),Sideshould represent the side of theFutSettDate2transaction.OrdType= Forex - Market, Forex - Limit, Forex- Swap, or Forex - Previously Quoted- Netting can be specified via the
ExecInstfield.
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).
Execution Reports
The execution report message is used to:
- confirm the receipt of an order
- confirm changes to an existing order (i.e. accept cancel and replace requests)
- relay order status information
- relay fill information on working orders
- reject orders
- 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 message will contain information that will describe the current state of the order and execution status as understood by the broker. State changes should be sent as separate messages and should not be used to also convey new partial fill details (i.e. do not report a partial fill or filled in a Done for the Day, Reject, etc.)
Execution report messages can be transmitted as transaction types (ExecTransType) NEW, CANCEL, CORRECT or STATUS. Transaction types CANCEL and CORRECT modify the state of the message identified in field ExecRefID. 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
ExecTransTypeandOrdStatusfields 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
ExecRefIDfield. - 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
ExecRefIDfield. If a single execution is corrected more than once,ExecRefIDshould refer to theExecIDof the last corrected ExecutionRpt (same convention asClOrdIDandOrigClOrdID). Note: Data reported in theCumQty,LeavesQty, andAvgPxfields represent the status of the order as of the time of the correction, not as of the time of the originally reported execution.
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, LeavesQty, Price, etc). An order cannot be considered replaced until it has been explicitly accepted and confirmed to have reached the replaced status (i.e OrdStatus = “Replaced”)--Care should be taken as the replaced order could still have reports coming which will update the CumQty and AvgPx of both the original and replacement, however, the effect on the replacement (ClOrdID, new quantity or limit price, etc.) will not be seen until a report on the replacement has been generated.
The ExecType field describes the specific ExecutionRpt while OrdStatus will always identify the current order status.
An Order State Change Matrix appears in the appendix.
To transmit a change in OrdStatus for an order, the broker(sell side) should send an Execution Report with the new OrdStatus value in ExecType AND OrdStatus to signify this message is changing the state of the order. The only exception to this rule is when sending a CancelReject in response to a Cancel or Replace request, the CancelReject message is used. Furthermore, partial/complete fill information should be sent in a separate Execution Report than order accept(New), cancel accept(Canceled), cancel/replace accept(Replaced) or Done For Day reports.
The OrdStatus field is used to identify the status of the current 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:
| Precedence | OrdStatus | Description |
|---|---|---|
| 1 | Pending Cancel/Replace | Order with cancel request pending, used to confirm receipt of cancel or replace request. DOES NOT INDICATE THAT THE ORDER HAS BEEN CANCELED OR REPLACED. |
| 2 | Done for Day | Order not, or partially, filled; no further executions forthcoming |
| 3 | Calculated | Order 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 |
| 4 | Filled | Order completely filled, no remaining quantity |
| 5 | Stopped | Order has been stopped at the exchange |
| 6 | Suspended | Order has been placed in suspended state at the request of the client. |
| 7 | Canceled | Canceled order with or without executions |
| 7 | Expired | Order has been canceled in broker’s system due to time in force instructions. |
| 8 | Partially Filled | Outstanding order with executions and remaining quantity |
| 9 | Replaced | Replaced order with or without executions |
| 10 | New | Outstanding order with no executions |
| 10 | Rejected | Order 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. |
| 10 | Pending New | Order 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. |
NOTE: The canceled and replaced order status is set in response to accepted cancel and replace requests. These requests are only acted upon when there is an outstanding order quantity. Requests to replace OrderQty to a level less than the CumQty will be rejected. 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, Expired, Calculated, or Rejected in which case the order is no longer active and LeavesQty could be 0.
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.
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.
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:
ExecInst | ExpireTime | OrderQty2 |
OrderQty | MinQty | OpenClose |
OrdType | MaxFloor | CoveredOrUncovered |
Price | StopPx | Side (i.e. sell to sell plus) |
HandlInst | PegDifference | MaxShow |
TimeInForce | CashOrderQty | LocateReqd |
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 cancellation 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.
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 record instructs a broker on how to allocate executed shares to sub-accounts. The allocation record 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 record can be sent by the broker to communicate fees and other details which can only be computed once the sub-account breakdowns are known.
An allocation message can be submitted as preliminary, calculated, 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. 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.
The allocation record contains repeating fields for each order, sub-account and individual execution. The repeating fields are shown below in typeface Bold-Italic. The field’s relative position in the record is important. For example, each instance of allocation must be in the order shown below.
- The total shares allocated must equal the
Sharesvalue 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
NoOrdersfield and each individual order in theOrderIDfields. Combined orders must have the same ticker, trade date, settlement date and side.
The typical flow for US domestic trading (without MiscFees) is as follows:
| Institution | → | Allocation (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) |
The typical flow for international trading (with MiscFees) is as follows:
| Institution | → | Allocation (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.
Allocation ACK
The allocation ACK record is used by the broker to acknowledge the receipt and status of an allocation record 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):
- To provide “standing instructions” for the settlement of trades occurring in the future, messages should include some combination of.
AllocAccountLastMktSideSecurityTypeSettlLocationSettlDeliveryTypeEffectiveTime
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.
New Order - List
The new order list message type is used by institutions wishing to electronically submit lists of related orders to a broker for execution.
The New Order List is intended for use in staging lists to be executed by the broker. If the institution wishes to work a list using the broker's execution services, the orders should be submitted as individual New Order - Single's.
After staging, the list can be operated on in the following ways:
| Execute | The broker can be instructed to release the list for execution by sending the List-Execute message. |
| Cancel | 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. |
| Status | A status of the list can be requested via the submission of the List-Status Request message. The broker will respond with one or more List-Status messages which will report executed quantity, canceled quantity and average price for each order in the list. |
| Replace | Individual orders within the list can be replaced via Order Cancel/Replace Request messages. |
Executions against orders within the list will not normally be reported as they occur. (If this feature is desired the institution and broker should arrange for this reporting as a custom feature using the Execution message.) Executions against the list will be reported within the List-Status message.
List Status
The list status message is issued as the response to a List Status Request message and 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 order; the repeating fields are shown below in typeface Bold-Italic. The relative position of the repeating fields is important in this record, i.e. each instance of ClOrdID, CumQty, LeavesQty, CxlQty and AvgPx must be in the order shown below.
Each list status message will report on only a maximum of 50 orders; if the list contains more than 50 orders multiple status messages will be required.
List Execute
The list execute message type is used by institutions to instruct the broker to begin execution of a previously submitted list.
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.
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).
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 22. This value would be transmitted a |10=022| 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 );
}Appendix C
Reuters Exchange Mnemonics
Exchanges A–L
| Exchange | Mnemonic |
|---|---|
| Alberta Stock Exchange | AL |
| American Stock Exchange | A |
| Amman Stock Exchange | AM |
| Amsterdam Stock Exchange | AS |
| Australian Stock Exchange | AX |
| Bahrain Stock Exchange | BH |
| Basle Stock Exchange | BS |
| Barcelona Stock Exchange – Floor Trading | BC |
| Barcelona Stock Exchange – CATS Feed | MC |
| Belfox | b |
| Berlin Stock Exchange | BE |
| Berne Stock Exchange | BN |
| Bologna Stock Exchange | BL |
| Bombay Stock Exchange | BO |
| Bordeaux Stock Exchange | BD |
| Boston Stock Exchange | B |
| Bremen Stock Exchange | BM |
| Brussels Stock Exchange | BR |
| Chicago Board Options Exchange | W |
| Cincinnati Stock Exchange | C |
| Colombo Stock Exchange | CM |
| Copenhagen Stock Exchange | CO |
| Deutsche Terminboerse (DTB) | d |
| Dusseldorf Stock Exchange | D |
| European Options Exchange | E |
| Florence Stock Exchange | FL |
| Frankfurt Stock Exchange | F |
| Fukuoka Stock Exchange | FU |
| Geneva Stock Exchange | G |
| Genoa Stock Exchange | GE |
| Hamburg Stock Exchange | H |
| Hanover Stock Exchange | HA |
| Helsinki Stock Exchange | HE |
| Hiroshima Stock Exchange | HI |
| Hong Kong Stock Exchange | HK |
| Integrated Bourse Trading and Information System (IBIS) | IB |
| Interbolsa (Portugal) | IN |
| Istanbul Stock Exchange | IS |
| Jakarta Stock Exchange | JK |
| Japanese Securities Dealers Association | Q |
| Johannesburg Stock Exchange | J |
| Karachi Stock Exchange | KA |
| Korea Stock Exchange | KS |
| Kuala Lumpur Stock Exchange | KL |
| Kyoto Stock Exchange | KY |
| Lagos Stock Exchange | LG |
| Lausanne Stock Exchange | LA |
| Le Nouveau Marche | LN |
| Lille Stock Exchange | LI |
| Lisbon Stock Exchange (Portugal) | LS |
| London Stock Exchange | L |
| Luxembourg Stock Exchange | LU |
| Lyon Stock Exchange | LY |
Exchanges M–Z
| Exchange | Mnemonic |
|---|---|
| Madrid Stock Exchange – Floor Trading | MA |
| Madrid Stock Exchange – CATS Feed | MC |
| Marseille Stock Exchange | MS |
| MATIS | MT |
| MEFF Renta Variable | I |
| Mexican Stock Exchange | MX |
| Midwest Stock Exchange | MW |
| Milan Stock Exchange | MI |
| MONEP Paris Stock Options | p |
| Montreal Exchange | M |
| Munich Stock Exchange | MU |
| Muscat Stock Exchange | OM |
| Nancy Stock Exchange | NC |
| Nagoya Stock Exchange | NG |
| Nairobi Stock Exchange | NR |
| Nantes Stock Exchange | NT |
| Naples Stock Exchange | NA |
| NASDAQ | O |
| NASDAQ Dealers – International | OI |
| NASDAQ Dealers – Bulletin Board | OB |
| New York Stock Exchange | N |
| New Zealand Stock Exchange | NZ |
| Niigata Stock Exchange | NI |
| Osaka Stock Exchange | OS |
| Oslo Stock Exchange | OL |
| Pacific Stock Exchange | P |
| Palermo Stock Exchange | PL |
| Paris Stock Exchange | PA |
| Philadelphia Stock Exchange | PH |
| Philadelphia Stock Exchange – Options | X |
| Rome Stock Exchange | RO |
| Sao Paulo Stock Exchange | SA |
| Sapporo Stock Exchange | SP |
| Singapore Stock Exchange | SI |
| Shanghai Stock Exchange | SS |
| Shenzhen Stock Exchange | SZ |
| Stockholm Options Market | o |
| Stockholm Stock Exchange | ST |
| Stuttgart Stock Exchange | SG |
| Swiss Options and Financial Futures Exchange (SOFFEX) | Z |
| Taiwan Stock Exchange | TW |
| Tel Aviv Stock Exchange | TA |
| Thailand Stock Exchange | BK |
| Third Market | TH |
| Tokyo Stock Exchange | T |
| Toronto Options Exchange | K |
| Toronto Stock Exchange | TO |
| Tradepoint Stock Exchange | TP |
| Trieste Stock Exchange | TR |
| Tunis Stock Exchange | TN |
| Turin Stock Exchange | TU |
| Vancouver Stock Exchange | V |
| Venice Stock Exchange | VE |
| Vienna Stock Exchange | VI |
| Zimbabwe Stock Exchange | ZI |
| Zurich Stock Exchange | Z |
Other
| Exchange | Numeric Value |
|---|---|
| None | 0 |
| American Stock Exchange Options | 1 |
| Chicago Mercantile Exchange (CME) | 2 |
| London International Financial Futures Exchange (LIFFE) | 3 |
| POSIT | 4 |
| London Traded Options Market | 5 |
| Montreal Exchange Options (MOE) | 6 |
| New York Stock Exchange Options (NYO) | 7 |
| Pacific Stock Exchange Options (PAO) | 8 |
| Vancouver Options Exchange (VAO) | 9 |
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 and cancel/replace requests. These state diagrams are presented from the broker’s view. (Note: x refers to the original order, y refers to the cancel/replacing order)
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, LeavesQty, Price, etc). An order cannot be considered replaced until it has been explicitly accepted and confirmed to have reached the replaced status (i.e OrdStatus = “Replaced”)--Care should be taken as the replaced order could still have reports coming which will update the CumQty and AvgPx of both the original and replacement, however, the effect on the replacement (ClOrdID, new quantity or limit price, etc.) will not be seen until a report on the replacement has been generated.
When a “Fill Or Kill” (FOK) order cannot be filled or an “Immediate Or Cancel” (IOC) order cannot be Immediately hit, the proper response to "kill" the order is an ExecutionRpt with ExecType=”Cancelled”. Note that this is the equivalent of an “UNSOLICITED UR OUT” CMS message.
The equivalent of a “NOTHING DONE” CMS message should be sent as a “status report”, i.e. an ExecutionRpt message with ExecTransType=“Status” and ExecType/OrdStatus that of the previous ExecutionRpt message for this order (usually “New” or “Replaced” when “nothing has been done”).
Filled Order
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected), 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | (may repeat for multiple partials) 38=10000, 151=<tag38-tag14) | |
| 4 | Execution(X) | Fill | Filled | 38=10000, 151=0, 14=10000 |
Partially Filled Order
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | (may be multiple) 38=10000, 151=<tag38-tag14) | |
| 4 | Execution(X) | Done for Day | Done for Day | 38=10000, 151=0(depending on lifetime of order) |
Canceled Order
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Cancel Request(Y,X) | Pending Cancel | 38=10000 | ||
| 4 | Cancel Reject(Y,X) | N/A | New | (if rejected by salesperson) | |
| 4 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 151=10000 | |
| 5 | Cancel Reject(Y,X) | N/A | New | (if rejected by trader/exchange) | |
| 5 | Execution(Y,X) | Canceled | Canceled | 38=10000, 151=0 |
¹ information only transmitted as the result of an Order Status Request on this order
Partially Filled Order followed by Replace Request to Decrease Order Quantity
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | 38=10000, 32=1000, 14=1000, 151=9000 | |
| 4 | Replace Request(Y,X) | Pending Cancel¹ | (decreasing order quantity to 8000 leaving 7000 open) 38=8000 | ||
| 5 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected by sales person) | |
| 5 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 14=1000, 151=9000 | |
| 6 | Execution(X) | Partial Fill | Pending Cancel | 38=10000, 32=500, 14=1500, 151=8500 | |
| 7 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected by trader/exchange) | |
| 7 | Execution(Y,X) | Replace | Partially Filled | 38=8000, 14=1500, 151=6500 | |
| 8 | Execution(Y,X) | Fill | Filled | 38=8000, 14=8000, 151=0 |
¹ information only transmitted as the result of an Order Status Request on this order
Replaced Order
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Replace Request(Y,X) | Pending Cancel¹ | (changing price only) 38=10000 | ||
| 4 | Cancel Reject(Y,X) | N/A | New | (if rejected by sales person) | |
| 4 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 151=10000 | |
| 5 | Cancel Reject(Y,X) | N/A | New | (if rejected by trader/exchange) | |
| 5 | Execution(Y,X) | Replace | Replaced | 38=10000, 151=10000 |
¹ information only transmitted as the result of an Order Status Request on this order
Filled Order followed by a CancelReject
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | (may repeat for multiple partials) 38=10000, 151=<tag38-tag14) | |
| 4 | Replace Request(Y,X) | Partially Filled¹ | (replace request and filled message "pass" each other on the connection) 38=10000 | ||
| 4 | Execution(X) | Fill | Filled | 38=10000, 32=10000, 14=10000, 151=0 | |
| 5 | Cancel Reject(Y,X) | Filled |
Partially Filled Order followed by a Cancel Request
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | 38=10000, 151=<tag38-tag14) | |
| 4 | Cancel Request(Y,X) | Pending Cancel | 38=10000 | ||
| 5 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected) | |
| 5 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 151=<tag38-tag14) | |
| 6 | Execution(X) | Partial Fill | Pending Cancel | 38=10000, 151=<tag38-tag14) | |
| 7 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected) | |
| 7 | Execution(Y,X) | Canceled | Canceled | 38=10000, 151=0 |
Partially Filled Order followed by Replace Request to Increase Quantity
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | 38=10000, 151=<tag38-tag14) | |
| 4 | Replace Request(Y,X) | Pending Cancel¹ | (increasing quantity) 38=12000 | ||
| 5 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected) | |
| 5 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 151=<tag38-tag14) | |
| 6 | Execution(X) | Partial Fill | Pending Cancel | 38=10000, 151=<tag38-tag14) | |
| 7 | Cancel Reject(Y,X) | N/A | Partially Filled | (if rejected) | |
| 7 | Execution(Y,X) | Replace | Partially Filled | 38=12000, 151=<tag38-tag14) |
Filled Order followed by Replace Request to Increase Quantity
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | Rejected | Rejected | (if rejected) 38=10000, 151=0 | |
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Fill | Filled | 38=10000, 14=10000, 151=0 | |
| 4 | Replace Request(Y,X) | Pending Cancel¹ | (increasing quantity) 38=12000 | ||
| 5 | Cancel Reject(Y,X) | N/A | Filled | (if rejected) | |
| 5 | Execution(Y,X) | Pending Cancel | Pending Cancel | 38=10000, 151= | |
| 7 | Cancel Reject(Y,X) | N/A | Filled | (if rejected) | |
| 7 | Execution(Y,X) | Replace | Partially Filled | 38=12000, 151= |
Rejected Order due to Duplicate ClOrdID
| Time | Message Received (ClOrdID, OrigClOrdID) | Message Sent (ClOrdID, OrigClOrdID) | ExecType | OrdStatus | Comment |
|---|---|---|---|---|---|
| 1 | New Order(X) | Pending New¹ | 38=10000 | ||
| 2 | Execution(X) | New | New | 38=10000, 151=10000 | |
| 3 | Execution(X) | Partial Fill | Partially Filled | 38=10000, 151=<tag38-tag14) | |
| 4 | New Order(X) | Partially Filled¹ | 38=10000 | ||
| 5 | Execution(X) | Rejected | Partially Filled | OrdRejReason=duplicateClOrdID) 38=10000, 151= |
Appendix E
London SETS Order Types Matrix
The FIX OrdType (tag 40) field takes as valid values the CMS specification order types. For exchanges that do not use the CMS specification (e.g. London Stock Exchange) the issue of how exchange order types are represented in the FIX protocol arises. The table below presents the representation of the four London Stock Exchange Trading System (SETS) order types in the FIX protocol:
| LSE Order Type | OrdType | TimeInForce | ExpireTime |
|---|---|---|---|
| At Best | 1 | 3 | n/a |
| Fill or Kill - no limit price | 1 | 4 | n/a |
| Fill or Kill - limit price | 2 | 4 | n/a |
| Limit - day | 2 | n/a, 0 | n/a |
| Limit - good until | 2 | 6 | Good Till Date |
| Execute and Eliminate | 2 | 3 | n/a |
Appendix F
Settlement Instruction Field Usage Matrix
| Trade Settlement Type | F.I.X. Fields Required | F.I.X. Fields Optional |
|---|---|---|
| Standing Instructions Provided (i.e. to be stored in an internal or third-party standing instructions database) | SettlInstIDSettlInstTransTypeSettlInstMode=1SettlInstSourceAllocAccount(some combination of) * LastMkt* Side* SettlLocation* SecurityType* SettlDeliveryType* EffectiveTimeTransactTimeStandInstDbType(either SettlDepositoryCode or SecuritySettl*)SettlBrkrCodeSettlInstCode | ClientIDExecBrokerTextStandInstDbNameStandInstDbIDSettlDepositoryCodeSecuritySettlAgentNameSecuritySettlAgentCodeSecuritySettlAgentAcctNumSecuritySettlAgentContactNameSecuritySettlAgentContactPhone( CashSettl* only if SecuritySettl* fields provided)CashSettlAgentNameCashSettlAgentCodeCashSettlAgentAcctNumCashSettlAgentContactNameCashSettlAgentContactPhone |
| Specific Allocation Account (trade) referencing existing Standing Instructions | SettlInstIDSettlInstTransTypeSettlInstMode=2SettlInstSourceAllocAccountTradeDateAllocIDLastMktSideTransactTimeStandInstDbTypeStandInstDbIDSettlBrkrCodeSettlInstCode | SettlLocationSecurityTypeClientIDExecBrokerTextStandInstDbName |
| Specific Allocation Account (trade) providing details for settlement at a depository | SettlInstIDSettlInstTransTypeSettlInstMode=2SettlInstSourceAllocAccountSettlLocationTradeDateAllocIDLastMktSideTransactTimeSettlDepositoryCodeSettlBrkrCodeSettlInstCode | SecurityTypeClientIDExecBrokerTextSettlDeliveryType |
| Specific Allocation Account (trade) providing details for a Single Agent (bank) for the security | SettlInstIDSettlInstTransTypeSettlInstMode=2SettlInstSourceAllocAccountSettlLocationTradeDateAllocIDLastMktSideTransactTimeSettlBrkrCodeSettlInstCodeSecuritySettlAgentNameSecuritySettlAgentCodeSecuritySettlAgentAcctNum | SecurityTypeClientIDExecBrokerTextSettlDeliveryTypeSecuritySettlAgentContactNameSecuritySettlAgentContactPhone |
| Specific Allocation Account (trade) providing details for a Two Agents (banks) one for the security and one for cash | SettlInstIDSettlInstTransTypeSettlInstMode=2SettlInstSourceAllocAccountSettlLocationTradeDateAllocIDLastMktSideTransactTimeSettlDeliveryType=FreeSettlBrkrCodeSettlInstCodeSecuritySettlAgentCodeSecuritySettlAgentAcctNumCashSettlAgentCodeCashSettlAgentAcctNum | SecurityTypeClientIDExecBrokerTextSecuritySettlAgentNameSecuritySettlAgentContactNameSecuritySettlAgentContactPhoneCashSettlAgentNameCashSettlAgentContactNameCashSettlAgentContactPhone |
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.
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 None | A 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 Opening | A 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 Price | A 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 Minus | A 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 Order | A buy or sell order that, if not executed expires at the end of the trading day on which it was entered. [ TimeInForce] |
| Do Not Increase | A 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 Reduce | A 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 Kill | A 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 Canceled | An order to buy or sell that remains in effect until it is either executed or canceled; sometimes called an “open order”. [ TimeInForce] |
| Good Till Executed | An order to buy or sell that remains in effect until it is executed. |
| Immediate or Cancel | A 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 Better | Indicates 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 Without | An order to be executed at a limit price, with or without round-lot sales; valid only for odd lot orders. [ OrdType] |
| Market | Indicates 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 Close | A round-lot order to be executed at - or as near to as practical - the close of the market. [ OrdType] |
| Market Or Better | Indicates an order to buy or sell a stated amount of a security at the quoted market or better. [ OrdType] |
| On Close | An 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 Plus | A 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 Short | An 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 Exempt | Short sale exempt from short-sale rules. [ OrdType] |
| Stop | A 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 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. [ OrdType] |
| Stop Limit | A 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 above - the stop price after the order is represented in the Trading Crowd. [ OrdType] |
Orchimate Copyright 2026 Atomic Wire Technology Limited
Orchestra Copyright 2026 FIX Protocol Ltd
Terms of Service|Privacy Policy