Skip to content
UDX
On this page

Discovering Markets

Read and follow the FIX instrument catalog, select market tickers, and subscribe to trading status.

Use the FIX market-data session to discover market tickers and follow changes to their catalog membership and trading status. Complete logon as described in FIX Sessions and Recovery before sending these requests.

The examples show decoded FIX fields. Your FIX engine encodes the numeric tags and raw values and supplies the header and trailer. Indentation marks repeating-group entries. Replace <ticker> with a ticker returned by the catalog. See Markets and Trading for single-leg and multi-leg markets and pricing units.

Read the Catalog

Send SecurityListRequest(x) to read every listed instrument:

MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-1
SecurityListRequestType(559)=ALL_SECURITIES(4)
SubscriptionRequestType(263)=SNAPSHOT(0)

The exchange answers with SecurityList(y). Match SecurityReqID(320) to your request; SecurityResponseID(322) carries the same value. Read the instrument entries under NoRelatedSym(146) and copy each Symbol(55) as the market’s ticker.

Result Next step
SecurityRequestResult(560)=VALID_REQUEST(0) Read the returned instrument entries.
SecurityRequestResult(560)=NO_INSTRUMENTS_FOUND(2) The selected catalog is empty; there are no instrument entries.
SecurityRequestResult(560)=INVALID_OR_UNSUPPORTED_REQUEST(1) Correct the request’s fields before retrying.
SecurityRequestResult(560)=NOT_SUPPORTED(5) Select supported catalog criteria from the request reference.

An empty catalog is an explicit answer, not silence:

MsgType(35)=SecurityList(y)
SecurityReqID(320)=catalog-1
SecurityResponseID(322)=catalog-1
SecurityRequestResult(560)=NO_INSTRUMENTS_FOUND(2)
NoRelatedSym(146)=0

Each instrument entry includes MinPriceIncrement(969), the price tick in dollars. Apply any returned minimum quantity and price limits when preparing orders. A multi-leg entry also contains a nested NoLegs(555) group identifying its component tickers; single-leg entries omit that group. Use the returned market ticker rather than constructing one from the component tickers.

Narrow the Catalog

To read only multi-leg markets, select one security type:

MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-multi
SecurityListRequestType(559)=SECURITYTYPE_AND_OR_CFICODE(1)
SecurityType(167)=MLEG
SubscriptionRequestType(263)=SNAPSHOT(0)

Use SecurityType(167)=EVENT for single-leg markets. The filter reads SecurityType(167) only. To look up one ticker, use SecurityListRequestType(559)=SYMBOL(0) and include Symbol(55) with that ticker.

Catalog membership and book availability are separate. The all-instrument and security-type queries can list a market before its book state is available. A named lookup or book request can therefore report that the ticker is unknown even though it appeared in the catalog. Do not treat catalog presence as confirmation that the market is ready to trade; read its trading status below.

Follow Catalog Changes

To keep a catalog current, use the same request shape with a new request ID and SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1):

MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-live
SecurityListRequestType(559)=ALL_SECURITIES(4)
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)

Build your starting catalog from SecurityList(y). Later SecurityListUpdateReport(BK) messages carry SecurityReqID(320)=catalog-live, so you can associate each change with this subscription.

Update Apply it to your catalog
SecurityUpdateAction(980)=ADD(A) Add or replace the named instrument using the returned entry. It carries the same details as a catalog snapshot, including any legs and configured limits.
SecurityUpdateAction(980)=DELETE(D) Remove the named ticker. The entry carries the ticker alone, without its former limits or legs.

Apply these entries to the existing catalog; an update is not a replacement for the entire catalog. Catalog subscriptions report additions and deletions, not general metadata edits or changes in trading status. Track status separately.

To cancel, repeat the subscription request with its original SecurityReqID(320)=catalog-live and SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2). Keep the original selection fields so the request remains valid. The exchange sends no application-level cancellation acknowledgment; messages already in transit can still arrive.

Follow One Market’s Status

Send SecurityStatusRequest(e) with the selected ticker:

MsgType(35)=SecurityStatusRequest(e)
SecurityStatusReqID(324)=status-1
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)
Symbol(55)=<ticker>

The initial SecurityStatus(f) and subsequent status changes echo SecurityStatusReqID(324)=status-1 and name the ticker in Symbol(55).

Answer Meaning
SecurityTradingStatus(326)=READY_TO_TRADE(17) The market’s book is open for trading.
SecurityTradingStatus(326)=TRADING_HALT(2) The market’s book is closed for trading.
Text(58)=no such instrument, with SecurityTradingStatus(326) omitted The exchange has no book state for that ticker. Check the ticker and catalog; a newly listed market may not have book state yet.

A status subscription for an unknown ticker remains registered. It can receive a status when the market’s book becomes available. For a one-time status read, use SubscriptionRequestType(263)=SNAPSHOT(0) instead.

To cancel the subscription, repeat the request with SecurityStatusReqID(324)=status-1, the original ticker, and SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2). No application-level cancellation acknowledgment is sent.

Follow Status Across Markets

Use SecurityMassStatusRequest(CN) to follow trading status across markets without opening a separate subscription for each ticker. This example selects multi-leg markets:

MsgType(35)=SecurityMassStatusRequest(CN)
SecurityStatusReqID(324)=status-multi
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)
NoInstrumentScopes(1656)=1
  InstrumentScopeOperator(1535)=INCLUDE(1)
  InstrumentScopeSecurityType(1547)=MULTILEG_INSTRUMENT(MLEG)

Omit NoInstrumentScopes(1656) to include both instrument kinds. To include only single-leg markets, use InstrumentScopeSecurityType(1547)=EVENT_CONTRACT(EVENT) in the scope entry. For a one-time read, use SubscriptionRequestType(263)=SNAPSHOT(0).

The exchange answers with SecurityMassStatus(CO), echoing SecurityStatusReqID(324). Its NoRelatedSym(146) entries contain a ticker and trading status. Build the initial status map from that response; subsequent messages update the entries they name. Do not replace the entire status map with each change message. NoRelatedSym(146)=0 means no matching book states were found.

This is a view of known book states, not a second instrument catalog. Do not infer catalog membership from this response. Use different SecurityStatusReqID(324) values for status subscriptions you want to keep active at the same time.

Cancel by repeating the mass-status request with its original request ID, scope, and SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2). No application-level cancellation acknowledgment is sent.

Read Books and Trades

Continue with Reading Market Data to request book snapshots, maintain a top-of-book view, or receive trades. Book and trade subscriptions do not supply trading status.

After a disconnection, recreate the catalog and status subscriptions you still need. Follow the fresh market-data logon procedure in FIX Sessions and Recovery.