Page tree
Skip to end of metadata
Go to start of metadata

VERSION 1.2

Overview

This article describes mapping rules which are applied to incoming TOF-messages in order to convert them to FIX4.4 messages.

Deal Types recognition rules

Below is the table that represents the rules for recognition of the deal type in incoming Record Response (340).

Deal type
Matching predicate
Field Lists
Comment
FXSpotPure Deal-Type (569) == '2'501Spot
FXFwdPure Deal-Type (569) == '4' and not exists(Fixing Date 1 (554))Outright
FXSwapPure Deal-Type (569) == '8' and not exists(Fixing Date 1 (554)) and not exists(Fixing Date 2 (555))502Swap
NDF(Pure Deal-Type (569) == '4' and exists(Fixing Date 1 (554)) or (Pure Deal-Type (569) == '8' and exists(Fixing Date 1 (554)) and exists(Fixing Date 2 (555)))501/502NDF Outright or NDF Swap
FXDepositPure Deal-Type (569) == '16'503Deposit
FXFRAPure Deal-Type (569) == '32'505FRA

TOF Record Response to FIX Trade Capture Report mapping rules

Below is the table which represents rules of mapping which are applied to TOF Record Response (340) message in order to convert it to FIX Trade Capture Report (msgType = AE) message.

TOF

FIX 4.4


Mapping Rules


Comment

TOF fieldTOF tagFIX fieldFIX tagReq'dValid ValuesData Type
--TradeReportID571Y

-

String

FIX 571 = tcid#N, where tcid is four-character code.

tcid#N is extracted from header …<US>…<GS>tcid#N<US>…

Unique identifier of Trade Capture Report ('AE')
--SenderSubID50Y-StringFIX 50 = 'REUTERS'Assigned value used to identify specific message originator
--TradeReportTransType487N

0 = New

1 = Cancel

2 = Replace

int

FIX 487 = '0'

Identifies Trade Capture Report (AE) message transaction type
Direction514TrdSubType829N

0 = Regular Trade

12 = Exchange for Swap

22 = Privately Negotiated Trades

51 = Deposits

52 = Blank credit

53 = Repurchase agreement

intif DealType == FXDeposit or DealType == FXFRA FIX 829=51-
--ExecID17N-String

FIX 17 = tcid#N, where tcid is four-character code.

tcid#N is extracted from header …<US>…<GS>tcid#N<US>…

Unique identifier of Execution Report
--SecondaryExecID527N-StringNot mappedIdentifier of original Swap for MICEX Spot
--PreviouslyReported570YN = Not reportedBooleanFIX(570) = 'N'-
ID of the original it this is a Contra567TradeReportRefID572N-String
  • if TOF 567 != tcid#0, FIX 572 = TOF 567
  • if TOF 568 != tcid#0, FIX 572 = TOF 568
The TradeReportID (571) that is being referenced for correction or cancelation. For REPO Margin Calls in MICEX: reference to tag 818 tag of original REPO deal
ID of previous if this is a next568
Rate Direction524PriceType423N-int
  • if TOF 524 = '1', FIX 423 = '20'
  • if TOF 524 = '2', FIX 423 = '21'
-
Price Convention573

PriceSubType

10423N-intIf Exists(TOF 573), FIX 10423 = TOF 573-
--ExecType150N

F = Trade

G = Trade Correct

H = Trade Cancel

char

 FIX 150 = 'F'

-
Currency 1517Symbol55YFormat: Crncy1/Crncy2StringFIX 55 = concat (TOF 517, '/', TOF 518)Crncy1, Crncy2 - 3 character ISO Currency code. Example: 'USD/JPY', 'EUR/USD'
Currency 2518
--SecurityID48N-StringNot mapped-
--SecurityIDSource22N4 = ISIN CodeStringNot mapped-
--Product460N

2 = Commodity

4 = Currency

5 = Equity

6 = Government

8 = Loan

11 = Municipal

int
  • if DealType = FXDeposit || DealType = FXFRA FIX 460 = '9'
  • else FIX 460 = '4'

 

-
--CFICode461N

MRCXXX = Currency

ESXXXX = Common stock

EPXXXX = Preferred stock

DBXXXX = Bonds

EUXXXX = Mutual fund

"OgsCXN" = Non-standardized Option on Currency.

g: C=Call / P=Put,

s: A=American / E=European.

String
  • if DealType = FXDeposit || DealType = FXFRA FIX 461 = 'DCXXXX'
  • else FIX FIX 461 = 'MRCXXX'
Indicates the type of security using ISO standard, Classification of Financial Instruments (CFI code) values. 
--SecurityType167Y

CS = Common stock

PS = Preferred stock

EUSOV = Eurobond

MUNI = Municipal bond

BN = Bank notes

CORP = Corporate bond

MF = Mutual fund

FOR = Foreign Exchange Contract

OPT = Options

String
  • if DealType = FXDeposit || DealType = FXFRA FIX 167 = 'CD'
  • else FIX FIX 167 = 'FOR'
 
Settlement674SecuritySubType762N

‘DELIVERABLE’
‘NON-DELIVERABLE’

String
  • if TOF 674 == '1', FIX 762 == 'DELIVERABLE'
  • if TOF 674 == '2', FIX 762 == 'NON-DELIVERABLE'
  • else don't map
-
Pure-Deal type569SecurityDesc107N

 -

String
  • If Deal type = 'FXSpot', FIX 107 = 'FXSPOT'
  • If Deal type = 'FXSwap', FIX 107 = 'FXSWAP'
  • If Deal type = 'FXFwd', FIX 107 = 'FXFORW'
  • If Deal type = 'NDF', FIX 107 = 'NDF'
  • If Deal type = 'FXFRA', FIX 107 = 'FXFRA'
  • If Deal type = 'FXDeposit', FIX 107 = 'DEPZ'

Please see Deal Types recognition rules for details of Deal type recognition.

Security description

FRA Fixing Date/Fixing Date Period 1554
FRA Settlement Date/Fixing Date Period 2555
Source Reference501TradeID1003N-StringFIX 1003 = TOF 501-
Secondary Source Reference539SecondaryTradeID1040N-String

FIX 1040 = TOF 539

-
 - -NoEvents864N-NumInGroup
  • If NoEvents repeating group is not empty/absent, create new repeating group entry NoEvents (864) = 1
  • else NoEvents (864) = current tag value + 1
-
FRA Fixing Date/Fixing Date Period 1554EventType=> 865Y - intFIX 865 [1] = '101' -
EventDate => 866Y - LocalMktDateFIX 866 [1] = convert2LocalMktDate(TOF 554) -
--NoUnderlyings711 N - NumInGroupNot mapped Is used for REPO only. Absent otherwise.
--UnderlyingSymbol  => 311N - StringNot mapped Is used for REPO only. Absent otherwise.
--NoUnderlyingStips887N - NumInGroupNot mapped -
--UnderlyingStipType=> 888N- StringNot mapped-
--UnderlyingStipValue=> 889N- StringNot mapped-
Direction514StartDate 916N-LocalMkDate
  • if (DealType = 'FXDeposit') AND Exists(TOF 525), then FIX 916 = TOF 525
  • if (DealType = 'FXFRA') AND Exists(TOF 555), then FIX 916 = TOF 555
-
Value Date Period 1 Currency 1525
FRA Settlement Date555
Direction514EndDate 917N-LocalMkDate
  • if (DealType = 'FXDeposit') AND Exists(TOF 527), then FIX 917 = TOF 527
  • if (DealType = 'FXFRA') AND Exists(TOF 556), then FIX 917 = TOF 556
-
Value Date Period 2 Currency 1527
FRA Maturity Date/Payment Date/Premium Date for FXO556
--DeliveryType919N-intNot mapped-
Period 1515SettlType63C

0 = Regular / FX Spot settlement (T+1 or T+2 depending on currency)

1 = Cash / TOD (T+0)

2 = Next Day (T+1) / TOM (T+1)

6 = Future

char

if DealType = FXSpot:

  • if TOF 515 in (0, 5, 11-14, 21-80, 101-199) FIX 63 = 6
  • if TOF 515 in(1, 2, 3)  FIX 63 = TOF 515
  • if TOF 515 = 4  FIX 63 = 0
  • if TOF 515.isEmpty or not TOF 515.exist FIX 63=

    

 

 

The field is set for FX Spot.

If 515 tag is empty or not exists, we should to map it to empty FIX.63 tag

To be able send and process empty fix tags there should be switch set following option in Fix Antenna Cpp configuration file:

Session.Default.Validation.ProhibitTagsWithoutValue = false


Pure-Deal type569SettlDate64CFormat: YYYYMMDDLocalMktDate

if TOF 569 == '2' OR TOF 569 == '4', FIX 64 = convert2LocalMktDate (TOF 525)

-
Value date Period 1 Currency 1525
Date of Deal502TradeDate75NFormat: YYYYMMDDLocalMktDate

FIX 75 = MakeLocalTimeFromUtc (TOF 502, TOF 503)

-
Time Of Deal503
Deal Volume Currency 1519LastQty32N-QtyFIX 32 = TOF 519Amount of dealt currency.
Pure-Deal type569LastPx31Y-Price
  • if TOF 569 == '2' OR TOF 569 == '4', FIX 31 = TOF 522
  • if TOF 569 == '8', FIX 31 = TOF 521
  • if TOF 569 == '16' OR TOF 569 == '32', FIX 31 = TOF 520
-
Deposit Rate520
Swap Rate521
Exchange Rate Period 1522
--Yield236N-PercentageNot mapped-
--Price10044N-PriceNot mapped-
--Price210640N-PriceNot mapped-
--NoSides552Y-intFIX 552 = '1'

For data from Bloomberg NoSides(552)=2 always.

For data from Reuters can be 1 or 2 depends on Method of deal (540) field

Direction514Side=> 54Y

'1' = Buy

'2' = Sell

'F' = Lend

'G' = Borrow

char
  • if TOF 514 in ('1','3'), FIX 54 [1] = '1'
  • if TOF 514 in ('2','4'), FIX 54 [1] = '2'
  • if TOF 514 in ('5','7'), FIX 54 [1] = 'F'
  • if TOF 514 in ('6','8'), FIX 54 [1] = 'G'
-
Review Reference Number552OrderID=> 37Y-String

FIX 37 [1] = TOF 552

First entry contains deal ID as assigned by corresponding data feed (Reuters, Bloomberg or Micex). Second entry (if presents) contains ID of the matching deal as assigned by corresponding data feed (Reuters, Bloomberg or Micex)
--ClOrdID=> 11N-StringNot mappedThe field is provided by Bloomberg only. Absent for Trade Captures received from Reuters and Micex
Currency 1517Currency=> 15N-CurrencyFIX 15 [1] = TOF 5173 character ISO Currency code of the Dealt Currency
Base Currency544SettlCurrency=> 120N-CurrencyFIX 120 [1] = TOF 5443 character ISO Currency code for settlement denomination
--Account=> 1N-StringNot mappedAccount mnemonic
--TradingSessionID=> 336N-StringNot mappedIdentifier for Trading Session and Board
--TradingSessionSubID=> 625N-StringNot mappedSubidentifier for Trading Session
--GrossTradeAmt=> 381N-AmtNot mappedTotal amount traded
--AccruedInterestAmt=> 159N-AmtNot mappedAmount of Accrued Interest
--Commission=> 12N-AmtNot mappedCommission
--CommType=> 13N-charNot mappedCommission type
Volume Of Interest570EndAccruedInterestAmt=> 920N-Amtif Exists(TOF 570), FIX 920 = TOF 570-
--StartCash=> 921N-AmtNot mapped-
--EndCash=> 922N-AmtNot mapped-
Pure-Deal type569PeriodCurrency1=> 9073N-StringIf TOF 569 in ('2', '4'), FIX 9073 = TOF 529-
Payment Instruction Period 1 Currency 1529
Pure-Deal type569PeriodCurrency2=> 9074N-StringIf TOF 569 in ('2', '4'), FIX 9074 = TOF 530-
Payment Instruction Period 1 Currency 2/Their Premium Payment Instruction530
Pure-Deal type569TotalGrossTradeAmt=> 2369N-AmtIf TOF 569 in ('2', '4'), FIX 2369 = TOF 545-
Calculated Volume Period 1 Currency 2545
--NoMiscFees=> 136N-NumInGroupNot mappedNumber of repeating groups of miscellaneous fees
--MiscFeeAmt=> => 137N-AmtNot mappedMiscellaneous fee value
--MiscFeeType=> => 139N-intNot mappedIndicates type of miscellaneous fee
Broker Dealing Code510NoPartyIDs=> 453YThere should be greater than or equal to 2 repeating groups.int
  • if not exist (TOF 510, 511), then FIX 453 [1] = '2' 
  • if exist (TOF 510) or exist (TOF 511), then FIX 453 [1] = '3'
  • if exist (TOF 510, 511), then FIX 453 [1] = '4' 

-

Broker Name511
Local TCID551PartyIDSource=> => 447N

From Reuters and Micex:
D = Proprietary/Custom code

From Bloomberg:
C = Generally accepted

charFIX 447[1][1] = 'D'

-

PartyID=> => 448N-stringif exists(TOF 551), FIX 448[1][1] = TOF 551-
PartyRole=> => 452N

17 = Contra Firm for counterparty

26 = Correspondent Broker

27 = Buyer/Seller for recepient

39 = Contra Investor ID
intif exists(TOF 551), FIX 452[1][1] = '27'
-
NoPartySubIDs=>=> 802N- if exists(TOF 551), FIX 802[1][1] = '2'-
Bank1 Name509PartySubID=>=>=>523N-string
  • if exists (TOF 509) and trim(TOF 509)  not empty, FIX 523[1][1][1] = TOF 509
  • else FIX 523[1][1][1] = 'UNK'

-

PartySubIDType=> => =>803N

1 = Firm
2 = Person
9 = Contact Name
4001 = Counterparty ID 1
4002 = Counterparty ID 2
4003 = Counterparty ID 3
4004 = Counterparty ID 4

stringFIX 523[1][1][1] = '0'-
Dealer ID504PartySubID=> => =>523N-stringFIX 523[1][1][2] = trim(TOF 504)-
PartySubIDType=> => =>803N1 = Firm
2 = Person
9 = Contact Name
4001 = Counterparty ID 1
4002 = Counterparty ID 2
4003 = Counterparty ID 3
4004 = Counterparty ID 4
stringFIX 523[1][1][2] = '1'-
Bank1508PartyIDSource=> => 447N

From Reuters and Micex:
D = Proprietary/Custom code

From Bloomberg:
C = Generally accepted

charFIX 447[1][1][2] = 'D'-
PartyID=> => 448N-stringif exists(TOF 508) FIX 448[1][1][2] = trim(TOF 508)
PartyRole=> => 452N

17 = Contra Firm for counterparty

26 = Correspondent Broker

27 = Buyer/Seller for recepient

39 = Contra Investor ID
intFIX 452[1][1][2] = '17'
Brorker Name511PartyIDSource=> => 447N

From Reuters and Micex:
D = Proprietary/Custom code

From Bloomberg:
C = Generally accepted

charif exists(TOF 511) FIX 447[1][FIX 453 + 1] = 'D'
PartyID=> => 448N-charif exists(TOF 511), FIX 447[1][FIX 453 + 1] = TOF 511
-
PartyRole=> => 452N

17 = Contra Firm for counterparty

26 = Correspondent Broker

27 = Buyer/Seller for recepient

39 = Contra Investor ID
intif exists(TOF 511), FIX 452[1][FIX 453 + 1] = '26'
-
Broker Dealing Code510PartyIDSource=> => 447N

From Reuters and Micex:
D = Proprietary/Custom code

From Bloomberg:
C = Generally accepted

charif exists(TOF 511), FIX 447[1][FIX 453 + 1] = 'D'-
PartyID=> => 448N- if exists(TOF 511), FIX 447[1][FIX 453 + 1] = TOF 510-
PartyRole=> => 452N

17 = Contra Firm for counterparty

26 = Correspondent Broker

27 = Buyer/Seller for recepient

39 = Contra Investor ID

intif exists(TOF 511), FIX 452[1][FIX 453 + 1] = '39'
-
 - -NoStipulations=> 232N1intFIX 232 = '1'-
 - -StipulationType=>=> 233Y-StringFIX 233 [0] = 'TEXT'-
Conversation Text548StipulationValue=>=> 234Y-StringFIX 234 [0] = TOF 548-
Pure-Deal type569NoLegs555C2int

If TOF 569 == '8' OR TOF 569 == '16' OR TOF 569 = '32', FIX 555 = '2'

-
Currency 1517LegSymbol=> 600YCrncy1/Crncy2String

FIX 600 [i] = concat(TOF 517,'/',TOF 518), i=1,2

Crncy1, Crncy2 - 3 character ISO Currency code. Example: 'USD/JPY', 'EUR/USD'
Currency 2518
--LegProduct=> 607N
int
  • if DealType = FXDeposit or FXFRA, FIX 607 = '9'
  • else FIX 607 = '4'
-
--LegCFICode=> 608N

MRCXXX = Currency

ESXXXX = Common stock

EPXXXX = Preferred stock

DBXXXX = Bonds

EUXXXX = Mutual fund

"OgsCXN" = Non-standardized Option on Currency.

g: C=Call / P=Put,

s: A=American / E=European

String
  • if DealType = FXDeposit or FXFRA, FIX 608 = 'DCXXXX'
  • else FIX 608 = 'MRCXXXX'
-
Direction514LegSide=> 624Y

1 = Buy

2 = Sell

char
  • if TOF 514 =='3', FIX 624 [1] = '1'
  • if TOF 514 =='3', FIX 624 [2] = '2'
  • if TOF 514 =='4', FIX 624 [1] = '2'
  • if TOF 514 =='4', FIX 624 [2] = '1'
-
Currency 1517LegCurrency=> 556Y3 character ISO Currency codeCurrencyFIX 556 [i] = TOF 517, i=1,2-
Period 1515LegSettlType=> 587N

0 = Regular / FX Spot settlement (T+1 or T+2 depending on currency).

1 = Cash / TOD (T+0)

2 = Next Day (T+1) / TOM (T+1)

6 = Future

char
  • if TOF X == '4', FIX 587 [i] = '0'
  • if TOF X == '1', FIX 587 [i] = '1'
  • if TOF X == '2', FIX 587 [i] = '2'
  • if TOF X == '3', FIX 587 [i] = '3'
  • if TOF X in ('0';'5';'11'-'14';'21'-'80';'101'-'199'), FIX 587 [i] = '6'

where:

X = 515, [i==1]

X = 516, [i==2]

-
Period 2516
Value Date Period 1 Currency 1525LegSettlDate=> 588NFormat: YYYYMMDDLocalMktDate

if DealType = FXFRA:

  • FIX 588[1] = convert2LocalMktDate(TOF 555)
  • FIX 588 [2] = convert2LocalMktDate(TOF 556)

else:

  • FIX 588[1] = convert2LocalMktDate(TOF 525)
  • FIX 588 [2] = convert2LocalMktDate(TOF 527)
-
Value Date Period 2 Currency 1527
FRA Settlement Date555
FRA Maturity Date556
Deal Volume Currency 1519LegQty=> 687N-Qty

FIX 687 [1] = TOF 519

FIX 687 [2] = TOF 547

-
Deal Volume Period 2 Currency 1547
Exchange Rate Period 1522LegLastPx=> 637N-Price

FIX 637 [1] = TOF 522

FIX 637 [2] = TOF 523

-
Exchange Rate Period 2523
Calculated Volume Period 1 Currency 2545LegTotalGrossTradeAmt=> 2359N-Amt

if TOF 569 == '8':

  • FIX 2359 [1] = TOF 545
  • FIX 2359 [2] = TOF 546

 

-
Calculated Volume Period 2 Currency 2546
Pure-Deal type569
Date of Deal502TransactTime60NFormat: YYYYMMDD-HH:MM:SSUTCTimestampFIX 60 = concat (convert2Timestamp(TOF 502),'-', TOF 503)Time the transaction represented by this Trade Capture Report ('AE') occurred
Time of Deal503
Date Confirmed505NoTrdRegTimestamps768N-TrdRegTS

if exists(TOF 505, TOF 506), FIX 768 = '1'

-
Time Confirmed506
Date Confirmed505TrdRegTimestamp=> 769NFormat: YYYYMMDD-HH:MM:SSUTCTimestampFIX 769 = concat (convert2Timestamp(TOF 505),'-', TOF 506)-
Time Confirmed506
--TrdRegTimestampType=> 770N--FIX 770 = '17'-
Payment instruction Period 1 Currency 1529LegPeriodCurrency1=> 9075N-String

If TOF 569 in ('7', '8', '9', '10', '16', '32') THEN:

  • FIX 9075 [1] = TOF 529;
  • FIX 9075 [2] = TOF 531.
-
Payment Instruction Period 2 Currency 1531
Pure-Deal type569
Payment Instruction Period 1 Currency 2/Payment Instruction Period 1 Currency 2530LegPeriodCurrency2=> 9076N-String

IF TOF 569 in ('7', '8') THEN:

  • FIX 9076 [1] = TOF 530
  • FIX 9076 [2] = TOF 532

 

-
Payment Instruction Period 2 Currency 2/Their Hedge Payment Instruction532
Pure-Deal type569
Comment Text553Text58N-StringFIX 58 = concat (TOF 553,'.','Title1:',TOF 561,'User Defined Data 1:',TOF 562,'Title2:',TOF 563,'User Defined Data 2:',TOF 564,'Title3:',TOF 565,'User Defined Data 3:',TOF 566)-
User-defined Title 1561
User-defined Data 1562
User-defined Title 2563
User-defined Data 2564
User-defined Title 3565
User-defined Data 3566
Spot Basis Rate560LastSpotRate194N-PriceFIX 194 = TOF 560-
Outright Points Premium Rate559LastForwardPoints195N-PriceOffsetFIX 195 = TOF 559-
ID of previous if this is 'next'568SecondaryTradeReportID818N-Stringif HasRelated(TOF 568), FIX 818 = TOF 568

Tag will be defined for MICEX only. Identifies REPO trade ID.

HasRelated means that field exists and contains <TCID>#<ticket number>, where ticket number != 0.

Method of Deal540TrdType828N

Valid values:

'0' Regular Trade

'1' Block Trade

'2' EFP (Exchange for physical)

'3' Transfer

'4' Late Trade

'5' T Trade

'6' Weighted Average Price Trade

'7' Bunched Trade

'8' Late Bunched Trade

'9' Prior Reference Price Trade

'10' After Hours Trade

intFIX 828 = TOF 540 + 100-
--USTradeType10001N

R = REPO first leg

r = REPO second leg

D = Margin call

charNot mapped.Tag will be defined for MICEX only.
--USTradeStatus10002N

M = Matched/confirmed (included into off-line settlement)

C = Cancelled by the Trading System

W = Withdrawn by the user

charNot mapped.Tag will be defined for MICEX only.
--TotalAmount10111N-AmtNot mapped.Tag will be defined for MICEX only.
Year Length572CouponDayCount1950N-intFIX 1950 = TOF 572Coupon Day Count.
--OperationType10003N

K = Deposit

D = Withdraw

charNot mapped.Tag will be defined for MICEX only.
Transaction ID585TransactionID2485N
stringFIX 2485 = TOF 585
  • No labels