Typed Messages Sample
Source code
using OnixS.SimpleBinaryEncoding;
using OnixS.Cme.ILink3;
using System;
using System.Globalization;
using System.Configuration;
using OnixS.SimpleBinaryEncoding.Cme;
namespace TypedMessages
{
static class TypedMessages
{
static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
const int ExecutionReportNewTemplateId = 522;
const int ExecutionReportRejectTemplateId = 523;
const int BusinessRejectTemplateId = 521;
const int DefaultSecurityId = 5424; // Channel 54 - "CME Equity Options"
const decimal DefaultPrice = -46190;
const ulong PartyDetailsListReqID = 1;
const int MaxMsgSize = 65536;
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 >= 5 ? int.Parse(args[4], CultureInfo.InvariantCulture) : DefaultSecurityId;
decimal price = args.Length >= 6 ? decimal.Parse(args[5], CultureInfo.InvariantCulture) : DefaultPrice;
try
{
SessionSettings settings = new SessionSettings();
settings.LoadDecoderLibrary = true;
settings.LicenseStore = "../../../../../license";
settings.TradingSystemVersion = "1.1.0";
settings.TradingSystemName = "Trading System";
settings.TradingSystemVendor = "OnixS";
settings.SessionId = ConfigurationManager.AppSettings["SessionId"];
settings.FirmId = ConfigurationManager.AppSettings["FirmId"];
settings.AccessKey = ConfigurationManager.AppSettings["AccessKey"];
settings.SecretKey = ConfigurationManager.AppSettings["SecretKey"];
using (Session session = new Session(settings, marketSegmentId))
{
session.InboundApplicationMessage += Session_InboundApplicationMessage;
session.InboundSessionMessage += Session_InboundSessionMessage;
session.OutboundApplicationMessage += Session_OutboundApplicationMessage;
session.OutboundSessionMessage += Session_OutboundSessionMessage;
session.Warning += Session_Warning;
session.Error += Session_Error;
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.");
Console.WriteLine("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)
{
NewOrderSingle514 message = new NewOrderSingle514(new byte[MaxMsgSize], true);
message.PartyDetailsListReqID = partyDetailsListReqID;
message.Side = SideReq.Buy;
message.SenderID = "GFP";
message.ClOrdID = "OrderId";
message.OrderRequestID = 1u;
message.Location = "UK";
message.OrdType = OrderTypeReq.Limit;
message.TimeInForce = TimeInForce.Day;
message.SecurityID = securityId;
message.OrderQty = 1;
message.Price = price;
message.ManualOrderIndicator = ManualOrdIndReq.Automated;
message.ExecutionMode = ExecMode.Aggressive;
message.ExecInst = ExecInst.AON;
return message;
}
private static void Session_Error(object sender, SessionErrorEventArgs e)
{
Console.WriteLine("Session error: " + e.Description);
}
private static void Session_Warning(object sender, SessionWarningEventArgs e)
{
Console.WriteLine("Session warning: " + e.Description);
}
private static void Session_OutboundSessionMessage(object sender, MessageEventArgs e)
{
Console.WriteLine("Outgoing session message: " + e.Message);
}
private static void Session_OutboundApplicationMessage(object sender, MessageEventArgs e)
{
Console.WriteLine("Outgoing application message: " + e.Message);
}
private static void Session_InboundSessionMessage(object sender, InboundMessageEventArgs e)
{
Console.WriteLine("Incoming session message: " + e.Message);
}
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");
}
}
}