1. Introduction
1.1. Scope
This document contains descriptions of all the functionalities, even if some of them are not available for users of a particular client. That must be taken into account during communicating with users.
1.2. Overview
The FIX5 Trading Gateway enables clients to submit orders and to receive real-time information on executed trades. The interface is a point-to-point service based on the technology and industry standards TCP/IP, FIXT, and FIX. The session and application event models and messages are based on versions 1.1 and 5.0 (Service Pack 2) of the FIXT and FIX protocols respectively.
1.3. Conventions
Required key:
Key | Description |
Y | Required |
N | Not required |
C | Conditionally required. For conditions, refer to the test in Conditions inside the field description. |
Field properties:
Property | Description |
Conditions | Conditions for:
All items listed under this category are mutually exclusive options. If occurrence of a parameter or a field depends on a combination of conditions, those will be placed in a single item with "AND" conjunction. |
Format | Standard, pattern or a custom type that the value must satisfy. It may include the following:
|
Default | Default value of a parameter. May be specified if it has |
Values | Accepted values of a parameter or possible values of a response (message) including the only possible value. |
Placeholders:
Placeholder | Description |
| User exchange account identifier. Format: integer |
All placeholders are series of upper case letters with words separated by underscores (_
). For example: in user_ACCOUNT_ID
pattern, user_
is the constant part and ACCOUNT_ID
is a placeholder.
1.4. Data Types
Type | Description |
String | Alpha-numeric free format strings. It can include any character or punctuation except the delimiter. All String fields are case-sensitive. |
> Currency | String field representing a currency code. |
> LocalMktDate | String field representing a Date of Local Market (as opposed to UTC) in Format: |
> MultipleCharValue | String field containing one or more space delimited single character values. |
> UTCDateOnly | String field representing a date in UTC format in Format: |
> UTCTimestamp | String field representing date and time combination represented in UTC in either Format:
|
char | Single character value, can include any alphanumeric character or punctuation except the delimiter. All char fields are case-sensitive. The following fields are based on char. |
> Boolean | Char field containing a boolean. Values:
|
float | Sequence of digits with optional decimal point and sign character. The absence of the decimal point within the string will be interpreted as the float representation of an integer value. Format: NOTE: Fields which are derived from float may contain negative values unless explicitly specified otherwise. The following data types are based on float. |
> Amt | Amount in quote currency. |
> Percentage | Float field representing a percentage (e.g., 0.0001 represents 0.01%). |
> Price | Price in quote currency. |
> Qty | Quantity in lots. |
int | Sequence of digits without commas or decimals and optional sign character. Format: NOTE: int values may contain leading zeros. The following data types are based on int. |
> Length | int field representing the length in bytes. Values: ≥ |
> NumInGroup | int field representing the number of entries in a repeating group. Values: ≥ |
> SeqNum | int field representing a message sequence number. Values: ≥ |
2. Connectivity
2.1. CompID
The CompID of each client must be registered before FIX communications can begin. A single client may have multiple connections to the server (i.e., multiple FIX sessions, or logins, each with its own CompID).
The CompID of the server is ME
. The messages sent to the server should contain the CompID assigned to the client in the field SenderCompID(49) and ME
in the field TargetCompID(56). The messages sent from the server to the client will contain ME
in the field SenderCompID(49) and the CompID assigned to the client in the field TargetCompID(56). The client may also specify ME_MD
in the field TargetCompID(56) in order to differentiate connections between FIX5 Trading Gateway and FIX5 Market Data Gateway. In that case, requests with TargetCompID(56) = ME
will be processed on FIX5 Trading Gateway only and with TargetCompID(56) = ME_MD
—on FIX5 Market Data Gateway or otherwise rejected. Once chosen the same TargetCompID(56) value must be used in all request throughout the entire session.
2.2. Password
Each new CompID will be assigned a username and a password on registration.
2.3. Message Rate Throttling
A scheme for throttling message traffic is implemented, where each CompID is only permitted to submit up to a specified number of messages per second:
soft throttle limit—applied to all request messages but OrderCancelRequest(35=F);
hard throttle limit—applied to all request messages without exceptions.
To get acquainted with the exact values of the throttle limits, the client must address a request to their provider.
The soft throttle limit does not affect OrderCancelRequest(35=F) messages and causes rejection of an OrderCancelReplaceRequest(35=G) and placing an OrderCancelRequest(35=F) instead. As a result, the client receives one ExecutionReport(35=8) with rejection to the CancelReplaceRequest(35=G) and another—to the OrderCancelRequest(35=F) which can be either successful or not.
Any other messages will be rejected via a BusinessMessageReject(35=j) (with BusinessRejectReason(380) = 8
(Throttle limit exceeded) and Text(58) specifying the reason for the rejection.
Every message which exceeds the hard throttle limit of a CompID will be rejected via a BusinessMessageReject (with BusinessRejectReason(380) = 8
(Throttle limit exceeded) and Text(58) specifying the reason for the rejection.
Client Heartbeat(35=0) messages, reject messages, and any other client–initiated administrative messages are not counted towards the throttling limits.
2.4. Mass Cancellation on Disconnect
The client may request to cancel all orders submitted through a FIX session. In a Logon(35=A) message, the value of CancelOnDisconnect(10001) field defaults to N
.
If it is set to Y
, then as soon as the gate detects that the client has disconnected (intentionally or due to a connection loss), it will send requests to cancel working orders. If the connection is lost, the gate can detect a disconnection with a delay of several seconds when Heartbeat(35=0) messages do not come from the client.
If the CancelOnDisconnect(10001) flag was not set in the Logon(35=A) message, then canceling on disconnect can be activated for any new order. To do this, in the NewOrderSingle(35=D) message in the ExecInst(18) field add the value o
(Cancel on connection loss).
3. Connections and Sessions
3.1. Establishing Connection
FIX connections and sessions between the client and server are maintained as specified in the FIX protocol.
Each client will use the assigned IP address and port to establish a TCP/IP session with the server. The client will initiate a FIX session by sending the Logon(35=A) message. The client will identify itself using the SenderCompID(49) field. At each connection MsgSeqNum(34) is reset to 1
, the client should set ResetSeqNumFlag(141) to Y
. The server will validate the CompID, password and IP address of the client. Once the client is authenticated, the server will respond with a Logon message.
The client must wait for the server Logon response before sending additional messages. If the client sends messages prior to sending the Logon(35=A) message or prior to receiving the Logon(35=A) response, the server will break the TCP/IP connection with the client without sending any message.
If a logon attempt fails (due to an invalid SenderCompID(49), invalid TargetCompID(56), invalid IP address, invalid password or not having the appropriate privileges to log in to the gateway, or if the user sends a Logon(35=A) message with duplicated tags), the server will break the TCP/IP connection with the client without sending a Logout(35=5) or Reject(35=3) message.
If during a logon of a sender, the server receives a second connection attempt while a valid FIX session is already underway for that same SenderCompID(49), the server will break the TCP/IP connection with the second connection without sending a Logout(35=5) or Reject(35=3) message.
3.2. Maintaining Session
3.2.1. Message Sequence Numbers
As outlined in the FIX protocol, the client, and server will each maintain a separate and independent set of incoming and outgoing message sequence numbers. Sequence numbers should be initialized to 1
(one) at the start of the FIX session and be incremented throughout the session.
If any message sent by the client contains a sequence number that is less than what is expected and the PossDupFlag(43) is not set to Y
, the server will send a Logout message and terminate the FIX connection. The Logout will contain the next expected sequence number as well as the received sequence number in the Text(58) field.
3.2.2. Heartbeats
The client and server will use the Heartbeat(35=0) message to exercise the communication line during periods of inactivity and to verify that the interfaces at each end are available. The heartbeat interval will be the HeartBtInt(108) specified in the client Logon(35=A) message.
The server will send a Heartbeat(35=0) anytime it has not transmitted a message for the heartbeat interval. The client is expected to employ the same logic.
As a safety mechanism, the system will not allow the user to login if HeartBtInt(108) = 0
.
If the server detects inactivity for a period longer than the heartbeat interval plus a reasonable transmission time, it will send a TestRequest(35=1) message to force a Heartbeat(35=0) from the client. If a response to the TestRequest(35=1) is not received by a reasonable transmission time, the server will send a Logout(35=5) and break the TCP/IP connection with the client. The client is expected to employ similar logic if inactivity is detected on the part of the server.
3.2.3. Increasing Expected Sequence Number
The client or server may use the SequenceReset(35=4) message in gap-fill mode if it wishes to increase the expected incoming sequence number of the other party.
The client or server may also use the SequenceReset(35=4) message in SequenceReset(35=4) mode if it wishes to increase the expected incoming sequence number of the other party. The SequenceReset(35=4) mode should only be used to recover from an emergency situation. It should not be relied upon as a regular practice.
3.2.4. Terminating Connection
The client will terminate a connection by sending the Logout(35=5) message. The server will respond with a Logout(35=5) to confirm the termination. The client will then break the TCP/IP connection with the server.
All open TCP/IP connections will be terminated by the server when it shuts down (a Logout(35=5) will be sent). Under exceptional circumstances the server may initiate the termination of a connection during the trading day by sending the Logout(35=5) message.
3.2.5. Re-establishing Session
If a FIX connection is terminated during the trading day it may be re-established via an exchange of Logon(35=A) messages.
4. Single Order Handling
4.1. Order Types
Order types:
Type | Description |
Market | An order that will be executed at the "best" available price. |
Limit | An order that will be executed at or better than the specified price. The remainder, if any, is added to the order book or expired by terms of its Time-In-Force instruction. |
Stop market | A market order that remains inactive until the market crosses a specified stop price (for sell orders—falls below, for buy orders—rises above). |
Stop limit | A limit order that remains inactive until the market crosses a specified stop price (for sell orders—falls below, for buy orders—rises above). |
Take-profit market | A market order that remains inactive until the market crosses a specified stop price (for sell orders—rises above, for buy orders—falls below). |
Take-profit limit | A limit order that remains inactive until the market crosses a specified stop price (for sell orders—rises above, for buy orders—falls below). |
Day
, GTD
, GTC
types are not allowed for market orders.
4.2. Order Statuses
Order statuses:
Status | Description |
New | An active order displayed in the order book. |
Suspended | Inactive order parked until the market or order in an orders list meet certain conditions. |
Partially filled | A part of an active order has been executed. |
Filled | The entire quantity has been executed, and it has been removed from the order book. |
Canceled | An active or inactive order has been canceled either by the user or the system. |
Rejected | An order request has been rejected before any order being parked or activated. |
Expired | An active or inactive order that does not satisfy its conditions. |
4.3. Time in Force
Time If Force types:
Type | Description |
Day | An order that will expire at the end of the day. Day (session) orders automatically expire at UTC 00:00. |
Immediate or Cancel (IOC) | An order that will be executed on receipt and the remainder, if any, immediately expired. |
Fill or Kill (FOK) | An order that will be fully executed on receipt or immediately expired. |
Good Till Date (GTD) | An order that will expire at the specified date and time. |
Good Till Cancel (GTC) | An order that remains in effect until it is either executed or canceled. |
4.4. Post-only Mode
Orders for which the client has placed 6
(Participate do not initiate) in the ExecInst(18) field of NewOrderSingle(35=D) will be in the order book only if they do not trigger a single transaction. Otherwise, two ExecutionReport(35=8) messages will be returned to the client:
ExecType(150) =
0
(New);ExecType(150) =
C
(Expired).
4.5. Reduce-only Mode
Requests with ExecInst(18) = E
(Do not increase) place new orders that, being filled, are guaranteed not to put the position quantity to the point when the position changes its direction, given the quantity of regular close and existing reduce-only orders which are "closer" to the spread. If reduce-only orders in total tend to “flip” the position, the ones farther from the spread may be reduced in size up to the cancellation. If a new reduce-only order is the “farthest” from the spread, then its size is being reduced as well, or an ExecutionReport(35=8) is sent with OrdRejReason(103) = 99
(Other).
This option is available only for margin positions.
4.6. Fat-finger Protection
A limit order request may be rejected to prevent input errors ("Fat-finger" errors) if the following conditions are met concurrently:
order book is not empty;
order price differs more than for 10% from the "worst" of two:
current market price;
the "best" available price.
order quantity is greater than "best" ask or "best" bid size for bids and asks, respectively.
The maximum acceptable difference between order price and the current market price is called the "Fat-finger" limit (10%).
The system will reject a stop limit or take-profit limit order request before order activation if the difference between the limit price and the stop price goes beyond the "Fat-finger" limit.
If the price of a market order exceeds the "Fat-finger" limit, it will be adjusted to the "best" price level accepted by the limit.
A cancel/replace request, failed to satisfy the rule, will be rejected and cancel an existing order without placing a new one.
4.7. Cancel Order
The remainder of a live order may be canceled via the OrderCancelRequest(35=F) message. The server will respond with an ExecutionReport(35=8) or OrderCancelReject(35=9) to confirm or reject the cancellation request respectively.
In a scenario where the OrderCancelRequest(35=F) message is submitted under a different SenderCompID(49) than the SenderCompID(49) of the original order, the ExecutionReport(35=8) will be sent to the canceling SenderCompID(49). If the user canceling the order does not have permissions to cancel orders, the cancel request will be rejected.
The client should identify the order being canceled by its OrigClOrdID(41).
If an order submitted by a different user (PartyID(448)) is being canceled, the OrderCancelRequest(35=F) should include its OrigClOrdID(41).
4.8. Cancel/Replace Order
The following attributes of a live order may be amended via the OrderCancelReplaceRequest(35=G) message:
quantity;
price;
stop price.
The server will respond with an ExecutionReport(35=8) or OrderCancelReject(35=9) to confirm or reject the amendment request respectively.
In a scenario where the OrderCancelReplaceRequest(35=G) message is submitted by a different SenderCompID(49) than the SenderCompID(49) who submitted the original order, the ExecutionReport(35=8) or OrderCancelReject(35=9) will be sent to the modifying SenderCompID(49). If the user amending the order does not have permissions to modify orders on behalf of the firm, the amend request will be rejected.
The client should identify the order being amended by its OrigClOrdID(41).
If an order submitted under a different SenderCompID(49) is being amended, the OrderCancelReplaceRequest(35=G) should include its OrigClOrdID(41). If the amendment is successful, the order will be treated as one submitted under the SenderCompID(49) that sent the Order OrderCancelReplaceRequest(35=G).
The stop price of a stop market, stop limit, take-profit market, take-profit limit order cannot be amended once the order has been injected into the order book.
If an order receives one or more fills while an amendment request is in flight, the system will not reject the incoming amendment request if its quantity after amending will be greater than the filled quantity. Otherwise, the amendment request will be rejected.
An order will lose time priority in the order book if any of its parameters are amended.
4.9. Order Execution Report
The ExecutionReport(35=8) message is used to inform customers of up-to-date information about order status immediately after any occurred event. This message contains the fields:
OrdStatus(39)—this field is used to convey the current state of an order;
ExecType(150)—the type of occurred event is indicated.
The list of event types is given in the table below.
Execution type:
Execution type | Description |
| Indicates that a new order has been accepted. This message will also be sent when a suspended order is injected and added to the order book. |
| Indicates that an order cancel request has been accepted and successfully processed. This message will also be sent unsolicited if the system canceled the order. |
| Indicates that an order cancel/replace request has been accepted and successfully processed. |
| Indicates that an order has been rejected. |
| Indicates that an order has been parked by the system without adding it to the order book. |
| Indicates that secondary orders in a One-Triggers-One-Cancels-Other order list have been placed after the execution of the primary one. |
| Indicates that an order has expired in terms of its time qualifier; or it is IOC, FOK; or ExecInst(18) contains |
| Indicates that an order has been partially or fully filled. The execution details (e.g., price and quantity) are specified. |
| This value is used if the ExecutionReport(35=8) is sent in response to OrderStatusRequest(35=H) or OrderMassStatusRequest(35=AF). |
4.10. Order Identifiers
4.10.1. Client Order Identifier
Clients should comply with the FIX protocol and ensure unique ClOrdID(11) across all messages (e.g., NewOrderSingle(35=D), OrderCancelRequest(35=F), etc.) sent under a particular SenderCompID(49). Given that the server supports GTD orders, clients should also ensure that their ClOrdIDs are unique across trading days (e.g., embed the date within the ClOrdID(11)).
Clients must, in terms of the FIX protocol, specify the ClOrdID(11) when submitting an OrderCancelRequest(35=F) or OrderCancelReplaceRequest(35=G).
Adding a SenderCompID(49) to ClOrdID(11) is recommended.
Example:
|
The system will accept a maximum length of 32 characters. If the identifier is longer than 32 characters then it will be rejected.
This is valid for the following:
NewOrderSingle(35=D)—ClOrdID(11);
OrderCancelRequest(35=F)—OrigClOrdID(41);
OrderCancelReplaceRequest(35=G)—OrigClOrdID(41);
RequestForPositions(35=AN)—PosReqID(710);
OrderStatusRequest(35=H)—OrdStatisReqID(790);
OrderMassStatusRequest(35=AF)—MassStatusReqID(584).
ClOrdID(11) may contain delimiters as desired by the client.
Example:
|
4.10.2. Order Identifier
The server will use the OrderID(37) field of the ExecutionReport(35=8) to keep track of orders within the matching system. Order IDs will be unique across trading days.
4.10.3. Execution Identifier
The server will use the ExecID(17) field to affix a unique identifier for each ExecutionReport(35=8). ExecIDs will be unique across trading days.
5. List Trading
Each order on an order list has a full set of orders parameters and unique client identifier.
5.1. All Or None
All Or None (AON) order lists allow execution of all orders in a set immediately, or expire all of them.
An AON order list can contain orders of the following types:
Market;
Limit.
The following conditions must be met:
there are only FOK orders on the list: all orders are either filled simultaneously or get canceled if some of them cannot be filled;
each order on an order list must have a unique symbol field.
5.2. One Cancel Other
One Cancel Other (OCO) order lists allow to cancel all orders in a set if one of them was executed.
An OCO order list can contain orders of the following types:
Limit;
Stop market;
Take-profit market;
Stop limit;
Take-profit limit.
The following conditions must be met:
no more than one limit order;
the Time-In-Force instruction cannot be FOK or IOC.
Orders from the OCO order list are canceled if one of the following cases:
A limit order has been filled (partially or fully).
One of the stop orders has been activated.
Any order from the list has expired.
Any order from the list has been canceled due to user actions, disconnection or an unsuccessful replacement.
Orders in an order list may on different symbols.
5.3. One Trigger Other
One Trigger Other (OTO) order lists allow activating all orders in the list after the first (primary) order has been partially or fully executed.
An OTO list has two parts:
Primary order, which is always placed first on the list.
Secondary orders that will be activated after a partial or a full execution of the primary order. The number of secondary orders within a list is limited. This limit is defined in the configuration.
All orders from an OTO list may have any type and Time-In-Force instruction.
Orders with the suspended status do not support Cancel/Replace requests.
Cancellation or expiration of any order on the list (primary or secondary) results in the cancellation of the all order list.
5.4. One Trigger One Cancel Other
One Trigger One Cancel Other (OTOCO) order lists allow placing a One-Cancel-Other order list after the first (primary) order has been partially or fully executed.
An OTOCO list has two parts:
Primary order, which is always placed first on the list. This order can have any type and time_in_force values.
Secondary orders that will be combined into an OCO list after a partial or a full execution of the primary order.
The rules for these orders are similar to the OCO order list rules.
The OTOCO order list must contain at least 3 orders including a single primary order and a number of secondary ones. The number of secondary orders within a list is limited. This limit is defined in the configuration.
Orders from the OTOCO list with the suspended status do not support Cancel/Replace requests.
Cancellation or expiration of any order on the list (primary or secondary) results in the cancellation of the all order list.
6. Recovery
6.1. Resend Requests
Sending and processing ResendRequest(35=2) is not supported. In response to the incoming ResendRequest(35=2) the Reject(35=3) message is sent.
6.2. Possible Duplicates
The server handles possible duplicates according to the FIX protocol. The client and server will use the PossDupFlag(43) field to indicate that a message may have been previously transmitted with the same MsgSeqNum(34).
7. Messages
This section provides details on the header and trailer, administrative and application messages utilized by the server. Client-initiated messages not included in this section are rejected by the server via a Reject(35=3) or BusinessMessageReject(35=j).
7.1. Message Types
7.1.1. Administrative Messages
All administrative messages are initiated by either the client or the server.
MsgType(35) | Name | Description |
| Logon | Allows the client and server to establish a FIX session. |
| Logout | Allows the client and server to terminate a FIX session. |
| Heartbeat | Allows the client and server to exercise the communication line during periods of inactivity and verify that the interfaces at each end are available. |
| TestRequest | Allows the client or server to request a response from the other party if inactivity is detected. |
| ResendRequest | Allows for the recovery of messages lost during a malfunction of the communications layers. |
| Reject | Used to reject a message that does not comply with FIXT. |
| SequenceReset | Allows the client or server to increase the expected incoming sequence number of the other party. |
7.1.2. Application Messages
Client-initiated:
MsgType(35) | Name | Description |
| NewOrderSingle | Submit a new order. |
| NewOrderList | Submit a new order list. |
| OrderCancelRequest | Cancel an order. |
| OrderCancelReplaceRequest | Replace an order. |
| OrderStatusRequest | Request order status for a submitted order. |
| OrderMassStatusRequest | Allows to request the status for all orders of the client. |
| NewOrderList | Allows the client to submit a new order list. |
| RequestForPositions | Allows the client to request a PositionReport(35=AP) about balance. |
| SetMargin | Allows the client to change margin account settings. |
| SetLeverage | Allows the client to change margin account leverage. |
| CloseMarginPosition | Allows the client to close a position. |
Server-initiated:
MsgType(35) | Name | Description |
| ExecutionReport | Indicates one of the following events:
|
| OrderCancelReject | Indicates that an OrderCancelRequest(35=F) or OrderCancelReplaceRequest(35=G) has been rejected. |
| ListStatus | Comes in response when a NewOrderList(35=E) request fails. |
| RequestForPositionsAck | Comes in response when requesting position details via RequestForPositions(35=AN). |
| PositionReport | Comes in response when requesting position details via RequestForPositions(35=AN). |
| MarginAccountReport | Comes in response when requesting margin account details via RequestForPositions(35=AN). |
| MarginReject | Indicates that a RequestForPositions(35=AN) has been rejected. |
7.1.3. Business Rejects
Server-initiated:
MsgType(35) | Name | Description |
| BusinessMessageReject | Indicates that an application message could not be processed. |
7.1.4. Message Format
A standard message includes message header, message body, and message trailer. Fields inside the header, body, and trailer consist of TAG
=VALUE
pairs, and, unless otherwise noted, these fields can be defined in any order.
During formation of a request message, it is necessary to follow the order of tags exactly as given in this specification.
Tags in the range from 10000
to 10100
are custom. Any of them may be ignored if it doesn’t occur in this specification.
7.1.5. Message Body
The message body fields can be defined in any order, except NoFIELD
tags (where FIELD
is a field being counted). These tags start repeating data groups. The fields inside these groups must be defined in the order specified in this document.
7.1.6. StandardHeader
The message header fields are given in the table below. The first three fields in the header must be BeginString(8), BodyLength(9) and MsgType(35). Other fields can be defined in any order.
Tag | Name | Type | Req | Description |
| BeginString | String | Y | Identifies beginning of new message and protocol version. Values: Conditions:
|
| BodyLength | Length | Y | Message length, in bytes, forward to the CheckSum(10) field. Conditions:
|
| MsgType | String | Y | Message type. A Conditions:
Values: refer to Message Types |
| SenderCompID | String | Y | CompID of the party the message is sent from. Values:
|
| TargetCompID | String | Y | CompID of the party the message is sent to. Values:
|
| MsgSeqNum | SeqNum | Y | Integer message sequence number. |
| PossDupFlag | Boolean | N | Flag indicating possible retransmission of a message with this MsgSeqNum(34) Default: Values:
|
| SendingTime | UTCTimestamp | Y | Time of message transmission. |
| OrigSendingTime | UTCTimestamp | C | Original time of message transmission when transmitting orders as the result of a resend request. If the original time is not available, this should be the same value as SendingTime(52). Conditions: PossDupFlag(43) = |
7.1.7. StandardTrailer
Tag | Name | Type | Req | Description |
| CheckSum | String | Y | Three byte, simple checksum. Format: 3 characters Conditions:
|
7.2. Administrative Messages
7.2.1. Logon
The Logon(35=A) message authenticates the client establishing a connection to the FIX Server. In addition to the standard fields, clients will need to populate two additional fields—Username(553) and Password(554).
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| EncryptMethod | int | Y | Method of encryption. Values:
|
| HeartBtInt | int | Y | Indicates the heartbeat interval in seconds. Values: ≥ |
| ResetSeqNumFlag | Boolean | Y | Flag indicating that the both sides of the FIX session should reset sequence numbers. Values:
|
| MaxMessageSize | Length | N | Maximum number of bytes supported for a single message. If a message is received from the client, where BodyLength(9) is greater than MaxMessageSize(383), the connection will be closed. This field is sent by the server; if sent by the client, it will be ignored. |
| Username | String | C | Username assigned to the CompID. Conditions: client-initiated message |
| Password | String | C | Password assigned to the CompID. Conditions: client-initiated message |
| DefaultApplVerID | String | Y | Flag indicating the service pack release being applied, by default, to message at the session level. Values:
|
| CancelOnDisconnect | Boolean | N | Flag indicating whether cancel on disconnect functionality is enabled for all orders placed through this session that allows users to have this orders automatically canceled upon an unintentional loss of session connectivity. Conditions: client-initiated message |
Component | Y |
|
|
7.2.2. Logout
The Logout(35=5) message initiates or confirms the termination of a FIX session. It can optionally contain the Text(58) field which is populated with the reason for the logout.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| SessionStatus | int | N | Status of a FIX session. Conditions: server-initiated message Values:
|
| Text | String | N | The field will contain the next expected sequence number as well as the received sequence number if the server terminated the connection after receiving a sequence number that was less than what was expected. In other cases the field will contain the reason for logout. |
Component | Y |
|
|
7.2.3. Heartbeat
The Heartbeat(35=0) message monitors the status of the communication link and identifies when the last of a string of messages was not received. A Heartbeat(35=0) is sent every HeartBtInt(108) seconds, as defined in the Logon(35=A) message, as well as in response to a TestRequest(35=1) message.
Inclusion of the optional TestReqID(112) field indicates that this Heartbeat(35=0) is a response to a TestRequest(35=1) message.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| TestReqID | String | C | Identifier included in an initial TestRequest(35=1) message. Conditions: response to TestRequest(35=1) Values: TestReqID(112) in TestRequest(35=1) |
Component | Y |
|
|
7.2.4. TestRequest
The TestRequest(35=1) message forces a heartbeat from the opposing application. It can be initiated both from the client and from the server.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| TestReqID | String | Y | Identifier included in TestRequest(35=1) message to be returned in resulting Heartbeat(35=0). |
Component | Y |
|
|
7.2.5. ResendRequest
This function is used if a sequence number gap is detected, if the receiving application lost a message, or as a function of the initialization process.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| BeginSeqNo | SeqNum | Y | Message sequence number of first message in range to be resent. |
| EndSeqNo | SeqNum | Y | Message sequence number of last message in range to be resent. If the request is for a single message, BeginSeqNo(7) = EndSeqNo(16). If the request is for all messages after a particular message, EndSeqNo(16) = |
Component | Y |
|
|
7.2.6. Reject
A Reject(35=3) message is issued when a message is received but cannot be properly processed due to a session-level rule violation. Whenever possible, it is strongly recommended to describe the cause of the failure in the Text(58) field.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| RefSeqNum | SeqNum | Y | Reference message sequence number. |
| RefMsgType | String | N | The MsgType(35) of the FIX message being referenced. |
| RefTagID | int | N | The tag number of the FIX field being referenced. If a message is rejected due to an issue with a particular field, its tag number will be indicated. |
| SessionRejectReason | int | N | Code to identify reason for a session-level Reject(35=3) message. Values:
|
58 | Text | String | N | Text specifying the reason for the rejection. |
Component | Y |
|
|
7.2.7. SequenceReset
A SequenceReset(35=4) message instructs the receiving party to set the next expected message sequence number to a new value, which is contained in the FIX message in the NewSeqNo(36) field.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| NewSeqNo | SeqNum | Y | New sequence number. |
| GapFillFlag | Boolean | N | Flag indicating that the SequenceReset(35=4) message is replacing administrative or application messages which will not be re-sent. Default: Values:
|
Component | Y |
|
|
7.3. Trading
7.3.1. Single Order Handling
7.3.1.1. NewOrderSingle
The NewOrderSingle(35=D) message is used by clients wishing to electronically submit orders to the exchange for execution.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| Account | String | Y | User identifier. Format: |
| OrdType | char | Y | Order type (refer to Order Types). Values:
|
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| TransactTime | UTCTimestamp | N | Ignored. |
| OrderQty | Qty | Y | Quantity ordered. |
152 | CashOrderQty | Amt | C | Minimum desired value received for selling commodity or maximum value paid when buying commodity. Conditions:
|
| PositionEffect | char | N | Flag indicating a stop market order must close a margin position when executed or be canceled otherwise. Conditions:
Values:
|
| Symbol | String | Y | Ticker symbol. |
| Side | char | Y | Side of order. Values:
|
| TimeInForce | char | Y | Time qualifier of the order (refer to Time in Force). Default:
Values:
|
| ClOrdID | String | Y | Unique identifier for the order as assigned by the client. If omitted, will be generated by the server. Format: 8 – 32 characters, a-z, A-Z, 0-9, Conditions: uniqueness must be guaranteed until the last order with the same client order identifier becomes inactive (canceled, expired, or fully executed) and some time after that. |
| StopPx | Price | C | Stop price. Conditions: OrdType(40) = |
| ExpireTime | UTCTimestamp | C | Date and time of order expiration. Conditions: TimeInForce(59) = |
| Price | Price | C | Limit price. Conditions: OrdType(40) = |
| ExecInst | MultipleCharValue | N | Instructions for order handling on the exchange trading floor. Values:
|
| CashMargin | char | C | Margin mode. Conditions: margin order Default: Values:
|
| EffectiveTime | UTCTimestamp | N | Time the details within the message should take effect. |
| DisplayQty | Qty | N | The visible part of the hidden order quantity. Values: |
| ListSeqNo | int | C | Sequence of individual order within list. Conditions: orders in order list. |
Component | Y |
|
|
7.3.1.2. OrderStatusRequest
The OrderStatusRequest(35=H) message is used by clients to request order status for one of their orders. Server will respond with an ExecutionReport(35=8) message with ExecType(150) = I
(Order Status).
In case of any errors for example if the order is not found, server will respond with an ExecutionReport, where ExecType(150) = I
(Order Status), OrdStatus(39) = 8
(Rejected), OrdRejReason(103) and Text(58) will contain the error code and its description.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| OrdStatusReqID | String | N | Unique identifier for the status request as assigned by the client. Echoed back on ExecutionReport(35=8) if provided. If omitted, it will be generated by the system. Format: 8 – 32 characters, a-z, A-Z, 0-9, |
| ClOrdID |
| C | The ClOrdID(11) of the order which status is being requested. Either OrderID(37) or ClOrdID(11) must be provided. Conditions:
|
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Symbol | String | N | Ticker symbol. |
| Side | char | N | Side of order. Values:
|
| OrderID | String | C | Unique identifier for order as assigned by the server. Conditions:
|
Component | Y |
|
|
7.3.1.3. OrderCancelRequest
The OrderCancelRequest(35=F) message requests the cancellation all of the remaining quantity of an existing order.
Each OrderCancelRequest(35=F) is assigned a unique identifier in the ClOrdID(11) field, and is subsequently treated as a separate entity. If rejected, the ClOrdID(11) of the cancel request will be sent in the OrderCancelReject(35=9) message ClOrdID(11) field, whereas the ClOrdID(11) of the actual order in the OrigClOrdID(41) field. The ClOrdID(11) assigned to the cancel request must be unique among the ClOrdID(11) fields assigned to regular orders and replacement orders.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| OrigClOrdID | String | Y | ClOrdID(11) of the previous non-rejected order when canceling an order. |
| ClOrdID | String | Y | Unique identifier of cancel request as assigned by the server. |
| Symbol | String | Y | Ticker symbol. |
| Side | char | Y | Side of order. Values:
|
| TransactTime | UTCTimestamp | N | Ignored. |
Component | Y |
|
|
7.3.1.4. OrderCancelReplaceRequest
The OrderCancelReplaceRequest(35=G) message can be used to change the details of an existing limit order.
When processing a cancel/replace request, the existing order is canceled and a new order is placed on the order book. This is executed as a single atomic transaction. However, the newly-placed order loses its order book time priority. Hence, if the intention is to increase the quantity of an existing order, it is recommended that clients send a NewOrderSingle(35=D) message for the increased quantity rather than an OrderCancelReplaceRequest(35=G).
Clients should not use this message to cancel the remaining quantity of an outstanding order. Instead, they should send an OrderCancelReplaceRequest(35=G) message.
The OrderCancelReplaceRequest(35=G) will only be accepted if the order can successfully be pulled back from the exchange without executing. Requests which cannot be processed will be rejected using the OrderCancelReject(35=9) message.
A OrderCancelReject(35=9) message and an ExecutionReport(35=8) with ExecType(150) = 4
(Canceled) and OrdStatus(39) = 4
(Canceled) may arrive in an arbitrary order caused by either of following reasons:
after request processing, the remaining quantity reduces to zero;
client funds are insufficient for placing an order with requested quantity.
Each cancel/replace request is assigned a unique identifier in the ClOrdID(11) field, and is subsequently treated as a separate entity. If rejected, the ClOrdID(11) of the cancel request will be sent in the OrderCancelReject(35=9) message ClOrdID(11) field, whereas the ClOrdID(11) of the actual order in the OrigClOrdID(41) field. The ClOrdID(11) assigned to the OrderCancelReplaceRequest(35=G) must be unique among the ClOrdID(11) fields assigned to regular orders and replacement orders.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| TransactTime | UTCTimestamp | N | Ignored. |
| Symbol | String | Y | Ticker symbol. |
| Side | char | Y | Side of order. |
| OrigClOrdID | String | Y | ClOrdID(11) of the previous non-rejected order when replacing an order. |
| ClOrdID | String | Y | Unique identifier of cancel/replace request as assigned by the server. |
| StopPx | Price | C | Stop price. Conditions: |
| ExpireTime | UTCTimestamp | C | Date and time of order expiration. Conditions: TimeInForce(59) = |
| Price | Price | C | Limit price. Conditions: OrdType(40) = |
| OrderQty | Qty | Y | Quantity ordered. Conditions: |
| OrdType | char | N | Ignored. |
| EffectiveTime | UTCTimestamp | N | Time the details within the message should take effect. |
Component | Y |
|
|
7.3.1.5. OrderCancelReject
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| CxlRejResponseTo | char | Y | Type of request being rejected. Values:
|
| ClOrdID | String | Y | ClOrdID(11) that was submitted with the order cancel or cancel/replace request being rejected. |
| OrigClOrdID | String | Y | Value of the parameter is equal to the value of OrigClOrdID(41) of the cancel request preceding. |
| OrdStatus | char | Y | Current status of order. Values:
|
| CxlRejReason | int | Y | Code specifying the reason for the rejection. Values:
|
| Text | String | N | Text specifying the reason for the rejection. |
Component | Y |
|
|
7.3.1.6. ExecutionReport
The ExecutionReport(35=8) 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.
Each execution report contains two fields which are used to communicate both the current state of the order as understood by the client, OrdStatus(39), and the purpose of the message—ExecType(150).
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| ClOrdID | String | C | Client-specified identifier of the order. Conditions: omitted if this message is sent in reply to an OrderStatusRequest(35=H) message and an order with the specified ClOrdID(11) is missing |
| OrigClOrdID | String | C | ClOrdID(11) of the previous non-rejected order when replacing an order. Will be filled with the actual ClOrdID(11) of the order regardless of whether OrigClOrdID(41) was specified (valid or invalid value) in the OrderCancelRequest(35=F) or OrderCancelReplaceRequest(35=G) message. Conditions:
|
| OrigClOrdID | String | C | ClOrdID(11) of the previous non-rejected order when canceling an order. |
| OrderID | String | Y | Unique identifier for order as assigned by the server. |
| ExecID | String | Y | Unique identifier of execution message. |
| OrdStatusReqID | String | C | Unique identifier of a specific OrderStatusRequest(35=H) message. Conditions: reply to OrderStatusRequest(35=H) |
| MassStatusReqID | String | C | Value assigned by issuer of OrderMassStatusRequest(35=AF) to uniquely identify the request. Conditions: reply to OrderMassStatusRequest(35=AF) |
| TotNumReports | int | C | Total number of reports returned in response to a request. Conditions: reply to OrderMassStatusRequest(35=AF) |
| LastRptRequested | Boolean | C | Flag indicating whether this message is that last report message in response to a request, such as OrderMassStatusRequest(35=AF). Conditions: reply to OrderMassStatusRequest(35=AF) |
| ExecType | char | Y | Reason the execution report was generated (refer to Order Execution Report). Values:
|
| OrdStatus | char | Y | Current status of the order. Values:
|
| OrdRejReason | int | C | Code to identify reason for order rejection. Conditions: ExecType(150) = Values:
|
| Text | String | N | Text specifying the reason for the rejection, cancellation, or expiration. Conditions: ExecType(150) = |
| LeavesQty | Qty | Y | Quantity open for further execution. If the OrdStatus(39) = |
| CumQty | Qty | Y | Total quantity filled. |
| Symbol | String | C | Ticker symbol. Conditions:
|
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| OrdType | char | C | Order type (refer to Order Types). Values:
Conditions:
|
| TimeInForce | char | C | Time qualifier of the order (refer to Time in Force). Default: Values:
Conditions:
|
| ExpireTime | UTCTimestamp | C | Date and time of order expiration. Conditions: TimeInForce(59) = |
| Side | char | C | Side of order. Values:
Conditions:
|
| OrderQty | Qty | C | Quantity ordered. |
| CashOrderQty | Amt | C | Minimum desired value received for selling commodity or maximum value paid when buying commodity. Conditions: OrdType(40) = |
151 | LeavesQty | Qty | Y | Quantity open for further execution. Conditions:
If the OrdStatus(39) = |
| Price | Price | C | Limit price. Conditions:
|
| StopPx | Price | C | Stop price. Conditions:
|
| ExecInst | MultipleCharValue | N | Instructions for order handling on exchange trading floor. Values:
|
| CashMargin | char | N | Margin mode. Conditions: margin order Default: Values:
|
| SolicitedFlag | Boolean | N | Flags indicating whether the order was solicited. All execution reports for orders, placed to liquidate a margin position (sent to the holder of a bankrupt position liquidated and also to the holder of a deleveraged one), will have SolicitedFlag(377) = Values:
|
| DisplayQty | Qty | N | The visible part of the hidden order quantity. Conditions: hidden order Values: |
| ContingencyType | int | C | Type of the order list. Values:
|
| TransactTime | UTCTimestamp | C | Timestamp when the business transaction represented by the message occurred. Conditions:
|
| LastLiquidityInd | int | C | Flag indicating whether this fill was a result of a liquidity provider providing or liquidity taker taking the liquidity. Conditions: ExecType(150) = Values:
|
| TrdMatchID | String | C | Identifier assigned to a trade by a matching system. Conditions: ExecType(150) = |
| AvgPx | Price | C | Calculated average price of all fills on this order. Conditions: CumQty(14) ≠ |
| LastPx | Price | C | Price of this (last) fill. Conditions: ExecType(150) = |
| LastQty | Qty | C | Quantity bought/sold on this (last) fill. Conditions: ExecType(150) = |
Component | MiscFeesGrp | C | Details of trade fees. Conditions: ExecType(150) = |
|
| NoMiscFees | NumInGroup | Y | Number of repeating groups of miscellaneous fees. |
> | MiscFeeAmt | Amt | Y | Miscellaneous fee value. |
> | MiscFeeCurr | Currency | Y | Currency of miscellaneous fee. |
> | MiscFeeType | String | Y | Type of miscellaneous fee. Values:
|
| ListID | String | C | Unique identifier for list as assigned by server, used to associate multiple individual orders. Conditions: reply to NewOrderList(35=E) |
Component | AccBalancesGrp | C | Details of account balance. Conditions: ExecType(150) = |
|
| NoAccBalance | NumInGroup | Y | Number of repeating groups of the following account balances:
Values: |
> | AccBalanceType | char | Y | Account balance type. Values:
|
> | AccBalanceCurrency | Currency | Y | Account balance instrument. |
> | AccBalanceAmt | Amt | Y | Account balance expressed in units of instrument specified in AccBalanceCurrency(10023). |
| WorkingIndicator | Boolean | C | Flag indicating whether a secondary order in an order list is inactive. Conditions: order in an order list |
Component | Y |
|
|
7.3.2. Order Mass Handling
7.3.2.1. OrderMassStatusRequest
The OrderMassStatusRequest(35=AF) message requests the status for all orders of the client.
A mass status request is assigned a ClOrdID(11) and is treated as a separate entity.
ExecutionReports(35=8) with ExecType(150) = I
(Order status) are returned for all orders matching the criteria provided on the request (i.e., for the client). Such an ExecutionReport(35=8) will have the MassStatusReqID(584) field filled in, and the very last one will have the LastRptRequested(912) flag populated.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| MassStatusReqID | String | Y | Value assigned by issuer of Mass StatusRequest(35=AF) to uniquely identify the request. |
| MassStatusReqType | int | Y | MassStatusRequest(AF) type. Values:
|
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| MassStatusRequestStatus | int | N | Current order status. Values:
|
| MassStatusRequestBeginTS | UTCTimestamp | N | Begin timestamp. Conditions: omitted if MassStatusRequestStatus(10014) = |
Component | Y |
|
|
7.3.3. List Trading
7.3.3.1. NewOrderList
The NewOrderList(35=E) message is used by clients wishing to electronically submit multiple orders to the exchange for execution.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| ListID | String | C | Unique identifier for the order list and the first order in the list as assigned by the client. If ClOrdID(11) is omitted, this field may not be specified. Values: ClOrdID(11) of the first order |
| BidType | int | Y | Code to identify the type of BidRequest(35=k). Values:
|
| TotNoOrders | int | Y | Total number of list order entries across all messages. Values: NoOrders(73) in ListOrdGrp |
Component | ListOrdGrp | Y | Number of orders in this message (number of repeating groups to follow). Each repeating group contains the same fields as the NewOrderSingle(35=D) message. |
|
| NoOrders | NumInGroup | Y | Number of repeating groups to follow. |
| ContingencyType | int | C | Type of the order list. Values:
|
Component | Y |
|
|
In case of successful execution of the request, the ExecutionReport(35=8) messages are sent to the client for each order from the order list.
7.3.3.2. ListStatus
The ListStatus(35=N) message is sent if a NewOrderList(35=E) request is rejected.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| ListID | String | Y | ListID(66) passed in the NewOrderList(35=E) message or generated by the server in reply to the message being rejected. |
| ListStatusType | int | Y | Code to represent the status type. Values:
|
| NoRpts | int | Y | Total number of reports within the series. Values: |
| ListOrderStatus | int | Y | Code to represent the status of a list order. Values:
|
| ListStatusText | String | N | Text specifying the reason for the rejection. |
| RptSeq | int | Y | Sequence number of the message within the report series. Values: |
| TotNoOrders | int | Y | Total number of list order entries across all messages. Values: NoOrders(73) in OrdListStatGrp |
Component | ListOrdGrp | Y | Number of orders in this message (number of repeating groups to follow). |
|
| NoOrders | NumInGroup | Y | Number of repeating groups to follow. |
> | ClOrdID | String | Y | ClOrdID(11) of the order being rejected passed in the NewOrderList(35=E) or generated by the server if omitted. |
> | CumQty | Qty | Y | Total quantity filled. Values: |
> | OrdStatus | char | Y | Identifies current status of order. Values:
|
> | LeavesQty | Qty | Y | Quantity open for further execution. Values: |
> | CxlQty | Qty | Y | Total quantity canceled for this order. Values: |
> | AvgPx | Price | Y | Calculated average price of all fills on this order. |
Component | Y |
|
|
7.3.4. Position Maintenance
7.3.4.1. Position Execution Types
Position report types:
Report types | Description |
Created | New position has been created as a result of the first set margin request. |
Open trade | Opening trade has been executed. |
Close trade | Closing trade has been executed. |
Flip Trade | Position has been flipped as a result of an opposite order execution with quantity exceeding the position quantity. |
Updated | Position has been changed as a result of either order placing, canceling, position status changing, or a "margin call". |
Margin changed | Position margin has been added or withdrawn as a result of any subsequent set margin request (refer to Created). |
Closed | Position quantity has zeroed as a result of a close trade. |
Status | Response to a position request. |
Liquidated | Position has been closed as a result of a liquidation trade (including one during auto-deleveraging). |
Interest taken | Interest rate has been paid. |
Liquidation trade | Liquidation order has been placed. |
Funding taken | Funding has been paid/taken. |
Deleveraged | Position has been deleveraged. |
Deleverage trade | A part of position quantity has been deleveraged. |
Leverage changed | Leverage of a futures position has been changed. |
7.3.4.2. RequestForPositions
The value of the PosReqType(724) field will be one of the following:
101
(Balance)—custom, non-standard, does not allow subscription, only snapshot. PositionReport(35=AP) is sent as reply to this request type;102
(Margin position)—custom, non-standard, allows subscription. MarginPositionReport(35=UMPR), or RequestForPositionsAck(35=AO), or MarginReject(35=UMR) are sent as reply to this request type;103
(Margin account)—custom, non-standard, allows subscription. MarginAccountReport(35=UMAR), RequestForPositionsAck(35=AO), or MarginReject(35=UMR) are sent as reply to this request type.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. Format: |
| PosReqType | int | Y | Type of position request being made. Values:
|
| SubscriptionRequestType | char | N | Subscription request type. Conditions: omitted if PosReqType(724) = Values:
Default: |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Currency | Currency | C | Currency code. Conditions:
|
| Symbol | String | C | Ticker symbol. Conditions:
|
| ClearingBusinessDate | LocalMktDate | N | Ignored. |
| TransactTime | UTCTimestamp | N | Ignored. |
| MarginMode | int | N | Margin mode. Conditions:
Values:
Default: |
Component | Y |
|
|
7.3.4.3. RequestForPositionsAck
Response to a RequestForPositions(35=AN) with PosReqType(724) = 102
(Margin position) in case of successful subscription to nonexistent position updates or successful unsubscription from position updates.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosMaintRptID | String | Y | Unique identifier for this position report. |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. Values: PosReqID(710) in RequestForPositions(35=AN) |
| PosReqType | int | Y | PosReqType(724) in RequestForPositions(35=AN) the message. Values:
|
| PosReqResult | int | Y | Result of RequestForPositions(35=AN). Values:
|
| PosReqStatus | int | Y | Status of RequestForPositions(35=AN). Values:
|
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Symbol | String | C | Ticker symbol. Conditions: PosReqType(724) = Values: Symbol(55) in RequestForPositions(35=AN) |
| Currency | Currency | C | Currency code. Conditions: PosReqType(724) = Values: Currency(15) in RequestForPositions(35=AN) |
Component | Y |
|
|
7.3.4.4. PositionReport
Response to requesting position details via a RequestForPositions(35=AN) message. The currency field will contain the currency for which the balance was requested. The Position repeating group will contain two elements (NoPosAmt(753) = 2
):
PosAmtType(707) =
CASH
(Cash amount);PosAmtType(707) =
CRES
(Cash residual amount).
In case of a balance request error, a PositionReport(35=AP) is sent with NoPosAmt(753) = 0
.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosMaintRptID | String | Y | Unique identifier for this position report. |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. Values: PosReqID(710) in RequestForPositions(35=AN) |
| PosReqType | int | Y | Type of position request being made. Values: PosReqType(724) in RequestForPositions(35=AN) |
| UnsolicitedIndicator | Boolean | Y | Flag indicating whether a message is being sent as a result of a subscription request. Values:
|
| PosReqResult | int | Y | Result of RequestForPositions(35=AN). Values:
|
| Text | String | N | Text specifying the reason for the rejection. |
| ClearingBusinessDate | LocalMktDate | Y | The current date. |
| Account | String | Y | User identifier. |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Currency | Currency | C | Currency code. Conditions: PosReqType(724) = Values: Currency(15) in RequestForPositions(35=AN) |
| Currency | Currency | C | Currency code. Conditions: PosReqType(724) = |
| Symbol | String | C | Ticker symbol. Conditions: PosReqType(724) = |
Component | PositionQty | C | The various types of position quantity in the position life-cycle. Conditions: PosReqType(724) = |
|
| NoPositions | NumInGroup | Y | Number of position entries. |
> | PosType | String | Y | Type of quantity that is being returned. |
> | LongQty | Qty | N | Long quantity. |
> | ShortQty | Qty | N | Short quantity. |
Component | PositionAmountData | C | Netted amounts associated with position quantities. |
|
| NoPosAmt | NumInGroup | C | Number of position amount entries. Values:
|
> | PosAmtType | String | Y | Type of position amount. Values:
|
> | PosAmt | Amt | Y | Position amount. |
Component | Y |
|
|
7.3.4.5. MarginPositionReport
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PositionID | String | Y | Unique identifier for a position entity. |
| PosReqID | String | N | Unique identifier for the position maintenance request as assigned by the submitter. Conditions:
Values: PosReqID(710) in RequestForPositions(35=AN) or SetMargin(35=USM) |
| ClOrdID | String | N | ClOrdID(11) of the order that leads to the positions is update. If caused by order this message follows the ExecutionReport(35=8) message. Conditions:
|
| MPExecType | char | Y | Reason the margin position execution report was generated (refer to Position Execution Types). Values:
|
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username of the client or the Central Counterparty. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified: either the client or the Central Counterparty. Values:
|
| Symbol | String | Y | Ticker symbol. |
| MPStatus | char | Y | Margin position status. Values:
|
| MarginMode | char | Y | Margin mode. Values:
|
| Leverage | float | Y | Position leverage. |
Component | CollateralAmounts | Y | Balances of the margin account. |
|
| NoCollateralAmounts | NumInGroup | Y | Number of collateral amount entries:
Values: |
> | CurrentCollateralAmount | Amt | Y | Currency value currently attributed to the collateral. |
> | CollateralCurrency | Currency | Y | Currency of the collateral. |
> | CollateralAmountType | int | Y | Type of value in CurrentCollateralAmount(1704). Values:
|
| CumQty | Qty | Y | Position quantity (it will be negative for short positions). |
| AvgPx | int | C | Weighted average price of open trades. Conditions: omitted if CumQty(14) = |
| EntryValue | Amt | C | Position value. Conditions: omitted if CumQty(14) = |
| MarginCallPx | Price | C | The price at which margin is to be insufficient for maintaining the position, so a margin call is issued. Conditions: omitted if CumQty(14) = |
| LiquidationPx | Price | C | The price at which the position will be liquidated. Conditions: omitted if CumQty(14) = |
| BankruptcyPx | Price | C | The price at which margin will not cover the loss. Conditions: omitted if CumQty(14) = |
| RealisedPnL | Amt | Y | Realized PnL. |
| MPUntouchableFlag | Boolean | C | Flag indicating whether the position cannot be force-closed. Values:
|
| MPMarginCallFlag | Boolean | Y | Flag indicating whether additional margin is required to maintain the position. |
| OrigTime | UTCTimestamp | Y | Time of message origination. Format: nanosecond precision |
| LastUpdateTime | UTCTimestamp | Y | Timestamp of last update to data item (or creation if no updates made since creation). Format: nanosecond precision |
| ADLRanking | Int | Y | Rank of a position which defines how appropriate a position is to be used for closing bankrupt positions avoided liquidation. The higher the rank, the higher probability the position will be deleveraged. Values: |
136 | NoMiscFees | NumInGroup | Y | Fees paid throughout the position lifetime until it is closed. Values: |
> 137 | MiscFeeAmt | Amt | Y | Total (cumulative) fee value. This value does zero out after the positions closes and does not when it flips. |
> 138 | MiscFeeCurr | Currency | Y | Currency of fees. |
> 139 | MiscFeeType | String | Y | Type of fees. Values:
|
Component | Y |
|
|
Values of MarginCallPx(10007), LiquidationPx(10008), BankruptcyPx(10009) do not carry information that would be valuable for predicting the condition of a position, since those change after an adjusted price (mark price) changes.
7.3.4.6. CloseMarginPosition
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Symbol | String | Y | Ticker symbol. |
| OrdType | char | Y | Order type (refer to Order Types). Values:
|
| Price | Price | C | Limit price. Conditions: OrdType(40) = |
| MarginMode | char | N | Margin mode. Values:
|
Component | Y |
|
|
7.3.4.7. MarginReject
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. |
| Username | String | C | Username assigned to the CompID. |
| Symbol | String | Y | Ticker symbol. |
| MPRejectReason | int | Y | The reason for the rejection.
|
| Text | String | N | Text specifying the reason for the rejection. |
| RefMsgType | String | Y | The MsgType(35) of the FIX message being referenced. Values:
|
| OrdType | char | C | Order type (refer to Order Types). Conditions: RefMsgType(372) = Values:
|
| Price | Price | N | Limit price. Conditions: OrdType(40) = |
| MarginMode | char | Y | Margin mode. Values:
|
Component | Y |
|
|
7.3.5. Collateral Management
7.3.5.1. Margin Account Execution Types
Position report types:
Type | Description |
Created | A successful set margin request changed the margin from zero creating the account. |
Updated | An existing account margin was changed due to trading, charging interest (funding), order cancellation, etc. |
Status | A successful request for margin account details. |
Margin call changed | A margin call has been issued. |
Margin changed | A successful set margin request changed the margin (including setting it to zero). |
7.3.5.2. MarginAccountReport
Response to a RequestForPositions(35=AN) with PosReqType(724) = 103
(Margin account) in case of successful subscription to nonexistent account updates or successful unsubscription from updates.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | N | Unique identifier for the account maintenance request as assigned by the submitter. Conditions:
|
| ClOrdID | String | N | ClOrdID(11) of the order that leads to the account is updated. If caused by order this message follows the ExecutionReport(35=8) message. Conditions:
|
| MPExecType | char | Y | Margin account execution type (refer to Margin Account Execution Types). Values:
|
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| MarginMode | char | Y | Margin mode. Values:
|
| Symbol | String | C | Ticker symbol. Conditions: MarginMode(10004) = |
Component | CollateralAmounts | Y | Balances of the margin account. |
|
| NoCollateralAmounts | NumInGroup | Y | Number of collateral amount entries:
Values: |
> | CurrentCollateralAmount | Amt | Y | Currency value currently attributed to the collateral. |
> | CollateralCurrency | Currency | Y | Currency of the collateral. |
> | CollateralAmountType | int | Y | Type of value in CurrentCollateralAmount(1704). Values:
|
| MPMarginCallFlag | Boolean | Y | Flag indicating whether additional margin is required to maintain the position. |
| LastUpdateTime | UTCTimestamp | Y | Timestamp of last update to data item (or creation if no updates made since creation). Format: nanosecond precision |
Component | Y |
|
|
Values of CurrentCollateralAmount(1704) do not carry information that would be valuable for predicting the condition of a position, since those change after an adjusted price (mark price) changes.
7.3.5.3. SetMargin
Sets margin for position or creates position, if it does not exist.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Symbol | String | C | Ticker symbol. Conditions: MarginMode(1004) = |
Component | CollateralAmounts | Y | Balances of the margin account. |
|
| NoCollateralAmounts | NumInGroup | Y | Number of collateral amount entries Values: |
> | CurrentCollateralAmount | Amt | Y | Currency value currently attributed to the collateral. |
> | CollateralCurrency | Currency | Y | Currency of the collateral. NOTE: Both Symbol(55) and CollateralCurrency(1705) are required if MarginMode(10004) = |
> | CollateralAmountType | int | Y | Type of value in CurrentCollateralAmount(1704). Values:
|
| Leverage | float | N | Maximum allowed leverage set by a user to hedge their risk. If the conditions are violated, the server sends a Reject(3) message. Conditions: MarginMode(10004) = |
| MarginMode | char | N | Margin mode. Values:
Default: |
Component | Y |
|
|
SetMargin(35=USM) request may be used for changing position leverage if MarginMode(10004) = 1
(Isolated) but it is not suggested.
7.3.5.4. SetLeverage
Sets leverage for a position.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| PosReqID | String | Y | Unique identifier for the position maintenance request as assigned by the submitter. |
| Account | String | Y | User identifier. Format: |
Component | Parties | Y | Party information related to the submitter of the request. |
|
| NoPartyIDs | NumInGroup | Y | Number of PartyID(448), PartyIDSource(447), and PartyRole(452) entries. Values:
|
> | PartyID | String | Y | Username. Format: |
> | PartyIDSource | char | Y | Flag indicating class or source of the PartyID(448) value. Values:
|
> | PartyRole | int | Y | Identifies the type or role of the PartyID(448) specified. Values:
|
| Symbol | String | Y | Ticker symbol. |
| MarginMode | char | Y | Margin mode. Values:
|
| Leverage | float | Y | Maximum allowed leverage set by a user to hedge their risk. |
Component | Y |
|
|
7.4. Business Rejects
7.4.1. BusinessMessageReject
A BusinessMessageReject(35=j) message is sent when a client message cannot be processed.
Tag | Name | Type | Req | Description |
Component | Y | MsgType(35) = |
| |
| BusinessRejectRefID | String | N | The value of the business-level identifier (e.g., ClOrdID, OrdStatusReqID, etc.) on the message being referenced if it was specified. |
| RefSeqNum | SeqNum | N | MsgSeqNum(34) of rejected message. |
| RefTagID | int | N | The tag number of the FIX field being referenced. |
| RefMsgType | String | Y | The MsgType(35) of the FIX message being referenced. |
| BusinessRejectReason | int | Y | Code to identify reason for a BusinessMessageReject(35=j) message. Values:
|
| Text | String | N | Text specifying the reason for the rejection. |
Component | Y |
|
|
8. Version History
Version | Date | Description |
Version | Date | Description |
1.0 | 2019/11/08 | First edition. |
1.1 | 2020/04/15 | Added SetMargin(35=USM), CloseMarginPosition(35=UCMP), and MarginReject(35=UMR) messages. |
1.2 | 2020/11/06 | Added an ADL ranking parameter in MarginPositionReport(35=UMPR). |
1.3 | 2021/02/25 | Updated description of SolicitedFlag(377) tag in ExecutionReport(35=8). |
1.4 | 2021/06/30 | Added fat-finger protection. |
1.5 | 2021/08/05 | Added take-profit market and take-profit limit order types. |
1.6 | 2021/09/15 | Added DisplayQty(1138) parameter in NewOrderSingle(35=D) message. |
1.7 | 2021/10/13 | Added NewOrderList(35=E) message and reduce-only mode. |
1.8 | 2021/11/22 | Added One-Cancels-the-Other (OCO) order list type. |
1.9 | 2022/04/12 | Added ListExecute(35=L) execution report type. |
2.0 | 2022/06/07 | Added balances in ExecutionReport(35=8) message. |
2.1 | 2022/08/24 | Added deleverage trade execution report type in MarginPositionReport(35=UMPR). |
2.2 | 2023/03/24 | Added single-currency cross margin:
|
2.3 | 2023/06/20 | Added support of AON order lists. |
2.4 | 2023/09/04 | Changed the standard behavior of TIF for market and limit orders. |
2.5 | 2023/09/08 |
|
2.6 | 2023/10/09 | Added a new CashOrderQty(152) field in ExecutionReport(35=8) message. |
2.7 | 2024/05/13 | Added a new NoMiscFees(136) group in MarginPositionReport(35=UMPR) message. |
2.8 | 2024/05/13 | Added a new PositionEffect(77) field in NewOrderSingle(35=D), NewOrderList(35=E), ListStatus(35=N), ExecutionReport(35=8) messages. |
2.9 | 2024/07/17 | Added support of replacing suspended orders with OrderCancelReplaceRequest(35=G). |