Versions Compared

Key

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

Table of Contents

Solution overview

The diagram shows a configuration in which FIXEdge is a router between Client and Exchange. 

FIXEdge works with two sessions:

  1. Client <-> FIXEdge (FIX session 1) 
  2. FIXEdge <-> Exchange (FIX session 2)

Expected message flow: messages from the Client are routed to the Exchange and messages from the Exchange are routed back to the Client.
Sequences in such sessions FIX session 1 and FIX session 2 don't match. If the Exchange rejects a message from the client with session Reject (35=3), the Client often wants to get information about the rejected message. However, the value from RefSeqNum (45) tag doesn't refer to the original message from FIX Session 1.
As session-level messages aren't routed by BL rules, additional processing of session level Reject (35=3) is required to pass information about a rejected message back to the sender.

The following example shows how to use BL Rules and JavaScript to achieve it.

BL Rules configuration

Session level Rejects (35=3) trigger OnSessionLevelRejectEvent action on BL.

In OnSessionLevelRejectEvent action can be called a JavaScript preparing a reject message for sending to the required session. In this case, it is SENDER

Code Block
languagexml
<FIXEdge>
 <BusinessLayer>
  <!-- Rules for messages routing -->
  <Rule Description="Route messages from SENDER to REPORTER">
   <Source>
    <FixSession SenderCompID="SENDER" TargetCompID=".*"/>
   </Source>
   <Action>
    <Send>
     <FixSession SenderCompID="FIXEDGE" TargetCompID="REPORTER"/>
    </Send>
   </Action>
  </Rule>
  <Rule Description="Route messages from REPORTER to SENDER">
   <Source>
    <FixSession SenderCompID="REPORTER" TargetCompID=".*"/>
   </Source>
   <Action>
    <Send>
     <FixSession SenderCompID="FIXEDGE" TargetCompID="SENDER"/>
    </Send>
   </Action>
  </Rule>


  <!-- Rules for rejects routing -->
  <OnSessionLevelRejectEvent>
   <Source>
    <FixSession SenderCompID="REPORTER" TargetCompID=".*"/>
   </Source>
   <Action>
    <Script Language="JavaScript" FileName ="../FIXEdge1/conf/enrichReject.js"/>
    <Send>
     <FixSession SenderCompID="FIXEDGE" TargetCompID="SENDER"/>
    </Send>    
   </Action>
  </OnSessionLevelRejectEvent>

  <DefaultRule>
   <Action>
    <DoNothing/>
   </Action>
  </DefaultRule>
 </BusinessLayer>
</FIXEdge>   

JavaScript 

The JavaScript does the following:

...

2. Gets rejected message from the session logs with getMsgBySeqNum(<SenderCompId>, <TargetCompId> , <SeqNum>) function.

3. Serializes to the text serializeMessage(<tagDelimiter>)

4. Creates new reject message again with transform(<target protocol>, <target message type> )

5. Fills stored data from #1

...

SENDER session can get information about the rejected message from the Text (58) field:

Message

...

example

Sent message:

8=FIX.4.4|9=209|35=D|49=FIXEdge|56=FIXCLIENT|34=4|52=20180412-09:49:37.737|11=E2017000000000000000001|453=3|448=TestValue1|447=D|452=11|448=TestValue2|447=D|452=122|448=XYZT|447=D|452=17|1=EPAM-TEST|55=USD/CNH|15=USD|58=TEXT|10=078|

Received SessionLevelReject message:

8=FIX.4.4|9=245|35=3|49=FIXCLIENT|56=FIXEdge|34=4|52=20180412-09:49:37.738|45=4|371=452|372=D|373=6|58=Field value '122' does not meet ValBlock dictionary conditions in tag 452[Group tag=453, Entry #=1] in message New Order - Single (D) with sequence number 4.|10=210|

Info

See “How to update entities stored in History with referenced sequence number” also