• Version 1.7.1
Show / Hide Table of Contents

Order Entry Service Gateway Sample Project

This sample shows how to connect to the Order Entry Service Gateway.

When the session is established, the 'PartyDetailsDefinitionRequest'(MsgType='CX') SBE message is sent to the counterparty.

Source code


using OnixS.SimpleBinaryEncoding;
using OnixS.Cme.ILink3;
using System;
using System.Globalization;
using System.Configuration;

namespace OrderEntryServiceGatewaySample
{
    internal class OrderEntryServiceGatewaySample
    {
        private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        private const int BusinessRejectTemplateId = 521;
        private const int PartyDetailsDefinitionRequestTemplateId = 518;
        private const ulong PartyDetailsListReqID = 1;

        private static void Main(string[] args)
        {
            Console.WriteLine("CME iLink 3 Order Entry Service Gateway Sample.");

            string host = "127.0.0.1";
            int port = 49152;
            int marketSegmentId = 12;

            if (args.Length < 3)
            {
                Console.WriteLine("usage: [MarketSegmentId] [Host] [Port] (PartyDetailsListReqID)");
                return;
            }
            else
            {
                marketSegmentId = int.Parse(args[0], CultureInfo.InvariantCulture);
                host = args[1];
                port = int.Parse(args[2], CultureInfo.InvariantCulture);
            }

            ulong partyDetailsListReqID = args.Length >= 4 ? ulong.Parse(args[3], CultureInfo.InvariantCulture) : PartyDetailsListReqID;

            try
            {
                SessionSettings settings = new()
                {
                    LicenseStore = "../../../../../license|../../../../license|.",
                    TradingSystemVersion = "NC1.6",
                    TradingSystemName = "Trading System",
                    TradingSystemVendor = "OnixS",
                    SessionId = ConfigurationManager.AppSettings["SessionId"],
                    FirmId = ConfigurationManager.AppSettings["FirmId"],
                    AccessKey = ConfigurationManager.AppSettings["AccessKey"],
                    SecretKey = ConfigurationManager.AppSettings["SecretKey"]
                };

                using (Session session = new(settings, marketSegmentId))
                {
                    session.InboundApplicationMessage += (object sender, InboundMessageEventArgs e) => {
                        Console.WriteLine($"\nIncoming application message: {e.Message}\n");

                        if (e.Message.TemplateID == BusinessRejectTemplateId)
                        {
                            Console.WriteLine("\nWARNING: Please check that you are connecting to the Order Entry Service Gateway IP address. " +
                                "It can be found in the MSGW_Config.xml file from sftpng.cmegroup.com.");
                        }
                    };

                    session.InboundSessionMessage += (object sender, InboundMessageEventArgs e) => Console.WriteLine($"\nIncoming session message: {e.Message}\n");
                    session.Warning += (object sender, SessionWarningEventArgs e) => Console.WriteLine($"WARNING: {e.Description}\n");
                    session.Error += (object sender, SessionErrorEventArgs e) => Console.WriteLine($"ERROR: {e.Description}\n"); ;

                    session.Reset();
                    session.Connect(host, port);

                    IEncoder encoder = session.CreateEncoder();
                    IMessage request = CreatePartyDetailsDefinitionRequest(encoder, partyDetailsListReqID);
                    session.Send(request);

                    Console.WriteLine("The PartyDetailsDefinitionRequest was sent.");

                    WaitForEnterKey("Press Enter to close the application.");

                    Console.WriteLine("Disconnect the session and terminate the application.");

                    session.Disconnect();
                }

                Console.WriteLine("Done.");

            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.ToString());
                logger.Error("Exception: " + ex.ToString());

                WaitForEnterKey("Press Enter to exit...");
            }

            NLog.LogManager.Shutdown();
        }

        private static IMessage CreatePartyDetailsDefinitionRequest(IEncoder encoder, ulong partyDetailsListReqID)
        {
            IMessage message = encoder.Wrap(PartyDetailsDefinitionRequestTemplateId);

            message
                .SetUnsignedLong(Tag.PartyDetailsListReqID, partyDetailsListReqID)
                .SetChar(Tag.ListUpdateAction, (char)ListUpdAct.Add)
                .SetByte(Tag.CustOrderCapacity, (byte)CustOrderCapacity.AllOther)
                .SetByte(Tag.ClearingAccountType, (byte)ClearingAcctType.Firm)
                .SetChar(Tag.CustOrderHandlingInst, (char)CustOrdHandlInst.AlgoEngine)
                .SetUnsignedLong(Tag.Executor, 1u)
                .SetChar(Tag.CmtaGiveupCD, (char)CmtaGiveUpCD.GiveUp)
                .SetUnsignedLong(Tag.IdMShortCode, 1u);

            const byte PartyDetailsGroupSize = 3;

            IGroup details = message.SetGroup(Tag.NoPartyDetails, PartyDetailsGroupSize);

            details.MoveNext();
            details
                .SetString(Tag.PartyDetailId, ConfigurationManager.AppSettings["FirmId"])
                .SetUnsignedShort(Tag.PartyDetailRole, (ushort)PartyDetailRole.ExecutingFirm);

            details.MoveNext();
            details
                .SetString(Tag.PartyDetailId, "CSET_TEST")
                .SetUnsignedShort(Tag.PartyDetailRole, (ushort)PartyDetailRole.CustomerAccount);

            details.MoveNext();
            details
                .SetString(Tag.PartyDetailId, ConfigurationManager.AppSettings["FirmId"])
                .SetUnsignedShort(Tag.PartyDetailRole, (ushort)PartyDetailRole.Operator);

            return message;
        }

        private static void WaitForEnterKey(string message)
        {
            Console.WriteLine(message);

            if (Console.IsInputRedirected)
                Console.In.Read();
            else
                Console.ReadKey();
        }
    }
}

CME Tags


namespace OrderEntryServiceGatewaySample
{
    internal static class Tag
    {
        internal const int PartyDetailsListReqID = 1505;
        internal const int ListUpdateAction = 1324;
        internal const int CustOrderCapacity = 582;
        internal const int ClearingAccountType = 1816;
        internal const int CustOrderHandlingInst = 1031;
        internal const int Executor = 5290;
        internal const int CmtaGiveupCD = 9708;
        internal const int IdMShortCode = 36023;
        internal const int NoPartyDetails = 1671;
        internal const int PartyDetailId = 1691;
        internal const int PartyDetailRole = 1693;
    }

    internal enum ListUpdAct
    {
        Add = 'A',
        Delete = 'D'
    }

    internal enum CustOrderCapacity
    {
        MemberTradingForTheirOwnAccount = 1,
        ClearingFirmTradingForItsProprietaryAccount = 2,
        MemberTradingForAnotherMember = 3,
        AllOther = 4
    }

    internal enum ClearingAcctType
    {
        Customer = 0,
        Firm = 1
    }

    internal enum CustOrdHandlInst
    {
        FCMProvidedScreen = 'C',
        OtherProvidedScreen = 'D',
        FCMAPIOrFIX = 'G',
        AlgoEngine = 'H',
        DeskElectronic = 'W',
        ClientElectronic = 'Y'
    }

    internal enum CmtaGiveUpCD
    {
        GiveUp = 'G',
        SGXOffset = 'S'
    }

    internal enum PartyDetailRole
    {
        ExecutingFirm = 1,
        CustomerAccount = 24,
        TakeUpFirm = 96,
        Operator = 118,
        TakeUpAccount = 1000
    }
}

In this article
Back to top Copyright © Onix Solutions.
Generated by DocFX