Skip to content
Get Started

FIX 4.4 Interface Specification

Introduction

The Nanoconda FIX gateway gives FIX-capable trading systems, algorithmic trading platforms and institutional back offices standard FIX access to a Nanoconda trading account on CME Group markets.

This document is the complete reference for the Nanoconda FIX interface. It covers session behaviour, supported messages, every tag the gateway reads or sends, enumerations, and differences from the FIX 4.4 standard. It assumes the reader already knows the FIX protocol.

The interface supports two main use cases:

  • Trading: order entry, order management, market data, reference data, positions and trade capture for trading clients and algorithms.
  • Drop copy: real-time, read-only visibility into all account activity for clearing firms, FCMs and risk desks. See Drop Copy.

All orders submitted over FIX pass through the Nanoconda Pre-Trade Risk System before they are sent to the exchange.

Contents

  1. Connectivity
  2. Supported Messages
  3. Session Layer
  4. Authentication & Roles
  5. Order Entry
  6. Execution Reports & Cancel Rejects
  7. Market Data
  8. Reference Data
  9. Positions
  10. Trade Capture
  11. Rejects & Error Handling
  12. Drop Copy
  13. Message Flows
  14. Reconnection & Recovery
  15. Differences from FIX 4.4 & Unsupported Features
  16. Appendix A: Tag Reference
  17. Appendix B: Enumerations

1. Connectivity

Item Specification
Transport TCP
Protocol FIX tag=value, SOH (0x01) delimited
FIX version FIX.4.4 (recommended and certified). The gateway replies with the BeginString(8) the client sent on Logon, but all message content follows FIX 4.4 semantics.
Encryption None at the FIX layer (EncryptMethod(98)=0)
Host / port Provided per account by your Nanoconda account representative. The FIX gateway shares its host and port with the other Nanoconda remote interfaces; the protocol is detected automatically (see Interfaces).
Credentials, SenderCompID / TargetCompID Provided per account by your Nanoconda account representative.

Standard header and trailer

Every message sent by the gateway carries:

Tag Name Notes
8 BeginString The value the client sent on Logon.
9 BodyLength
35 MsgType
49 SenderCompID The client's TargetCompID(56) from Logon.
56 TargetCompID The client's SenderCompID(49) from Logon.
34 MsgSeqNum Starts at 1 for each session and increments by one.
52 SendingTime UTC.
10 CheckSum Standard FIX checksum.

Client messages must carry a standard FIX header and trailer with a valid BodyLength(9) and CheckSum(10).

Conventions

  • Tags not listed for a message in this specification are not used by the gateway.
  • "Account-wide" means an operation covers every order and fill on the account, whichever session or interface created them. "Session-scoped" means it covers only orders submitted or amended on the current FIX session.
  • Tag numbers appear in parentheses after field names, e.g. ClOrdID(11). Message types appear as 35=X or in parentheses after the message name.

2. Supported Messages

Session messages

MsgType Message Direction
A Logon Client ↔ Nanoconda
0 Heartbeat Client ↔ Nanoconda
1 TestRequest Client ↔ Nanoconda
2 ResendRequest Client → Nanoconda
3 Reject Nanoconda → Client
4 SequenceReset Client ↔ Nanoconda
5 Logout Client ↔ Nanoconda

Application messages: client to Nanoconda

MsgType Message Purpose Scope
D NewOrderSingle Submit an order
F OrderCancelRequest Cancel an order Session
G OrderCancelReplaceRequest Modify an order's price and/or quantity Session
H OrderStatusRequest Query one order Account
AF OrderMassStatusRequest Query all open orders Account
q OrderMassCancelRequest Cancel multiple orders Session
V MarketDataRequest Subscribe / unsubscribe to market data
x SecurityListRequest List tradeable instruments
c SecurityDefinitionRequest Instrument definition
AN RequestForPositions Positions snapshot or subscription Account
AD TradeCaptureReportRequest Fill history Account

Application messages: Nanoconda to client

MsgType Message Purpose
8 ExecutionReport Order state changes, fills, rejects, status responses
9 OrderCancelReject Rejection of a cancel or cancel/replace request
j BusinessMessageReject Application-level reject
W MarketDataSnapshotFullRefresh Initial book snapshot
X MarketDataIncrementalRefresh Book updates
Y MarketDataRequestReject Market data request rejected
y SecurityList Instrument list
d SecurityDefinition Instrument definition
AP PositionReport Position and P&L per instrument
AE TradeCaptureReport Fill detail
AQ TradeCaptureReportRequestAck No matching fills, or trade history unavailable

Any other MsgType is rejected with BusinessMessageReject(j), BusinessRejectReason(380)=3 (Unsupported Message Type).


3. Session Layer

Logon (35=A)

Client → Nanoconda

Tag Name Req'd Format Description
49 SenderCompID Y String Header field. Used as the login username when Username(553) is absent.
56 TargetCompID Y String Header field.
98 EncryptMethod Y Int Send 0 (None). The gateway always replies with 0.
108 HeartBtInt Y Int (seconds) Heartbeat interval for the session. If absent, 30 is used. 0 disables heartbeats and liveness checks. See Session liveness.
553 Username N String Account username. If absent, SenderCompID(49) is used as the username.
554 Password Y String Account password.

Username via SenderCompID

Many FIX engines do not expose Username(553). You can instead set your account username as SenderCompID(49) and omit tag 553.

Nanoconda → Client (logon accepted): Logon(A) with EncryptMethod(98)=0 and the client's HeartBtInt(108) echoed back.

Logon rejected: the gateway sends Logout(5) with a descriptive Text(58) and then closes the TCP connection. No numeric reject code is provided. Text(58) is one of:

Text (58) Cause
Username not found Unknown username
Incorrect Password Wrong password
User Already Logged in This username already has an active FIX session

Concurrent sessions: each username can have one active FIX session at a time. A second Logon with the same username is rejected until the first session logs out or times out. Different usernames on the same account can be connected at the same time, for example a TRADER login for order entry and a VIEWER login for drop copy. Connections through other Nanoconda interfaces (such as the Real-Time GUI) are not affected by this limit.

Sequence numbers

  • Outbound MsgSeqNum(34) starts at 1 for each new session. Configure your FIX engine to reset sequence numbers on every logon.
  • The gateway does not enforce inbound sequence continuity. An inbound gap produces no ResendRequest and no reject; the gateway continues from the MsgSeqNum it receives.
  • Messages are not persisted for replay across sessions. See Reconnection & Recovery.

Heartbeat (35=0)

Either side can send one. The gateway sends a Heartbeat when its outbound side has been idle for HeartBtInt seconds, and in reply to a TestRequest. TestReqID(112) is included only when the heartbeat answers a TestRequest.

TestRequest (35=1)

Either side can send one. TestReqID(112) is required. The gateway answers a client TestRequest with a Heartbeat echoing the same TestReqID.

ResendRequest (35=2)

Client → Nanoconda. BeginSeqNo(7) is accepted. The gateway does not store or retransmit messages. It always responds with SequenceReset(4) in Reset mode: GapFillFlag(123)=N, with NewSeqNo(36) set to its next outbound sequence number. Your engine should set its next expected inbound sequence number to NewSeqNo.

No message replay

Messages in the requested range are not resent and are not marked as gap-filled. They may include ExecutionReports. To recover missed order and fill activity, use the account-wide query messages described in Reconnection & Recovery.

SequenceReset (35=4)

  • Nanoconda → Client: sent only in Reset mode (GapFillFlag(123)=N) in response to a ResendRequest.
  • Client → Nanoconda: NewSeqNo(36) sets the next inbound sequence number the gateway expects. No response is sent.

Logout (35=5)

Either side can send one. When the client sends Logout, the gateway replies with Logout and closes the TCP connection. Releasing the account's FIX session can take a short time, so a client that logs on again straight after logging out should retry the Logon briefly if it is rejected.

Session liveness

Condition Gateway action
Nothing sent to the client for HeartBtInt seconds Sends Heartbeat(0)
Nothing received from the client for 1.5 x HeartBtInt seconds Sends TestRequest(1)
Nothing received from the client for 2 x HeartBtInt seconds Disconnects the session

There is no minimum or maximum HeartBtInt. With HeartBtInt=0 the gateway sends no heartbeats and never disconnects an idle session. Choose a value that suits your network conditions, because very small intervals can cause disconnects when there is network jitter.


4. Authentication & Roles

The gateway authenticates each session with the username (Username(553), or SenderCompID(49) if 553 is absent) and Password(554). Every username has a role, and the role decides which requests the session may send. Requests the role does not permit are always rejected explicitly with the reject message for that request type. They are never dropped silently.

Capability TRADER VIEWER CLEARER / ADMIN
Market data (MarketDataRequest) Yes No (MarketDataRequestReject(Y)) No (MarketDataRequestReject(Y))
Order entry: new, cancel, replace, mass cancel Yes No (rejected) Yes
Order status, positions, trade capture, reference data Yes Yes Yes
Real-time ExecutionReports for all account activity Yes Yes Yes

VIEWER is the recommended role for clearing firms, risk desks and drop-copy consumers. It has full read access to all account activity and cannot enter orders or change the account. See Drop Copy.


5. Order Entry

NewOrderSingle (35=D)

Client → Nanoconda

Tag Name Req'd Format Description
11 ClOrdID Y String Client-assigned order identifier. Must be unique.
55 Symbol Y String Instrument symbol, as returned in SecurityList(y).
54 Side Y Char 1=Buy, 2=Sell.
38 OrderQty Y Int Must be greater than 0.
40 OrdType Y Char See supported order types.
44 Price C Price Required for Limit (2) and Stop Limit (4).
99 StopPx C Price Required for Stop (3) and Stop Limit (4).
59 TimeInForce N Char 0=Day (default), 3=Immediate or Cancel. All other values are rejected.
1138 DisplayQty N Int Iceberg display quantity. Must be greater than 0. Omit for a fully displayed order.
110 MinQty N Int Minimum fill quantity. Must be greater than 0.
1028 ManualOrderIndicator N Boolean Y=Manual (entered by a person), N=Automated (generated by a trading system). If omitted, the order is submitted as automated. Any other value is rejected. See Manual and automated orders.
21 HandlInst N Char Accepted but not validated.
60 TransactTime N UTCTimestamp Accepted but not used. The gateway applies its own timestamp.

Supported order types

OrdType (40) TimeInForce (59) Order type Required fields
1 0 or 3 Market. IOC is accepted and has no additional effect.
2 0 Limit Price
3 0 Stop (stop market) StopPx
4 0 Stop Limit Price, StopPx
2 3 Limit IOC (Fill-and-Kill): executes immediately for any available quantity, and the unfilled remainder is cancelled. The order never rests on the book. Price

Every other combination is rejected, including IOC with Stop or Stop Limit. GTC, GTD, OPG, GTX and all-or-none FOK are not supported. Day orders expire at the end of the trading session.

Manual and automated orders

CME requires every order to be identified as either manual or automated. Nanoconda sets this flag on the order it sends to CME from ManualOrderIndicator(1028):

ManualOrderIndicator (1028) Submitted to CME as
N Automated
Y Manual
Absent Automated

Send 1028=Y only for orders a person enters manually, for example from a manual order-entry screen. Orders generated by an algorithm or other trading software must be sent with 1028=N or with the tag omitted.

The flag is set when the order is submitted and applies to the order for its lifetime. Cancel and cancel/replace requests do not change it.

Every ExecutionReport for an accepted order, and every TradeCaptureReport, returns the flag in ManualOrderIndicator(1028). This includes drop-copy reports for orders entered through other sessions or interfaces, such as the Real-Time GUI.

Response

  • Accepted: ExecutionReport(8) with ExecType=A (Pending New), followed by ExecType=0 (New) once the exchange acknowledges the order. See Message Flows.
  • Rejected: ExecutionReport(8) with ExecType=8 and OrdStatus=8 (Rejected), with the reason in Text(58). Reasons include:
    • Validation failures (Text(58) only): unsupported TimeInForce, unsupported OrdType/TimeInForce combination, missing Side, OrderQty not greater than 0, ManualOrderIndicator not Y or N, or a role not permitted to trade (VIEWER).
    • Pre-trade risk failures (Text(58) and OrdRejReason(103)): price outside the instrument's price band, price not on a valid tick, or size/exposure/capital limits exceeded.
    • Rejection by the exchange (OrdRejReason(103)).
  • Unknown symbol: BusinessMessageReject(j), BusinessRejectReason(380)=2 (Unknown Security). No ExecutionReport is sent.

OrderCancelRequest (35=F)

Client → Nanoconda

Tag Name Req'd Description
11 ClOrdID Y Identifier for this cancel request. After a successful cancel it becomes the order's current ClOrdID.
37 OrderID C Nanoconda order identifier. Takes precedence when present. Required if OrigClOrdID is not sent.
41 OrigClOrdID C The order's current ClOrdID. Used only when OrderID is absent. Required if OrderID is not sent.

Scope: session-scoped. You can cancel only orders that were submitted or last amended on the same FIX session.

Response: ExecutionReport(8) (ExecType=4 Canceled, which may be preceded by 6 Pending Cancel) on success. OrderCancelReject(9) if the order is unknown to this session, the role is not permitted, or the cancel is rejected.

OrderCancelReplaceRequest (35=G)

Client → Nanoconda

Tag Name Req'd Description
11 ClOrdID Y Identifier for this replace request. After a successful replace it becomes the order's current ClOrdID.
37 OrderID C Nanoconda order identifier. Takes precedence when present. Required if OrigClOrdID is not sent.
41 OrigClOrdID C The order's current ClOrdID. Used only when OrderID is absent. Required if OrderID is not sent.
44 Price N New limit price. If omitted, the price is unchanged.
38 OrderQty N New total order quantity. If omitted, the quantity is unchanged.

Only Price and OrderQty can be modified. TimeInForce, StopPx, ManualOrderIndicator and other order attributes are not changed even if they are sent.

Scope: session-scoped, the same as OrderCancelRequest.

Response: ExecutionReport(8) (ExecType=5 Replaced, which may be preceded by E Pending Replace) on success. OrderCancelReject(9) on failure.

OrderStatusRequest (35=H)

Client → Nanoconda

Tag Name Req'd Description
37 OrderID C Takes precedence when present.
11 ClOrdID C Used if OrderID is absent or not found.

Scope: account-wide for open orders. It returns any working order on the account, including orders submitted by other sessions or interfaces and by earlier, disconnected sessions. Orders that are no longer working (filled, cancelled or rejected) are not available and return Unknown ID. Use TradeCaptureReportRequest(AD) for fills.

Response: ExecutionReport(8) with the order's current state, or BusinessMessageReject(j), BusinessRejectReason(380)=1 (Unknown ID) if no working order matches.

OrderMassStatusRequest (35=AF)

Client → Nanoconda

Tag Name Req'd Description
584 MassStatusReqID N Accepted and not used.
585 MassStatusReqType N Accepted and not used. Selection is controlled only by the filters below.
55 Symbol N Filter by instrument.
54 Side N Filter by side (1/2).

Scope: account-wide. It returns every open order on the account that matches the optional filters.

Response: one ExecutionReport(8) per matching order.

Note

If no orders match, no response is sent. Treat the absence of ExecutionReports as a zero-result response.

OrderMassCancelRequest (35=q)

Client → Nanoconda

Tag Name Req'd Description
55 Symbol N Filter by instrument.
54 Side N Filter by side (1/2).

MassCancelRequestType(530) is not used. Selection is controlled only by the filters above.

Scope: session-scoped. It cancels only open orders that were submitted or last amended on the current FIX session.

Response: one ExecutionReport(8) per matching order, showing its status after the cancel was submitted. If the cancel was accepted, the order shows 6 (Pending Cancel) and a 4 (Canceled) report follows when the exchange confirms. If the cancel failed for that order, its OrdStatus is unchanged. If no orders match, no response is sent. A VIEWER role receives BusinessMessageReject(j), BusinessRejectReason(380)=6 (Not authorized).


6. Execution Reports & Cancel Rejects

ExecutionReport (35=8)

Nanoconda → Client

Tag Name Presence Description
1 Account Always
37 OrderID Always Nanoconda order identifier. NONE if the order was rejected before it was assigned an ID.
11 ClOrdID Usually The order's current ClOrdID. Omitted only if no ClOrdID is on record for the order.
17 ExecID Always
150 ExecType Always See the table below.
39 OrdStatus Always See the table below.
103 OrdRejReason Conditional On pre-trade risk and exchange rejects (ExecType=8). Not sent on order validation rejects. See OrdRejReason.
55 Symbol Always
54 Side Always
40 OrdType Always
59 TimeInForce Always 0 or 3.
38 OrderQty Always
44 Price Conditional Limit, Stop Limit and Limit IOC orders.
99 StopPx Conditional Stop and Stop Limit orders.
1138 DisplayQty Conditional If the order was submitted with it.
110 MinQty Conditional If the order was submitted with it.
1028 ManualOrderIndicator Conditional Y=Manual, N=Automated: how the order was flagged when it was submitted to CME. Present on every report for an order accepted by Nanoconda, whichever session or interface entered it. Omitted when OrderID is NONE.
151 LeavesQty Always
14 CumQty Always
6 AvgPx Always 0 until the first fill.
32 LastQty On fills Quantity of this fill.
31 LastPx On fills Price of this fill.
60 TransactTime Always UTC.
58 Text Conditional Reason for a new-order reject.

ExecType (150) and OrdStatus (39)

ExecType and OrdStatus carry the same value, except for an exchange-rejected cancel or replace (see below).

Value Meaning Description
A Pending New Order received by Nanoconda and awaiting exchange acknowledgement.
0 New Order acknowledged by the exchange and working.
1 Partially Filled
2 Filled Also used for trade corrections.
6 Pending Cancel Cancel sent and awaiting confirmation.
4 Canceled Also used for trade cancellations (busts).
E Pending Replace Replace sent and awaiting confirmation.
5 Replaced
8 Rejected New order rejected (OrdStatus=8), or a cancel/replace rejected by the exchange (OrdStatus=0). In the second case the order is still working.

Cancel/replace rejections: two forms

A rejected cancel or cancel/replace request can arrive in either of two forms:

  1. Rejected by Nanoconda (immediately, before the request reaches the exchange): OrderCancelReject(9) with CxlRejReason(102).
  2. Rejected by the exchange (after the request was forwarded, for example because the order had already been filled): an unsolicited ExecutionReport(8) with ExecType=8, OrdStatus showing that the order is still working, and OrdRejReason(103) carrying the exchange's reason code.

Warning

To detect every failed cancel or replace, watch for both OrderCancelReject(9) and ExecutionReport(8) with ExecType=8 on a working order.

OrderCancelReject (35=9)

Nanoconda → Client

Tag Name Description
1 Account
37 OrderID NONE if the order is unknown.
11 ClOrdID ClOrdID of the rejected request.
41 OrigClOrdID
39 OrdStatus Always 8.
434 CxlRejResponseTo 1=OrderCancelRequest, 2=OrderCancelReplaceRequest.
102 CxlRejReason See CxlRejReason.
58 Text Always present. Human-readable reason.

OrderCancelReject is always sent to the session that made the request. If the account's risk controls or order management reject a cancel or replace on a working order, the OrderCancelReject also goes to every other FIX session on the account (see Drop Copy). Rejects for an unknown order or an unauthorized role go only to the requesting session.


7. Market Data

Market data is available to the TRADER role only.

MarketDataRequest (35=V)

Client → Nanoconda

Tag Name Req'd Description
262 MDReqID Y Subscription identifier. Included in every response for this subscription.
263 SubscriptionRequestType Y 1=Subscribe, 2=Unsubscribe. 0 (Snapshot) is treated as 1. Snapshot-only requests are not supported.
264 MarketDepth N 1=Top of book only. Any other value, or absent, gives top of book plus full depth.
267 NoMDEntryTypes N
→ 269 MDEntryType N 0=Bid, 1=Offer. If absent, both sides are sent.
146 NoRelatedSym N
→ 55 Symbol Y One or more instruments. Every Symbol in the message is subscribed.

Response:

  • Subscribe: one MarketDataSnapshotFullRefresh(W) per symbol, followed by MarketDataIncrementalRefresh(X) updates.
  • Unsubscribe: no response.
  • Rejected: MarketDataRequestReject(Y) for an unauthorized role, an unknown symbol, or a request with no symbol.

MarketDataRequestReject (35=Y)

Nanoconda → Client

Tag Name Description
262 MDReqID
58 Text Reason, e.g. Not authorized, Unknown symbol, No Symbol specified.

MDReqRejReason(281) is not sent.

MarketDataSnapshotFullRefresh (35=W)

Nanoconda → Client. Sent once per symbol when the subscription starts. Contains the best bid and best offer only. A side with no orders is omitted, so NoMDEntries can be 0. Full-depth levels are not included; they arrive as MarketDataIncrementalRefresh entries with MDUpdateAction=0 (New) immediately after the snapshot.

Tag Name Description
262 MDReqID
55 Symbol
268 NoMDEntries
→ 269 MDEntryType 0=Bid, 1=Offer.
→ 270 MDEntryPx
→ 271 MDEntrySize

MarketDataIncrementalRefresh (35=X)

Nanoconda → Client. The gateway checks each subscribed book every millisecond and sends an update for anything that changed since the last check. Updates are conflated: several changes within the same millisecond arrive as one update showing the latest state. Each subscription produces two update streams:

  • Top of book: always active. One message per change, with an entry for each side that changed.
  • Full depth: active unless MarketDepth(264)=1 was requested. Up to 10 price levels per side. One message per changed level. Each entry also carries MDPriceLevel(1023).
Tag Name Description
262 MDReqID
268 NoMDEntries
→ 279 MDUpdateAction 0=New, 1=Change, 2=Delete.
→ 269 MDEntryType 0=Bid, 1=Offer.
→ 55 Symbol
→ 270 MDEntryPx Omitted on Delete.
→ 271 MDEntrySize Omitted on Delete.
→ 1023 MDPriceLevel Full-depth entries only. 1-based.

Depth is maintained by level position, not by price. MDUpdateAction refers to the level number in MDPriceLevel: 0 (New) means the level was previously empty. 1 (Change) means the level had quantity before and after the update; its price may also have changed. 2 (Delete) means the level is now empty. When a price level is added or removed, the levels below it shift and are each sent as a Change.


8. Reference Data

SecurityListRequest (35=x)

Client → Nanoconda

Tag Name Req'd Description
320 SecurityReqID Y Included in the response.
559 SecurityListRequestType N 0 with Symbol(55) returns that single instrument, or NoRelatedSym=0 if it is unknown. Any other value, or absent, returns every tradeable instrument.
55 Symbol C Used with SecurityListRequestType=0.

SecurityList (35=y)

Nanoconda → Client

Tag Name Description
320 SecurityReqID
146 NoRelatedSym
→ 55 Symbol
→ 207 SecurityExchange Exchange MIC, e.g. XCME.

SecurityDefinitionRequest (35=c)

Client → Nanoconda

Tag Name Req'd Description
320 SecurityReqID Y Included in the response.
55 Symbol Y Single instrument.

SecurityDefinition (35=d)

Nanoconda → Client

Tag Name Description
320 SecurityReqID
322 SecurityResponseID Assigned by Nanoconda.
393 TotNoRelatedSym 1=found, 0=not found.
55 Symbol
207 SecurityExchange Exchange MIC.
167 SecurityType FUT, OPT or MLEG.
969 MinPriceIncrement Tick size.
231 ContractMultiplier
1148 LowLimitPrice Lower price band for the current trading day. Omitted if no band applies.
1149 HighLimitPrice Upper price band for the current trading day. Omitted if no band applies.
58 Text Unknown symbol when not found. Only SecurityReqID, TotNoRelatedSym=0, Symbol (as requested) and Text are sent.

LowLimitPrice and HighLimitPrice are the price band that pre-trade risk checks on NewOrderSingle. An order priced outside the band is rejected with OrdRejReason(103)=16.


9. Positions

RequestForPositions (35=AN)

Client → Nanoconda

Tag Name Req'd Description
710 PosReqID N Included in every response for this request.
724 PosReqType N Accepted and not used.
263 SubscriptionRequestType N See below.
SubscriptionRequestType (263) Behaviour
0 or absent Snapshot. Returns current positions once.
1 Snapshot + Updates. Returns current positions, then sends a new PositionReport for an instrument each time a fill changes its position, until you unsubscribe or the session ends.
2 Unsubscribe. No response.

Position updates are sent only to sessions that subscribed with SubscriptionRequestType=1.

Scope: account-wide.

PositionReport (35=AP)

Nanoconda → Client. One report per instrument with activity.

Tag Name Description
710 PosReqID From the request. For subscription updates, the PosReqID of the original subscription.
721 PosMaintRptID Unique report identifier.
728 PosReqResult 0=Valid request, 2=No positions found.
727 TotalNumPosReports Number of reports in this response. 1 on subscription updates.
325 UnsolicitedIndicator N=response to a request, Y=subscription update caused by a fill.
55 Symbol
715 ClearingBusinessDate YYYYMMDD, current UTC date.
702 NoPositions 1
→ 703 PosType TOT (Total Transaction Qty).
→ 704 LongQty Gross filled long quantity.
→ 705 ShortQty Gross filled short quantity.
753 NoPosAmt 1
→ 707 PosAmtType FMTM (Final Mark-to-Market).
→ 708 PosAmt Open (unrealized) P&L.

Gross quantities

LongQty and ShortQty are gross filled quantities and are not netted against each other. For example, buying 2 and selling 2 of the same instrument reports LongQty=2 and ShortQty=2. Net position = LongQty minus ShortQty.

If the account has no positions, a single PositionReport is sent with PosReqResult=2, TotalNumPosReports=0, and no instrument, position or amount fields.

Each session has one position subscription. A new RequestForPositions with SubscriptionRequestType=1 replaces the previous subscription and its PosReqID.

Margin and risk-limit figures are not available over FIX.


10. Trade Capture

TradeCaptureReportRequest (35=AD)

Client → Nanoconda

Tag Name Req'd Description
568 TradeRequestID N Included in every response.
569 TradeRequestType N Accepted and not used.
55 Symbol N Filter by instrument.
37 OrderID N Filter by order.

Scope: account-wide. Returns every fill on the account that matches the filters, whichever session or interface placed the order. A new session can retrieve the account's full trade history without having placed any orders itself.

TradeCaptureReport (35=AE)

Nanoconda → Client. One report per matching fill.

Tag Name Description
568 TradeRequestID
571 TradeReportID Unique report identifier.
487 TradeReportTransType 0 (New).
748 TotNumTradeReports Total number of reports in this response.
912 LastRptRequested Y on the last report of the response, otherwise N.
17 ExecID
37 OrderID
55 Symbol
54 Side
1028 ManualOrderIndicator Y=Manual, N=Automated: how the order behind this fill was flagged when it was submitted to CME.
31 LastPx Fill price.
32 LastQty Fill quantity.
60 TransactTime UTC.

TradeCaptureReportRequestAck (35=AQ)

Nanoconda → Client. Sent instead of TradeCaptureReport when no fills match or trade history is unavailable.

Tag Name Description
568 TradeRequestID
748 TotNumTradeReports 0
912 LastRptRequested Y
58 Text Trade log not available when trade history cannot be retrieved.

11. Rejects & Error Handling

Reject (35=3)

Session-level reject. It is sent for any application message received before Logon has completed.

Tag Name Description
45 RefSeqNum MsgSeqNum of the rejected message.
373 SessionRejectReason 99 (Other).
58 Text Not logged on.

BusinessMessageReject (35=j)

Application-level reject for problems not tied to a specific order's fields.

Tag Name Description
45 RefSeqNum MsgSeqNum of the rejected message.
372 RefMsgType MsgType of the rejected message.
380 BusinessRejectReason See below.
58 Text Human-readable reason.
Condition BusinessRejectReason (380)
Unsupported MsgType 3 Unsupported Message Type
Unknown Symbol on NewOrderSingle 2 Unknown Security
OrderStatusRequest for an unknown order 1 Unknown ID
OrderMassCancelRequest from a VIEWER role 6 Not authorized
Unsolicited exchange-side error related to an account order Exchange reason code, passed through unchanged. Values above 7 are exchange-defined (for example throttle limits, kill switch, risk controls).

Where to find reject reasons

Rejected request Response Reason field
Message before logon Reject(3) SessionRejectReason(373)
Logon Logout(5) Text(58)
New order ExecutionReport(8), ExecType=8 Text(58), and OrdRejReason(103) for risk and exchange rejects
Cancel / replace, rejected by Nanoconda OrderCancelReject(9) CxlRejReason(102), Text(58)
Cancel / replace, rejected by exchange ExecutionReport(8), ExecType=8 OrdRejReason(103)
Market data MarketDataRequestReject(Y) Text(58)
Other application messages BusinessMessageReject(j) BusinessRejectReason(380), Text(58)

12. Drop Copy

This section is for clearing firms, FCMs and risk desks that need real-time, read-only visibility into account activity without order entry. It gathers in one place the relevant behaviour described elsewhere in this document.

Setup

  1. Log on with a VIEWER username (see Logon). VIEWER cannot enter orders or change the account, so the drop-copy connection is read-only.
  2. No subscription is needed for order and fill activity. Every FIX session on the account automatically receives real-time ExecutionReports for all account activity, whichever session or interface created it.
  3. Optional: subscribe to position updates with RequestForPositions(AN), SubscriptionRequestType(263)=1.

Real-time unsolicited messages

Message Content
ExecutionReport(8) Every order lifecycle event on the account: acknowledgements, partial and full fills, cancels, replaces, new-order rejects, and cancel/replace rejects from the exchange (ExecType=8). Each report shows whether the order was submitted to CME as manual or automated in ManualOrderIndicator(1028).
OrderCancelReject(9) Cancel/replace requests on working orders rejected by Nanoconda risk controls or order management.
BusinessMessageReject(j) Exchange-side errors related to an account order.
PositionReport(AP) Position and P&L updates after fills, only if subscribed.

Reconciliation

These account-wide requests return complete, current state whichever session created the activity. Use them to reconcile at start of day, after a disconnect, or at any other time:

Request Returns
OrderStatusRequest(H) / OrderMassStatusRequest(AF) Current state of a single working order / all working orders
TradeCaptureReportRequest(AD) Full fill history, optionally filtered by Symbol or OrderID
RequestForPositions(AN) Current positions and open P&L per instrument

Messages missed while disconnected are not replayed. See Reconnection & Recovery.


13. Message Flows

Session establishment

# Direction Message
1 Client → Nanoconda Logon(A)
2 Nanoconda → Client Logon(A)

Instrument discovery

# Direction Message
1 Client → Nanoconda SecurityListRequest(x)
2 Nanoconda → Client SecurityList(y)
3 Client → Nanoconda SecurityDefinitionRequest(c) (optional, per instrument)
4 Nanoconda → Client SecurityDefinition(d)

Market data subscription

# Direction Message
1 Client → Nanoconda MarketDataRequest(V), SubscriptionRequestType=1
2 Nanoconda → Client MarketDataSnapshotFullRefresh(W), one per symbol
3 Nanoconda → Client MarketDataIncrementalRefresh(X), repeated on each book change

Limit order through fill

# Direction Message
1 Client → Nanoconda NewOrderSingle(D), OrdType=2
2 Nanoconda → Client ExecutionReport(8), ExecType=A (Pending New)
3 Nanoconda → Client ExecutionReport(8), ExecType=0 (New)
4 Nanoconda → Client ExecutionReport(8), ExecType=1 (Partially Filled) and/or 2 (Filled)

Modify and cancel a working order

# Direction Message
1 Client → Nanoconda OrderCancelReplaceRequest(G), OrderID of the working order
2 Nanoconda → Client ExecutionReport(8), ExecType=5 (Replaced), which may be preceded by E (Pending Replace)
3 Client → Nanoconda OrderCancelRequest(F), OrderID (or OrigClOrdID = the replace request's ClOrdID)
4 Nanoconda → Client ExecutionReport(8), ExecType=4 (Canceled), which may be preceded by 6 (Pending Cancel)

Order status after reconnect

# Direction Message
1 Client → Nanoconda Logon(A)
2 Client → Nanoconda OrderStatusRequest(H) or OrderMassStatusRequest(AF)
3 Nanoconda → Client ExecutionReport(8) per order (no response from AF if there are no open orders)

Trade history

# Direction Message
1 Client → Nanoconda TradeCaptureReportRequest(AD), optional Symbol / OrderID filter
2 Nanoconda → Client TradeCaptureReport(AE) x N, or TradeCaptureReportRequestAck(AQ) if none

Positions snapshot and subscription

# Direction Message
1 Client → Nanoconda RequestForPositions(AN), SubscriptionRequestType=0 (snapshot) or 1 (snapshot + updates)
2 Nanoconda → Client PositionReport(AP) x N, one per instrument, or one with PosReqResult=2 if there are none
3 Nanoconda → Client PositionReport(AP), UnsolicitedIndicator=Y, after each fill (subscription only)
4 Client → Nanoconda RequestForPositions(AN), SubscriptionRequestType=2 (end subscription)

Drop copy

# Direction Message
1 Client → Nanoconda Logon(A), VIEWER role
2 Nanoconda → Client ExecutionReport(8) / OrderCancelReject(9) / BusinessMessageReject(j), unsolicited, as account activity occurs

Logout

# Direction Message
1 Client → Nanoconda Logout(5)
2 Nanoconda → Client Logout(5), then the connection is closed

14. Reconnection & Recovery

FIX sessions do not persist across a disconnect. Messages are not replayed (ResendRequest is answered with a sequence reset only), and order modification requests are session-scoped. After a reconnect:

Capability Behaviour on the new session
OrderStatusRequest, OrderMassStatusRequest Available for all orders still working, including those submitted before the disconnect.
RequestForPositions, TradeCaptureReportRequest Fully available. Account-wide, including all activity from before the disconnect.
OrderCancelRequest, OrderCancelReplaceRequest, OrderMassCancelRequest Apply only to orders submitted or amended on the new session. Orders from the previous session cannot be cancelled or modified over FIX from the new session.
Messages sent while disconnected Not replayed. Recover state with the account-wide queries above.

Recommended reconnect sequence

  1. Logon(A)
  2. OrderMassStatusRequest(AF): get every working order and its LeavesQty / CumQty. Any order you hold as open that is not returned is no longer working.
  3. RequestForPositions(AN): confirm positions against your own records.
  4. TradeCaptureReportRequest(AD): retrieve fill detail for the disconnected period, if needed.

If your workflow needs to cancel or modify orders from a previous session, contact your Nanoconda account representative.


15. Differences from FIX 4.4 & Unsupported Features

Area Nanoconda behaviour
TimeInForce Only Day (0) and IOC (3, Limit orders only). GTC, GTD, OPG, GTX and FOK are rejected.
Order modification OrderCancelReplaceRequest modifies only Price and OrderQty.
Order management scope Cancel, replace and mass cancel are session-scoped. Status, positions and trade capture are account-wide.
Mass requests OrderMassStatusRequest and OrderMassCancelRequest filter only by Symbol and Side. MassStatusReqType(585) and MassCancelRequestType(530) are not used.
Mass request results OrderMassStatusRequest and OrderMassCancelRequest send no response when no orders match.
Sequence numbers Inbound gaps are not enforced. ResendRequest is answered with SequenceReset in Reset mode (GapFillFlag=N), with no message replay.
Logon reject Sent as Logout(5) with Text(58). No numeric code.
Market data Only snapshot + updates (SubscriptionRequestType=0 is treated as 1). Bid and Offer entries only. No MDReqRejReason(281).
DisplayQty / MinQty Passed through to the exchange as submitted and echoed on ExecutionReport.
Party identification Parties component (PartyID/PartyRole), SenderSubID(50) and TargetSubID(57) are not used. Each FIX session is bound to one account.
Margin / risk limits Not available over FIX.
Not supported Multi-leg order entry (NewOrderMultileg), cross orders (NewOrderCross), quoting (MassQuote, QuoteCancel), allocations, and any message not listed in Supported Messages. These are rejected with BusinessMessageReject(j), BusinessRejectReason=3.

Appendix A: Tag Reference

Every tag read or sent by the Nanoconda FIX gateway, in numeric order.

Tag Name Messages
1 Account ExecutionReport, OrderCancelReject
6 AvgPx ExecutionReport
7 BeginSeqNo ResendRequest
8 BeginString Header (all)
9 BodyLength Header (all)
10 CheckSum Trailer (all)
11 ClOrdID NewOrderSingle, OrderCancelRequest, OrderCancelReplaceRequest, OrderStatusRequest, ExecutionReport, OrderCancelReject
14 CumQty ExecutionReport
15 Currency Accepted and not used
17 ExecID ExecutionReport, TradeCaptureReport
21 HandlInst NewOrderSingle (accepted and not used)
31 LastPx ExecutionReport, TradeCaptureReport
32 LastQty ExecutionReport, TradeCaptureReport
34 MsgSeqNum Header (all)
35 MsgType Header (all)
36 NewSeqNo SequenceReset
37 OrderID OrderCancelRequest, OrderCancelReplaceRequest, OrderStatusRequest, TradeCaptureReportRequest, ExecutionReport, OrderCancelReject, TradeCaptureReport
38 OrderQty NewOrderSingle, OrderCancelReplaceRequest, ExecutionReport
39 OrdStatus ExecutionReport, OrderCancelReject
40 OrdType NewOrderSingle, ExecutionReport
41 OrigClOrdID OrderCancelRequest, OrderCancelReplaceRequest, OrderCancelReject
44 Price NewOrderSingle, OrderCancelReplaceRequest, ExecutionReport
45 RefSeqNum Reject, BusinessMessageReject
49 SenderCompID Header (all)
52 SendingTime Header (all)
54 Side NewOrderSingle, OrderMassStatusRequest, OrderMassCancelRequest, ExecutionReport, TradeCaptureReport
55 Symbol Order, market data, reference data, position and trade capture messages
56 TargetCompID Header (all)
58 Text ExecutionReport, Logout, Reject, BusinessMessageReject, OrderCancelReject, MarketDataRequestReject, SecurityDefinition, TradeCaptureReportRequestAck
59 TimeInForce NewOrderSingle, ExecutionReport
60 TransactTime NewOrderSingle (accepted and not used), ExecutionReport, TradeCaptureReport
98 EncryptMethod Logon
99 StopPx NewOrderSingle, ExecutionReport
102 CxlRejReason OrderCancelReject
103 OrdRejReason ExecutionReport
108 HeartBtInt Logon
110 MinQty NewOrderSingle, ExecutionReport
112 TestReqID TestRequest, Heartbeat
123 GapFillFlag SequenceReset
146 NoRelatedSym MarketDataRequest, SecurityList
150 ExecType ExecutionReport
151 LeavesQty ExecutionReport
167 SecurityType SecurityDefinition
207 SecurityExchange SecurityList, SecurityDefinition
231 ContractMultiplier SecurityDefinition
262 MDReqID MarketDataRequest, MarketDataSnapshotFullRefresh, MarketDataIncrementalRefresh, MarketDataRequestReject
263 SubscriptionRequestType MarketDataRequest, RequestForPositions
264 MarketDepth MarketDataRequest
267 NoMDEntryTypes MarketDataRequest
268 NoMDEntries MarketDataSnapshotFullRefresh, MarketDataIncrementalRefresh
269 MDEntryType MarketDataRequest, MarketDataSnapshotFullRefresh, MarketDataIncrementalRefresh
270 MDEntryPx MarketDataSnapshotFullRefresh, MarketDataIncrementalRefresh
271 MDEntrySize MarketDataSnapshotFullRefresh, MarketDataIncrementalRefresh
279 MDUpdateAction MarketDataIncrementalRefresh
320 SecurityReqID SecurityListRequest, SecurityList, SecurityDefinitionRequest, SecurityDefinition
322 SecurityResponseID SecurityDefinition
325 UnsolicitedIndicator PositionReport
372 RefMsgType BusinessMessageReject
373 SessionRejectReason Reject
380 BusinessRejectReason BusinessMessageReject
393 TotNoRelatedSym SecurityDefinition
434 CxlRejResponseTo OrderCancelReject
487 TradeReportTransType TradeCaptureReport
553 Username Logon
554 Password Logon
559 SecurityListRequestType SecurityListRequest
568 TradeRequestID TradeCaptureReportRequest, TradeCaptureReport, TradeCaptureReportRequestAck
569 TradeRequestType TradeCaptureReportRequest (accepted and not used)
571 TradeReportID TradeCaptureReport
584 MassStatusReqID OrderMassStatusRequest (accepted and not used)
585 MassStatusReqType OrderMassStatusRequest (accepted and not used)
702 NoPositions PositionReport
703 PosType PositionReport
704 LongQty PositionReport
705 ShortQty PositionReport
707 PosAmtType PositionReport
708 PosAmt PositionReport
710 PosReqID RequestForPositions, PositionReport
715 ClearingBusinessDate PositionReport
721 PosMaintRptID PositionReport
724 PosReqType RequestForPositions (accepted and not used)
727 TotalNumPosReports PositionReport
728 PosReqResult PositionReport
748 TotNumTradeReports TradeCaptureReport, TradeCaptureReportRequestAck
753 NoPosAmt PositionReport
912 LastRptRequested TradeCaptureReport, TradeCaptureReportRequestAck
969 MinPriceIncrement SecurityDefinition
1023 MDPriceLevel MarketDataIncrementalRefresh (full-depth entries)
1028 ManualOrderIndicator NewOrderSingle, ExecutionReport, TradeCaptureReport
1138 DisplayQty NewOrderSingle, ExecutionReport
1148 LowLimitPrice SecurityDefinition
1149 HighLimitPrice SecurityDefinition

Appendix B: Enumerations

OrdType (40)

Value Meaning
1 Market
2 Limit (Limit IOC when TimeInForce=3)
3 Stop
4 Stop Limit

TimeInForce (59)

Value Meaning Supported
0 Day Yes (default)
1 Good Till Cancel (GTC) No
2 At the Opening (OPG) No
3 Immediate or Cancel (IOC) Yes, Limit orders only (Fill-and-Kill)
4 Fill or Kill (FOK) No
5 Good Till Crossing (GTX) No
6 Good Till Date (GTD) No

ManualOrderIndicator (1028)

Value Meaning
Y Manual order
N Automated order (default when absent)

Side (54)

Value Meaning
1 Buy
2 Sell

ExecType (150) / OrdStatus (39)

Value Meaning
A Pending New
0 New
1 Partially Filled
2 Filled
6 Pending Cancel
4 Canceled
E Pending Replace
5 Replaced
8 Rejected

See ExecutionReport for usage.

OrdRejReason (103)

Present on ExecutionReport with ExecType=8 for pre-trade risk and exchange rejects. Order validation rejects carry Text(58) only. It can come from two sources:

  • Nanoconda (immediately, on NewOrderSingle validation and pre-trade risk checks): the values marked "Yes" below.
  • Exchange (asynchronously, on an order or cancel/replace rejected by the exchange): the exchange's reject code, passed through unchanged. These codes are exchange-defined and may fall outside the standard FIX values below. Refer to CME iLink 3 documentation for their meaning.
Value Meaning Sent by Nanoconda
0 Broker / Exchange option Yes (other risk or validation reject)
1 Unknown symbol Yes
2 Exchange closed
3 Order exceeds limit Yes (risk limit exceeded)
4 Too late to enter
5 Unknown order
6 Duplicate order
7 Duplicate of a verbally communicated order
8 Stale order
9 Trade along required
10 Invalid investor ID
11 Unsupported order characteristic Yes
12 Surveillance option
13 Incorrect quantity Yes
14 Incorrect allocated quantity
15 Unknown account(s)
16 Price exceeds current price band Yes (see LowLimitPrice(1148) / HighLimitPrice(1149))
18 Invalid price increment
99 Other

CxlRejReason (102)

Present on OrderCancelReject. Sent only by Nanoconda. Cancel/replace requests rejected by the exchange are reported on ExecutionReport with OrdRejReason(103) instead (see Cancel/replace rejections).

Value Meaning Sent by Nanoconda
0 Too late to cancel Yes
1 Unknown order Yes (order not found, or not submitted/amended on this session)
2 Broker / Exchange option Yes (other rejects)
3 Order already in Pending Cancel or Pending Replace status Yes
4 Unable to process Order Mass Cancel Request
5 OrigOrdModTime did not match last TransactTime of order
6 Duplicate ClOrdID received Yes
99 Other Yes (role not authorized, and other reasons; see Text(58))

BusinessRejectReason (380)

Value Meaning Sent by Nanoconda
0 Other Yes
1 Unknown ID Yes (OrderStatusRequest for an unknown order)
2 Unknown Security Yes (unknown Symbol on NewOrderSingle)
3 Unsupported Message Type Yes
4 Application not available
5 Conditionally required field missing
6 Not authorized Yes (OrderMassCancelRequest from a VIEWER role)
7 DeliverTo firm not available at this time
> 7 Exchange-defined Yes (exchange reason codes passed through on unsolicited exchange-side errors, for example throttle limits, kill switch, risk controls)

GapFillFlag (123)

Value Meaning
N Reset mode. Always sent by Nanoconda in response to ResendRequest.
Y Gap fill mode. Accepted from the client.

SessionRejectReason (373)

Value Meaning
99 Other: application message received before logon completed. This is the only value sent.

SecurityType (167)

Value Meaning
FUT Future
OPT Option
MLEG Multi-leg instrument (spread)

SecurityListRequestType (559)

Value Meaning
0 Single instrument, by Symbol(55)
Any other / absent All tradeable instruments

SubscriptionRequestType (263)

Value MarketDataRequest RequestForPositions
0 Treated as 1 Snapshot
1 Snapshot + updates Snapshot + updates
2 Unsubscribe Unsubscribe

MarketDepth (264)

Value Meaning
1 Top of book only
Any other / absent Top of book and full depth

MDEntryType (269)

Value Meaning
0 Bid
1 Offer

MDUpdateAction (279)

Value Meaning
0 New
1 Change
2 Delete

PosReqResult (728)

Value Meaning
0 Valid request
2 No positions found

PosType (703) / PosAmtType (707)

Tag Value Meaning
703 TOT Total Transaction Qty
707 FMTM Final Mark-to-Market

CxlRejResponseTo (434)

Value Meaning
1 OrderCancelRequest
2 OrderCancelReplaceRequest

UnsolicitedIndicator (325)

Value Meaning
N Response to a request
Y Subscription update

TradeReportTransType (487)

Value Meaning
0 New