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