FIXAntennaJava  2.26.0
CME iLink support

Preface

This article describes the FIX connectivity to iLink 2.X using the B2BITS FIX Antenna Java (tm) library CME iLink adaptor.

Overview

iLink 2.X is based on the FIX 4.2 protocol to establish and manage bi-directional sessions.

Using B2BITS FIX Antenna Java(tm) a user can establish connection with a FIX-over-FAST oriented

Quick start for CME iLink 2.X

This example provides a simple functionality for connecting to CME iLink server and reading data from it.

package com.epam.example;
import com.epam.common.FIXVersion;
import com.epam.fix.message.FIXField;
import com.epam.fix.message.FIXFieldList;
import com.epam.fix.message.FIXTypes;
import com.epam.fix.message.constants.FIXT11;
import com.epam.fixengine.FIXSession;
import com.epam.fixengine.FIXSessionListener;
import com.epam.fixengine.SessionParameters;
import com.epam.fixengine.SessionState;
import java.io.IOException;
import java.util.Calendar;
public class SimpleOrderSender {
private static Object lockSync = new Object();
public static void main(String[] args) throws IOException {
// creating connection parameters
SessionParameters details = new SessionParameters();
details.setFixVersion(FIXVersion.FIX42);
details.setHost("10.135.70.92");
details.setHeartbeatInterval(30);
details.setPort(10337);
details.setSenderCompId("0D8004N");
details.setTargetCompId("CME"); // always CME
details.setSenderSubId("3B2");
details.setTargetSubId("G");
details.setSenderLocationId("USA");
details.getIncomingLoginFixFieldList().add(new FIXField(95, "3"));
details.getIncomingLoginFixFieldList().add(new FIXField(96, "3B2"));
// During Logon process make sure that Sequence Number is set to 1 and tag 141 = Y
// (these are requirements to establish the very first session during current working week)
// All other mid-week logons should contain $141= N;
// CME does not reset sequence numbers during whole week (except if reset was not initiated by Client)
details.getIncomingLoginFixFieldList().add(new FIXField(141, "N"));
// create session we intend to work with
final FIXSession session = details.createNewFIXSession();
// listener for incoming messages and session state changes
FIXSessionListener application = new FIXSessionListener() {
// this method will be called every time session state is changed
public void onSessionStateChange(SessionState sessionState) {
System.out.println("Session state changed:" + sessionState);
// this callback is called upon session state change
if (sessionState == SessionState.DISCONNECTED) {
// end this session
session.dispose();
}
}
// processing incoming messages
public void onNewMessage(FIXFieldList message) {
// this callback is called upon new message arrival
String msgType = message.getTagStringValue(FIXT11.Header.MsgType);
if("8".equals(msgType)) {
System.out.println("New execution report received: " + message);
// wait for any execution report
synchronized (lockSync) {
lockSync.notify();
}
} else {
System.out.println("New message received: " + message);
}
}
};
// setting listener for incoming messages
session.setFIXSessionListener(application);
// initiate connection
try {
session.connect();
} catch (Exception e) {
System.err.println("Error on connect. Cause: " + e.getMessage());
System.exit(0);
}
// creates the order
FIXFieldList order = createOrder();
//send order
sendNewOrder(session, order);
// wait for execution reports
waitForAnswer();
// disconnecting
session.disconnect("User request");
// we don't want to received logout, shutdown immediately
session.dispose();
}
private static void waitForAnswer() {
synchronized (lockSync) {
try {
lockSync.wait(5000);
} catch (InterruptedException e) {
}
}
}
private static void sendNewOrder(FIXSession session, FIXFieldList order) {
System.out.println("Sending new order: " + order);
session.sendMessage("D", order);
}
private static FIXFieldList createOrder() {
final FIXFieldList order = new FIXFieldList();
order.add(new FIXField(1, "ACCOUNT1"));
order.add(new FIXField(21, "1"));
order.add(new FIXField(11, "CLORDR:" + Long.toString(System.currentTimeMillis())));
order.add(new FIXField(55, "963"));
order.add(new FIXField(167, "FUT"));
order.add(new FIXField(107, "1CLH1"));
order.add(new FIXField(54, "1"));
order.add(new FIXField(60, FIXTypes.formatUTCTimestamp(Calendar.getInstance())));
order.add(new FIXField(38, "100"));
order.add(new FIXField(40, "2"));
order.add(new FIXField(44, "9825"));
order.add(new FIXField(59, "0"));
order.add(new FIXField(204, "0"));
order.add(new FIXField(9702, "4"));
order.add(new FIXField(9717, "90001210"));
order.add(new FIXField(9768, "N"));
return order;
}
}

iLink MSGW

Key requirements:

How to create an application for iLink MSGW To create MSGW session you need special configuration for FIXAJ and special FIX dictionary. You can find example of configuration in "examples\etc\msgw\" and dictionary "ilink_dic\cmeilink_msgw_fix42.xml" in the cmeilinkadaptor package If you are not going to use a Fault Tolerance connection, you can use the example described above.

Example how to connect to iLink MSGW with Fault Tolerance you can find in cmeilinkadaptor package(examples\src\com\epam\example\msgw\SimpleOrderSenderSessionMSGW.java)

CME iLink adaptor configuration

iLink adaptor reads configurations parameters from the engine.properties file which is plased in appropriate etc directory of iLink distribution.

 - Configuration parameters
    - maxRequestResendInBlock - defines the maximum requested messages in one resend request block. CME iLink specification
      it is highly recommended the client system request the maximum limit of 2500 messages.

    - includeLastProcessed - include or exclude the 369 tag from messages.
      According to the CME iLink specification the 369 tag should be included in all messages.

    - forceSeqNumReset - This parameter allow to automatically resolve sequence gap problem (for example, when there is every day
       sequence reset). Supported values: Always, OneTime, Never.<br/>

        If this parameter is set to:
        - Always - session will send logon with 34= 1 and 141=Y every times (during connection and reconnection).
        - OneTime - session will send logon with 34= 1 and 141=Y only one time (during connection).
        - Never - this means that user can sets the 34= 1 and 141=Y from session parameters by hand.

    - validation.FIX42.additionalDictionaryFileName - defines path to additional dictionary.

    - validation.FIX42.additionalDictionaryUpdate - defines if replace or update the additional dictionary.