The Lab

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

If a credential is not found, or if the credential is disabled, or if any risk pools containing the credential is in a UNPLUGGED state, or if password translation is enabled and password match failed, then the session is terminated. Otherwise, the message passes through.


FlagPresenceFieldType
COMP_IDRequiredSenderCompID[49]STRING
SUB_IDOptionalSenderSubID[50]STRING
PASSWORDOptionalPassword[554]STRING
NEW_PASSWORDOptionalNewPassword[925]STRING



Tip
titlePassword Translation

Password translation is an optional feature where the trader is not provided the venue's FIX logon password. Instead, the trader is provisioned a different password of the same length. On logon, Reflector checks for the fake password. Upon matching, it overwrites the fake password with the real password.

...

On an inbound Logon[A] message, a credential is deduced and looked up using the ordered triple { ExchangeCode, COMP_ID, SUB_ID }. If a credential is not found, or if the credential is disabled, or if any risk pools containing the credential is in a UNPLUGGED state, the session is terminated. Otherwise, the message passes through, and the session is bound to the credential, inheriting its SessionType.


FlagPresenceFieldType
COMP_IDRequiredSenderCompID[49]STRING
SUB_IDOptionalSenderSubID[50]STRING


Password Change

Outbound

EBS & Reuters have a unique password changing process whereby traders must log in to change passwords with a UserRequest[BE] message. The SessionTypes PASS_TKR & PASS_MKR handle this contingency for PBs who do not wish for their clients to know the real logon passwords:

Message NameMsgType[35]ActionExplanation
LogonADrop sessionOutbound risk message with risk implications is banned.
NewOrderSingleDDrop sessionOutbound risk message with risk implications is banned.
QuoteResponseAJDrop sessionOutbound risk message with risk implications is banned.
NewOrderListEDrop sessionOutbound risk message with risk implications is banned.
NewOrderMultilegABDrop sessionOutbound risk message with risk implications is banned.
ExecutionReport8Drop sessionOutbound risk message with risk implications is banned.
ExecutionAcknowledgementBNDrop sessionOutbound risk message with risk implications is banned.
Logout5Change session type
  • PASS_TKR maps to TAKER
  • PASS_MKR maps to MAKER
everything else-

Change new password

  • NewPassword[925] is replaced by the preset venue password.

Inbound

Inbound messages on tcp sessions in password changing mode are completely unscreened with one exception: on detection of Logon[A] message, the stream terminates immediately.

...

On an outbound taker stream, potential order actions are inspected.

Message NameMsgType[35]ActionExplanation
LogonADrop sessionTrader already logged on
ExecutionReport8Drop sessionMaker exec submission
NewOrderSingleDInspectNew order submission request
QuoteResponseAJInspectNew order submission request
OrderCancelReplaceRequestGInspectExisting order modication request
NewOrderListEOverwriteNot yet implemented
NewOrderMultilegABOverwriteNot yet implemented
QuoteSOverwriteIllegal
MassQuoteiOverwriteIllegal
OrderMassActionRequestCAInspectBlock unsupported actions



Info
titleOrderCancelRequest[F]

Notably missing from this list is OrderCancelRequest[F]. It is omitted because it has no risk implications.

...

NewOrderSingle[D], QuoteResponse[AJ], & OrderCancelReplaceRequest[G]


Flag

Presence in D

Presence in AJ

Presence in G

FieldType
POSS_DUPEOptionalOptionalOptionalPossDupFlag[43], PossResend[97]BOOL
SEQ_NUMRequiredRequiredRequiredMsgSeqNum[34]INT
ACCOUNTOptionalOptionalOptionalAccount[1], PartyRole[452], etcSTRING
ALLOC_ACCTBANNEDBANNEDBANNEDAllocAccount[79]STRING
ORD_TYPERequired-OptionalOrdType[40]ENUM
QUOTE_RESP_TYPE-Required-QuoteRespType[694]ENUM
ORIG_ORDER_ID--OptionalOrigClOrdID[41]STRING
ORDER_IDRequiredOptionalRequiredClOrdID[11]STRING
QUOTE_RESP_ID-Optional-QuoteRespID[693]STRING
SYMBOLRequiredRequiredRequiredSymbol[55], SecurityID[48]STRING, INT
CURRENCYOptionalRequiredOptionalCurrency[15]STRING
SIDERequiredRequiredRequiredSide[54]ENUM
CONTRACT_MULTIPLIEROptionalOptionalOptionalContractMultiplier[231]FLOAT
PRICEOptionalOptionalRequiredPrice[44]FLOAT
PRICE-Optional-BidPx[132], OfferPx[133]FLOAT
PRICE_TWOBANNEDBANNEDBANNEDPrice2[640]FLOAT
PRICE_TWO-BANNED-BidPx2[. . . ], OfferPx2[. . .]FLOAT
QUANTITYRequiredOptionalRequiredOrderQty[38]FLOAT
QUANTITY-Optional-BidSize[134], BidSize[135]FLOAT
QUANTITY_TWOBANNEDBANNEDBANNEDOrderQty2[192]FLOAT
QUANTITY_TWO-BANNED-BidSize2[. . . ], BidSize2[. . . ]FLOAT
SETTLE_DATEOptionalOptionalOptionalSettlDate[64]DATE
SETTLE_DATE_TWOBANNEDBANNEDBANNEDSettlDate2[193]DATE
NUM_LEGSOptionalOptionalOptionalNoLegs[555]INT


Processing Sequence

On an outbound risk-carrying Taker message, the parser acts as if the following events occur in sequence:

...

On an inbound taker stream, Reflector accepts updates (including rejects) to live orders and fill notications.


Message NameMsgType[35]ActionExplanation
LogonADrop sessionTrader already logged on
NewOrderSingleDDrop sessionMaker new order
QuoteResponseAJDrop sessionMaker new order
NewOrderListEDrop sessionMaker new order
NewOrderMultilegABDrop sessionMaker new order
ExecutionReport8UpdateOrder update + fill insert
TradeCaptureReportAEUpdateFill Insert
OrderMassCancelReportrUpdateOrder revoke
OrderCancelReject9NothingNothing
Reject3UpdateOrder revoke
BusinessMessageRejectjUpdateOrder revoke


Reflector models live and filled outlays separately. This means that on an ExecutionReport[8], two independent potential updates of separate records could be performed: one to update the state of the live order, another to insert a fill. No attempt is made to track which fill belongs to which order.

...

A ExecutionReport[8] is a potential TradeCaptureReport[AE], plus a mandatory live order state update; where the fill portion is identified by the same ExecID[17] and the live portion is identified by one or more of ClOrdID[11], OrigClOrdID[41], or QuoteRespID[693].
If Text[58] exists, and Reflector has previously blocked the identified order, then it's content will be replaced by Reflector's ErrorCode.


Flag

Presence in 8

Presence in AE

FieldType
POSS_DUPEOptionalOptionalPossDupFlag[43], PossResend[97]BOOL
SEQ_NUMRequiredRequiredMsgSeqNum[34]INT
TEXTOptional-Text[58]STRING
ACCOUNTOptionalOptionalAccount[1], PartyRole[452], etcSTRING
ALLOC_ACCTBANNEDBANNEDAllocAccount[79]STRING
ORD_TYPERequired-OrdType[40]ENUM
ORD_STATUSRequired-OrdStatus[39]ENUM
EXEC_TYPERequired-ExecType[190]ENUM
MATCH_STATUS-RequiredMatchStatus[573]ENUM
ORIG_ORDER_IDOptional-OrigClOrdID[41]STRING
ORDER_IDOptional-ClOrdID[11]STRING
QUOTE_RESP_IDOptional-QuoteRespID[693]STRING
EXEC_IDRequiredRequiredExecID[17]STRING
SYMBOLRequiredRequiredSymbol[55], SecurityID[48]STRING, INT
CURRENCYOptionalOptionalCurrency[15]STRING
SIDERequiredRequiredSide[54]ENUM
CONTRACT_MULTIPLIEROptionalOptionalContractMultiplier[231]FLOAT
PRICEOptional-Price[44]FLOAT
PRICE_TWOBANNED-Price2[640]FLOAT
QUANTITYRequired-OrderQty[38]FLOAT
QUANTITY_TWOBANNED-OrderQty2[192]FLOAT
LEAVES_QUANTITYRequired-LeavesQty[151]FLOAT
LEAVES_QUANTITY_TWOBANNED-LeavesQty2[...]FLOAT
LAST_PRICEOptionalRequiredLastPx[31]FLOAT
LAST_PRICE_TWOBANNEDBANNEDLastPx2[...]FLOAT
LAST_QUANTITYOptionalRequiredLastQty[32]FLOAT
LAST_QUANTITY_TWOBANNEDBANNEDLastQty2[...]FLOAT
SETTLE_DATEOptionalRequiredSettlDate[64]DATE
SETTLE_DATE_TWOBANNEDBANNEDSettlDate2[193]DATE
NUM_LEGSOptionalOptionalNoLegs[555]INT


OrderMassCancelReport[r] & OrderCancelReject[9]

On OrderMassCancelReport[r], on every ClOrdID[11] and OrigClOrdID[41] observed, the corresponding live order is looked up and invalidated. On OrderCancelReject[9], no order actions are taken; but if fields ClOrdID[11] and Text[58] exist, and Reflector has previously blocked an order identified by ClOrdID[11], then the value of Text[58] will be replaced by Reflector's ErrorCode.

Flag

Presence in 8

Presence in AE

FieldType
TEXT-OptionalText[58]STRING
ORIG_ORDER_IDOptional-OrigClOrdID[41]STRING
TEXTOptionalOptionalClOrdID[11]STRING


Reject[3] & BusinessMessageReject[j]

Reject[3] & BusinessMessageReject[j] are handled in the exact same way. If a corresponding live order is found when RefSeqNum[45] will be looked up, it will be invalidated. Additionally, if Reflector has previously blocked an order identified by RefSeqNum[45], then the value of Text[58], if it exists, will be replaced by Reflector's ErrorCode.

Flag

Presence in 8

Presence in AE

FieldType
TEXTOptionalOptionalText[58]STRING
REF_SEQ_NUMRequiredRequiredRefSeqNum[45]INT

Maker

Outbound

On an outbound maker stream, only ExecutionReport[8] & ExecutionAcknowledgement[BN] are meaningful to inspect.


Message NameMsgType[35]ActionExplanation
LogonADrop sessionTrader already logged on
NewOrderSingleDDrop sessionTaker order submission
QuoteResponseAJDrop sessionTaker order submission
NewOrderListEDrop sessionTaker order submission
NewOrderMultilegABDrop sessionTaker order submission
ExecutionReport8InspectNew execution request
ExecutionAcknowledgementBNInspectNew execution request


ExecutionReport[8] & ExecutionAcknowledgement[BN]

Takers need to deal with both orders and executions (fills). Makers deal with only executions, but must handle the rare case where they could be rolled back.


Flag

Presence in 8

Presence in BN

FieldType
POSS_DUPEOptionalOptionalPossDupFlag[43], PossResend[97]BOOL
SEQ_NUMRequiredRequiredMsgSeqNum[34]INT
ACCOUNTOptionalOptionalAccount[1], PartyRole[452], etcSTRING
ALLOC_ACCTBANNEDBANNEDAllocAccount[79]STRING
EXEC_TYPERequired-ExecType[190]ENUM
EXEC_ACK_STATUS-RequiredExecAckStatus[1036]ENUM
ORDER_IDRequiredRequiredClOrdID[11]STRING
EXEC_IDRequiredRequiredExecID[17]STRING
SYMBOLRequiredRequiredSymbol[55], SecurityID[48]STRING, INT
CURRENCYRequiredRequiredCurrency[15]STRING
SIDERequiredRequiredSide[54]ENUM
CONTRACT_MULTIPLIEROptionalOptionalContractMultiplier[231]FLOAT
PRICEOptionalOptionalPrice[44]FLOAT
PRICE_TWOBANNEDBANNEDPrice2[640]FLOAT
QUANTITYOptionalOptionalOrderQty[38]FLOAT
QUANTITY_TWOBANNEDBANNEDOrderQty2[192]FLOAT
LAST_PRICERequiredRequiredLastPx[31]FLOAT
LAST_PRICE_TWOBANNEDBANNEDLastPx2[...]FLOAT
LAST_QUANTITYRequiredRequiredLastQty[32]FLOAT
LAST_QUANTITY_TWOBANNEDBANNEDLastQty2[...]FLOAT
SETTLE_DATERequiredRequiredSettlDate[64]DATE
SETTLE_DATE_TWOBANNEDBANNEDSettlDate2[193]DATE
NUM_LEGSOptionalOptionalNoLegs[555]INT

On an outbound maker risk-carrying message, the parser acts as-if the following events occur in sequence:

...

On an inbound maker stream, we basically check for various ways an outbound accept could be invalidated:

Message NameMsgType[35]ActionExplanation
LogonADrop sessionTrader already logged on
ExecutionReport 8UpdateNew order + fill update
ExecutionAcknowledgementBNUpdateFill update
DontKnowTrade QUpdateRevoke fill via ExecID[17]
OrderTimeOutOTUpdateRevoke fills via ClOrdID[11]
Currenex OrderTimeOutU3UpdateRevoke fills via ClOrdID[11]
Reject3UpdateRevoke fill via MsgSeqNum[34]
BusinessMessageReject jUpdateRevoke fill via MsgSeqNum[34]


ExecutionReport[8] & ExecutionAcknowledgement[BN]

Some venues use ExecutionReport[8] as new (FXall), those are skipped. Some venues use ExecutionReport[8] as ack, those are inspected. Some venues use ExecutionReport[8] as both new and ack (Hotspot), those are included inspected too. Additionally, if Reflector has previously blocked an execution identified by ExecID[17], then value of Text[58], if it exists, will be replaced by Reflector's ErrorCode.


Flag

Presence in 8

Presence in BN

FieldType
POSS_DUPEOptionalOptionalPossDupFlag[43], PossResend[97]BOOL
TEXTOptionalOptionalText[58]STRING
ACCOUNTOptionalOptionalAccount[1], PartyRole[452], etcSTRING
ALLOC_ACCTBANNEDBANNEDAllocAccount[79]STRING
EXEC_TYPERequired-ExecType[190], HSFXTradeStatus[7226]ENUM
EXEC_ACK_STATUS-RequiredExecAckStatus[1036]ENUM
ORDER_IDRequiredRequiredClOrdID[11]STRING
EXEC_IDRequiredRequiredExecID[17]STRING
SYMBOLRequiredRequiredSymbol[55], SecurityID[48]STRING, INT
CURRENCYOptionalOptionalCurrency[15]STRING
SIDERequiredRequiredSide[54]ENUM
CONTRACT_MULTIPLIEROptionalOptionalContractMultiplier[231]FLOAT
PRICEOptionalOptionalPrice[44]FLOAT
PRICE_TWOBANNEDBANNEDPrice2[640]FLOAT
QUANTITYOptionalOptionalOrderQty[38]FLOAT
QUANTITY_TWOBANNEDBANNEDOrderQty2[192]FLOAT
LAST_PRICERequiredRequiredLastPx[31]FLOAT
LAST_PRICE_TWOBANNEDBANNEDLastPx2[...]FLOAT
LAST_QUANTITYRequiredRequiredLastQty[32]FLOAT
LAST_QUANTITY_TWOBANNEDBANNEDLastQty2[...]FLOAT
SETTLE_DATERequiredRequiredSettlDate[64]DATE
SETTLE_DATE_TWOBANNEDBANNEDSettlDate2[193]DATE
NUM_LEGSOptionalOptionalNoLegs[555]INT


The handling of an inbound maker execution update is both complex (because we are essentially rescinding historic actions) and trivial (because things never actually get modified). For the sake of completeness, Reflector handles the complexity, even though it can never happen. The risk instance, upon processing a maker execution update request, can emit the following warnings:

...

ExecID[17] will be looked up and execution invalidated if not already invalid. Additionally, if Reflector has previously blocked an execution identified by ExecID[17], then value of Text[58], if it exists, will be replaced by Reflector's ErrorCode.

Flag

Presence

FieldType
TEXTOptionalText[58]STRING
EXEC_IDRequiredExecID[17]STRING


OrderTimeOut[OT] & Currenex OrderTimeOut[U3]

ClOrdID[11] will be looked up and every associated execution invalidated. For Currenex only, U3 will be looked up instead of OT.

Flag

Presence in OT

Presence in U3

FieldType
ORDER_IDRequiredRequiredClOrdID[11]STRING


Reject[3] & BusinessMessageReject[j]

Reject[3] & BusinessMessageReject[j] are handled in the exact same way. If a corresponding execution is found when RefSeqNum[45] will be looked up, it will be invalidated. Additionally, if Reflector has previously blocked an execution identified by RefSeqNum[45], then the value of Text[58], if it exists, will be replaced by Reflector's ErrorCode.

Flag

Presence in 8

Presence in AE

FieldType
TEXTOptionalOptionalText[58]STRING
REF_SEQ_NUMRequiredRequiredRefSeqNum[45]INT

Copy

SessionType::COPY denotes special sessions reserved for dropcopy fill injection into Reflector.


Counter-Currency Trading

Dealt currency status is tricky to determine because traders and venues alike tend to omit the Currency[15] field. This is fine when the intention is to convey the base ccy order that it defaults to anyway, but sometimes the field is similarly omitted for a term ccy order, for example when this is established in a previous message or a different (quote) stream.

For this reason, new order requests on taker sessions that are responding to quotes must populate Currency[15].

On maker sessions, outbound executions must populate Currency[15] too because the inbound NewOrderSingle is similarly unscreened.

Note
In the inbound direction on both taker and maker sessions, since we are powerless to restrain the venue, Reflector must rely on previouly tested evidence that the venue will populate Currency[15] on a term order confirmation or term execution ack.


Account Multiplexing

Some customers wish to map to multiple accounts per session, through Account[1] or otherwise. This is supported through Reflector, but it must know the complete set of allowed account tag values and what risk pool they belong to.

On a credential with account multiplexing set up, any order submission with a missing or unknown account tag will be rejected.