• Version 1.7.1
Show / Hide Table of Contents

Typed Messages Sample

This sample shows how to use Typed Messages.

NOTE: Please do not forget to regenerate the generated/OnixS.SimpleBinaryEncoding.Cme.dll file after updating the ilinkbinary.xml file. Use the ../../tools/SbeCodeGenerator tool to do this.

Source code


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

namespace TypedMessages
{
    internal static class TypedMessages
    {
        private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        private const int ExecutionReportNewTemplateId = 522;
        private const int ExecutionReportRejectTemplateId = 523;
        private const int BusinessRejectTemplateId = 521;
        private const int DefaultSecurityId = 5424; // Channel 54 - "CME Equity Options"
        private const decimal DefaultPrice = -46190;
        private const ulong PartyDetailsListReqID = 1;
        private const int MaxMsgSize = 65536;

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

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

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

            int securityId = args.Length >= 4 ? int.Parse(args[3], CultureInfo.InvariantCulture) : DefaultSecurityId;
            decimal price = args.Length >= 5 ? decimal.Parse(args[4], CultureInfo.InvariantCulture) : DefaultPrice;

            try
            {

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

                using (Session session = new (settings, marketSegmentId))
                {
                    session.InboundApplicationMessage += Session_InboundApplicationMessage;
                    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();
                    NewOrderSingle514 order = CreateOrder(PartyDetailsListReqID, securityId, price);
                    session.Send(order);

                    Console.WriteLine("The order was sent. Press Enter to close the application.");

                    Console.ReadLine();

                    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());
                Console.WriteLine("Press Enter to exit...");
                Console.ReadLine();
            }

            NLog.LogManager.Shutdown();
        }

        private static NewOrderSingle514 CreateOrder(ulong partyDetailsListReqID, int securityId, decimal price)
        {
            return new NewOrderSingle514(new byte[MaxMsgSize], true)
            {
                ClOrdID = Guid.NewGuid().ToString(),
                ExecInst = 0,
                //ExecutionMode = ExecMode.Aggressive,
                Location = "UK",
                ManualOrderIndicator = ManualOrdIndReq.Automated,
                OrderQty = 1,
                OrderRequestID = GetUniqueID(),
                OrdType = OrderTypeReq.Limit,
                PartyDetailsListReqID = partyDetailsListReqID,
                Price = price,
                SecurityID = securityId,
                SenderID = "GFP",
                Side = SideReq.Buy,
                TimeInForce = TimeInForce.Day,
            };
        }

        private static void Session_InboundApplicationMessage(object sender, InboundMessageEventArgs e)
        {
            Console.WriteLine("Incoming application message: " + e.Message);
            switch (e.Message.TemplateID)
            {
                case ExecutionReportNewTemplateId:
                    ProcessExecutionReportNew((ExecutionReportNew522)e.Message);
                    break;
                case ExecutionReportRejectTemplateId:
                    ProcessExecutionReportReject((ExecutionReportReject523)e.Message);
                    break;
                case BusinessRejectTemplateId:
                    ProcessBusinessReject((BusinessReject521)e.Message);
                    break;
            }
        }

        private static void ProcessBusinessReject(BusinessReject521 message)
        {
            Console.WriteLine($"Message is rejected: {message.Text}");
        }

        private static void ProcessExecutionReportNew(ExecutionReportNew522 message)
        {
            Console.WriteLine($"Order {message.ClOrdID} is accepted");
        }
        private static void ProcessExecutionReportReject(ExecutionReportReject523 message)
        {
            Console.WriteLine($"Order {message.ClOrdID} is rejected");
        }

        public static ulong GetUniqueID() => (ulong)Stopwatch.GetTimestamp() % 10000;
    }
}

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