Organisational Changes

 

The close coupling between Client API and server backend is FINALLY broken.

 

Removed

SLM API - Whilst the SLM remains a Whisperer component, SLM API support is now deprecated in favour of our clients using Reflector, or at least using the same notification interface as used by Reflector (WHSPRR-1676):

 

Batching

What's New

Session Handling

Counterparties

Regulatory

ESP/RFS

All product types supported:

Pre-trade allocations.

Order messages linked with Quote/MDReqID to assist supportability.

Market Data

Quotes

Indicative/Tradeable QuoteType (aka Quote condition) now supported, to allow Maker ESP/RFS quote withdrawal.

Orders

Additional Time In Force support:

Additional Order types:

Cancel/replace now allows for provision of MinQty and StopPx.

Executions

Full Order details now echoed back, as opposed to the minimum set of fill details, including:

 

Order Fill status now maintained on a per-leg basis: LegOrderQty*, LegLastQty, LegCumQty*, LegLeavesQty. * - Newly added.

Maker/Taker agnostic

The Venue always dictates the supported message flow, the API does not make any assumptions about counterparty roles, eliminating the need for separate Maker and Taker Whisperer installations.

Instrument Identification

Venue Capabilities

 

 

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
 *
 * Copyright (C) 2018 MarketFactory, Inc. All rights reserved.
 * Use in source and binary forms, with or without modification, is permitted provided that the following conditions are met:
 * 1. You may only use this software for internal evaluation and testing purposes and may not use the software for engaging
 * in live trades, unless and until you have entered into a separate agreement with MarketFactory governing the use of
 * MarketFactory software in a production environment.
 * 2. You may not distribute the software (in either source or binary forms) to third parties.
 * 3. All copies of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 *    THIS SOFTWARE IS PROVIDED BY MARKETFACTORY AND ITS LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 *    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
 *    NO EVENT SHALL MARKETFACTORY OR ITS LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 *    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 -->
<sbe:messageSchema xmlns:sbe="http://fixprotocol.io/2016/sbe"
                   package="mfunified"
                   id="5"
                   version="0"
                   semanticVersion="MF-FIX5.0SP2"
                   description="Schema for marketdata and trading messages. Based on FIX50SP2. The protocol is designed to run over TCP."
                   byteOrder="littleEndian">


<!-- TODO - think about putting the Batch messages into MktDataRequest and MarketDataIncrementalRefresh -->
<!-- TODO - DropCopy to get worked out for HS drop copy and STPBridge usage (used by CIBC) - need to verify this maps to the execReport -->

<!-- TODO - check for aggfeed support -->
<!-- TODO - tidy use of SemanticType - as per SBE convention -->

<!-- NOTE

It is the Venue that dictates the message flow, not the API Client - thus, this Schema is Maker/Taker agnostic. Session startup behaviour varies across venue types as follows:
    Maker, CLOB
        Any MFAPI client requests will be rejected by Whisperer, until such time as the Feed Handler reports OPEN with TradingSessionStatus (TradingSubscriptionStatus = Enabled)
    Taker
        Feed Handler will not connect to venue until MFAPI Client connection with Logon & LogonResponse, no inbound requests will be received until the Feed Handler reports OPEN with TradingSessionStatus (TradingSubscriptionStatus = Enabled)

-->

<!-- NOTE

    This Schema utilises the following custom tags:

    20000    PacketLength
    20001    PacketSeqNum
    20002    MessageLength
    20003    PacketSendingTime
    20004    BigPriceIncrement
    20006    NoSupportedModels
    20013    BatchDefinitionID
    20014    NoSecurityIDs
    20016    BatchGroup
    20018    NoSupportedProducts
    20019    TradingModel
    20020    TradingSubscriptionStatus
    20022    VenueID
    20024    VenueName
    20025    OrigVenueID
    20045    StartTimestamp
    20046    EndTimestamp
    20047    OfferQuoteType
    20050    AllocRegulatoryFields
    20051    AllocRegulatoryKey
    20052    AllocRegulatoryValue
    20053    BodyRegulatoryFields
    20054    BodyRegulatoryKey
    20055    BodyRegulatoryValue
    20056    CurrentSeqNum
    20057    -
    20058    FixingReference
    20059    FwdPriceIncrement
    20060    LegAllocCalculatedCcyQty
    20061    LegCumQty
    20062    LegLeavesQty
    20063    LegRegulatoryFields
    20064    LegRegulatoryKey
    20065    LegRegulatoryValue
    20066    LotSize
    20067    -
    20068    -
    20069    NumCompetitors
    20070    -
    20071    -
    20072    PassthruElements
    20073    PassthruFields
    20074    PassthruKey
    20075    PassthruValue
    20076    RegulatoryBodies
    20077    StreamCategory
    20078    -
    20079    -
    20080    OrderAttributes

    a couple of commands to help maintain this list:
        egrep '2[0-9]{4}' *.xml
        egrep 'id="(2[0-9]{4}|TODO)"' mfproto-3.15.xml  | awk 'BEGIN { FS="\"" }  {print $4, $2 }' | sort -u
-->


<!-- NOTE

Messages are in two categories: Sequenced and Unsequenced. Sequenced messages relate to trading state changes, and may or may not be persisted/resent.
All MF Sequence Numbering is responsibility of individual FHs.
Seq Nums reset weekly.


The table below specifies what messages are to be persisted/resent vs gap fills.
NOTE: Persisted = - is Unsequenced, Y/N is Sequenced.

Message                          Tx             Rx              Persisted
=======                          ==             ==              =========

Logon                            Client(Both)   FH              -
LogonResponse                    FH             Client(Both)    -
Logout                           Client(Both)   FH              -
LogoutResponse                   FH             Client(Both)    -
SequenceResetGapFill             Client(Both)   FH              -
                                 FH             CLient(Both)    -
                                 API Server     Client(Both)    -
Heartbeat                        Client(Both)   FH              -
                                 FH             CLient(Both)    -
TestRequest                      Client(Both)   FH              -
                                 FH             CLient(Both)    -

SecurityDefinitionRequest        Client(Both)   FH              -
SecurityDefinition               FH             CLient(Both)    -
SecurityStatus                   FH             CLient(TAKER)   -
MarketDefinitionRequest          Client(Both)   FH              -
MarketDefinition                 FH             CLient(Both)    -
TradingSessionStatusRequest      Client(Both)   FH              -
TradingSessionStatus             FH             CLient(Both)    -

MarketDataRequest                Client(Both)   FH              -
MarketDataRequestHistoric        Client(Both)   TODO            -
MarketDataRequestReject          FH             Client(Both)    -
MarketDataIncrementalRefresh     FH             Client(Both)    -
RegisterForBatch                 Client(Both)   FH              -
UnregisterForBatch               Client(Both)   FH              -
BatchesCompleted                 FH             Client(Both)    -

QuoteRequest                     Client(TAKER)  FH              N
                                 FH             Client(MAKER)   N
QuoteRequestReject               Client(MAKER)  FH              N
                                 FH             CLient(TAKER)   N
Quote                            Client(MAKER)  FH              -
                                 FH             CLient(TAKER)   -
MassQuote                        Client(MAKER)  FH              -
                                 FH             CLient(TAKER)   -
QuoteResponse                    Client(MAKER)  FH              N
                                 FH             CLient(TAKER)   N
                                 Client(TAKER)  FH              N
                                 FH             CLient(MAKER)   N

NewOrderMultileg                 Client(TAKER)  FH              N
                                 FH             CLient(MAKER)   N
OrderCancelReplaceRequest        Client(TAKER)  FH              N
                                 FH             CLient(MAKER)   N
OrderCancelRequest               Client(TAKER)  FH              N
                                 FH             CLient(MAKER)   N
OrderCancelReject                Client(MAKER)  FH              N
                                 FH             CLient(TAKER)   N
ExecutionReport                  Client(MAKER)  FH              Y <<<<<<< Requirement on Client to be tested in onboarding.
                                 FH             CLient(TAKER)   Y <<<<<<<
ExecutionAck                     Client(TAKER)  FH              N
                                 FH             CLient(MAKER)   Y
-->

<!-- NOTE

    The table below defines the mapping from the 3.13/3.14 Classic MFAPI to the 4.0 SBE MFAPI
  
    Lcn    ClassicName                   Comment                                     SBEName
    ===    ===========                   =======                                     =======
    API    AcceptOrderMessage            3.14/Maker See OrderDoneMessage             ExecutionReport(OrdStatus=PartiallyFilled/Filled)
    API    BatchesCompletedMessage       -                                           BatchesCompleted
    API    BatchRegisterMessage          -                                           RegisterForBatch
    API    BatchUnregisterMessage        -                                           UnregisterForBatch
    API    CancelAllOrderMessage         -                                           DEPRECATED (Disconnect should do this)
    API    CancelOrderMessage            -                                           OrderCancelRequest
    API    CancelQuoteMessage            3.14/Maker                                  QuoteResponse (for termination), Quote/MassQuote (for withdrawal)
    API    ClientConnectMessage          -                                           Logon
    API    ClientDisconnectMessage       -                                           Logout
    API    ComplexOrderMessage           -                                           DEPRECATED (Agg feed order message, but not used)
    API    ConfigMessage                 -                                           SecurityDefinitionRequest, SecurityDefinition, MarketDefinitionRequest, MarketDefinition
    API    ConnectResponseMessage        -                                           LogonResponse, LogoutResponse
    API    DateRolloverMessage           -                                           SecurityStatus
    API    DropCopyMessage               -                                           ExecutionReport(OrdStatus=Calculated) For Partial & Full Fills ONLY.
    API    EventReportMessage            -                                           TODO
    API    HeartbeatMessage              -                                           Heartbeat
    API    ImHereMessage                 -                                           Heartbeat (in response to TestRequest)
    API    InsertLogMessage              -                                           TODO
    API    LastSequenceIDMessage         -                                           DEPRECATED (Now use standard FIX sequence number logic) 
    API    LockResponseMessage           AdminUsers                                  DEPRECATED (Reflector)
    API    LockUserMessage               AdminUsers                                  DEPRECATED (Reflector)
    API    MassQuoteAckMessage           3.14/Maker                                  DEPRECATED (Will force disconnect)
    API    MassQuoteMessage              3.14/Maker                                  MassQuote
    API    MktDataMessage                -                                           MarketDataIncrementalRefresh
    API    ModifyOrderMessage            -                                           OrderCancelReplaceRequest
    API    NewOrderMessage               3.14/Maker See SubmitOrderMessage           NewOrderMultileg
    API    OrderCanceledMessage          -                                           ExecutionReport(OrdStatus=Canceled)
    API    OrderCancelRejectedMessage    -                                           OrderCancelReject
    API    OrderDoneMessage              See TradeCaptureMessage                     ExecutionReport(OrdStatus=Filled)
    API    OrderReceivedMessage          See AcceptOrderMessage                      ExecutionReport(OrdStatus=MFPendingNew)
    API    OrderRejectedMessage          See RejectOrderMessage                      ExecutionReport(OrdStatus=Rejected)
    API    OrderSubmittedMessage         -                                           ExecutionReport(OrdStatus=New) NOTE: Sent after order has been sent to venue. PendingNew, really. TODO Revisit this.
    API    OrderTimeoutMessage           3.14/Maker                                  ExecutionAck(ExecAckStatus=DontKnow)
    API    QuoteRequestMessage           3.14/Maker                                  QuoteRequest
    API    RejectOrderMessage            3.14/Maker See OrderRejectedMessage         ExecutionReport(OrdStatus=Rejected)
    API    RejectQuoteRequestMessage     3.14/Maker                                  QuoteRequestReject
    API    ReplayDoneMessage             -                                           DEPRECATED (Now use standard FIX sequence number logic, along with PossDupFlag in resent ExecutionReports.)
    API    ReplayMessage                 -                                           DEPRECATED (Both sides now expect gaps to be filled automatically).
    API    RequestSnapshotMessage        -                                           DEPRECATED (Incremental starts with effective snapshot)
    API    RiskResponseMessage           -                                           TODO
    API    RuThereMessage                -                                           TestRequest
    API    SubmitOrderMessage            See NewOrderMessage                         NewOrderMultileg
    API    SubscribeMessage              -                                           TradingSessionStatusRequest, MarketDataRequest(SubscriptionRequestType=SnapshotAndUpdates) Unsubscribe would cancel orders.
    API    SubscriptionEventMessage      -                                           MarketDataRequestReject
    API    TaskInitializationMessage     -                                           DEPRECATED
    API    TestMessage                   -                                           DEPRECATED
    API    TradeCaptureAckMessage        3.14/Maker                                  ExecutionAck (ExecAckStatus=Accepted/Rejected)
    API    TradeCaptureMessage           See OrderDoneMessage                        ExecutionReport(OrdStatus=PartiallyFilled/Filled)
    API    TradeLimitDataMessage         AdminUsers                                  DEPRECATED (Reflector)
    API    UnsubscribeAllMessage         -                                           DEPRECATE (Disconnect should do this)
    API    UnsubscribeMessage            -                                           TODO MarketDataRequest(SubscriptionRequestType=DisablePreviousSnapshot)
    API    VersionMessage                -                                           DEPRECATE (in favour of messageHeader).
    
    INT    CallbackMessage               -                                           -
    INT    HeartbeatTimerMessage         -                                           -
    INT    InternalClientInfoMessage     -                                           -
    INT    MDActivityCheckMessage        -                                           -
    INT    MemBusConnectMessage          -                                           -
    INT    MemBusDisconnectMessage       -                                           -
    INT    MemBusHeartbeatMessage        -                                           -
    INT    RequestMessage                -                                           -
    INT    SecurityInfoMessage           -                                           -
    INT    StatTimeoutMessage            -                                           -
    INT    SubscriptionTimeoutMessage    -                                           -
    INT    SubscriptionTimerMessage      -                                           -
    INT    TimerMessage                  -                                           -
    LOG    ExchangeMessage               -                                           -
    LOG    LogMessage                    -                                           -
    LOG    PadMessage                    -                                           -
    LOG    StatCounterMessage            -                                           -
    LOG    ProtocolDefinitionMessage     -                                           -


    
    SBE Messages not supported in Classic:

    SequenceResetGapFill
    TradingSessionStatus
    MarketDataRequestHistoric
    TradeDateRequest
    TradeDateReport
    
-->

<!-- TODO presence optionality should be defined for the field, or the type?
 Any value in defining groups for common fields sharing the same condition (e.g. NDF-specific fields not in group, but Regulatory fields are)?
 Clear, consistent policy required. -->


<!--NON-Schema -->
<!-- https://jira.marketfactory.com/browse/MFTECH-503 MF To disconnect.
-->

<!-- Schema Changes -->
<!-- https://jira.marketfactory.com/browse/PRODMGT-179 SBE/Whisperer support for Fwds/NDFs/Swaps/NDSs
-->
<!-- https://jira.marketfactory.com/browse/PRODMGT-135 SBE codec for distribution (Maker & Taker).
-->
    <types>

        <!-- SBE defined types -->
        <composite name="messageHeader" description="The SBE header that is part of each message.">
            <type name="messageLength" primativetype="uint16" description="Length of the whole message. May span multiple packets."/>
            <type name="blockLength" primitiveType="uint16" description="The length of the message root block before repeating groups or variable data commences."/>
            <type name="templateId" primitiveType="uint16" description="The identifier for the template type of the message that is to follow."/>
            <type name="schemaId" primitiveType="uint16" description="The identifier for the schema that defines the message."/>
            <type name="version" primitiveType="uint16" description="The version of the schema allowing for extension."/>
        </composite>

        <composite name="varDataEncoding" description="Definition for a variable length string."> <!-- NOTE: This schema does not use variable length data elements, included only for completeness. -->
            <type name="length" primitiveType="uint8" description="Length of string." maxValue="1300"/>
            <type name="varData" primitiveType="uint8" description="Array of UTF-8 characters." length="0" characterEncoding="UTF-8"/>
        </composite>

        <composite name="groupSizeEncoding" description="Repeating group dimensions." semanticType="NumInGroup">
            <type name="blockLength" description="Length of element." primitiveType="uint8"/>
            <type name="numInGroup" description="Number of items in repeating group." primitiveType="uint8"/>
        </composite>

        <!-- Primitive types -->
        <type name="Int32NULL" description="Nullable, signed 32-bit integer." presence="optional" nullValue="-2147483648" primitiveType="int32" semanticType="int"/>
        <type name="Int8NULL" description="Nullable, signed 8-bit integer." presence="optional" nullValue="-128" primitiveType="int8"/>
        <type name="uInt32NULL" description="Nullable, unsigned 32-bit integer." presence="optional" nullValue="4294967295" primitiveType="uint32"/>
        <type name="uInt8NULL" description="Nullable, unsigned 8-bit integer." presence="optional" nullValue="255" primitiveType="uint8"/>
        <type name="LocalMktDate" description="Local calendar date in days since epoch." presence="optional" nullValue="65535" primitiveType="uint16" semanticType="LocalMktDate"/> <!-- TODO what is the local timezone?! I would prefer this- infact ALL - dates and times to be UTC-->
        <type name="SeqNum" description="Sequence number for detecting missed messages." primitiveType="uint32" semanticType="SeqNum"/>
        <type name="SecurityID" description="Numeric ID assigned by MF for a given Security." primitiveType="uint32" semanticType="String"/>
        <type name="VenueID" description="Numeric ID assigned by MF for a given Venue. AKA Feed ID." nullValue="4294967295" primitiveType="uint32" semanticType="int"/>
        <type name="OrderID" presence="optional" nullValue="18446744073709551615" description="Numeric ID assigned by MF for a given Order." primitiveType="uint64"/>
        <type name="UTCTimestamp" description="Number of nanoseconds since epoch" primitiveType="uint64" semanticType="UTCTimestamp"/>

        <!-- String types -->
        <type name="Text" description="Free format text string." length="64" primitiveType="char" semanticType="String"/>
        <type name="Symbol" description="Identifier for a security." length="32" primitiveType="char" semanticType="String"/>
        <type name="Username" description="Id given to user for logging on." length="64" primitiveType="char" semanticType="String"/>
        <type name="Password" description="Password used to logon." length="32" primitiveType="char" semanticType="String"/>
        <type name="Currency" description="Currency code supported by MarketFactory. Usually the ISO 4217 Currency code value." length="3" primitiveType="char" semanticType="Currency"/>
        <type name="PassthruKey" description="Passthru Element name. e.g. Name of FIX tag." length="32" primitiveType="char" semanticType="String"/>
        <type name="PassthruValue" description="Passthru Element value." length="64" primitiveType="char" semanticType="String"/>
        <type name="RegulatoryValue" description="Body/Leg/Allocation Regulatory field value." length="64" primitiveType="char" semanticType="String"/>
        <type name="IDString" description="Fixed length string type for IDs assigned by Venues. All valid ASCII from decimal 32 to decimal 126 allowed, excluding ~`_!*,-:=[]" length="64" primitiveType="char" semanticType="String"/> <!-- Char exclusion list based on EBS ClOrdID constraint. -->
        <type name="PartyString" description="Fixed length string type for IDs assigned by Venues." length="64" primitiveType="char" semanticType="String"/>
        <type name="FixingReference" description="Fixed length string type for IDs assigned by Venues. Refer to [REF TODO] for Venue-specific fixing reference strings." length="64" primitiveType="char" semanticType="String"/>
        
        <!-- Price and Qty types -->
        <composite name="DecimalQtyNULL" description="A number representing quantity" semanticType="Qty">
            <type name="mantissa" description="The significant digits of the quantity value with an optional NULL value." primitiveType="int64" presence="optional" nullValue="-9223372036854775807"/>
            <type name="exponent" description="The scale of the decimal number as a power of 10." primitiveType="int8"  presence="constant">-5</type>
        </composite>

        <composite name="PriceNULL" description="Price NULL" semanticType="Price">
            <type name="mantissa" description="The significant digits of the price value with an optional NULL value." primitiveType="int64" presence="optional" nullValue="-9223372036854775807"/>
            <type name="exponent" description="The scale of the decimal number as a power of 10." primitiveType="int8"  presence="constant">-9</type>
        </composite>

        <!-- Enumerations and sets -->
        <set name="Flags" encodingType="uint64" semanticType="Boolean"> <!-- Implemented as a set to avoid any problems with null values -->
            <choice name="PossDupFlag" description="TRUE if message has been resent in response to an identified sequence number gap.">0</choice>
        </set>
        
        <set name="MDFlags" encodingType="uint64" semanticType="Boolean"> <!-- Implemented as a set to avoid any problems with null values -->
            <choice name="LastInTimeSlice" description="FALSE if this Venue does not implement Market Data time-slicing, or if there are further Incremental messages to follow in the current time-slice. TRUE if this is the last Incremental in the current time-slice.">0</choice>
        </set>
 
        <enum name="OrdType" encodingType="CharNULL" semanticType="char">
            <!-- TODO Review coverage, naming: PreviouslyQuoted/Market/Market-Limit/Limit/Limit-TakeProfit/Limit-Iceberg/Stop-Loss/Stop-Limit/Stop-Trailing/Pegged/Fixing/Mid etc -->
            <validValue name="Market" description="Standard Market order. Buys or sells the order quantity regardless of price.">1</validValue>
            <!-- An instruction to deal immediately at the best possible price (the current rate quotation). -->
            <validValue name="Limit" description="Standard Limit order. Order is executed when the specified limit price is reached.">2</validValue>
            <!-- An instruction to deal if a market moves to a MORE favourable level -->
                <!-- TakeProfit/Limit-sell -->
            <!-- Stop -  an instruction to deal if a market moves to a LESS favourable level -->
            <validValue name="StopLoss" description="Standard Stop Loss order. Executes an exposure reducing market order when market exceeds order's price.">3</validValue>
            <!-- Stop-sell Order executed at a predetermined price in order to limit potential losses should the market move against an investor's position. The order rate must be lower than the current bid rate. -->
            <validValue name="StopLimit" description="Standard Stop Limit order. Executes an exposure reducing limit order when market exceeds order's price.">4</validValue>
            <!-- A Stop  order with a specified worst price at which the order can be filled. A Limit is additionally specified, to ensure execution only within a specified range of bid or offer prices.-->
            <validValue name="PreviouslyQuoted" description="An order to hit an individual quote. To hit multiple quotes, aka sweeping, the user must submit individual orders from best to worst price.">D</validValue>
            <validValue name="MarketWithLeftOverAsLimit" description="Trading only, not used in published Market Data. Order that starts as a Market order and executes any leaves quantity as a limit order.">K</validValue>
            <validValue name="TrailingStop" description="The Stop Price follows the market by a specified offset.">w</validValue> <!-- MSW -->
            <validValue name="VwapSweep" description="An order that can hit/lift one or multiple quotes by submitting an order with the desired amount and the Volume Weighted Average Price (VWAP) of the total amount.">y</validValue>
        </enum>

        <enum name="TimeInForce" encodingType="char" semanticType="char">
            <validValue name="DAY" description="Day">0</validValue>
            <validValue name="GTC" description="Good 'til Canceled">1</validValue>
            <validValue name="IOC" description="Immediate Or Cancel">3</validValue>
            <validValue name="FOK" description="Fill Or Kill">4</validValue>
            <validValue name="GTD" description="Good 'til Date">6</validValue> <!-- MSW -->
            <validValue name="GFT" description="Good For Time">A</validValue> <!-- MSW -->
            <!-- MSW consider also supporting All-or-None (AON) / Fill-and-Kill (FAK) -->
        </enum>

        <enum name="Side" description="Side" encodingType="char">
            <validValue name="Buy">1</validValue>
            <validValue name="Sell">2</validValue>
            <validValue name="2-Way">7</validValue>
        </enum>

        <enum name="UserRequestType" encodingType="uint8" description="Defines the valid states for a published Quote.">
            <validValue name="Error" description="User request failed.">100</validValue>
            <validValue name="Lock(ed)" description="Prevent user from trading.">101</validValue>
            <validValue name="Unlock(ed)" description="Allow user to trade.">102</validValue>
        </enum>

        <enum name="ReportingEntity" encodingType="char">
            <validValue name="Maker">M</validValue>
            <validValue name="Taker">T</validValue>
        </enum>

        <enum name="SecurityType" encodingType="char">
            <validValue name="SPT" description="FX Spot">0</validValue>
            <validValue name="FWD" description="FX Forward">1</validValue>
            <validValue name="NDF" description="FX Non-Deliverable Forward">2</validValue>
            <validValue name="SWP" description="FX Swap">3</validValue>
            <validValue name="NDS" description="FX Non-Deliverable Swap">4</validValue>
            <validValue name="BLK" description="FX Block">5</validValue>
            <validValue name="FUT" description="Future">6</validValue>
            <validValue name="IMM" description="Money Market (Cash)">7</validValue>
            <validValue name="OPT" description="FX Option">8</validValue>
        </enum>

        <enum name="TenorType" encodingType="uint8" description="Defines the standard tenors supported by MarketFactory.">
            <validValue name="BKN" description="Broken Date">0</validValue>
            <!-- Standard fixed duration Tenors -->
            <validValue name="TOD" description="Today">1</validValue>
            <validValue name="TOM" description="Tomorrow">2</validValue>
            <validValue name="SPT" description="Spot">3</validValue>
            <validValue name="D1" description="One day after Spot">4</validValue>
            <validValue name="D2" description="Two days after Spot">5</validValue>
            <validValue name="W1" description="One Week">6</validValue>
            <validValue name="W2" description="Two Weeks">7</validValue>
            <validValue name="W3" description="Three Weeks">8</validValue>
            <validValue name="M1" description="One Month">9</validValue>
            <validValue name="M2" description="Two Months">10</validValue>
            <validValue name="M3" description="Three Months">11</validValue>
            <validValue name="M4" description="Four Months">12</validValue>
            <validValue name="M5" description="Five Months">13</validValue>
            <validValue name="M6" description="Six Months">14</validValue>
            <validValue name="M7" description="Seven Months">15</validValue>
            <validValue name="M8" description="Eight Months">16</validValue>
            <validValue name="M9" description="Nine Months">17</validValue>
            <validValue name="M10" description="Ten Months">18</validValue>
            <validValue name="M11" description="Eleven Months">19</validValue>
            <validValue name="Y1" description="One Year">20</validValue>
            <validValue name="M15" description="Fifteen Months">21</validValue>
            <validValue name="M18" description="Eighteen Months">22</validValue>
            <validValue name="Y2" description="Two Years">23</validValue>
            <validValue name="Y3" description="Three Years">24</validValue>
            <validValue name="Y4" description="Four Years">25</validValue>
            <validValue name="Y5" description="Five Years">26</validValue>
            <!-- Fixed dates -->
            <validValue name="JAN" description="January Futures Expiration Date">27</validValue>
            <validValue name="FEB" description="FebruaryFutures Expiration Date">28</validValue>
            <validValue name="MAR" description="March Futures Expiration/IMM Date">29</validValue>
            <validValue name="APR" description="April Futures Expiration Date">30</validValue>
            <validValue name="MAY" description="May Futures Expiration Date">31</validValue>
            <validValue name="JUN" description="June Futures Expiration/IMM Date">32</validValue>
            <validValue name="JUL" description="July Futures Expiration Date">33</validValue>
            <validValue name="AUG" description="August Futures Expiration Date">34</validValue>
            <validValue name="SEP" description="September Futures Expiration/IMM Date">35</validValue>
            <validValue name="OCT" description="October Futures Expiration Date">36</validValue>
            <validValue name="NOV" description="November Futures Expiration Date">37</validValue>
            <validValue name="DEC" description="December Futures Expiration/IMM Date">38</validValue>
            <validValue name="M0E" description="Last working day of current Month">39</validValue><!-- required for R5FX -->
            <validValue name="M1E" description="Last working day of next Month">40</validValue><!-- required for R5FX -->
        </enum>

        <enum name="QuoteType" encodingType="uint8" description="Defines the valid states for a published Quote.">
            <validValue name="Indicative" description="Non-tradeable price.">0</validValue>
            <validValue name="Tradeable" description="Executable price.">1</validValue>
        </enum>

        <enum name="BodyRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">
            <!-- SEF 0..19 -->
            <validValue name="SEFTakerIsUSPerson" description="A legal term referring to any U.S. person or legal entity anywhere in the world that should be taxed under U.S. law.">0</validValue> <!-- 360T RFS Maker -->
            <validValue name="SEFDataRepository" description="Repository for the reporting of SEF trades.">1</validValue> <!-- 360T/CNX RFS Maker, JPM --> <!-- PartyRole 102 -->
            <validValue name="SEFReportingEntity" description="Identifies the trading counterparty with the responsibility to report the transaction to a Data Repository after execution.">2</validValue> <!-- 360T RFS Maker -->
            <validValue name="SEFIsLargeTrade" description="Indicates whether or not part of a large trade.">3</validValue> <!-- 360T RFS Maker -->
            <validValue name="SEFRequiredTransaction" description="Indicates whether or not a required transaction (rather than permitted).">4</validValue> <!-- 360T RFS Maker -->
            <validValue name="SEFClearingExempted" description="Indicates whether or not this trade is exempted from clearing.">5</validValue> <!-- 360T/CNX RFS Maker -->
            <validValue name="SEFClearer" description="Conditionally populated if SEFClearingExempted = N. Clearing House (DCO) to be used for the clearing of SEF trades.">6</validValue> <!-- 360T/CNX RFS Maker -->
            <!-- EMIR 20..39 -->
            <validValue name="EMIRDoNotUse" description="Intentionally blank.">20</validValue>
            <!-- MiFID 40..59 -->
            <validValue name="MiFIDExecutingUnit" description="Maker branch/business unit under which this trade will be booked.">40</validValue> <!-- CNX RFS Maker --> <!-- PartyRole 59 -->
            <validValue name="MiFIDRegulatedMarket" description="4 character Market Identifier Code (MIC) of the Multilateral Trading Facility (MTF).">41</validValue> <!-- CNX RFS Maker, MorganStanley, SEB --> <!-- PartyRole 65 -->
            <validValue name="MiFIDExecutingDecisionMaker" description="Shortcode representing Executing Decision Maker of Taker.">42</validValue> <!-- EBS Direct Taker -->
            <validValue name="MiFIDInvestmentDecisionMaker" description="Shortcode representing Investment Decision Maker of Taker.">43</validValue> <!-- EBS Direct Taker -->
            <validValue name="MiFIDIlliquidInstrumentWaver" description="Pre-Trade Illiquid Instrument waiver indicator.">44</validValue> <!-- MorganStanley, SEB -->
            <validValue name="MiFIDSizeSpecificWaver" description="Pre-Trade Size-specific (trade of substantial size etc.) waiver indicator.">45</validValue> <!-- MorganStanley, SEB -->
            <validValue name="MiFIDLiquidityProvisionFlag" description="Indicates that the Order is part of a liquidity provision activity.">46</validValue> <!-- EBS Direct Taker -->
            <validValue name="MiFIDAlgorithmicOrderFlag" description="Indicates that the Order was generated by algorithmic trading.">47</validValue> <!-- EBS Direct Taker, SEB -->
            <validValue name="MiFIDPackageTradeFlag" description="Indicates that the Order is considered a Package/aggregated transaction for reporting purposes.">48</validValue> <!-- CNX RFS Maker, SEB --> <!-- Swaps, Blocks, Batches in scope -->
            <validValue name="MiFIDPackageID" description="Conditionally populated if MiFIDPackageTradeFlag = Y. Identifier assigned to a collection of trades so they may be analysed as a single unit.">49</validValue> <!-- CNX RFS Maker -->
            <validValue name="MiFIDSystematicInternaliserFlag" description="Used to indicate whether the specified party is a Systematic Internaliser for this Order.">50</validValue>
        </enum>

        <enum name="LegRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">
            <!-- SEF 0..19 -->
            <validValue name="LegSEFUSIPrefix" description="10 character Unique Swap Identifier Prefix for this Leg, usually a hash of the code issueing authority’s LEI. The Maker may choose to generate their own IDs, in whhich case this value will differ from the that provided in the Order.">0</validValue>  <!-- 360T RFS Maker -->
            <validValue name="LegSEFUSI" description="32 character Unique Swap Identifier (USI) for this Leg. The Maker may choose to generate their own IDs, in whhich case the ExecutionReport value will differ from the that provided in the Order.">1</validValue> <!-- 360T RFS Maker -->
            <!--- TODO UPI Prefix/Value (BAML) -->
            <!-- EMIR 20..39 -->
            <validValue name="LegEMIRUTIPrefix" description="10 character Unique Trade Identifier (UTI) Prefix for this Leg, usually a hash of the code issueing authority’s LEI.">20</validValue> <!-- I split this out, but could possibly leave as a single 52-char string. --> <!-- NONE -->
            <validValue name="LegEMIRUTI" description="42 character Unique Trade Identifier (UTI) for this Leg.">21</validValue> <!-- 360T RFS Maker -->
            <!-- MiFID 40..59 -->
            <validValue name="LegMiFIDISIN" description="12 character International Securities Identification Number http://www.anna-web.org/home/derivatives-service-bureau/.">40</validValue> <!--SEB -->
            <validValue name="LegMiFIDTVTIC" description="52 character Trading Venue Transaction Identification Code (TVTIC) for this Leg.">41</validValue> <!-- CNX RFS Maker -->
            <validValue name="LegMiFIDConversionFlag" description="Indicates that the Leg is an FX conversion trade and related to a transaction which would be exempt from margining and reporting. Tenor must be less than T+5 - i.e. TOD, TOM, SPT, D1 or D2.">42</validValue> <!-- Only specified in Quote Request --> <!-- CNX RFS Maker, SEB -->
        </enum>

        <enum name="AllocRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">
            <!-- SEF 0..19 -->
            <validValue name="AllocSEFUSIPrefix" description="10 character Unique Swap Identifier Prefix for this Allocation, usually a hash of the code issueing authority’s LEI.">0</validValue>  <!-- 360T/CNX RFS Maker -->
            <validValue name="AllocSEFUSI" description="32 character Unique Swap Identifier (USI) for this Allocation.">1</validValue>  <!-- 360T/CNX RFS Maker, JPM -->
            <!-- EMIR 20..39 -->
            <validValue name="AllocEMIRUTIPrefix" description="10 character Unique Trade Identifier (UTI) Prefix for this Allocation, usually a hash of the code issueing authority’s LEI.">20</validValue> <!-- I split this out, but could possibly leave as a single 52-char string. -->
            <validValue name="AllocEMIRUTI" description="42 character Unique Trade Identifier (UTI) for this Allocation.">21</validValue>  <!-- 360T/CNX RFS Maker, JPM -->
            <!-- MiFID 40..59 -->
            <validValue name="AllocMiFIDTVTIC" description="52 character Trading Venue Transaction Identification Code (TVTIC) for this Allocation">40</validValue> <!-- CNX RFS Maker -->
        </enum>

        <set name="RegulatoryBodies" encodingType="uint64" description="Allows definition of which Regulatory Fields the Order will include.">
            <choice name="SEF" description="Dodd-Frank Swap Execution Facility.">0</choice>
            <choice name="EMIR" description="European Market Infrastructure Regulation.">1</choice>
            <choice name="MiFID" description="Markets in Financial Instruments Directive.">2</choice>
        </set>

        <enum name="PartyRole" encodingType="unint8" description="Details of conditionally populated counterparty identification fields.">
            <validValue name="ExecutingFirm" description="Maker Firm responsible for filling/rejecting this Order.">1</validValue>
            <validValue name="ExecutingTrader" description="Maker Trader responsible for filling/rejecting this Order - may be human or autotrader.">12</validValue>
            <validValue name="ExecutingFirmLEI" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID. A Legal Entity Identifier defined by ISO 17442 to identify the Maker Firm.">254</validValue> <!-- http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag803.html = 84 -->
            <validValue name="OrderOriginationFirm" description="Taker Firm responsible for submission of this Order.">13</validValue>
            <validValue name="OrderOriginationTrader" description="Taker Trader responsible for submission of this Order - may be human or autotrader.">11</validValue>
            <validValue name="OrderOriginationFirmLEI" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID. A Legal Entity Identifier defined by ISO 17442 to identify the Taker Firm.">255</validValue> <!-- http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag803.html = 84 -->
        </enum>

        <set name="OrderAttributes" encodingType="uint64" description="Distinguishing features of a particular Venues Order model.">
            <choice name="hasTimeSlicing" description="Set if the Venue supports time-slicing of Market Data. Currently only on EBS feeds.">0</choice>
            <choice name="hasPegged" description="Set if Pegged Orders are supported">1</choice>
            <choice name="hasIceberg" description="Set if Iceberg Orders are supported">2</choice>
            <choice name="hasFixing" description="Set if Fixing Orders are supported">3</choice>
            <choice name="AllowsModify" description="Set if OrderCancelReplaceRequests are supported">4</choice>
            <choice name="AllowsCancel" description="Set if OrderCancelRequests are supported">5</choice>
            <choice name="usesPrice" description="Set if OrdType != Market. If OrdType=PreviouslyQuoted then represents the Spot price, otherwise represents the Order Limit price.">6</choice>
            <choice name="usesStopPx" description="Set if this Order is a Stop-type order.">7</choice>
            <choice name="usesMaxShow" description="Set if this Order supports Icebergs. defines Iceberg tip-size.">8</choice>
            <choice name="usesDiscretionOffsetValue" description="Set if this Order supports provision of Discretion instructions - defines the worst price the trader will accept.">9</choice>
            <choice name="usesPegOffsetValue" description="Set if this Order supports provision of Pegging instructions - defines the absolute value of market offset.">10</choice>
            <choice name="usesExpireTime" description="Set if TimeInForce = GTD - defines the Order cancellation timestamp.">11</choice>
            <choice name="usesExposureDuration" description="Set if TimeInForce = GFT. Number of seconds after which the Order will be cancelled.">12</choice>
            <!-- TODO: AggregatedBook -->
            <!--TODO PriceDelta / DisplayQty/MaxShow / ReplenishDelay / PegType (Bid/Offer/Mid) / TrailBy -->

        </set>

        <enum name="MDUpdateAction" description="A market data update action." encodingType="char" semanticType="char">
            <validValue name="New">0</validValue>
            <validValue name="Change">1</validValue>
            <validValue name="Delete">2</validValue>
        </enum>

        <enum name="MDEntryType" description="A market data entry type." encodingType="char">
            <validValue name="Bid" description="Entry contains bid details.">0</validValue>
            <validValue name="Offer" description="Entry contains offer details.">1</validValue>
            <validValue name="Trade" description="Entry contains Venue trade details.">2</validValue>
            <validValue name="Mid-Price" description="Required for Regulatory reporting.">H</validValue> <!-- MSW Regulatory -->
            <validValue name="EmptyBook" description="Sent to indicate the book should be cleared.">J</validValue>
            <validValue name="WorstTradeGiven" description="The worst price that was sold on EBS during a timeslice.">w</validValue>
            <validValue name="WorstTradePaid" description="The worst price that was bought on EBS during a timeslice.">x</validValue>
            <validValue name="TradeGiven" description="Indicates trade where the offer was aggressed. TODO Perspective.">y</validValue> <!-- TODO Perspective: Taker vs Maker, MF Client vs Counterparty -->
            <validValue name="TradePaid" description="Indicates trade where the bid was aggressed. TODO Perspective.">z</validValue>
        </enum>

        <enum name="MDBookType" description="Defines the type of a market data update group." encodingType="uint8">
            <validValue name="TopOfBook" description="Book containing just the top-of-book information.">1</validValue>
            <validValue name="PriceDepth" description="Book containing the standard per level price and depth information.">2</validValue>
            <validValue name="OrderDepth" description="Book containing the count of orders at each price level.">3</validValue>
            <validValue name="AmountView" description="The worst PRICE for which you would have to trade in order to get at least the regular amount (it's a minimum, not a precise value). The size field should be set to the same fixed constraint amount every time (fixed by the exchange for each market). This corresponds to an EBS Regular Price and to a Reuters Aggregate Price. This entry is credit screened (once again, we treat EBS Live's amount constraint as if it were credit-screened).">100</validValue>
            <validValue name="SpreadView" description="A price constraint, that is, the sum total amount that is available from the top of the book through a fixed number of price levels away from that price. Essentially, this provides an amount variable for a fixed price. Because the price changes constantly, the fixed price range is usually specified as a price difference from the top-of-book. We compute provide that price in this entry. This corresponds to EBS's Outside Amount. Sometimes this entry is capped. This entry is credit-screened.">101</validValue>
            <validValue name="ExchangeBest" description="Used for Reuters. The best price on the Venue, regardless of whether it is credit screened.">102</validValue> <!-- Exchange best use to be just per side, now it is actually a separate book since Reuters supports multiple levels. -->
            <!-- TODO - explicit identification of Aggregated books... To discuss - Maybe this is a function of the VenueID? -->
            <!-- TODO EBS Direct - FullAmount View -->
            <!-- TODO EBS Ai MarketSegmentID - “Fixing”  “FixingOffset” “SwapOffset” “Standard” -->
        </enum>

        <enum name="SubscriptionRequestType" encodingType="char" semanticType="char" description="Market data subscription request type."> <!--MSW changed -->
            <validValue name="SnapshotAndUpdates" description="Subscription for all market data updates.">1</validValue>
            <validValue name="DisablePreviousSnapshot" description="Unsubscribe for all market data updates.">2</validValue>
        </enum>

        <enum name="SecurityRequestType" description="Market data security request type." encodingType="uint8">
            <validValue name="AllSecurities" description="Request for all securities.">8</validValue>
        </enum>

        <enum name="SecurityTradingStatus" description="Trading status for a specific security." encodingType="uInt8NULL" semanticType="int">
            <validValue name="Close">4</validValue>
            <validValue name="ReadyToTrade">17</validValue>
            <validValue name="NotAvailableForTrading">18</validValue>
            <validValue name="UnknownOrInvalid">20</validValue>
            <validValue name="PreOpen">21</validValue>
            <validValue name="PostClose">26</validValue>
            <validValue name="Error">254</validValue>
        </enum>

        <enum name="MDReqRejReason" description="Reason for rejection of a Market data subscription request."  encodingType="char">
            <validValue name="UnknownSymbol" description="Rejected due to unknown security symbol.">0</validValue>
            <validValue name="Other" description="Rejected for other reason. Catch-all.">Z</validValue>
        </enum>

        <enum name="TradingSubscriptionStatus" description="Status of trading subscription." encodingType="uint8">
            <validValue name="Enabled">0</validValue>
            <validValue name="Disabled">1</validValue>
            <validValue name="RequestRejected">2</validValue>
        </enum>

        <enum name="TradSesStatus" description="Status of a trading session." encodingType="uint8" semanticType="int">
            <validValue name="Open" description="Market is open and ready to trade.">2</validValue>
            <validValue name="Closed" description="Market is not trading.">3</validValue>
            <validValue name="PreOpen" description="Earliest phase of Opening market state. Order Entry, modification, and cancel are allowed. No order matching, so crossed (backwardated) prices are possible.">4</validValue> <!-- MSW New -->
            <validValue name="PrimeBrokerLoggedOff" description="Reuters specific. The PB is logged off and therefore new orders are not able to be submitted.">250</validValue>
            <validValue name="CreditLow" description="EBS specific credit status.">252</validValue>
            <validValue name="CreditExhausted" description="EBS specific credit status.">253</validValue>
            <validValue name="Disconnected" description="MF is not connected to the Venue, therfore trading is unavailable.">254</validValue>
        </enum>

        <enum name="OrdStatus" description="Order status." encodingType="char" semanticType="char">
            <validValue name="New">0</validValue>
            <validValue name="PartiallyFilled">1</validValue>
            <validValue name="Filled">2</validValue>
            <validValue name="Canceled">4</validValue>
            <validValue name="PendingCancel">6</validValue>
            <validValue name="Rejected">8</validValue>
            <validValue name="PendingNew">A</validValue>
            <validValue name="Calculated">B</validValue> <!-- For Drop-copy/STP notifications -->
            <validValue name="Expired">C</validValue> <!-- MSW - added eg For Integral and (TODO) sundy errors -->
            <validValue name="PendingReplace">E</validValue>
            <validValue name="MFPendingNew">W</validValue>
            <validValue name="MFPendingCancel">X</validValue>
            <validValue name="MFPendingReplace">Y</validValue>
            <validValue name="Error" description="Used for Reuters/EBS when a trade fails validation. Also used when an order goes into a bad state. Both situations require manual intervention.">Z</validValue>
        </enum>

        <enum name="ExecType" description="Execution Type." encodingType="char"  semanticType="char">
            <validValue name="New">0</validValue>
            <validValue name="Canceled">4</validValue>
            <validValue name="Rejected">8</validValue>
            <validValue name="PendingNew">A</validValue> <!-- MSW - instead of "ReceivedByMF". TODO What about PendingCancel & PendingReplace ? -->
            <validValue name="Trade">F</validValue>
            <validValue name="CanceledLastLook" description="Fastmatch returns an indication that the Cancel reason is that the order was rejected because of a Last Look">W</validValue>
            <validValue name="PendingMatch" description="Used for Reuters and EBS when there is an execution that is awaiting validation.">X</validValue>
            <validValue name="Error" description="Used for Reuters/EBS when a trade fails validation. Also used when an order goes into a bad state. Both situations require manual intervention.">Y</validValue>
            <validValue name="ReceivedByMF">Z</validValue> <!-- TODO as for OrdStatus -->
        </enum>

        <enum name="CxlRejReason" description="Cancel Request Rejection Reason." encodingType="uint8" semanticType="int">
            <validValue name="TooLateToCancel">0</validValue>
            <validValue name="UnknownOrder">1</validValue>
            <validValue name="DuplicateClOrdIDReceived">6</validValue>
            <validValue name="Other">99</validValue>
        </enum>

        <enum name="NegotiationMethod" description="Indicates whether QuoteRequest is for ESP or RFS." encodingType="uint8">
            <validValue name="ESP" description="Executable Streaming Prices via MassQuote.">100</validValue>
            <validValue name="RFS" description="Request For Quote or Stream via Quote.">101</validValue>
            <validValue name="Order" description="Instruction to Venue.">102</validValue>
        </enum>

        <enum name="QuoteRequestRejectReason" description="Reason for rejection of QuoteRequest." encodingType="uint8">
            <validValue name="UnknownSymbol" description="Rejected due to unknown security symbol.">1</validValue>
            <validValue name="Other" description="Rejected for other reason. Catch-all.">99</validValue>
        </enum>

        <enum name="QuoteRespType" description="Reason for termination of QuoteRequest." encodingType="uint8">
            <validValue name="Pass" description="RFS Stream terminated by Taker.">6</validValue>
            <validValue name="Timed-out" description="RFS Stream duration ended without Order. Maker and ECN have individual time-outs.">8</validValue>
        </enum>

        <enum name="LegID" description="TODO" encodingType="uint8">
            <validValue name="Near" description="Near leg of SWP/NDS MassQuote.">1</validValue>
            <validValue name="Far" description="Far leg of SWP/NDS MassQuote.">2</validValue>
        </enum>

        <enum name="VenueType" description="Categorization for the various venues offered through Whisperer." encodingType="char"  semanticType="char"> <!-- customization of http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag1430.html -->
            <validValue name="Maker" description="Liquidity Provider, MFAPI Client must act as Taker.">0</validValue>
            <validValue name="Taker" description="Liquidity Consumer, MFAPI Client must act as Maker.">1</validValue>
            <validValue name="CLOB" description="Order-Matching, MFAPI Client may consumer or provide liquidity as desired.">2</validValue>
        </enum>
       
    </types>

<!--
 *
 * Session-Level Messages
 *
 -->

    <!-- Application Session -->
    
    <sbe:message name="Logon" id="1" semanticType="A" description="Used to logon to a Market Data or Trading session.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="HeartBtInt" id="108" type="uint8" description ="Frequence with which the client wishes to vallidate connection health."/>
        
        <field name="NextExpectedMsgSeqNum" id="789" type="SeqNum" description="Provided by MFAPI client to support MF message gap checks. If equal to the next-to-be-assigned MF sequence then Whisperer will respond with a LogonResponse message and then proceed with the session as normal. If lower, then Whisperer will respond with a LogonResponse message and immediately (re)send persisted messages or GapFills, in order. On completion, it will proceed with the session as normal. If higher, then Whisperer will respond with a Logout message to abort the session."/>
        <field name="Username" id="533" type="Username"/>
        <field name="Password" id="554" type="Password"/>
        <!-- TODO
            LS: We need to add a sessionType to the logon so we know what type of session the logon is attempting (trading, md, maker trading, maker quoting, drop copy, etc.

            MSW: My expectation was that the combination of the username and venue would be used to do a lookup in my.mf? I guess that leads on to a class of "not permissioned" business rejections that need to be documented.
            
            LS: You will want to put the enum.  Else, they will have to have multiple accounts for MD and trading, which some clients will see as unnecessary friction.  Plus, this will ease troubleshooting.   This will also make it easier for the LogonService to route to the appropriate venue process.
        -->
    </sbe:message>

    <sbe:message name="LogonResponse" id="2" semanticType="A" description="An acknowledgement from the server that the logon was successful as well as the expected heartbeat interval.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="NextExpectedMsgSeqNum" id="789" type="SeqNum" description="Provided by MF to support MFAPI client message gap checks. If equal to the next-to-be-assigned MFAPI client sequence then the client should proceed with the session as normal. If lower, then the client should immediately (re)send persisted messages or GapFills, in order. On completion, it may then proceed with the session as normal. If higher, then the client should respond with a Logout message to abort the session."/>
        <!-- TODO Why 108/HeartBtInt missing? -->
        <!-- TODO - UserType -->
    </sbe:message>

    <sbe:message name="Logout" id="3" semanticType="5" description="A request to stop the session.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="Text" id="58" type="Text" description="Free format text string. May include reason for logout."/>
    </sbe:message>

    <sbe:message name="LogoutResponse" id="4" semanticType="5" description="An acknowledgement that the session has been terminated.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
    </sbe:message>

    <sbe:message name="SequenceResetGapFill" id="5" semanticType="4" description="Used to explicitly skip blocks of unpersisted messages during a replay, if a sequence gap is detected.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="NewSeqNo" id="36" type="SeqNum"/>
    </sbe:message>

    <sbe:message name="Heartbeat" id="6" semanticType="0" description="This is sent from each side of the connection periodically.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Heartbeat was sent."/>
        <field name="OrigSendingTime" id="122" type="UTCTimestamp" presence="optional" description="Time when the TestRequest was sent."/>
        <field name="CurrentSeqNum" id="20056" type="SeqNum" description="This is the last sequence number sent by originator. On detection of a sequence number gap, the recipient should immediately Logout and then Logon in order to resolve the dropped message(s)."/>
    </sbe:message>

    <sbe:message name="TestRequest" id="7" semanticType="1" description="Sent by either side in order to generate a Heartbeat response. May also be used to determine approximate application round-trip times.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the TestRequest was sent."/>
    </sbe:message>

<!--
 *
 * Venue Status Messages
 *
 -->

    <!-- Configuration information -->
    <sbe:message name="SecurityDefinitionRequest" id="101" semanticType="a" description="A request for a list of a Venue's securities and their attributes.">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>

        <field name="SecurityRequestType" id="321" type="SecurityRequestType"/>
    </sbe:message>

    <!-- https://jira.marketfactory.com/browse/PRODMGT-180 SBE Schema change for SecurityDefinition
     *
     * Even though this is a new 3.15 API, We *should* provide a sane migraton path for clients from both 3.13 and 3.14 - If clients were to be able to use the new API in the old manner (i.e. backward compatibility) that would de-risk the transition. Especially true for existing Futures support that needs to be revisited, but only after after non-Spot FX.
     *
     * We *need* to provide sane migraton path for MF/Whisperer FHs - we need to be able to pass non-spot Mkt IDs for those non-upgraded FHs that still depend on my.mf static config to then lookup Product type, tenor(s).
     * So Price Requests/Orders need to be able to specify a Spot Security/MarketID along with separate Product/Tenor components and the API should map this to the legacy Market ID *internally* (eg a simple static look-up).
     *
     * We do not want to mess with my.mf at this stage (big job).
    -->
    <sbe:message name="SecurityDefinition" id="102" semanticType="d" description="Describes the attributes of a given security.">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID" description="The numeric ID assigned by MF to identify the Venue in other messages."/>

        <field name="TotNumReports" id="911" type="uint32" semanticType="int" description="The total number of security definitions in group, used to detect the receipt of all security definitions."/> <!-- MSW - Custom use of this FIX tag. -->
        <field name="Symbol" id="55" type="Symbol" description="The market convention representation of the instrument eg 'EUR/USD'"/>        <!-- Aka name. eg AUD/USD, or AUD/CAD-FORWARD-M6 (deprecated), 6AM0 (future, still needs to be supported) -->
        <field name="SecurityID" id="48" type="SecurityID" description="The numeric MF ID used to identify the Symbol in other messages. Deprecated for FX Instruments."/>                    <!-- Aka marketID. -->
        <field name="MinPriceIncrement" id="969" type="PriceNULL" description="The minimum Spot price movement, tick size."/>
        <field name="BigPriceIncrement" id="20004" type="PriceNULL" description="Pip position"/>
        <field name="FwdPriceIncrement" id="20059" type="PriceNULL" description="The minimum Fwd price movement, Fwd Pts (and non-Spot All-in) precision"/>
    </sbe:message>

    <sbe:message name="SecurityStatus" id="103" semanticType="f" description="Contains details of a Venue status, trade/settle dates, and more. Sent by MF to Taker in response to a MarketDataRequest and should be processed before the first market data message. Can also arrive asynchronously if the state of a security changes - e.g. Date Roll">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>

        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>
        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT), 2-legged (SWP, NDS). NOTE: This message is NOT to be used for BLK, IMM or OPT Security Types."/>
        <!-- TODO Tenor(s), this whole message needs careful thought WRT sources of dates, purpose of message -->

        <field name="TradeDate" id="75" type="LocalMktDate" description="Trade Session Date of security."/>
        <field name="SettlDate" id="64" type="LocalMktDate" description="Settlement date of security."/> <!-- TODO where does this information come from? -->
        <field name="SecurityTradingStatus" id="326" type="SecurityTradingStatus" description="Identifies the trading status applicable to the instrument or Security Group"/>
        <field name="Text" id="58" type="Text" description="Explanation of status state."/>
    </sbe:message>

    <sbe:message name="MarketDefinitionRequest" id="104" semanticType="BT" description="Request for a definition of the Venue.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>
    </sbe:message>

    <sbe:message name="MarketDefinition" id="105" semanticType="BU" description="Contains attributes of the given Venue."> <!-- TODO Review this - naming/customization etc -->
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="MarketID" id="1301" type="Text" description="General name of the Market/Value. 'EBS-Ai' for example."/>
        <field name="VenueName" id="20024" type="Text" description="MF defined market/Venue name. Used to identify a special, specific MF configuration/connection to a market/Venue. EBS-Ai-metals for example."/>
        <field name="VenueType" id="1430" type="VenueType" description="Maker, Taker, or CLOB"/>
        <group name="NoSupportedModels" id="20006" description="A list of the trading models supported by the Venue." dimensionType="groupSizeEncoding">
            <field name="TradingModel" id="20019" type="NegotiationMethod" description="ESP, RFS, or Orders."/>
            
            <group name="NoSupportedProducts" id="20018" description="A list of the product types supported by the Venue for this Trading Model." dimensionType="groupSizeEncoding">
                <field name="SecurityType" id="167" type="SecurityType" description="TODO"/>

                <group name="NoOrdTypeRules" id="1237" description="A list of the order types supported by the Venue for this Trading Model and Product." dimensionType="groupSizeEncoding">
                    <field name="OrdType" id="40" type="OrdType"/>
                    <field name="TimeInForce" id="59" type="TimeInForce"/>
                    <field name="OrderAttributes" id="20080" type="OrderAttributes" description="Bitmap field of n Boolean type flags, indicating the supported flavours of this OrdType, and associated NewOrderMultileg fields."/>
                </group>
            </group>
        </group>
    </sbe:message>

    <sbe:message name="TradingSessionStatusRequest" id="106" semanticType="g" description="A request to subscribe to a Venue in order to begin trading.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>
    </sbe:message>

    <sbe:message name="TradingSessionStatus" id="107" semanticType="h" description="A response to a TradingSessionStatusRequest indicating the state of the Venue. This event will be sent if the state of the Venue changes.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>

        <field name="TradingSubscriptionStatus" id="20020" type="TradingSubscriptionStatus"/>
        <field name="TradSesStatus" id="340" type="TradSesStatus"/> 
        <field name="Text" id="58" type="Text" description="Explanation of status state, if any."/>
    </sbe:message>

<!--
 *
 * Pricing Messages - Market Data (Order Matching) and Quotation (ESP, RFQ, RFS)
 *
 -->

    <!-- MarketData messages -->
    <sbe:message name="MarketDataRequest" id="201" semanticType="V" description="A request to create, cancel, or otherwise manipulate a subscription for a single security from a specific Venue."> <!-- NOTE: No support for client provision of desired rungs for Full Amount trading. This is currently done in http://my.mf:8080/#/profile_exchange_instruments -->
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketDataRequest was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketDataRequest was sent."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketDataRequest was received by MF."/>
        <!-- Identification -->
        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/>  <!--NOTE: FIX defines this tag as a string. -->
        <!-- State -->
        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT) product types only. NOTE: This message is NOT to be used for 2-legged (SWP, NDS), BLK, IMM or OPT Security Types."/>

        <!-- TODO - Consider that most of the fields in this message should not need to be populated for a subscription cancellation... Unless we wanted to manage MDReqID internally... -->
        <field name="SettlType" id="63" type="TenorType" description="Specifies a standard date for settlement."/>
        <field name="SettlDate" id="64" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>
        <field name="MaturityDate" id="541" type="LocalMktDate" description="Conditionally required if SecurityType = NDF. Specifies the Fixing Date."/>
        <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType=NDF. Fixing Reference. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
        <field name="MarketDepth" id="264" type="uint8" description="0=Full Book, 1=Top of Book, n=Number of Levels."/> <!-- TODO To discuss -->
    </sbe:message>

    <sbe:message name="MarketDataRequestReject" id="203" semanticType="Y" description="A rejection of a request for market data.">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketDataRequestReject was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketDataRequestReject was sent."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketDataRequestReject was received by MF."/>
        <!-- Identification -->
        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/> <!-- Required because the request can no longer be uniquely identified via the SecurityID. -->
        <!-- Instrument -->
        <field name="SecurityID" id="48" type="SecurityID" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>

        <field name="MDReqRejReason" id="281" type="MDReqRejReason"/>
        <field name="Text" id="58" type="Text" description="Additional information, if any, about the rejection."/>
    </sbe:message>

    <sbe:message name="MarketDataIncrementalRefresh" id="204" semanticType="X" description="Contains any combination of new, changed, or deleted Market Data Entries, for any combination of instruments, with any combination of trades,  quotes and Laddered/VWAP prices, etc. All of these types of Market Data Entries can be changed and deleted.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="HopRefID" id="630" type="SeqNum" description="Used to correlate this entry with the Venue message. Will be NULL if message is generated by MF (snapshot, enhanced data, etc.)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketData was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketData was sent."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketData was received by MF."/>
        <!-- Identification -->
        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/> <!-- Required because the request can no longer be uniquely identified via the SecurityID. -->
        <field name="MDBookType" id="1021" type="MDBookType" description="Instructs Taker as to how the book should be interpreted."/>

        <!-- FIX defines the following fields as part of the repeating group, but for our needs these are all static. Some Venues will mandate that such fields are populated on the first entry of the first message only - current model represents a halfway house. outside repeating group, but every message. -->
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>
        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT) product types only. NOTE: This message is NOT to be used for 2-legged (SWP, NDS), BLK, IMM or OPT Security Types."/>
        <field name="SettlType" id="63" type="TenorType" description="Specifies a standard date for settlement."/>
        <field name="SettlDate" id="64" type="LocalMktDate" description="Specifies the date for settlement."/>
        <field name="MaturityDate" id="541" type="LocalMktDate" presence="optional" description="Conditionally required if Requested SecurityType = NDF. Specifies the Fixing Date."/>
        <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if Requested SecurityType=NDF. Fixing Reference. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
        <!-- TODO state conditional population constraints for Mid-Price -->
        <!-- Agg feed components need to be supported -->

        <group name="NoMDEntries" id="268" dimensionType="groupSizeEncoding" description="On entry for each individual change in the market data message.">
            <field name="MDUpdateAction" id="279"  type="MDUpdateAction" description="The type of update action to be applied to this market data entry."/>
            <field name="MDEntryType" id="269"  type="MDEntryType" presence="optional" description="Conditionally populated if MDUpdateAction=New. Defines the nature of this market data entry."/>
            <field name="MDEntryID" id="278" type="IDString" description="Unique identifier of this market data entry, referenced throughout MDUpdateAction lifecycle."/> <!-- TODO Why missing before? -->
            <field name="NumberOfOrders" id="346"  type="int16" description="Number of orders at this level, if available."/>
            <field name="MDEntryPx" id="270"  type="PriceNULL" description="All-in Price. MDEntryPx = MDEntrySpotRate + MDEntryForwardPoints"/>
            <field name="MDEntrySpotRate" id="1026" type="PriceNULL" description="Spot Price."/>
            <field name="MDEntryForwardPoints" id="1027" type="PriceNULL" description="Fwd Pts."/>
            <field name="MDEntrySize" id="271"  type="DecimalQtyNULL" description="Size for quoted price. Expressed in units of CCY1."/>
            <field name="MinQty" id="110"  type="DecimalQtyNULL" description="Minimum quantity available to execute."/>
            <field name="LotSize" id="20066" type="DecimalQtyNULL" description="TODO"/> <!-- MSW E.g. for Hotspot -->

            <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
                <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/> <!-- E.g. EBS Ultra MarketRegion -->
                <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
            </group>
        </group>
    </sbe:message>

    <!-- NOTE: MassQuoteAck support removed - this was only used to notify Maker of rejection of prices by venue - this should in fact cause the Feed Handler to disconnect. -->
    <!-- TODO SeqDiag - Venue BusinessMessageReject and other errors results in Logout -->

    <sbe:message name="QuoteRequest" id="208" semanticType="R" description="Issued by Taker to request a short-lived RFS subscription."> <!-- TODO how to terminate -->
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteRequest may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteRequest was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteRequest was received by MF."/>
        <!-- Identification -->
        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>
        <field name="NegotiationMethod" id="2115" type="NegotiationMethod" description="RFS - Quote messages sent in response. ESP - MassQuote messages sent in response. Order - not applicable."/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>
        <field name="StreamCategory" id="20077" type="IDString" presence="optional" description="Conditionally populated if NegotiationMethod = ESP. The name of the requested stream category. Bilaterally agreed between ECN and Maker."/>
            
        <field name="NumCompetitors" id="20069" type="Int8NULL" description="0=Not in competition; n= Number of competitors; NULL=unknown."/>
        <!-- Regulatory -->
        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>
        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>
            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>
        </group>
        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>

        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">
            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>
            <field name="LegSide" id="624" type="Side"/>
            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>
            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>
            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>
            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>
            <!-- NDF/NDS -->
            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this Leg of NDF/NDS."/>
            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/>
            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
            <!-- Regulatory -->
            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>
            </group>

            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">
                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>
                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>
                <!-- Regulatory -->
                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>
                </group>
            </group>
        </group>

        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>
            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
        </group>
    </sbe:message>

    <sbe:message name="QuoteRequestReject" id="209" semanticType="AG" description="Issued by Maker to deny the corresponding QuoteRequest.">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteRequestReject may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteRequestReject was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteRequestReject was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteRequestReject was received by MF."/>
        <!-- Identification -->
        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>

        <field name="QuoteRequestRejectReason" id="658" type="QuoteRequestRejectReason"/>
        <field name="Text" id="58" type="Text" description="Additional information, if any, about the rejection."/>
    </sbe:message>

    <sbe:message name="Quote" id="210" semanticType="S" description="Issued by Maker to publish a price in response to a corresponding QuoteRequest. A new quote replaces the previous, and may be marked Indicative (i.e. non-tradeable).">
        <!-- Session -->
        <field name="VenueID" id="20022"  type="VenueID"/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the Quote was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Quote was sent."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the Quote was received by MF."/>
        <!-- Identification -->
        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the Taker."/>
        <field name="QuoteID" id="117" type="IDString" description="Unique ID of this Quote specified by the Maker."/><!-- TODO clarify 360T quirk in this regard -->

        <!-- State -->
        <!-- https://jira.marketfactory.com/browse/PRODMGT-158 Quote withdrawal not handled properly
         * Need to revisit existing Maker implementations for removal of CANCEL_QUOTE_SPECIFIED_IN_QUOTE_ID
         *
        -->
        <field name="QuoteType" id="537" type="QuoteType" description="Indicative/Tradeable price."/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>

        <field name="BidSpotRate" id="188" type="PriceNULL" description="Conditionally populated if SecurityType = SWP/BLK, or SecurityType = SPT/FWD/NDF and Side = Buy/2-Way. The quoted Bid Spot rate relating to this quote."/>
        <field name="MidPx" id="631" type="PriceNULL" description="Mid-Market spot rate."/><!-- Regulatory -->
        <field name="OfferSpotRate" id="190" type="PriceNULL" description="Conditionally populated if SecurityType = SWP/BLK, or SecurityType = SPT/FWD/NDF and Side = Sell/2-Way. The quoted Offer Spot rate relating to this quote."/>

        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>
        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">
            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>
            <field name="LegSide" id="624" type="Side"/>
            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>
            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>
            <!-- NDF/NDS TODO - Confirm these fields are really necessary. -->
            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this Leg of NDF/NDS."/>
            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/> <!-- Custom use of this tag. -->
            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>

            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>
            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>
            <field name="LegBidPx" id="681" type="PriceNULL" description="Conditionally populated if LegSide = Buy/2-Way. All-in Bid rate."/>
            <field name="LegMidPx" id="2346" type="PriceNULL" description="Mid-Market All-in Price of this Leg."/><!-- Regulatory -->
            <field name="LegOfferPx" id="684" type="PriceNULL" description="Conditionally populated if LegSide = Sell/2-Way. All-in Offer rate."/>
            <field name="LegBidForwardPoints" id="1067" type="PriceNULL" description="Conditionally populated if LegSide = Buy/2-Way. The Bid FX forward points for this Leg. Value can be negative. Expressed in decimal form, LegBidForwardPoints = LegBidPx – BidSpotRate."/>
            <field name="LegOfferForwardPoints" id="1068" type="PriceNULL" description="Conditionally populated if LegSide = Sell/2-Way. The Offer FX forward points for this Leg. Value can be negative. Expressed in decimal form LegOfferForwardPoints = LegOfferPx – OfferSpotRate."/>

            <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
                <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>
                <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
            </group>
        </group>
    </sbe:message>

    <sbe:message name="MassQuote" id="211" semanticType="i" description="Used by Maker for publication of ESP price ladders by stream category.">
        <!-- Session -->
        <field name="VenueID" id="20022"   type="VenueID"/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketData was generated."/> <!-- MSW Promoted from QuoteEntry -->
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketData was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketData was received by MF."/>
        <!-- Identification -->
        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the Taker."/>
        <field name="QuoteID" id="117" type="IDString" description="Unique ID of this Quote specified by the Maker."/>

        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>
        <group name="NoQuoteSets" id="296" dimensionType="groupSizeEncoding" description="Always one QuoteSet per stream category QuoteRequest.">
            <!-- Instrument -->
            <field name="QuoteSetID" id="302" type="IDString" description="The name of this stream category as specified in the QuoteRequest by StreamCategory."/>
<!--            <field name="TotNoQuoteEntries" id="304" type="TODO" description="TODO"/>-->
            <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/> <!-- MSW promoted from QuoteEntry -->
            <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/> <!-- MSW promoted from QuoteEntry -->
            <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF) and 2-legged (SWP, NDS) order types. NOTE: This message is NOT to be used for FUT, BLK, IMM or OPT Security Types."/> <!-- MSW promoted from QuoteEntry -->

            <field name="FixingReference" id="20058" type="FixingReference" presence="optional" description="Conditionally required if Requested SecurityType=NDF/NDS. Fixing Reference. Refer to [REF TODO] for Venue-specific fixing reference strings."/>
            <group name="NoQuoteEntries" dimensionType="groupSizeEncoding" description="One QuoteEntry per ladder rung and Leg.">
                <field name="QuoteEntryID" id="299" type="IDString" description="TODO"/> <!-- TODO Can use Rn-Ln for Swaps or Add a leg ID as well?-->
                <!-- State -->
                <!-- https://jira.marketfactory.com/browse/PRODMGT-158 Quote withdrawal not handled properly
                 * Need to revisit existing Maker implementations for removal of CANCEL_QUOTE_SPECIFIED_IN_QUOTE_ID
                 *
                -->
                <field name="BidQuoteType" id="537" type="QuoteType" description="Indicative/Tradeable price."/> <!-- QuoteType relocated from head of hessage and renamed to reflect specific side -->
                <field name="OfferQuoteType" id="20047" type="QuoteType" description="Indicative/Tradeable price."/>
                <field name="SettlType" id="63" type="TenorType" description="Specifies a standard Tenor for settlement of this Leg."/> <!-- MSW customisation -->
                <field name="SettlDate" id="64" type="LocalMktDate" presence="optional" description="Specifies the calendar date for settlement of this Leg."/>
                <!-- NDF/NDS -->
                <field name="MaturityDate" id="541" type="LocalMktDate" presence="optional" description="Conditionally required if SecurityType = NDF/NDS. Specifies the Fixing Date for this Leg."/>
                <field name="SettlCurrency" id="120" type="Currency" description="Conditionally required if SecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/> <!-- Custom use of this tag. -->
                <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>

                <field name="Currency" id="15" type="Currency" description="Specifies the denomination of the quantity fields in this Rung."/>
                <field name="BidSize" id="134" type="DecimalQtyNULL" description="Bid quantity in this Rung."/>
                <field name="OfferSize" id="135" type="DecimalQtyNULL" description="Offer quantity in this Rung."/>
                <field name="BidPx" id="132" type="PriceNULL" description="All-in Bid rate for this Rung."/>
                <field name="MidPx" id="631" type="PriceNULL" description="All-in Mid-Market rate for this Rung. "/><!-- Regulatory -->
                <field name="OfferPx" id="133" type="PriceNULL" description="All-in Offer rate for this Rung."/>
                <field name="BidSpotRate" id="188" type="PriceNULL" description="Conditionally populated if SecurityType = SPT/FWD/NDF/SWP/NDS. The quoted Bid Spot rate relating to this Rung."/>
                <field name="OfferSpotRate" id="190" type="PriceNULL" description="Conditionally populated if SecurityType = SPT/FWD/NDF/SWP/NDS. The quoted Offer Spot rate relating to this Rung."/>
                <field name="BidForwardPoints" id="189" type="PriceNULL" description="The Bid FX forward points for this Rung. Value can be negative. Expressed in decimal form, BidForwardPoints = BidPx – BidSpotRate."/>
                <field name="OfferForwardPoints" id="191" type="PriceNULL" description="The Offer FX forward points for this Rung. Value can be negative. Expressed in decimal form OfferForwardPoints = OfferPx – OfferSpotRate."/>

                <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
                    <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>
                    <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
                </group>
            </group>
        </group>
    </sbe:message>

    <sbe:message name="QuoteResponse" id="212" semanticType="AJ" description="Issued by Taker, Maker or ECN to terminate the corresponding QuoteRequest.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteResponse may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteResponse was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteResponse was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteResponse was received by MF."/>
        <!-- Identification -->
        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>

        <field name="QuoteRespType" id="694" type="QuoteRespType" description="Reason for termination of QuoteRequest."/>
        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>
    </sbe:message>


<!--
 *
 * Trading Messages - Orders (RFQ, RFS, ESP, Order Matching) and Executions.
 *
 -->

    <sbe:message name="NewOrderMultileg" id="301" semanticType="AB" description="Issued by Taker to submit an FX Order (either in response to an ESP or Order-Matching Market Data stream, or against a published Quote). To be used for 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this Order may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the Order was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Order was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the Order was received by MF."/>
        <!-- Identification -->
        <field name="OrderRequestID" id="2422" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Contains stringified(MDReqID) or QuoteReqID, to aid support."/> <!--NOTE: FIX defines this tag as an int. -->
        <field name="QuoteID" id="117" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Contains MDEntryID or QuoteID."/> <!-- MSW -->
        <field name="ClOrdID" id="11" type="IDString" description="Unique identifier for Order as assigned by the Taker."/>
        <!-- State -->
        <field name="OrdType" id="40" type="OrdType"/>
        <field name="TimeInForce" id="59" type="TimeInForce"/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the traded instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>
        <!-- Instructions -->
        <field name="Price" id="44" type="PriceNULL" description="Conditionally populated if OrdType != Market. If OrdType=PreviouslyQuoted then represents the Spot price: LegPrice - Price = Leg Fwd Pts (TODO - Fwd Pts not currently populated). Othwerwise represents the Order Limit price."/> <!-- TODO - discuss/clarify eg For Fixing/FixingOffset orders will convey the points to be added to a fix rate. -->
        <field name="MinQty" id="110" type="DecimalQtyNULL" description="Minimum quantity to execute, used to prevent partial fills under the defined quantity. If the Order quantity drops below this value due to a fill, the Order will be cancelled."/>
        <field name="StopPx" id="99" type="PriceNULL" description="Stop price. Only required if this order is a Stop-type order."/>
        <field name="MaxShow" id="210" type="DecimalQtyNULL" description="If supported by Venue and specified, defines Iceberg tip-size. Otherwise, will default to OrderQty."/>
        <field name="DiscretionOffsetValue" id="389" type="PriceNULL" description="If supported by Venue, added to Price to define the worst price the trader will accept."/>
        <field name="PegOffsetValue" id="211" type="PriceNULL" description="If supported by Venue, defines the absolute value of market offset."/>
        <field name="ExpireTime" id="126" type="UTCTimestamp" presence="optional" ddescription="Conditionally populated if TimeInForce = GTD. Timestamp when the Order will be cancelled (will be rounded to the nearest second)."/>
        <field name="ExposureDuration" id="1629" type="uInt32NULL" description="Conditionally populated if TimeInForce = GFT. Number of seconds after which the Order will be cancelled."/>
        <!-- TODO EBS Ai -    MarketSegmentID - “Fixing”  “FixingOffset” “SwapOffset” “Standard” MDBookType??
                        DisplayQty, DisplayMethod, IcebergHigh RandomTime - for Iceberg Orders
        -->
        <!-- Regulatory -->
        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>
        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>
            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>
        </group>
        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>

        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">
            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>
            <field name="LegSide" id="624" type="Side"/>
            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>
            <field name="LegPrice" id="566" type="PriceNULL" description="All-in Order limit price. LegPrice - Price = Leg Fwd Pts (not currently populated). Not required on all order types (for example, Market order)."/>
            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>
            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>
            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>
            <!-- NDF/NDS  -->
            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this leg of NDF/NDS."/>
            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency for NDF/NDSs."/> <!-- TODO - do we allow different values for each leg of NDS? -->
            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference, should be the same as in the original Quote Request. Refer to [REF TODO] for Venue-specific fixing reference strings."/>
            <!-- Regulatory -->
            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>
            </group>

            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">
                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>
                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>
                <!-- Regulatory -->
                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>
                </group>
            </group>
        </group>

        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>
            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
        </group>
    </sbe:message>

    <sbe:message name="OrderCancelReplaceRequest" id="302" semanticType="G" description="Modify an outstanding order.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelReplaceRequest may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was received by MF."/>
        <!-- Identification -->
        <field name="ClOrdID" id="11" type="IDString" description="Identifier of this request."/>
        <field name="OrigClOrdID" id="41" type="IDString" description="ClOrdID of the order to modify."/>
        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel. Can set to null. It is quicker to set it, since making it null requires the system to look up the value to retrieve it."/>
        <!-- State -->
        <field name="OrdType" id="40" type="OrdType"/>
        <field name="TimeInForce" id="59" type="TimeInForce" description="The original order time in force."/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <!-- Instructions -->
        <field name="Price" id="44" type="PriceNULL" description="The NEW order price, if changing, or the original price if not. "/>
        <field name="MinQty" id="110" type="DecimalQtyNULL" description="The NEW minimum quantity to execute, if changing, or the original (possibly NULL) value if not."/>
        <field name="StopPx" id="99" type="PriceNULL" description="The NEW stop price, if changing, or the original stop price if not. Only required if this order is a Stop-type order."/> <!-- MSW -->
        <field name="MaxShow" id="210" type="DecimalQtyNULL" description="Where available, sets the NEW maximum amount to show. If available, but not supplied, MaxShow specified by a previous NewOrderMultileg or OrderCancelReplaceRequest is assumed."/> <!-- WHSPRR-1974 -->

        <field name="Side" id="54" type="Side" description="The original order side."/>
        <field name="OrderQty" id="38" type="DecimalQtyNULL" description="The NEW order quantity, if changing, or the original order quantity if not."/>
    </sbe:message>

    <sbe:message name="OrderCancelRequest" id="303" semanticType="F" description="Cancel an outstanding order.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelRequest may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelRequest was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelRequest was received by MF."/>
        <!-- Identification -->
        <field name="ClOrdID" id="11" type="IDString" description="Identifier of this cancel request."/>
        <field name="OrigClOrdID" id="41" type="IDString" description="ClOrdID of the order to cancel."/>
        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel. Can set to null. It is quicker to set it, since making it null requires the system to look up the value to retrieve it."/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
    </sbe:message>

    <sbe:message name="OrderCancelReject" id="304" semanticType="9" description="Sent by Maker to reject an OrderCancelReplaceRequest or OrderCancelRequest.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelReject may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelReject was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelReject was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelReject was received by MF."/>
        <!-- Identification -->
        <field name="ClOrdID" id="11" type="IDString" description="The ClOrdID of the Cancel request."/>
        <field name="OrigClOrdID" id="41" type="IDString" description="The ClOrdID of the order to be canceled"/>
        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel."/>
        <field name="SecondaryOrderID" id="198" type="IDString" description="The OrderID assigned by the Venue."/>
        <!-- State -->
        <field name="OrdStatus" id="39" type="OrdStatus" description="Defines the current state of the Order."/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>

        <field name="CxlRejReason" id="102" type="CxlRejReason"/>
        <field name="Text" id="58" type="Text" description="Free format text string. May include extra information about the rejection."/>
    </sbe:message>
    
    <!-- TODO - custom message for OrderTimedOut -->

    <sbe:message name="ExecutionReport" id="305" semanticType="8" description="Maker/ECN responses for order actions and events.">
        <!-- Session -->
        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="OrigVenueID" id="20025" type="VenueID" description="VenueID of the source of this ExecutionReport. Used when placing orders on the smart order router."/>
        <field name="MsgSeqNum" id="34" type="SeqNum"/>
        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this ExecutionReport may have already been processed (it is being resent)."/>
        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the ExecutionReport was generated."/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the ExecutionReport was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>
        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the ExecutionReport was received by MF."/>
        <!-- Identification -->
        <field name="OrderRequestID" id="2422" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Used to associate Order with earlier Market Data (ESP) or Quote (RFS) messages, to aid support."/> <!--NOTE: FIX defines this tage as an int. -->
        <field name="ClOrdID" id="11" type="IDString" description="The current ClOrdID of the order. Can differ from the originally submitted value on the NewOrderSingle if, for example, edits have been made."/>
        <field name="OrigClOrdID" id="41" type="IDString" description="The ClOrdID of the original value submitted on the NewOrderSingle."/>
        <field name="OrderID" id="37" type="OrderID" description="The MF assigned OrderID."/>
        <field name="SecondaryOrderID" id="198" type="IDString" description="The OrderID assigned by the Maker/ECN."/>
        <field name="ExecID" id="17" type="IDString" description="Unique identifier for this ExecutionReport."/>
        <!-- State -->
        <field name="OrdType" id="40" type="OrdType"/>
        <field name="TimeInForce" id="59" type="TimeInForce"/>
        <field name="OrdStatus" id="39" type="OrdStatus" description="Defines the current state of the Order."/>
        <field name="ExecType" id="150" type="ExecType"/>
        <!-- Instrument -->
        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>
        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types.NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>

        <field name="TradeDate" id="75" type="LocalMktDate" description="Indicates date of trading day (expressed in local time at place of trade)."/>
        <field name="LastSpotRate" id="194" type="PriceNULL" description="Conditionally required if ExecType = 'Trade'. Spot Price on this (last) fill. LastSpotRate = LegLastPrice - LegLastForwardPoints."/>
        <field name="MidPx" id="631" type="PriceNULL" description="Conditionally required if ExecType = 'Trade'. Mid-Market Spot Price on this (last) fill."/><!-- Regulatory -->
        <field name="Text" id="58" type="Text" description="Free format text string. May include extra information about the execution."/>
        <!-- Regulatory -->
        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>
        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>
            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>
        </group>
        <!-- Counterparties -->
        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">
            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>
            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>
        </group>

        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">
            <field name="LegSide" id="624" type="Side"/>
            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>
            <field name="LegPrice" id="566" type="PriceNULL" description="All-in Order limit price of Leg. Not required on all Order types (for example, Market order)."/>
            <field name="LegMidPx" id="2346" type="PriceNULL" presence="optional" description="Conditionally required if ExecType = 'Trade'. Mid-Market All-in Price of Leg for this (last) fill."/><!-- Regulatory -->
            <field name="LegLastPrice" id="637" type="PriceNULL" description="All-in Price of Leg for this last fill, if any. LegLastPrice = LastSpotRate + LegLastForwardPoints."/>
            <field name="LegLastForwardPoints" id="1073" type="PriceNULL" description="FX forward points of Leg. May be a negative value. Zero if Leg = SPOT. LegLastForwardPoints = LegLastPrice - LastSpotRate."/>
            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>
            <field name="LegLastQty" id="1418" type="DecimalQtyNULL" description="Specifies the dealt amount for this Leg, if any."/>
            <field name="LegCalculatedCcyLastQty" id="1074" type="DecimalQtyNULL" description="Specifies the contra amount for this (last) fill and Leg, if any. If LegCurrency is LHS then = LegLastQty * LegLastPx; if LegCurrency is RHS then = LegLastQty / LegLastPx (rounded arithmetically)."/>
            <field name="LegCumQty" id="20061" type="DecimalQtyNULL" description="Total quantity filled on this Leg of the Order."/>
            <field name="LegLeavesQty" id="20062" type="DecimalQtyNULL" description="Quantity remaining to execute on this Leg of the Order."/>
            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>
            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>
            <!-- NDF/NDS  -->
            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if SecurityType='NDF' or 'NDS'. Fixing Date."/>
            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if SecurityType='NDF' or 'NDS'. Specifies the fixing currency for NDF/NDSs."/> <!-- TODO - do we allow different values for each leg of NDS? -->
            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType='NDF' or 'NDS'. Fixing Reference, should be the same as in the original QuoteRequest. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
            <!-- Regulatory -->
            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>
            </group>

            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">
                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>
                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>
                <field name="LegAllocCalculatedCcyQty" id="20060" type="DecimalQtyNULL" description="Quantity to be allocated to Account, expressed in contra currency. Allocation direction expressed arithmetically ABS(SUM (LegAllocCalculatedCcyQty)) = LegCalculatedCcyLastQty (but may be subject to accumulated rounding errors). If LegCurrency is LHS then = -LegAllocQty * LegLastPx; if LegCurrency is RHS then = -LegAllocQty / LegLastPx (rounded arithmetically)."/>
                <!-- Regulatory -->
                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">
                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>
                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>
                </group>
            </group>
        </group>

        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">
            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>
            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>
        </group>
    </sbe:message>
    
    <sbe:message name="ExecutionAck" id="306" semanticType="BN" description="ECN response to Maker-sent ExecutionReport or time-out event.">
        <!-- TODO Complete this message. -->
    </sbe:message>

</sbe:messageSchema>


 

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!-- * * Copyright (C) 2018 MarketFactory, Inc. All rights reserved. * Use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: * 1. You may only use this software for internal evaluation and testing purposes and may not use the software for engaging * in live trades, unless and until you have entered into a separate agreement with MarketFactory governing the use of * MarketFactory software in a production environment. * 2. You may not distribute the software (in either source or binary forms) to third parties. * 3. All copies of source code must retain the above copyright notice, this list of conditions and the following disclaimer. *    THIS SOFTWARE IS PROVIDED BY MARKETFACTORY AND ITS LICENSORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, *    BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN *    NO EVENT SHALL MARKETFACTORY OR ITS LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, *    OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * --><sbe:messageSchema xmlns:sbe="http://fixprotocol.io/2016/sbe"                   package="mfunified"                   id="5"                   version="0"                   semanticVersion="MF-FIX5.0SP2"                   description="Schema for marketdata and trading messages. Based on FIX50SP2. The protocol is designed to run over TCP."                   byteOrder="littleEndian">

<!-- TODO - think about putting the Batch messages into MktDataRequest and MarketDataIncrementalRefresh --><!-- TODO - DropCopy to get worked out for HS drop copy and STPBridge usage (used by CIBC) - need to verify this maps to the execReport -->
<!-- TODO - check for aggfeed support --><!-- TODO - tidy use of SemanticType - as per SBE convention -->
<!-- NOTE
It is the Venue that dictates the message flow, not the API Client - thus, this Schema is Maker/Taker agnostic. Session startup behaviour varies across venue types as follows:    Maker, CLOB        Any MFAPI client requests will be rejected by Whisperer, until such time as the Feed Handler reports OPEN with TradingSessionStatus (TradingSubscriptionStatus = Enabled)    Taker        Feed Handler will not connect to venue until MFAPI Client connection with Logon & LogonResponse, no inbound requests will be received until the Feed Handler reports OPEN with TradingSessionStatus (TradingSubscriptionStatus = Enabled)
-->
<!-- NOTE
    This Schema utilises the following custom tags:
    20000    PacketLength    20001    PacketSeqNum    20002    MessageLength    20003    PacketSendingTime    20004    BigPriceIncrement    20006    NoSupportedModels    20013    BatchDefinitionID    20014    NoSecurityIDs    20016    BatchGroup    20018    NoSupportedProducts    20019    TradingModel    20020    TradingSubscriptionStatus    20022    VenueID    20024    VenueName    20025    OrigVenueID    20045    StartTimestamp    20046    EndTimestamp    20047    OfferQuoteType    20050    AllocRegulatoryFields    20051    AllocRegulatoryKey    20052    AllocRegulatoryValue    20053    BodyRegulatoryFields    20054    BodyRegulatoryKey    20055    BodyRegulatoryValue    20056    CurrentSeqNum    20057    -    20058    FixingReference    20059    FwdPriceIncrement    20060    LegAllocCalculatedCcyQty    20061    LegCumQty    20062    LegLeavesQty    20063    LegRegulatoryFields    20064    LegRegulatoryKey    20065    LegRegulatoryValue    20066    LotSize    20067    -    20068    -    20069    NumCompetitors    20070    -    20071    -    20072    PassthruElements    20073    PassthruFields    20074    PassthruKey    20075    PassthruValue    20076    RegulatoryBodies    20077    StreamCategory    20078    -    20079    -    20080    OrderAttributes
    a couple of commands to help maintain this list:        egrep '2[0-9]{4}' *.xml        egrep 'id="(2[0-9]{4}|TODO)"' mfproto-3.15.xml  | awk 'BEGIN { FS="\"" }  {print $4, $2 }' | sort -u-->

<!-- NOTE
Messages are in two categories: Sequenced and Unsequenced. Sequenced messages relate to trading state changes, and may or may not be persisted/resent.All MF Sequence Numbering is responsibility of individual FHs.Seq Nums reset weekly.

The table below specifies what messages are to be persisted/resent vs gap fills.NOTE: Persisted = - is Unsequenced, Y/N is Sequenced.
Message                          Tx             Rx              Persisted=======                          ==             ==              =========
Logon                            Client(Both)   FH              -LogonResponse                    FH             Client(Both)    -Logout                           Client(Both)   FH              -LogoutResponse                   FH             Client(Both)    -SequenceResetGapFill             Client(Both)   FH              -                                 FH             CLient(Both)    -                                 API Server     Client(Both)    -Heartbeat                        Client(Both)   FH              -                                 FH             CLient(Both)    -TestRequest                      Client(Both)   FH              -                                 FH             CLient(Both)    -
SecurityDefinitionRequest        Client(Both)   FH              -SecurityDefinition               FH             CLient(Both)    -SecurityStatus                   FH             CLient(TAKER)   -MarketDefinitionRequest          Client(Both)   FH              -MarketDefinition                 FH             CLient(Both)    -TradingSessionStatusRequest      Client(Both)   FH              -TradingSessionStatus             FH             CLient(Both)    -
MarketDataRequest                Client(Both)   FH              -MarketDataRequestHistoric        Client(Both)   TODO            -MarketDataRequestReject          FH             Client(Both)    -MarketDataIncrementalRefresh     FH             Client(Both)    -RegisterForBatch                 Client(Both)   FH              -UnregisterForBatch               Client(Both)   FH              -BatchesCompleted                 FH             Client(Both)    -
QuoteRequest                     Client(TAKER)  FH              N                                 FH             Client(MAKER)   NQuoteRequestReject               Client(MAKER)  FH              N                                 FH             CLient(TAKER)   NQuote                            Client(MAKER)  FH              -                                 FH             CLient(TAKER)   -MassQuote                        Client(MAKER)  FH              -                                 FH             CLient(TAKER)   -QuoteResponse                    Client(MAKER)  FH              N                                 FH             CLient(TAKER)   N                                 Client(TAKER)  FH              N                                 FH             CLient(MAKER)   N
NewOrderMultileg                 Client(TAKER)  FH              N                                 FH             CLient(MAKER)   NOrderCancelReplaceRequest        Client(TAKER)  FH              N                                 FH             CLient(MAKER)   NOrderCancelRequest               Client(TAKER)  FH              N                                 FH             CLient(MAKER)   NOrderCancelReject                Client(MAKER)  FH              N                                 FH             CLient(TAKER)   NExecutionReport                  Client(MAKER)  FH              Y <<<<<<< Requirement on Client to be tested in onboarding.                                 FH             CLient(TAKER)   Y <<<<<<<ExecutionAck                     Client(TAKER)  FH              N                                 FH             CLient(MAKER)   Y-->
<!-- NOTE
    The table below defines the mapping from the 3.13/3.14 Classic MFAPI to the 4.0 SBE MFAPI      Lcn    ClassicName                   Comment                                     SBEName    ===    ===========                   =======                                     =======    API    AcceptOrderMessage            3.14/Maker See OrderDoneMessage             ExecutionReport(OrdStatus=PartiallyFilled/Filled)    API    BatchesCompletedMessage       -                                           BatchesCompleted    API    BatchRegisterMessage          -                                           RegisterForBatch    API    BatchUnregisterMessage        -                                           UnregisterForBatch    API    CancelAllOrderMessage         -                                           DEPRECATED (Disconnect should do this)    API    CancelOrderMessage            -                                           OrderCancelRequest    API    CancelQuoteMessage            3.14/Maker                                  QuoteResponse (for termination), Quote/MassQuote (for withdrawal)    API    ClientConnectMessage          -                                           Logon    API    ClientDisconnectMessage       -                                           Logout    API    ComplexOrderMessage           -                                           DEPRECATED (Agg feed order message, but not used)    API    ConfigMessage                 -                                           SecurityDefinitionRequest, SecurityDefinition, MarketDefinitionRequest, MarketDefinition    API    ConnectResponseMessage        -                                           LogonResponse, LogoutResponse    API    DateRolloverMessage           -                                           SecurityStatus    API    DropCopyMessage               -                                           ExecutionReport(OrdStatus=Calculated) For Partial & Full Fills ONLY.    API    EventReportMessage            -                                           TODO    API    HeartbeatMessage              -                                           Heartbeat    API    ImHereMessage                 -                                           Heartbeat (in response to TestRequest)    API    InsertLogMessage              -                                           TODO    API    LastSequenceIDMessage         -                                           DEPRECATED (Now use standard FIX sequence number logic)     API    LockResponseMessage           AdminUsers                                  DEPRECATED (Reflector)    API    LockUserMessage               AdminUsers                                  DEPRECATED (Reflector)    API    MassQuoteAckMessage           3.14/Maker                                  DEPRECATED (Will force disconnect)    API    MassQuoteMessage              3.14/Maker                                  MassQuote    API    MktDataMessage                -                                           MarketDataIncrementalRefresh    API    ModifyOrderMessage            -                                           OrderCancelReplaceRequest    API    NewOrderMessage               3.14/Maker See SubmitOrderMessage           NewOrderMultileg    API    OrderCanceledMessage          -                                           ExecutionReport(OrdStatus=Canceled)    API    OrderCancelRejectedMessage    -                                           OrderCancelReject    API    OrderDoneMessage              See TradeCaptureMessage                     ExecutionReport(OrdStatus=Filled)    API    OrderReceivedMessage          See AcceptOrderMessage                      ExecutionReport(OrdStatus=MFPendingNew)    API    OrderRejectedMessage          See RejectOrderMessage                      ExecutionReport(OrdStatus=Rejected)    API    OrderSubmittedMessage         -                                           ExecutionReport(OrdStatus=New) NOTE: Sent after order has been sent to venue. PendingNew, really. TODO Revisit this.    API    OrderTimeoutMessage           3.14/Maker                                  ExecutionAck(ExecAckStatus=DontKnow)    API    QuoteRequestMessage           3.14/Maker                                  QuoteRequest    API    RejectOrderMessage            3.14/Maker See OrderRejectedMessage         ExecutionReport(OrdStatus=Rejected)    API    RejectQuoteRequestMessage     3.14/Maker                                  QuoteRequestReject    API    ReplayDoneMessage             -                                           DEPRECATED (Now use standard FIX sequence number logic, along with PossDupFlag in resent ExecutionReports.)    API    ReplayMessage                 -                                           DEPRECATED (Both sides now expect gaps to be filled automatically).    API    RequestSnapshotMessage        -                                           DEPRECATED (Incremental starts with effective snapshot)    API    RiskResponseMessage           -                                           TODO    API    RuThereMessage                -                                           TestRequest    API    SubmitOrderMessage            See NewOrderMessage                         NewOrderMultileg    API    SubscribeMessage              -                                           TradingSessionStatusRequest, MarketDataRequest(SubscriptionRequestType=SnapshotAndUpdates) Unsubscribe would cancel orders.    API    SubscriptionEventMessage      -                                           MarketDataRequestReject    API    TaskInitializationMessage     -                                           DEPRECATED    API    TestMessage                   -                                           DEPRECATED    API    TradeCaptureAckMessage        3.14/Maker                                  ExecutionAck (ExecAckStatus=Accepted/Rejected)    API    TradeCaptureMessage           See OrderDoneMessage                        ExecutionReport(OrdStatus=PartiallyFilled/Filled)    API    TradeLimitDataMessage         AdminUsers                                  DEPRECATED (Reflector)    API    UnsubscribeAllMessage         -                                           DEPRECATE (Disconnect should do this)    API    UnsubscribeMessage            -                                           TODO MarketDataRequest(SubscriptionRequestType=DisablePreviousSnapshot)    API    VersionMessage                -                                           DEPRECATE (in favour of messageHeader).        INT    CallbackMessage               -                                           -    INT    HeartbeatTimerMessage         -                                           -    INT    InternalClientInfoMessage     -                                           -    INT    MDActivityCheckMessage        -                                           -    INT    MemBusConnectMessage          -                                           -    INT    MemBusDisconnectMessage       -                                           -    INT    MemBusHeartbeatMessage        -                                           -    INT    RequestMessage                -                                           -    INT    SecurityInfoMessage           -                                           -    INT    StatTimeoutMessage            -                                           -    INT    SubscriptionTimeoutMessage    -                                           -    INT    SubscriptionTimerMessage      -                                           -    INT    TimerMessage                  -                                           -    LOG    ExchangeMessage               -                                           -    LOG    LogMessage                    -                                           -    LOG    PadMessage                    -                                           -    LOG    StatCounterMessage            -                                           -    LOG    ProtocolDefinitionMessage     -                                           -

        SBE Messages not supported in Classic:
    SequenceResetGapFill    TradingSessionStatus    MarketDataRequestHistoric    TradeDateRequest    TradeDateReport    -->
<!-- TODO presence optionality should be defined for the field, or the type? Any value in defining groups for common fields sharing the same condition (e.g. NDF-specific fields not in group, but Regulatory fields are)? Clear, consistent policy required. -->

<!--NON-Schema --><!-- https://jira.marketfactory.com/browse/MFTECH-503 MF To disconnect.-->
<!-- Schema Changes --><!-- https://jira.marketfactory.com/browse/PRODMGT-179 SBE/Whisperer support for Fwds/NDFs/Swaps/NDSs--><!-- https://jira.marketfactory.com/browse/PRODMGT-135 SBE codec for distribution (Maker & Taker).-->    <types>
        <!-- SBE defined types -->        <composite name="messageHeader" description="The SBE header that is part of each message.">            <type name="messageLength" primativetype="uint16" description="Length of the whole message. May span multiple packets."/>            <type name="blockLength" primitiveType="uint16" description="The length of the message root block before repeating groups or variable data commences."/>            <type name="templateId" primitiveType="uint16" description="The identifier for the template type of the message that is to follow."/>            <type name="schemaId" primitiveType="uint16" description="The identifier for the schema that defines the message."/>            <type name="version" primitiveType="uint16" description="The version of the schema allowing for extension."/>        </composite>
        <composite name="varDataEncoding" description="Definition for a variable length string."> <!-- NOTE: This schema does not use variable length data elements, included only for completeness. -->            <type name="length" primitiveType="uint8" description="Length of string." maxValue="1300"/>            <type name="varData" primitiveType="uint8" description="Array of UTF-8 characters." length="0" characterEncoding="UTF-8"/>        </composite>
        <composite name="groupSizeEncoding" description="Repeating group dimensions." semanticType="NumInGroup">            <type name="blockLength" description="Length of element." primitiveType="uint8"/>            <type name="numInGroup" description="Number of items in repeating group." primitiveType="uint8"/>        </composite>
        <!-- Primitive types -->        <type name="Int32NULL" description="Nullable, signed 32-bit integer." presence="optional" nullValue="-2147483648" primitiveType="int32" semanticType="int"/>        <type name="Int8NULL" description="Nullable, signed 8-bit integer." presence="optional" nullValue="-128" primitiveType="int8"/>        <type name="uInt32NULL" description="Nullable, unsigned 32-bit integer." presence="optional" nullValue="4294967295" primitiveType="uint32"/>        <type name="uInt8NULL" description="Nullable, unsigned 8-bit integer." presence="optional" nullValue="255" primitiveType="uint8"/>        <type name="LocalMktDate" description="Local calendar date in days since epoch." presence="optional" nullValue="65535" primitiveType="uint16" semanticType="LocalMktDate"/> <!-- TODO what is the local timezone?! I would prefer this- infact ALL - dates and times to be UTC-->        <type name="SeqNum" description="Sequence number for detecting missed messages." primitiveType="uint32" semanticType="SeqNum"/>        <type name="SecurityID" description="Numeric ID assigned by MF for a given Security." primitiveType="uint32" semanticType="String"/>        <type name="VenueID" description="Numeric ID assigned by MF for a given Venue. AKA Feed ID." nullValue="4294967295" primitiveType="uint32" semanticType="int"/>        <type name="OrderID" presence="optional" nullValue="18446744073709551615" description="Numeric ID assigned by MF for a given Order." primitiveType="uint64"/>        <type name="UTCTimestamp" description="Number of nanoseconds since epoch" primitiveType="uint64" semanticType="UTCTimestamp"/>
        <!-- String types -->        <type name="Text" description="Free format text string." length="64" primitiveType="char" semanticType="String"/>        <type name="Symbol" description="Identifier for a security." length="32" primitiveType="char" semanticType="String"/>        <type name="Username" description="Id given to user for logging on." length="64" primitiveType="char" semanticType="String"/>        <type name="Password" description="Password used to logon." length="32" primitiveType="char" semanticType="String"/>        <type name="Currency" description="Currency code supported by MarketFactory. Usually the ISO 4217 Currency code value." length="3" primitiveType="char" semanticType="Currency"/>        <type name="PassthruKey" description="Passthru Element name. e.g. Name of FIX tag." length="32" primitiveType="char" semanticType="String"/>        <type name="PassthruValue" description="Passthru Element value." length="64" primitiveType="char" semanticType="String"/>        <type name="RegulatoryValue" description="Body/Leg/Allocation Regulatory field value." length="64" primitiveType="char" semanticType="String"/>        <type name="IDString" description="Fixed length string type for IDs assigned by Venues. All valid ASCII from decimal 32 to decimal 126 allowed, excluding ~`_!*,-:=[]" length="64" primitiveType="char" semanticType="String"/> <!-- Char exclusion list based on EBS ClOrdID constraint. -->        <type name="PartyString" description="Fixed length string type for IDs assigned by Venues." length="64" primitiveType="char" semanticType="String"/>        <type name="FixingReference" description="Fixed length string type for IDs assigned by Venues. Refer to [REF TODO] for Venue-specific fixing reference strings." length="64" primitiveType="char" semanticType="String"/>                <!-- Price and Qty types -->        <composite name="DecimalQtyNULL" description="A number representing quantity" semanticType="Qty">            <type name="mantissa" description="The significant digits of the quantity value with an optional NULL value." primitiveType="int64" presence="optional" nullValue="-9223372036854775807"/>            <type name="exponent" description="The scale of the decimal number as a power of 10." primitiveType="int8"  presence="constant">-5</type>        </composite>
        <composite name="PriceNULL" description="Price NULL" semanticType="Price">            <type name="mantissa" description="The significant digits of the price value with an optional NULL value." primitiveType="int64" presence="optional" nullValue="-9223372036854775807"/>            <type name="exponent" description="The scale of the decimal number as a power of 10." primitiveType="int8"  presence="constant">-9</type>        </composite>
        <!-- Enumerations and sets -->        <set name="Flags" encodingType="uint64" semanticType="Boolean"> <!-- Implemented as a set to avoid any problems with null values -->            <choice name="PossDupFlag" description="TRUE if message has been resent in response to an identified sequence number gap.">0</choice>        </set>                <set name="MDFlags" encodingType="uint64" semanticType="Boolean"> <!-- Implemented as a set to avoid any problems with null values -->            <choice name="LastInTimeSlice" description="FALSE if this Venue does not implement Market Data time-slicing, or if there are further Incremental messages to follow in the current time-slice. TRUE if this is the last Incremental in the current time-slice.">0</choice>        </set>         <enum name="OrdType" encodingType="CharNULL" semanticType="char">            <!-- TODO Review coverage, naming: PreviouslyQuoted/Market/Market-Limit/Limit/Limit-TakeProfit/Limit-Iceberg/Stop-Loss/Stop-Limit/Stop-Trailing/Pegged/Fixing/Mid etc -->            <validValue name="Market" description="Standard Market order. Buys or sells the order quantity regardless of price.">1</validValue>            <!-- An instruction to deal immediately at the best possible price (the current rate quotation). -->            <validValue name="Limit" description="Standard Limit order. Order is executed when the specified limit price is reached.">2</validValue>            <!-- An instruction to deal if a market moves to a MORE favourable level -->                <!-- TakeProfit/Limit-sell -->            <!-- Stop -  an instruction to deal if a market moves to a LESS favourable level -->            <validValue name="StopLoss" description="Standard Stop Loss order. Executes an exposure reducing market order when market exceeds order's price.">3</validValue>            <!-- Stop-sell Order executed at a predetermined price in order to limit potential losses should the market move against an investor's position. The order rate must be lower than the current bid rate. -->            <validValue name="StopLimit" description="Standard Stop Limit order. Executes an exposure reducing limit order when market exceeds order's price.">4</validValue>            <!-- A Stop  order with a specified worst price at which the order can be filled. A Limit is additionally specified, to ensure execution only within a specified range of bid or offer prices.-->            <validValue name="PreviouslyQuoted" description="An order to hit an individual quote. To hit multiple quotes, aka sweeping, the user must submit individual orders from best to worst price.">D</validValue>            <validValue name="MarketWithLeftOverAsLimit" description="Trading only, not used in published Market Data. Order that starts as a Market order and executes any leaves quantity as a limit order.">K</validValue>            <validValue name="TrailingStop" description="The Stop Price follows the market by a specified offset.">w</validValue> <!-- MSW -->            <validValue name="VwapSweep" description="An order that can hit/lift one or multiple quotes by submitting an order with the desired amount and the Volume Weighted Average Price (VWAP) of the total amount.">y</validValue>        </enum>
        <enum name="TimeInForce" encodingType="char" semanticType="char">            <validValue name="DAY" description="Day">0</validValue>            <validValue name="GTC" description="Good 'til Canceled">1</validValue>            <validValue name="IOC" description="Immediate Or Cancel">3</validValue>            <validValue name="FOK" description="Fill Or Kill">4</validValue>            <validValue name="GTD" description="Good 'til Date">6</validValue> <!-- MSW -->            <validValue name="GFT" description="Good For Time">A</validValue> <!-- MSW -->            <!-- MSW consider also supporting All-or-None (AON) / Fill-and-Kill (FAK) -->        </enum>
        <enum name="Side" description="Side" encodingType="char">            <validValue name="Buy">1</validValue>            <validValue name="Sell">2</validValue>            <validValue name="2-Way">7</validValue>        </enum>
        <enum name="UserRequestType" encodingType="uint8" description="Defines the valid states for a published Quote.">            <validValue name="Error" description="User request failed.">100</validValue>            <validValue name="Lock(ed)" description="Prevent user from trading.">101</validValue>            <validValue name="Unlock(ed)" description="Allow user to trade.">102</validValue>        </enum>
        <enum name="ReportingEntity" encodingType="char">            <validValue name="Maker">M</validValue>            <validValue name="Taker">T</validValue>        </enum>
        <enum name="SecurityType" encodingType="char">            <validValue name="SPT" description="FX Spot">0</validValue>            <validValue name="FWD" description="FX Forward">1</validValue>            <validValue name="NDF" description="FX Non-Deliverable Forward">2</validValue>            <validValue name="SWP" description="FX Swap">3</validValue>            <validValue name="NDS" description="FX Non-Deliverable Swap">4</validValue>            <validValue name="BLK" description="FX Block">5</validValue>            <validValue name="FUT" description="Future">6</validValue>            <validValue name="IMM" description="Money Market (Cash)">7</validValue>            <validValue name="OPT" description="FX Option">8</validValue>        </enum>
        <enum name="TenorType" encodingType="uint8" description="Defines the standard tenors supported by MarketFactory.">            <validValue name="BKN" description="Broken Date">0</validValue>            <!-- Standard fixed duration Tenors -->            <validValue name="TOD" description="Today">1</validValue>            <validValue name="TOM" description="Tomorrow">2</validValue>            <validValue name="SPT" description="Spot">3</validValue>            <validValue name="D1" description="One day after Spot">4</validValue>            <validValue name="D2" description="Two days after Spot">5</validValue>            <validValue name="W1" description="One Week">6</validValue>            <validValue name="W2" description="Two Weeks">7</validValue>            <validValue name="W3" description="Three Weeks">8</validValue>            <validValue name="M1" description="One Month">9</validValue>            <validValue name="M2" description="Two Months">10</validValue>            <validValue name="M3" description="Three Months">11</validValue>            <validValue name="M4" description="Four Months">12</validValue>            <validValue name="M5" description="Five Months">13</validValue>            <validValue name="M6" description="Six Months">14</validValue>            <validValue name="M7" description="Seven Months">15</validValue>            <validValue name="M8" description="Eight Months">16</validValue>            <validValue name="M9" description="Nine Months">17</validValue>            <validValue name="M10" description="Ten Months">18</validValue>            <validValue name="M11" description="Eleven Months">19</validValue>            <validValue name="Y1" description="One Year">20</validValue>            <validValue name="M15" description="Fifteen Months">21</validValue>            <validValue name="M18" description="Eighteen Months">22</validValue>            <validValue name="Y2" description="Two Years">23</validValue>            <validValue name="Y3" description="Three Years">24</validValue>            <validValue name="Y4" description="Four Years">25</validValue>            <validValue name="Y5" description="Five Years">26</validValue>            <!-- Fixed dates -->            <validValue name="JAN" description="January Futures Expiration Date">27</validValue>            <validValue name="FEB" description="FebruaryFutures Expiration Date">28</validValue>            <validValue name="MAR" description="March Futures Expiration/IMM Date">29</validValue>            <validValue name="APR" description="April Futures Expiration Date">30</validValue>            <validValue name="MAY" description="May Futures Expiration Date">31</validValue>            <validValue name="JUN" description="June Futures Expiration/IMM Date">32</validValue>            <validValue name="JUL" description="July Futures Expiration Date">33</validValue>            <validValue name="AUG" description="August Futures Expiration Date">34</validValue>            <validValue name="SEP" description="September Futures Expiration/IMM Date">35</validValue>            <validValue name="OCT" description="October Futures Expiration Date">36</validValue>            <validValue name="NOV" description="November Futures Expiration Date">37</validValue>            <validValue name="DEC" description="December Futures Expiration/IMM Date">38</validValue>            <validValue name="M0E" description="Last working day of current Month">39</validValue><!-- required for R5FX -->            <validValue name="M1E" description="Last working day of next Month">40</validValue><!-- required for R5FX -->        </enum>
        <enum name="QuoteType" encodingType="uint8" description="Defines the valid states for a published Quote.">            <validValue name="Indicative" description="Non-tradeable price.">0</validValue>            <validValue name="Tradeable" description="Executable price.">1</validValue>        </enum>
        <enum name="BodyRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">            <!-- SEF 0..19 -->            <validValue name="SEFTakerIsUSPerson" description="A legal term referring to any U.S. person or legal entity anywhere in the world that should be taxed under U.S. law.">0</validValue> <!-- 360T RFS Maker -->            <validValue name="SEFDataRepository" description="Repository for the reporting of SEF trades.">1</validValue> <!-- 360T/CNX RFS Maker, JPM --> <!-- PartyRole 102 -->            <validValue name="SEFReportingEntity" description="Identifies the trading counterparty with the responsibility to report the transaction to a Data Repository after execution.">2</validValue> <!-- 360T RFS Maker -->            <validValue name="SEFIsLargeTrade" description="Indicates whether or not part of a large trade.">3</validValue> <!-- 360T RFS Maker -->            <validValue name="SEFRequiredTransaction" description="Indicates whether or not a required transaction (rather than permitted).">4</validValue> <!-- 360T RFS Maker -->            <validValue name="SEFClearingExempted" description="Indicates whether or not this trade is exempted from clearing.">5</validValue> <!-- 360T/CNX RFS Maker -->            <validValue name="SEFClearer" description="Conditionally populated if SEFClearingExempted = N. Clearing House (DCO) to be used for the clearing of SEF trades.">6</validValue> <!-- 360T/CNX RFS Maker -->            <!-- EMIR 20..39 -->            <validValue name="EMIRDoNotUse" description="Intentionally blank.">20</validValue>            <!-- MiFID 40..59 -->            <validValue name="MiFIDExecutingUnit" description="Maker branch/business unit under which this trade will be booked.">40</validValue> <!-- CNX RFS Maker --> <!-- PartyRole 59 -->            <validValue name="MiFIDRegulatedMarket" description="4 character Market Identifier Code (MIC) of the Multilateral Trading Facility (MTF).">41</validValue> <!-- CNX RFS Maker, MorganStanley, SEB --> <!-- PartyRole 65 -->            <validValue name="MiFIDExecutingDecisionMaker" description="Shortcode representing Executing Decision Maker of Taker.">42</validValue> <!-- EBS Direct Taker -->            <validValue name="MiFIDInvestmentDecisionMaker" description="Shortcode representing Investment Decision Maker of Taker.">43</validValue> <!-- EBS Direct Taker -->            <validValue name="MiFIDIlliquidInstrumentWaver" description="Pre-Trade Illiquid Instrument waiver indicator.">44</validValue> <!-- MorganStanley, SEB -->            <validValue name="MiFIDSizeSpecificWaver" description="Pre-Trade Size-specific (trade of substantial size etc.) waiver indicator.">45</validValue> <!-- MorganStanley, SEB -->            <validValue name="MiFIDLiquidityProvisionFlag" description="Indicates that the Order is part of a liquidity provision activity.">46</validValue> <!-- EBS Direct Taker -->            <validValue name="MiFIDAlgorithmicOrderFlag" description="Indicates that the Order was generated by algorithmic trading.">47</validValue> <!-- EBS Direct Taker, SEB -->            <validValue name="MiFIDPackageTradeFlag" description="Indicates that the Order is considered a Package/aggregated transaction for reporting purposes.">48</validValue> <!-- CNX RFS Maker, SEB --> <!-- Swaps, Blocks, Batches in scope -->            <validValue name="MiFIDPackageID" description="Conditionally populated if MiFIDPackageTradeFlag = Y. Identifier assigned to a collection of trades so they may be analysed as a single unit.">49</validValue> <!-- CNX RFS Maker -->            <validValue name="MiFIDSystematicInternaliserFlag" description="Used to indicate whether the specified party is a Systematic Internaliser for this Order.">50</validValue>        </enum>
        <enum name="LegRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">            <!-- SEF 0..19 -->            <validValue name="LegSEFUSIPrefix" description="10 character Unique Swap Identifier Prefix for this Leg, usually a hash of the code issueing authority’s LEI. The Maker may choose to generate their own IDs, in whhich case this value will differ from the that provided in the Order.">0</validValue>  <!-- 360T RFS Maker -->            <validValue name="LegSEFUSI" description="32 character Unique Swap Identifier (USI) for this Leg. The Maker may choose to generate their own IDs, in whhich case the ExecutionReport value will differ from the that provided in the Order.">1</validValue> <!-- 360T RFS Maker -->            <!--- TODO UPI Prefix/Value (BAML) -->            <!-- EMIR 20..39 -->            <validValue name="LegEMIRUTIPrefix" description="10 character Unique Trade Identifier (UTI) Prefix for this Leg, usually a hash of the code issueing authority’s LEI.">20</validValue> <!-- I split this out, but could possibly leave as a single 52-char string. --> <!-- NONE -->            <validValue name="LegEMIRUTI" description="42 character Unique Trade Identifier (UTI) for this Leg.">21</validValue> <!-- 360T RFS Maker -->            <!-- MiFID 40..59 -->            <validValue name="LegMiFIDISIN" description="12 character International Securities Identification Number http://www.anna-web.org/home/derivatives-service-bureau/.">40</validValue> <!--SEB -->            <validValue name="LegMiFIDTVTIC" description="52 character Trading Venue Transaction Identification Code (TVTIC) for this Leg.">41</validValue> <!-- CNX RFS Maker -->            <validValue name="LegMiFIDConversionFlag" description="Indicates that the Leg is an FX conversion trade and related to a transaction which would be exempt from margining and reporting. Tenor must be less than T+5 - i.e. TOD, TOM, SPT, D1 or D2.">42</validValue> <!-- Only specified in Quote Request --> <!-- CNX RFS Maker, SEB -->        </enum>
        <enum name="AllocRegulatoryKey" encodingType="uint8" description="Details of conditionally populated Regulatory fields.">            <!-- SEF 0..19 -->            <validValue name="AllocSEFUSIPrefix" description="10 character Unique Swap Identifier Prefix for this Allocation, usually a hash of the code issueing authority’s LEI.">0</validValue>  <!-- 360T/CNX RFS Maker -->            <validValue name="AllocSEFUSI" description="32 character Unique Swap Identifier (USI) for this Allocation.">1</validValue>  <!-- 360T/CNX RFS Maker, JPM -->            <!-- EMIR 20..39 -->            <validValue name="AllocEMIRUTIPrefix" description="10 character Unique Trade Identifier (UTI) Prefix for this Allocation, usually a hash of the code issueing authority’s LEI.">20</validValue> <!-- I split this out, but could possibly leave as a single 52-char string. -->            <validValue name="AllocEMIRUTI" description="42 character Unique Trade Identifier (UTI) for this Allocation.">21</validValue>  <!-- 360T/CNX RFS Maker, JPM -->            <!-- MiFID 40..59 -->            <validValue name="AllocMiFIDTVTIC" description="52 character Trading Venue Transaction Identification Code (TVTIC) for this Allocation">40</validValue> <!-- CNX RFS Maker -->        </enum>
        <set name="RegulatoryBodies" encodingType="uint64" description="Allows definition of which Regulatory Fields the Order will include.">            <choice name="SEF" description="Dodd-Frank Swap Execution Facility.">0</choice>            <choice name="EMIR" description="European Market Infrastructure Regulation.">1</choice>            <choice name="MiFID" description="Markets in Financial Instruments Directive.">2</choice>        </set>
        <enum name="PartyRole" encodingType="unint8" description="Details of conditionally populated counterparty identification fields.">            <validValue name="ExecutingFirm" description="Maker Firm responsible for filling/rejecting this Order.">1</validValue>            <validValue name="ExecutingTrader" description="Maker Trader responsible for filling/rejecting this Order - may be human or autotrader.">12</validValue>            <validValue name="ExecutingFirmLEI" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID. A Legal Entity Identifier defined by ISO 17442 to identify the Maker Firm.">254</validValue> <!-- http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag803.html = 84 -->            <validValue name="OrderOriginationFirm" description="Taker Firm responsible for submission of this Order.">13</validValue>            <validValue name="OrderOriginationTrader" description="Taker Trader responsible for submission of this Order - may be human or autotrader.">11</validValue>            <validValue name="OrderOriginationFirmLEI" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID. A Legal Entity Identifier defined by ISO 17442 to identify the Taker Firm.">255</validValue> <!-- http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag803.html = 84 -->        </enum>
        <set name="OrderAttributes" encodingType="uint64" description="Distinguishing features of a particular Venues Order model.">            <choice name="hasTimeSlicing" description="Set if the Venue supports time-slicing of Market Data. Currently only on EBS feeds.">0</choice>            <choice name="hasPegged" description="Set if Pegged Orders are supported">1</choice>            <choice name="hasIceberg" description="Set if Iceberg Orders are supported">2</choice>            <choice name="hasFixing" description="Set if Fixing Orders are supported">3</choice>            <choice name="AllowsModify" description="Set if OrderCancelReplaceRequests are supported">4</choice>            <choice name="AllowsCancel" description="Set if OrderCancelRequests are supported">5</choice>            <choice name="usesPrice" description="Set if OrdType != Market. If OrdType=PreviouslyQuoted then represents the Spot price, otherwise represents the Order Limit price.">6</choice>            <choice name="usesStopPx" description="Set if this Order is a Stop-type order.">7</choice>            <choice name="usesMaxShow" description="Set if this Order supports Icebergs. defines Iceberg tip-size.">8</choice>            <choice name="usesDiscretionOffsetValue" description="Set if this Order supports provision of Discretion instructions - defines the worst price the trader will accept.">9</choice>            <choice name="usesPegOffsetValue" description="Set if this Order supports provision of Pegging instructions - defines the absolute value of market offset.">10</choice>            <choice name="usesExpireTime" description="Set if TimeInForce = GTD - defines the Order cancellation timestamp.">11</choice>            <choice name="usesExposureDuration" description="Set if TimeInForce = GFT. Number of seconds after which the Order will be cancelled.">12</choice>            <!-- TODO: AggregatedBook -->            <!--TODO PriceDelta / DisplayQty/MaxShow / ReplenishDelay / PegType (Bid/Offer/Mid) / TrailBy -->
        </set>
        <enum name="MDUpdateAction" description="A market data update action." encodingType="char" semanticType="char">            <validValue name="New">0</validValue>            <validValue name="Change">1</validValue>            <validValue name="Delete">2</validValue>        </enum>
        <enum name="MDEntryType" description="A market data entry type." encodingType="char">            <validValue name="Bid" description="Entry contains bid details.">0</validValue>            <validValue name="Offer" description="Entry contains offer details.">1</validValue>            <validValue name="Trade" description="Entry contains Venue trade details.">2</validValue>            <validValue name="Mid-Price" description="Required for Regulatory reporting.">H</validValue> <!-- MSW Regulatory -->            <validValue name="EmptyBook" description="Sent to indicate the book should be cleared.">J</validValue>            <validValue name="WorstTradeGiven" description="The worst price that was sold on EBS during a timeslice.">w</validValue>            <validValue name="WorstTradePaid" description="The worst price that was bought on EBS during a timeslice.">x</validValue>            <validValue name="TradeGiven" description="Indicates trade where the offer was aggressed. TODO Perspective.">y</validValue> <!-- TODO Perspective: Taker vs Maker, MF Client vs Counterparty -->            <validValue name="TradePaid" description="Indicates trade where the bid was aggressed. TODO Perspective.">z</validValue>        </enum>
        <enum name="MDBookType" description="Defines the type of a market data update group." encodingType="uint8">            <validValue name="TopOfBook" description="Book containing just the top-of-book information.">1</validValue>            <validValue name="PriceDepth" description="Book containing the standard per level price and depth information.">2</validValue>            <validValue name="OrderDepth" description="Book containing the count of orders at each price level.">3</validValue>            <validValue name="AmountView" description="The worst PRICE for which you would have to trade in order to get at least the regular amount (it's a minimum, not a precise value). The size field should be set to the same fixed constraint amount every time (fixed by the exchange for each market). This corresponds to an EBS Regular Price and to a Reuters Aggregate Price. This entry is credit screened (once again, we treat EBS Live's amount constraint as if it were credit-screened).">100</validValue>            <validValue name="SpreadView" description="A price constraint, that is, the sum total amount that is available from the top of the book through a fixed number of price levels away from that price. Essentially, this provides an amount variable for a fixed price. Because the price changes constantly, the fixed price range is usually specified as a price difference from the top-of-book. We compute provide that price in this entry. This corresponds to EBS's Outside Amount. Sometimes this entry is capped. This entry is credit-screened.">101</validValue>            <validValue name="ExchangeBest" description="Used for Reuters. The best price on the Venue, regardless of whether it is credit screened.">102</validValue> <!-- Exchange best use to be just per side, now it is actually a separate book since Reuters supports multiple levels. -->            <!-- TODO - explicit identification of Aggregated books... To discuss - Maybe this is a function of the VenueID? -->            <!-- TODO EBS Direct - FullAmount View -->            <!-- TODO EBS Ai MarketSegmentID - “Fixing”  “FixingOffset” “SwapOffset” “Standard” -->        </enum>
        <enum name="SubscriptionRequestType" encodingType="char" semanticType="char" description="Market data subscription request type."> <!--MSW changed -->            <validValue name="SnapshotAndUpdates" description="Subscription for all market data updates.">1</validValue>            <validValue name="DisablePreviousSnapshot" description="Unsubscribe for all market data updates.">2</validValue>        </enum>
        <enum name="SecurityRequestType" description="Market data security request type." encodingType="uint8">            <validValue name="AllSecurities" description="Request for all securities.">8</validValue>        </enum>
        <enum name="SecurityTradingStatus" description="Trading status for a specific security." encodingType="uInt8NULL" semanticType="int">            <validValue name="Close">4</validValue>            <validValue name="ReadyToTrade">17</validValue>            <validValue name="NotAvailableForTrading">18</validValue>            <validValue name="UnknownOrInvalid">20</validValue>            <validValue name="PreOpen">21</validValue>            <validValue name="PostClose">26</validValue>            <validValue name="Error">254</validValue>        </enum>
        <enum name="MDReqRejReason" description="Reason for rejection of a Market data subscription request."  encodingType="char">            <validValue name="UnknownSymbol" description="Rejected due to unknown security symbol.">0</validValue>            <validValue name="Other" description="Rejected for other reason. Catch-all.">Z</validValue>        </enum>
        <enum name="TradingSubscriptionStatus" description="Status of trading subscription." encodingType="uint8">            <validValue name="Enabled">0</validValue>            <validValue name="Disabled">1</validValue>            <validValue name="RequestRejected">2</validValue>        </enum>
        <enum name="TradSesStatus" description="Status of a trading session." encodingType="uint8" semanticType="int">            <validValue name="Open" description="Market is open and ready to trade.">2</validValue>            <validValue name="Closed" description="Market is not trading.">3</validValue>            <validValue name="PreOpen" description="Earliest phase of Opening market state. Order Entry, modification, and cancel are allowed. No order matching, so crossed (backwardated) prices are possible.">4</validValue> <!-- MSW New -->            <validValue name="PrimeBrokerLoggedOff" description="Reuters specific. The PB is logged off and therefore new orders are not able to be submitted.">250</validValue>            <validValue name="CreditLow" description="EBS specific credit status.">252</validValue>            <validValue name="CreditExhausted" description="EBS specific credit status.">253</validValue>            <validValue name="Disconnected" description="MF is not connected to the Venue, therfore trading is unavailable.">254</validValue>        </enum>
        <enum name="OrdStatus" description="Order status." encodingType="char" semanticType="char">            <validValue name="New">0</validValue>            <validValue name="PartiallyFilled">1</validValue>            <validValue name="Filled">2</validValue>            <validValue name="Canceled">4</validValue>            <validValue name="PendingCancel">6</validValue>            <validValue name="Rejected">8</validValue>            <validValue name="PendingNew">A</validValue>            <validValue name="Calculated">B</validValue> <!-- For Drop-copy/STP notifications -->            <validValue name="Expired">C</validValue> <!-- MSW - added eg For Integral and (TODO) sundy errors -->            <validValue name="PendingReplace">E</validValue>            <validValue name="MFPendingNew">W</validValue>            <validValue name="MFPendingCancel">X</validValue>            <validValue name="MFPendingReplace">Y</validValue>            <validValue name="Error" description="Used for Reuters/EBS when a trade fails validation. Also used when an order goes into a bad state. Both situations require manual intervention.">Z</validValue>        </enum>
        <enum name="ExecType" description="Execution Type." encodingType="char"  semanticType="char">            <validValue name="New">0</validValue>            <validValue name="Canceled">4</validValue>            <validValue name="Rejected">8</validValue>            <validValue name="PendingNew">A</validValue> <!-- MSW - instead of "ReceivedByMF". TODO What about PendingCancel & PendingReplace ? -->            <validValue name="Trade">F</validValue>            <validValue name="CanceledLastLook" description="Fastmatch returns an indication that the Cancel reason is that the order was rejected because of a Last Look">W</validValue>            <validValue name="PendingMatch" description="Used for Reuters and EBS when there is an execution that is awaiting validation.">X</validValue>            <validValue name="Error" description="Used for Reuters/EBS when a trade fails validation. Also used when an order goes into a bad state. Both situations require manual intervention.">Y</validValue>            <validValue name="ReceivedByMF">Z</validValue> <!-- TODO as for OrdStatus -->        </enum>
        <enum name="CxlRejReason" description="Cancel Request Rejection Reason." encodingType="uint8" semanticType="int">            <validValue name="TooLateToCancel">0</validValue>            <validValue name="UnknownOrder">1</validValue>            <validValue name="DuplicateClOrdIDReceived">6</validValue>            <validValue name="Other">99</validValue>        </enum>
        <enum name="NegotiationMethod" description="Indicates whether QuoteRequest is for ESP or RFS." encodingType="uint8">            <validValue name="ESP" description="Executable Streaming Prices via MassQuote.">100</validValue>            <validValue name="RFS" description="Request For Quote or Stream via Quote.">101</validValue>            <validValue name="Order" description="Instruction to Venue.">102</validValue>        </enum>
        <enum name="QuoteRequestRejectReason" description="Reason for rejection of QuoteRequest." encodingType="uint8">            <validValue name="UnknownSymbol" description="Rejected due to unknown security symbol.">1</validValue>            <validValue name="Other" description="Rejected for other reason. Catch-all.">99</validValue>        </enum>
        <enum name="QuoteRespType" description="Reason for termination of QuoteRequest." encodingType="uint8">            <validValue name="Pass" description="RFS Stream terminated by Taker.">6</validValue>            <validValue name="Timed-out" description="RFS Stream duration ended without Order. Maker and ECN have individual time-outs.">8</validValue>        </enum>
        <enum name="LegID" description="TODO" encodingType="uint8">            <validValue name="Near" description="Near leg of SWP/NDS MassQuote.">1</validValue>            <validValue name="Far" description="Far leg of SWP/NDS MassQuote.">2</validValue>        </enum>
        <enum name="VenueType" description="Categorization for the various venues offered through Whisperer." encodingType="char"  semanticType="char"> <!-- customization of http://fiximate.fixtrading.org/latestEP/en/FIX.5.0SP2_EP240/tag1430.html -->            <validValue name="Maker" description="Liquidity Provider, MFAPI Client must act as Taker.">0</validValue>            <validValue name="Taker" description="Liquidity Consumer, MFAPI Client must act as Maker.">1</validValue>            <validValue name="CLOB" description="Order-Matching, MFAPI Client may consumer or provide liquidity as desired.">2</validValue>        </enum>           </types>
<!-- * * Session-Level Messages * -->
    <!-- Application Session -->        <sbe:message name="Logon" id="1" semanticType="A" description="Used to logon to a Market Data or Trading session.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="HeartBtInt" id="108" type="uint8" description ="Frequence with which the client wishes to vallidate connection health."/>                <field name="NextExpectedMsgSeqNum" id="789" type="SeqNum" description="Provided by MFAPI client to support MF message gap checks. If equal to the next-to-be-assigned MF sequence then Whisperer will respond with a LogonResponse message and then proceed with the session as normal. If lower, then Whisperer will respond with a LogonResponse message and immediately (re)send persisted messages or GapFills, in order. On completion, it will proceed with the session as normal. If higher, then Whisperer will respond with a Logout message to abort the session."/>        <field name="Username" id="533" type="Username"/>        <field name="Password" id="554" type="Password"/>        <!-- TODO            LS: We need to add a sessionType to the logon so we know what type of session the logon is attempting (trading, md, maker trading, maker quoting, drop copy, etc.
            MSW: My expectation was that the combination of the username and venue would be used to do a lookup in my.mf? I guess that leads on to a class of "not permissioned" business rejections that need to be documented.                        LS: You will want to put the enum.  Else, they will have to have multiple accounts for MD and trading, which some clients will see as unnecessary friction.  Plus, this will ease troubleshooting.   This will also make it easier for the LogonService to route to the appropriate venue process.        -->    </sbe:message>
    <sbe:message name="LogonResponse" id="2" semanticType="A" description="An acknowledgement from the server that the logon was successful as well as the expected heartbeat interval.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="NextExpectedMsgSeqNum" id="789" type="SeqNum" description="Provided by MF to support MFAPI client message gap checks. If equal to the next-to-be-assigned MFAPI client sequence then the client should proceed with the session as normal. If lower, then the client should immediately (re)send persisted messages or GapFills, in order. On completion, it may then proceed with the session as normal. If higher, then the client should respond with a Logout message to abort the session."/>        <!-- TODO Why 108/HeartBtInt missing? -->        <!-- TODO - UserType -->    </sbe:message>
    <sbe:message name="Logout" id="3" semanticType="5" description="A request to stop the session.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="Text" id="58" type="Text" description="Free format text string. May include reason for logout."/>    </sbe:message>
    <sbe:message name="LogoutResponse" id="4" semanticType="5" description="An acknowledgement that the session has been terminated.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>    </sbe:message>
    <sbe:message name="SequenceResetGapFill" id="5" semanticType="4" description="Used to explicitly skip blocks of unpersisted messages during a replay, if a sequence gap is detected.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="NewSeqNo" id="36" type="SeqNum"/>    </sbe:message>
    <sbe:message name="Heartbeat" id="6" semanticType="0" description="This is sent from each side of the connection periodically.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Heartbeat was sent."/>        <field name="OrigSendingTime" id="122" type="UTCTimestamp" presence="optional" description="Time when the TestRequest was sent."/>        <field name="CurrentSeqNum" id="20056" type="SeqNum" description="This is the last sequence number sent by originator. On detection of a sequence number gap, the recipient should immediately Logout and then Logon in order to resolve the dropped message(s)."/>    </sbe:message>
    <sbe:message name="TestRequest" id="7" semanticType="1" description="Sent by either side in order to generate a Heartbeat response. May also be used to determine approximate application round-trip times.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the TestRequest was sent."/>    </sbe:message>
<!-- * * Venue Status Messages * -->
    <!-- Configuration information -->    <sbe:message name="SecurityDefinitionRequest" id="101" semanticType="a" description="A request for a list of a Venue's securities and their attributes.">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>
        <field name="SecurityRequestType" id="321" type="SecurityRequestType"/>    </sbe:message>
    <!-- https://jira.marketfactory.com/browse/PRODMGT-180 SBE Schema change for SecurityDefinition     *     * Even though this is a new 3.15 API, We *should* provide a sane migraton path for clients from both 3.13 and 3.14 - If clients were to be able to use the new API in the old manner (i.e. backward compatibility) that would de-risk the transition. Especially true for existing Futures support that needs to be revisited, but only after after non-Spot FX.     *     * We *need* to provide sane migraton path for MF/Whisperer FHs - we need to be able to pass non-spot Mkt IDs for those non-upgraded FHs that still depend on my.mf static config to then lookup Product type, tenor(s).     * So Price Requests/Orders need to be able to specify a Spot Security/MarketID along with separate Product/Tenor components and the API should map this to the legacy Market ID *internally* (eg a simple static look-up).     *     * We do not want to mess with my.mf at this stage (big job).    -->    <sbe:message name="SecurityDefinition" id="102" semanticType="d" description="Describes the attributes of a given security.">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID" description="The numeric ID assigned by MF to identify the Venue in other messages."/>
        <field name="TotNumReports" id="911" type="uint32" semanticType="int" description="The total number of security definitions in group, used to detect the receipt of all security definitions."/> <!-- MSW - Custom use of this FIX tag. -->        <field name="Symbol" id="55" type="Symbol" description="The market convention representation of the instrument eg 'EUR/USD'"/>        <!-- Aka name. eg AUD/USD, or AUD/CAD-FORWARD-M6 (deprecated), 6AM0 (future, still needs to be supported) -->        <field name="SecurityID" id="48" type="SecurityID" description="The numeric MF ID used to identify the Symbol in other messages. Deprecated for FX Instruments."/>                    <!-- Aka marketID. -->        <field name="MinPriceIncrement" id="969" type="PriceNULL" description="The minimum Spot price movement, tick size."/>        <field name="BigPriceIncrement" id="20004" type="PriceNULL" description="Pip position"/>        <field name="FwdPriceIncrement" id="20059" type="PriceNULL" description="The minimum Fwd price movement, Fwd Pts (and non-Spot All-in) precision"/>    </sbe:message>
    <sbe:message name="SecurityStatus" id="103" semanticType="f" description="Contains details of a Venue status, trade/settle dates, and more. Sent by MF to Taker in response to a MarketDataRequest and should be processed before the first market data message. Can also arrive asynchronously if the state of a security changes - e.g. Date Roll">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>
        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT), 2-legged (SWP, NDS). NOTE: This message is NOT to be used for BLK, IMM or OPT Security Types."/>        <!-- TODO Tenor(s), this whole message needs careful thought WRT sources of dates, purpose of message -->
        <field name="TradeDate" id="75" type="LocalMktDate" description="Trade Session Date of security."/>        <field name="SettlDate" id="64" type="LocalMktDate" description="Settlement date of security."/> <!-- TODO where does this information come from? -->        <field name="SecurityTradingStatus" id="326" type="SecurityTradingStatus" description="Identifies the trading status applicable to the instrument or Security Group"/>        <field name="Text" id="58" type="Text" description="Explanation of status state."/>    </sbe:message>
    <sbe:message name="MarketDefinitionRequest" id="104" semanticType="BT" description="Request for a definition of the Venue.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>    </sbe:message>
    <sbe:message name="MarketDefinition" id="105" semanticType="BU" description="Contains attributes of the given Venue."> <!-- TODO Review this - naming/customization etc -->        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="MarketID" id="1301" type="Text" description="General name of the Market/Value. 'EBS-Ai' for example."/>        <field name="VenueName" id="20024" type="Text" description="MF defined market/Venue name. Used to identify a special, specific MF configuration/connection to a market/Venue. EBS-Ai-metals for example."/>        <field name="VenueType" id="1430" type="VenueType" description="Maker, Taker, or CLOB"/>        <group name="NoSupportedModels" id="20006" description="A list of the trading models supported by the Venue." dimensionType="groupSizeEncoding">            <field name="TradingModel" id="20019" type="NegotiationMethod" description="ESP, RFS, or Orders."/>                        <group name="NoSupportedProducts" id="20018" description="A list of the product types supported by the Venue for this Trading Model." dimensionType="groupSizeEncoding">                <field name="SecurityType" id="167" type="SecurityType" description="TODO"/>
                <group name="NoOrdTypeRules" id="1237" description="A list of the order types supported by the Venue for this Trading Model and Product." dimensionType="groupSizeEncoding">                    <field name="OrdType" id="40" type="OrdType"/>                    <field name="TimeInForce" id="59" type="TimeInForce"/>                    <field name="OrderAttributes" id="20080" type="OrderAttributes" description="Bitmap field of n Boolean type flags, indicating the supported flavours of this OrdType, and associated NewOrderMultileg fields."/>                </group>            </group>        </group>    </sbe:message>
    <sbe:message name="TradingSessionStatusRequest" id="106" semanticType="g" description="A request to subscribe to a Venue in order to begin trading.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>    </sbe:message>
    <sbe:message name="TradingSessionStatus" id="107" semanticType="h" description="A response to a TradingSessionStatusRequest indicating the state of the Venue. This event will be sent if the state of the Venue changes.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>
        <field name="TradingSubscriptionStatus" id="20020" type="TradingSubscriptionStatus"/>        <field name="TradSesStatus" id="340" type="TradSesStatus"/>         <field name="Text" id="58" type="Text" description="Explanation of status state, if any."/>    </sbe:message>
<!-- * * Pricing Messages - Market Data (Order Matching) and Quotation (ESP, RFQ, RFS) * -->
    <!-- MarketData messages -->    <sbe:message name="MarketDataRequest" id="201" semanticType="V" description="A request to create, cancel, or otherwise manipulate a subscription for a single security from a specific Venue."> <!-- NOTE: No support for client provision of desired rungs for Full Amount trading. This is currently done in http://my.mf:8080/#/profile_exchange_instruments -->        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketDataRequest was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketDataRequest was sent."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketDataRequest was received by MF."/>        <!-- Identification -->        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/>  <!--NOTE: FIX defines this tag as a string. -->        <!-- State -->        <field name="SubscriptionRequestType" id="263" type="SubscriptionRequestType"/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT) product types only. NOTE: This message is NOT to be used for 2-legged (SWP, NDS), BLK, IMM or OPT Security Types."/>
        <!-- TODO - Consider that most of the fields in this message should not need to be populated for a subscription cancellation... Unless we wanted to manage MDReqID internally... -->        <field name="SettlType" id="63" type="TenorType" description="Specifies a standard date for settlement."/>        <field name="SettlDate" id="64" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>        <field name="MaturityDate" id="541" type="LocalMktDate" description="Conditionally required if SecurityType = NDF. Specifies the Fixing Date."/>        <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType=NDF. Fixing Reference. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>        <field name="MarketDepth" id="264" type="uint8" description="0=Full Book, 1=Top of Book, n=Number of Levels."/> <!-- TODO To discuss -->    </sbe:message>
    <sbe:message name="MarketDataRequestReject" id="203" semanticType="Y" description="A rejection of a request for market data.">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketDataRequestReject was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketDataRequestReject was sent."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketDataRequestReject was received by MF."/>        <!-- Identification -->        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/> <!-- Required because the request can no longer be uniquely identified via the SecurityID. -->        <!-- Instrument -->        <field name="SecurityID" id="48" type="SecurityID" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>
        <field name="MDReqRejReason" id="281" type="MDReqRejReason"/>        <field name="Text" id="58" type="Text" description="Additional information, if any, about the rejection."/>    </sbe:message>
    <sbe:message name="MarketDataIncrementalRefresh" id="204" semanticType="X" description="Contains any combination of new, changed, or deleted Market Data Entries, for any combination of instruments, with any combination of trades,  quotes and Laddered/VWAP prices, etc. All of these types of Market Data Entries can be changed and deleted.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="HopRefID" id="630" type="SeqNum" description="Used to correlate this entry with the Venue message. Will be NULL if message is generated by MF (snapshot, enhanced data, etc.)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketData was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketData was sent."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketData was received by MF."/>        <!-- Identification -->        <field name="MDReqID" id="262" type="uint32" description="Unique ID specified by the subscriber."/> <!-- Required because the request can no longer be uniquely identified via the SecurityID. -->        <field name="MDBookType" id="1021" type="MDBookType" description="Instructs Taker as to how the book should be interpreted."/>
        <!-- FIX defines the following fields as part of the repeating group, but for our needs these are all static. Some Venues will mandate that such fields are populated on the first entry of the first message only - current model represents a halfway house. outside repeating group, but every message. -->        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol."/>        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF, FUT) product types only. NOTE: This message is NOT to be used for 2-legged (SWP, NDS), BLK, IMM or OPT Security Types."/>        <field name="SettlType" id="63" type="TenorType" description="Specifies a standard date for settlement."/>        <field name="SettlDate" id="64" type="LocalMktDate" description="Specifies the date for settlement."/>        <field name="MaturityDate" id="541" type="LocalMktDate" presence="optional" description="Conditionally required if Requested SecurityType = NDF. Specifies the Fixing Date."/>        <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if Requested SecurityType=NDF. Fixing Reference. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>        <!-- TODO state conditional population constraints for Mid-Price -->        <!-- Agg feed components need to be supported -->
        <group name="NoMDEntries" id="268" dimensionType="groupSizeEncoding" description="On entry for each individual change in the market data message.">            <field name="MDUpdateAction" id="279"  type="MDUpdateAction" description="The type of update action to be applied to this market data entry."/>            <field name="MDEntryType" id="269"  type="MDEntryType" presence="optional" description="Conditionally populated if MDUpdateAction=New. Defines the nature of this market data entry."/>            <field name="MDEntryID" id="278" type="IDString" description="Unique identifier of this market data entry, referenced throughout MDUpdateAction lifecycle."/> <!-- TODO Why missing before? -->            <field name="NumberOfOrders" id="346"  type="int16" description="Number of orders at this level, if available."/>            <field name="MDEntryPx" id="270"  type="PriceNULL" description="All-in Price. MDEntryPx = MDEntrySpotRate + MDEntryForwardPoints"/>            <field name="MDEntrySpotRate" id="1026" type="PriceNULL" description="Spot Price."/>            <field name="MDEntryForwardPoints" id="1027" type="PriceNULL" description="Fwd Pts."/>            <field name="MDEntrySize" id="271"  type="DecimalQtyNULL" description="Size for quoted price. Expressed in units of CCY1."/>            <field name="MinQty" id="110"  type="DecimalQtyNULL" description="Minimum quantity available to execute."/>            <field name="LotSize" id="20066" type="DecimalQtyNULL" description="TODO"/> <!-- MSW E.g. for Hotspot -->
            <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">                <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/> <!-- E.g. EBS Ultra MarketRegion -->                <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>            </group>        </group>    </sbe:message>
    <!-- NOTE: MassQuoteAck support removed - this was only used to notify Maker of rejection of prices by venue - this should in fact cause the Feed Handler to disconnect. -->    <!-- TODO SeqDiag - Venue BusinessMessageReject and other errors results in Logout -->
    <sbe:message name="QuoteRequest" id="208" semanticType="R" description="Issued by Taker to request a short-lived RFS subscription."> <!-- TODO how to terminate -->        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteRequest may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteRequest was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteRequest was received by MF."/>        <!-- Identification -->        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>        <field name="NegotiationMethod" id="2115" type="NegotiationMethod" description="RFS - Quote messages sent in response. ESP - MassQuote messages sent in response. Order - not applicable."/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>        <field name="StreamCategory" id="20077" type="IDString" presence="optional" description="Conditionally populated if NegotiationMethod = ESP. The name of the requested stream category. Bilaterally agreed between ECN and Maker."/>                    <field name="NumCompetitors" id="20069" type="Int8NULL" description="0=Not in competition; n= Number of competitors; NULL=unknown."/>        <!-- Regulatory -->        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>        </group>        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>
        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>            <field name="LegSide" id="624" type="Side"/>            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>            <!-- NDF/NDS -->            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this Leg of NDF/NDS."/>            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/>            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>            <!-- Regulatory -->            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>            </group>
            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>                <!-- Regulatory -->                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>                </group>            </group>        </group>
        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>        </group>    </sbe:message>
    <sbe:message name="QuoteRequestReject" id="209" semanticType="AG" description="Issued by Maker to deny the corresponding QuoteRequest.">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteRequestReject may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteRequestReject was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteRequestReject was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteRequestReject was received by MF."/>        <!-- Identification -->        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>
        <field name="QuoteRequestRejectReason" id="658" type="QuoteRequestRejectReason"/>        <field name="Text" id="58" type="Text" description="Additional information, if any, about the rejection."/>    </sbe:message>
    <sbe:message name="Quote" id="210" semanticType="S" description="Issued by Maker to publish a price in response to a corresponding QuoteRequest. A new quote replaces the previous, and may be marked Indicative (i.e. non-tradeable).">        <!-- Session -->        <field name="VenueID" id="20022"  type="VenueID"/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the Quote was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Quote was sent."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the Quote was received by MF."/>        <!-- Identification -->        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the Taker."/>        <field name="QuoteID" id="117" type="IDString" description="Unique ID of this Quote specified by the Maker."/><!-- TODO clarify 360T quirk in this regard -->
        <!-- State -->        <!-- https://jira.marketfactory.com/browse/PRODMGT-158 Quote withdrawal not handled properly         * Need to revisit existing Maker implementations for removal of CANCEL_QUOTE_SPECIFIED_IN_QUOTE_ID         *        -->        <field name="QuoteType" id="537" type="QuoteType" description="Indicative/Tradeable price."/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>
        <field name="BidSpotRate" id="188" type="PriceNULL" description="Conditionally populated if SecurityType = SWP/BLK, or SecurityType = SPT/FWD/NDF and Side = Buy/2-Way. The quoted Bid Spot rate relating to this quote."/>        <field name="MidPx" id="631" type="PriceNULL" description="Mid-Market spot rate."/><!-- Regulatory -->        <field name="OfferSpotRate" id="190" type="PriceNULL" description="Conditionally populated if SecurityType = SWP/BLK, or SecurityType = SPT/FWD/NDF and Side = Sell/2-Way. The quoted Offer Spot rate relating to this quote."/>
        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>            <field name="LegSide" id="624" type="Side"/>            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>            <!-- NDF/NDS TODO - Confirm these fields are really necessary. -->            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this Leg of NDF/NDS."/>            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/> <!-- Custom use of this tag. -->            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>            <field name="LegBidPx" id="681" type="PriceNULL" description="Conditionally populated if LegSide = Buy/2-Way. All-in Bid rate."/>            <field name="LegMidPx" id="2346" type="PriceNULL" description="Mid-Market All-in Price of this Leg."/><!-- Regulatory -->            <field name="LegOfferPx" id="684" type="PriceNULL" description="Conditionally populated if LegSide = Sell/2-Way. All-in Offer rate."/>            <field name="LegBidForwardPoints" id="1067" type="PriceNULL" description="Conditionally populated if LegSide = Buy/2-Way. The Bid FX forward points for this Leg. Value can be negative. Expressed in decimal form, LegBidForwardPoints = LegBidPx – BidSpotRate."/>            <field name="LegOfferForwardPoints" id="1068" type="PriceNULL" description="Conditionally populated if LegSide = Sell/2-Way. The Offer FX forward points for this Leg. Value can be negative. Expressed in decimal form LegOfferForwardPoints = LegOfferPx – OfferSpotRate."/>
            <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">                <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>                <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>            </group>        </group>    </sbe:message>
    <sbe:message name="MassQuote" id="211" semanticType="i" description="Used by Maker for publication of ESP price ladders by stream category.">        <!-- Session -->        <field name="VenueID" id="20022"   type="VenueID"/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the MarketData was generated."/> <!-- MSW Promoted from QuoteEntry -->        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the MarketData was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the MarketData was received by MF."/>        <!-- Identification -->        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the Taker."/>        <field name="QuoteID" id="117" type="IDString" description="Unique ID of this Quote specified by the Maker."/>
        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>        <group name="NoQuoteSets" id="296" dimensionType="groupSizeEncoding" description="Always one QuoteSet per stream category QuoteRequest.">            <!-- Instrument -->            <field name="QuoteSetID" id="302" type="IDString" description="The name of this stream category as specified in the QuoteRequest by StreamCategory."/><!--            <field name="TotNoQuoteEntries" id="304" type="TODO" description="TODO"/>-->            <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/> <!-- MSW promoted from QuoteEntry -->            <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/> <!-- MSW promoted from QuoteEntry -->            <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the requested instrument. 1-legged (SPT, FWD, NDF) and 2-legged (SWP, NDS) order types. NOTE: This message is NOT to be used for FUT, BLK, IMM or OPT Security Types."/> <!-- MSW promoted from QuoteEntry -->
            <field name="FixingReference" id="20058" type="FixingReference" presence="optional" description="Conditionally required if Requested SecurityType=NDF/NDS. Fixing Reference. Refer to [REF TODO] for Venue-specific fixing reference strings."/>            <group name="NoQuoteEntries" dimensionType="groupSizeEncoding" description="One QuoteEntry per ladder rung and Leg.">                <field name="QuoteEntryID" id="299" type="IDString" description="TODO"/> <!-- TODO Can use Rn-Ln for Swaps or Add a leg ID as well?-->                <!-- State -->                <!-- https://jira.marketfactory.com/browse/PRODMGT-158 Quote withdrawal not handled properly                 * Need to revisit existing Maker implementations for removal of CANCEL_QUOTE_SPECIFIED_IN_QUOTE_ID                 *                -->                <field name="BidQuoteType" id="537" type="QuoteType" description="Indicative/Tradeable price."/> <!-- QuoteType relocated from head of hessage and renamed to reflect specific side -->                <field name="OfferQuoteType" id="20047" type="QuoteType" description="Indicative/Tradeable price."/>                <field name="SettlType" id="63" type="TenorType" description="Specifies a standard Tenor for settlement of this Leg."/> <!-- MSW customisation -->                <field name="SettlDate" id="64" type="LocalMktDate" presence="optional" description="Specifies the calendar date for settlement of this Leg."/>                <!-- NDF/NDS -->                <field name="MaturityDate" id="541" type="LocalMktDate" presence="optional" description="Conditionally required if SecurityType = NDF/NDS. Specifies the Fixing Date for this Leg."/>                <field name="SettlCurrency" id="120" type="Currency" description="Conditionally required if SecurityType=NDF. Specifies the fixing currency of this Leg of NDF/NDS."/> <!-- Custom use of this tag. -->                <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType=NDF. Fixing Reference for this Leg of NDF/NDS. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>
                <field name="Currency" id="15" type="Currency" description="Specifies the denomination of the quantity fields in this Rung."/>                <field name="BidSize" id="134" type="DecimalQtyNULL" description="Bid quantity in this Rung."/>                <field name="OfferSize" id="135" type="DecimalQtyNULL" description="Offer quantity in this Rung."/>                <field name="BidPx" id="132" type="PriceNULL" description="All-in Bid rate for this Rung."/>                <field name="MidPx" id="631" type="PriceNULL" description="All-in Mid-Market rate for this Rung. "/><!-- Regulatory -->                <field name="OfferPx" id="133" type="PriceNULL" description="All-in Offer rate for this Rung."/>                <field name="BidSpotRate" id="188" type="PriceNULL" description="Conditionally populated if SecurityType = SPT/FWD/NDF/SWP/NDS. The quoted Bid Spot rate relating to this Rung."/>                <field name="OfferSpotRate" id="190" type="PriceNULL" description="Conditionally populated if SecurityType = SPT/FWD/NDF/SWP/NDS. The quoted Offer Spot rate relating to this Rung."/>                <field name="BidForwardPoints" id="189" type="PriceNULL" description="The Bid FX forward points for this Rung. Value can be negative. Expressed in decimal form, BidForwardPoints = BidPx – BidSpotRate."/>                <field name="OfferForwardPoints" id="191" type="PriceNULL" description="The Offer FX forward points for this Rung. Value can be negative. Expressed in decimal form OfferForwardPoints = OfferPx – OfferSpotRate."/>
                <group name="PassthruElements" id="20072" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">                    <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>                    <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>                </group>            </group>        </group>    </sbe:message>
    <sbe:message name="QuoteResponse" id="212" semanticType="AJ" description="Issued by Taker, Maker or ECN to terminate the corresponding QuoteRequest.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this QuoteResponse may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the QuoteResponse was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the QuoteResponse was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the QuoteResponse was received by MF."/>        <!-- Identification -->        <field name="QuoteReqID" id="131" type="IDString" description="Unique ID specified by the subscriber."/>
        <field name="QuoteRespType" id="694" type="QuoteRespType" description="Reason for termination of QuoteRequest."/>        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>    </sbe:message>

<!-- * * Trading Messages - Orders (RFQ, RFS, ESP, Order Matching) and Executions. * -->
    <sbe:message name="NewOrderMultileg" id="301" semanticType="AB" description="Issued by Taker to submit an FX Order (either in response to an ESP or Order-Matching Market Data stream, or against a published Quote). To be used for 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this Order may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the Order was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the Order was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the Order was received by MF."/>        <!-- Identification -->        <field name="OrderRequestID" id="2422" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Contains stringified(MDReqID) or QuoteReqID, to aid support."/> <!--NOTE: FIX defines this tag as an int. -->        <field name="QuoteID" id="117" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Contains MDEntryID or QuoteID."/> <!-- MSW -->        <field name="ClOrdID" id="11" type="IDString" description="Unique identifier for Order as assigned by the Taker."/>        <!-- State -->        <field name="OrdType" id="40" type="OrdType"/>        <field name="TimeInForce" id="59" type="TimeInForce"/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <field name="SecurityType" id="167" type="SecurityType" description="Specifies the product type for the traded instrument. 1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types. NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>        <!-- Instructions -->        <field name="Price" id="44" type="PriceNULL" description="Conditionally populated if OrdType != Market. If OrdType=PreviouslyQuoted then represents the Spot price: LegPrice - Price = Leg Fwd Pts (TODO - Fwd Pts not currently populated). Othwerwise represents the Order Limit price."/> <!-- TODO - discuss/clarify eg For Fixing/FixingOffset orders will convey the points to be added to a fix rate. -->        <field name="MinQty" id="110" type="DecimalQtyNULL" description="Minimum quantity to execute, used to prevent partial fills under the defined quantity. If the Order quantity drops below this value due to a fill, the Order will be cancelled."/>        <field name="StopPx" id="99" type="PriceNULL" description="Stop price. Only required if this order is a Stop-type order."/>        <field name="MaxShow" id="210" type="DecimalQtyNULL" description="If supported by Venue and specified, defines Iceberg tip-size. Otherwise, will default to OrderQty."/>        <field name="DiscretionOffsetValue" id="389" type="PriceNULL" description="If supported by Venue, added to Price to define the worst price the trader will accept."/>        <field name="PegOffsetValue" id="211" type="PriceNULL" description="If supported by Venue, defines the absolute value of market offset."/>        <field name="ExpireTime" id="126" type="UTCTimestamp" presence="optional" ddescription="Conditionally populated if TimeInForce = GTD. Timestamp when the Order will be cancelled (will be rounded to the nearest second)."/>        <field name="ExposureDuration" id="1629" type="uInt32NULL" description="Conditionally populated if TimeInForce = GFT. Number of seconds after which the Order will be cancelled."/>        <!-- TODO EBS Ai -    MarketSegmentID - “Fixing”  “FixingOffset” “SwapOffset” “Standard” MDBookType??                        DisplayQty, DisplayMethod, IcebergHigh RandomTime - for Iceberg Orders        -->        <!-- Regulatory -->        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>        </group>        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>
        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">            <field name="LegSecurityType" id="609" type="SecurityType" description="Specifies the product type for this leg. Valid values: SPT, FWD, NDF."/>            <field name="LegSide" id="624" type="Side"/>            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>            <field name="LegPrice" id="566" type="PriceNULL" description="All-in Order limit price. LegPrice - Price = Leg Fwd Pts (not currently populated). Not required on all order types (for example, Market order)."/>            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>            <!-- NDF/NDS  -->            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if LegSecurityType=NDF. Fixing Date for this leg of NDF/NDS."/>            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if LegSecurityType=NDF. Specifies the fixing currency for NDF/NDSs."/> <!-- TODO - do we allow different values for each leg of NDS? -->            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if LegSecurityType=NDF. Fixing Reference, should be the same as in the original Quote Request. Refer to [REF TODO] for Venue-specific fixing reference strings."/>            <!-- Regulatory -->            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>            </group>
            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>                <!-- Regulatory -->                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>                </group>            </group>        </group>
        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>        </group>    </sbe:message>
    <sbe:message name="OrderCancelReplaceRequest" id="302" semanticType="G" description="Modify an outstanding order.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelReplaceRequest may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelReplaceRequest was received by MF."/>        <!-- Identification -->        <field name="ClOrdID" id="11" type="IDString" description="Identifier of this request."/>        <field name="OrigClOrdID" id="41" type="IDString" description="ClOrdID of the order to modify."/>        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel. Can set to null. It is quicker to set it, since making it null requires the system to look up the value to retrieve it."/>        <!-- State -->        <field name="OrdType" id="40" type="OrdType"/>        <field name="TimeInForce" id="59" type="TimeInForce" description="The original order time in force."/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <!-- Instructions -->        <field name="Price" id="44" type="PriceNULL" description="The NEW order price, if changing, or the original price if not. "/>        <field name="MinQty" id="110" type="DecimalQtyNULL" description="The NEW minimum quantity to execute, if changing, or the original (possibly NULL) value if not."/>        <field name="StopPx" id="99" type="PriceNULL" description="The NEW stop price, if changing, or the original stop price if not. Only required if this order is a Stop-type order."/> <!-- MSW -->        <field name="MaxShow" id="210" type="DecimalQtyNULL" description="Where available, sets the NEW maximum amount to show. If available, but not supplied, MaxShow specified by a previous NewOrderMultileg or OrderCancelReplaceRequest is assumed."/> <!-- WHSPRR-1974 -->
        <field name="Side" id="54" type="Side" description="The original order side."/>        <field name="OrderQty" id="38" type="DecimalQtyNULL" description="The NEW order quantity, if changing, or the original order quantity if not."/>    </sbe:message>
    <sbe:message name="OrderCancelRequest" id="303" semanticType="F" description="Cancel an outstanding order.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelRequest may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelRequest was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelRequest was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelRequest was received by MF."/>        <!-- Identification -->        <field name="ClOrdID" id="11" type="IDString" description="Identifier of this cancel request."/>        <field name="OrigClOrdID" id="41" type="IDString" description="ClOrdID of the order to cancel."/>        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel. Can set to null. It is quicker to set it, since making it null requires the system to look up the value to retrieve it."/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>    </sbe:message>
    <sbe:message name="OrderCancelReject" id="304" semanticType="9" description="Sent by Maker to reject an OrderCancelReplaceRequest or OrderCancelRequest.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this OrderCancelReject may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the OrderCancelReject was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the OrderCancelReject was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the OrderCancelReject was received by MF."/>        <!-- Identification -->        <field name="ClOrdID" id="11" type="IDString" description="The ClOrdID of the Cancel request."/>        <field name="OrigClOrdID" id="41" type="IDString" description="The ClOrdID of the order to be canceled"/>        <field name="OrderID" id="37" type="OrderID" description="The MF assigned orderID of the order to cancel."/>        <field name="SecondaryOrderID" id="198" type="IDString" description="The OrderID assigned by the Venue."/>        <!-- State -->        <field name="OrdStatus" id="39" type="OrdStatus" description="Defines the current state of the Order."/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>
        <field name="CxlRejReason" id="102" type="CxlRejReason"/>        <field name="Text" id="58" type="Text" description="Free format text string. May include extra information about the rejection."/>    </sbe:message>        <!-- TODO - custom message for OrderTimedOut -->
    <sbe:message name="ExecutionReport" id="305" semanticType="8" description="Maker/ECN responses for order actions and events.">        <!-- Session -->        <field name="VenueID" id="20022" type="VenueID"/>        <field name="OrigVenueID" id="20025" type="VenueID" description="VenueID of the source of this ExecutionReport. Used when placing orders on the smart order router."/>        <field name="MsgSeqNum" id="34" type="SeqNum"/>        <field name="PossDupFlag" id="43" type="Flags" description="Indicates if this ExecutionReport may have already been processed (it is being resent)."/>        <field name="TransactTime" id="60" type="UTCTimestamp" description="Time when the ExecutionReport was generated."/>        <field name="SendingTime" id="52" type="UTCTimestamp" description="Time when the ExecutionReport was sent. If PossDupFlag=TRUE then represents the OrigSendingTime."/>        <field name="TimeArrival" id="20008" type="UTCTimestamp" description="Time when the ExecutionReport was received by MF."/>        <!-- Identification -->        <field name="OrderRequestID" id="2422" type="IDString" presence="optional" description="Conditionally populated if OrdType = Previously Quoted. Used to associate Order with earlier Market Data (ESP) or Quote (RFS) messages, to aid support."/> <!--NOTE: FIX defines this tage as an int. -->        <field name="ClOrdID" id="11" type="IDString" description="The current ClOrdID of the order. Can differ from the originally submitted value on the NewOrderSingle if, for example, edits have been made."/>        <field name="OrigClOrdID" id="41" type="IDString" description="The ClOrdID of the original value submitted on the NewOrderSingle."/>        <field name="OrderID" id="37" type="OrderID" description="The MF assigned OrderID."/>        <field name="SecondaryOrderID" id="198" type="IDString" description="The OrderID assigned by the Maker/ECN."/>        <field name="ExecID" id="17" type="IDString" description="Unique identifier for this ExecutionReport."/>        <!-- State -->        <field name="OrdType" id="40" type="OrdType"/>        <field name="TimeInForce" id="59" type="TimeInForce"/>        <field name="OrdStatus" id="39" type="OrdStatus" description="Defines the current state of the Order."/>        <field name="ExecType" id="150" type="ExecType"/>        <!-- Instrument -->        <field name="Symbol" id="55" type="Symbol" description="Symbol of requested Instrument."/>        <field name="SecurityID" id="48" type="SecurityID" presence="optional" description="Deprecated for SecurityType != FUT. Numeric MF ID representation of Symbol. If populated, value of Symbol will be ignored."/>        <field name="SecurityType" id="167" type="SecurityType" description="1-legged (SPT, FWD, NDF), 2-legged (SWP, NDS) and n-legged (BLK) order types.NOTE: This message is NOT to be used for FUT, IMM or OPT Security Types."/>
        <field name="TradeDate" id="75" type="LocalMktDate" description="Indicates date of trading day (expressed in local time at place of trade)."/>        <field name="LastSpotRate" id="194" type="PriceNULL" description="Conditionally required if ExecType = 'Trade'. Spot Price on this (last) fill. LastSpotRate = LegLastPrice - LegLastForwardPoints."/>        <field name="MidPx" id="631" type="PriceNULL" description="Conditionally required if ExecType = 'Trade'. Mid-Market Spot Price on this (last) fill."/><!-- Regulatory -->        <field name="Text" id="58" type="Text" description="Free format text string. May include extra information about the execution."/>        <!-- Regulatory -->        <field name="RegulatoryBodies" id="20076" type="RegulatoryBodies" description="Bitmap field of 3 Boolean type Regulation elegibility flags"/>        <group name="BodyRegulatoryFields" id="20053" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">            <field name="BodyRegulatoryKey" id="20054" type="BodyRegulatoryKey" description="Name of Regulatory field."/>            <field name="BodyRegulatoryValue" id="20055" type="RegulatoryValue" description="Value of Regulatory field."/>        </group>        <!-- Counterparties -->        <group name="NoPartyIDs" id="453" dimensionType="groupSizeEncoding" description="Order Origination/Execution counterparty details.">            <field name="PartyRole" id="452" type="PartyRoleType" description="Name of Party field."/>            <field name="PartyID" id="448" type="PartyString" description="Value of Party field."/>        </group>
        <group name="NoLegs" id="555" dimensionType="groupSizeEncoding" description="One Leg per value date. At least one Leg must be specified.">            <field name="LegSide" id="624" type="Side"/>            <field name="LegCurrency" id="556" type="Currency" description="Specifies the denomination of the quantity fields in this Leg."/>            <field name="LegPrice" id="566" type="PriceNULL" description="All-in Order limit price of Leg. Not required on all Order types (for example, Market order)."/>            <field name="LegMidPx" id="2346" type="PriceNULL" presence="optional" description="Conditionally required if ExecType = 'Trade'. Mid-Market All-in Price of Leg for this (last) fill."/><!-- Regulatory -->            <field name="LegLastPrice" id="637" type="PriceNULL" description="All-in Price of Leg for this last fill, if any. LegLastPrice = LastSpotRate + LegLastForwardPoints."/>            <field name="LegLastForwardPoints" id="1073" type="PriceNULL" description="FX forward points of Leg. May be a negative value. Zero if Leg = SPOT. LegLastForwardPoints = LegLastPrice - LastSpotRate."/>            <field name="LegOrderQty" id="685" type="DecimalQtyNULL" description="Required. Order quantity."/>            <field name="LegLastQty" id="1418" type="DecimalQtyNULL" description="Specifies the dealt amount for this Leg, if any."/>            <field name="LegCalculatedCcyLastQty" id="1074" type="DecimalQtyNULL" description="Specifies the contra amount for this (last) fill and Leg, if any. If LegCurrency is LHS then = LegLastQty * LegLastPx; if LegCurrency is RHS then = LegLastQty / LegLastPx (rounded arithmetically)."/>            <field name="LegCumQty" id="20061" type="DecimalQtyNULL" description="Total quantity filled on this Leg of the Order."/>            <field name="LegLeavesQty" id="20062" type="DecimalQtyNULL" description="Quantity remaining to execute on this Leg of the Order."/>            <field name="LegSettlType" id="587" type="TenorType" description="Specifies a standard date for settlement."/>            <field name="LegSettlDate" id="588" type="LocalMktDate" presence="optional" description="Conditionally required if SettlType='BKN'. Specifies the broken date for settlement."/>            <!-- NDF/NDS  -->            <field name="LegMaturityDate" id="611" type="LocalMktDate" description="Conditionally required if SecurityType='NDF' or 'NDS'. Fixing Date."/>            <field name="LegSettlCurrency" id="675" type="Currency" description="Conditionally required if SecurityType='NDF' or 'NDS'. Specifies the fixing currency for NDF/NDSs."/> <!-- TODO - do we allow different values for each leg of NDS? -->            <field name="FixingReference" id="20058" type="FixingReference" description="Conditionally required if SecurityType='NDF' or 'NDS'. Fixing Reference, should be the same as in the original QuoteRequest. Refer to [REF 360T RFS Maker, JPM Taker] for Venue-specific fixing reference strings."/>            <!-- Regulatory -->            <group name="LegRegulatoryFields" id="20063" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                <field name="LegRegulatoryKey" id="20064" type="LegRegulatoryKey" description="Name of Regulatory field."/>                <field name="LegRegulatoryValue" id="20065" type="RegulatoryValue" description="Value of Regulatory field."/>            </group>
            <group name="NoLegAllocs" id="670" dimensionType="groupSizeEncoding" description="At least one Allocation must be specified per Leg.">                <field name="LegAllocAccount" id="671" type="PartyString" description="Account mnemonic."/>                <field name="LegAllocQty" id="671" type="DecimalQtyNULL" description="Quantity to be allocated to Account. Specified in terms of LegCurrency and LegSide (negative quantities allocate to the opposite side)."/>                <field name="LegAllocCalculatedCcyQty" id="20060" type="DecimalQtyNULL" description="Quantity to be allocated to Account, expressed in contra currency. Allocation direction expressed arithmetically ABS(SUM (LegAllocCalculatedCcyQty)) = LegCalculatedCcyLastQty (but may be subject to accumulated rounding errors). If LegCurrency is LHS then = -LegAllocQty * LegLastPx; if LegCurrency is RHS then = -LegAllocQty / LegLastPx (rounded arithmetically)."/>                <!-- Regulatory -->                <group name="AllocRegulatoryFields" id="20050" dimensionType="groupSizeEncoding" description="Conditionally populated if RegulatoryBodies = SEF/EMIR/MiFID(MTF)">                    <field name="AllocRegulatoryKey" id="20051" type="LegRegulatoryKey" description="Name of Regulatory field."/>                    <field name="AllocRegulatoryValue" id="20052" type="RegulatoryValue" description="Value of Regulatory field."/>                </group>            </group>        </group>
        <group name="PassthruFields" id="20073" dimensionType="groupSizeEncoding" description="To be used only to transport custom/non-normalisable Venue-specific attributes.">            <field name="PassthruKey" id="20074" type="PassthruKey" description="Venue-specific name of this element (e.g. Fix tag name)."/>            <field name="PassthruValue" id="20075" type="PassthruValue" description="Arbitrary value to be assigned to this element."/>        </group>    </sbe:message>        <sbe:message name="ExecutionAck" id="306" semanticType="BN" description="ECN response to Maker-sent ExecutionReport or time-out event.">        <!-- TODO Complete this message. -->    </sbe:message>
</sbe:messageSchema>