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;
}
}