{"id":22220623,"url":"https://github.com/fix8mt/ufeed_bindings_csharp","last_synced_at":"2025-03-25T07:41:39.040Z","repository":{"id":215362111,"uuid":"425228597","full_name":"fix8mt/ufeed_bindings_csharp","owner":"fix8mt","description":"C# language binding to UFEed.","archived":false,"fork":false,"pushed_at":"2021-11-16T06:39:32.000Z","size":217,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-30T07:12:47.025Z","etag":null,"topics":["csharp","fix","fix-engine","fix8","fix8-market","fix8pro","fixengine","fixprotocol","google-protocol-buffers","high-performance","low-latency","middle","middleware","zeromq"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fix8mt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-11-06T11:38:50.000Z","updated_at":"2022-10-16T11:10:50.000Z","dependencies_parsed_at":"2024-01-04T02:26:16.955Z","dependency_job_id":null,"html_url":"https://github.com/fix8mt/ufeed_bindings_csharp","commit_stats":null,"previous_names":["fix8mt/ufeed_bindings_csharp"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Fufeed_bindings_csharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Fufeed_bindings_csharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Fufeed_bindings_csharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Fufeed_bindings_csharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fix8mt","download_url":"https://codeload.github.com/fix8mt/ufeed_bindings_csharp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245422922,"owners_count":20612725,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","fix","fix-engine","fix8","fix8-market","fix8pro","fixengine","fixprotocol","google-protocol-buffers","high-performance","low-latency","middle","middleware","zeromq"],"created_at":"2024-12-02T23:09:22.339Z","updated_at":"2025-03-25T07:41:39.016Z","avatar_url":"https://github.com/fix8mt.png","language":"C#","readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.fix8mt.com\"\u003e\u003cimg src=\"fix8mt_Master_Logo_Green_Trans.png\" width=\"200\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# UFEed C# Binding\n\n-   [Introduction](#introduction)\n-   [Getting started](#getting-started)\n-   [Interface](#interface)\n    -   [UFEMessage and UFEMessage Builder](#ufemessage-and-ufemessage-builder)\n    -   [UFEedClient](#ufeedclient)\n-   [Constants](#constants)\n    -   [FIX variants constants](#fix-variants-constants)\n-   [Building](#building)\n\n\n------------------------------------------------------------------------\n\n# Introduction\n\nThe UFEed C# Adapter (`UFEed_C#`) provides a low level native C# interface to\nthe UFEGW. Interactions with the UFEGW are based around a `UFEedClient`\nobject from `UFE.UFEedClient` namespace which can be used to send and\nreceive Messages to and from the UFEGW.\n\nUse the following [Universal FIX engine documentaion](https://fix8mt.atlassian.net/wiki/spaces/FMT/pages/634438/Universal+FIX+Engine+Home) for a reference.\n\nFeatures of `UFEedClient`:\n\n-   System API support ([see 4. Implementation Guide - Section\n    1.3](https://fix8mt.atlassian.net/wiki/spaces/FIX8PRO/pages/628308/4.+Implementation+Guide))\n\n-   Business API support (eg. NewOrderSingle and standard FIX messages)\n\n-   Provides a 4-way communications API in order to make requests,\n    publish messages, receive responses and subscribe to broadcast\n    messages\n\n-   User defined implementation of callback interface to handle these\n    PUB, SUB, REQ and REP message events\n\n-   Dynamic configuration of PUB, SUB, REQ, REP addressing and topics\n\n-   Internal session management\n\nFeatures of a `UFEMessage` and `UFEMessage.Builder`:\n\n-   A generic container of fields, i.e. tag/typed value pairs with\n    possible nested messages called groups\n\n-   Smart field creation and access, rendering field value to ival, sval\n    or fval depending on context\n\n-   Named Message getters/setters (name, long_name, seq, service_id,\n    subservice_id)\n\n# Getting started\n\nThe `UFEed_C#` is provided as a .NetCore nuget project for Linux and Windows. 3rd-party\ndependencies are included to nuget package and will be downloaded during\n`nuget restore` command. ZeroMQ C# wrapper\n(\u003chttps://github.com/zeromq/clrzmq4\u003e) has native build for .NetCore,\nit's included in distribution as `ZeroMQ.1.0.0.nupkg`. Within the\npacked or target build `UFEed_C#` archive we find the following directory structure\n(example is Linux):\n\n```\nufeed_bindings_csharp\n├── packages\n│   ├── UFE.UFEedClient.\u003cversion\u003e.nupkg\n│   └── ZeroMQ.1.0.0.nupkg\n├── Program.cs\n└── UFE.UFEedClient.Sample.netcore.csproj\n```\n\n# Interface\n\nThe main `UFEed_C#` interfaces/classes are `UFEMessage` and `UFEedClient`.\nMost of `UFEMessage` field setters and `UFEedClient` setters follow\n'builder' pattern to simplify C# language constructs (i.e. setters\nreturn the reference to an object it was called from):\n\n```c#\n// logon\nvar login = _uc.CreateMessage()\n    .SetLongName(\"login\")\n    .SetType(StSystem)\n    .SetServiceId(UFE_CMD_LOGIN)\n    .AddField(UFE_CMD, UFE_CMD_LOGIN)\n    .AddField(UFE_LOGIN_ID, \"webuser\")\n    .AddField(UFE_LOGIN_PW, \"5e884898da28047151d0e56f8dc\");\n```\n\n## UFEMessage and UFEMessage Builder\n\nThe `UFEMessage` class provides read-only access to underlying `WireMessage` object and mapped message fields and groups. `UFEMessage.BuildeR` on the other hand gives write-access to underlying\n`WireMessage`. Messages are objects with which requests are made from the `UFEed_C#` to the UFEGW. `UFEMessage` ctors are public but in most cases `UFEedClient::CreateMessage()` factory method shall be used to extend `UFEMessage` class to other underlying protocols and middleware plugins in the future. `UFEMessage.Builder` class follows \"builder\" pattern to build a message.\n\n```c#\npublic class Builder\n{\n    /// \u003csummary\u003e\n    /// Ctors\n    /// \u003c/summary\u003e\n    public Builder(WireMessage wm);\n\n    /// \u003csummary\u003e\n    /// Message properties\n    /// \u003c/summary\u003e\n    public string Name { get; set; }\n    public string LongName { get; set; }\n    public WireMessage.Types.Type  Type { get; set; }\n    public int ServiceId { get; set; }\n    public int SubServiceId { get; set; }\n    public int Seq { get; set; }\n\n    /// \u003csummary\u003e\n    /// Message properties setters for builder pattern\n    /// \u003c/summary\u003e\n    public Builder SetName(string name);\n    public Builder SetLongName(string longName);\n    public Builder SetType(WireMessage.Types.Type type);\n    public Builder SetServiceId(int serviceId);\n    public Builder SetSubServiceId(int subServiceId);\n    public Builder SetSeq(int seq);\n\n    /// \u003csummary\u003e\n    /// Underlying \u003cc\u003eWireMessage\u003c/c\u003e readonly property\n    /// \u003c/summary\u003e\n    public WireMessage WireMessage { get; }\n\n    /// \u003csummary\u003e\n    /// Adds field with typed value\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"tag\"\u003eField tag\u003c/param\u003e\n    /// \u003cparam name=\"val\"\u003eField typed value\u003c/param\u003e\n    /// \u003cparam name=\"loc\"\u003eField location\u003c/param\u003e\n    /// \u003creturns\u003eself\u003c/returns\u003e\n    public Builder AddField(uint tag, long val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, ByteString val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, string val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, char val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, double val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, bool val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, DateTime val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, Guid val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, Message.Status val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddField(uint tag, object val, UFEFieldLocation loc = UFEFieldLocation.FlBody);\n    public Builder AddFields(IEnumerable\u003cUFEField\u003e fields);\n    public Builder AddGroup(uint tag, out UFEField group, Action\u003cBuilder, UFEField\u003e tr, UFEFieldLocation loc = UFEFieldLocation.FlBody)\n    public Builder AddGroupItem(UFEField group);\n\n    /// \u003csummary\u003e\n    /// Creates UFEMessage from builder\n    /// \u003c/summary\u003e\n    /// \u003creturns\u003ebuilt UFEMessage\u003c/returns\u003e\n    public UFEMessage Build();\n}\n```\n\n`UFEMessage`:\n\n```c#\npublic class UFEMessage\n{\n    /// \u003csummary\u003e\n    /// Ctors\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"wm\"\u003eOptional \u003cc\u003eWireMessage\u003c/c\u003e to construct from\u003c/param\u003e\n    public UFEMessage(WireMessage wm);\n\n    /// \u003csummary\u003e\n    /// Message properties\n    /// \u003c/summary\u003e\n    public string Name { get; }\n    public string LongName { get; }\n    public WireMessage.Types.Type  Type { get; }\n    public int ServiceId { get; }\n    public int SubServiceId { get; }\n    public int Seq { get; }\n\n    /// \u003csummary\u003e\n    /// Underlying \u003cc\u003eWireMessage\u003c/c\u003e readonly property\n    /// \u003c/summary\u003e\n    public WireMessage WireMessage { get; }\n\n    /// \u003csummary\u003e\n    /// Mapped fields property\n    /// \u003c/summary\u003e\n    public Dictionary\u003cuint, UFEField\u003e Fields { get; };\n\n    /// \u003csummary\u003e\n    /// Mapped groups property\n    /// \u003c/summary\u003e\n    public Dictionary\u003cuint, List\u003cUFEMessage\u003e\u003e Groups { get; };\n\n    /// \u003csummary\u003e\n    /// Finds field by tag\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"tag\"\u003efield tag to find\u003c/param\u003e\n    /// \u003creturns\u003eFound field or null if not found\u003c/returns\u003e\n    public UFEField FindField(uint tag);\n\n    /// \u003csummary\u003e\n    /// Finds field value by tag\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"tag\"\u003efield tag to find\u003c/param\u003e\n    /// \u003creturns\u003eFound field value or null if not found\u003c/returns\u003e\n    public object FindFieldValue(uint tag);\n\n    /// \u003csummary\u003e\n    /// Finds group by tag\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"tag\"\u003egroup tag to find\u003c/param\u003e\n    /// \u003creturns\u003eFound group or null if not found\u003c/returns\u003e\n    public List\u003cUFEMessage\u003e FindGroup(uint tag);\n\n    /// \u003csummary\u003e\n    /// Creates a new builder\n    /// \u003c/summary\u003e\n    /// \u003creturns\u003emessage builder from this message\u003c/returns\u003e\n    public Builder NewBuilder();\n}\n```\n\n`UFEMessage` and `UFEMessage.Builder` usage sample:\n\n```c#\n// logon\nvar login = _uc.CreateMessage()\n    .SetLongName(\"login\")\n    .SetType(StSystem)\n    .SetServiceId(UFE_CMD_LOGIN)\n    .AddField(UFE_CMD, UFE_CMD_LOGIN)\n    .AddField(UFE_LOGIN_ID, \"webuser\")\n    .AddField(UFE_LOGIN_PW, \"5e884898da28047151d0e56f8dc\");\nvar response = _uc.Request(login);\nif (1 != _receivedResMsgs.Count)\n    throw new UFEedClientException(\"Received message count mismatch\");\nif (_receivedResMsgs[0].FindField(UFE_SESSION_TOKEN) == null)\n    throw new UFEedClientException(\"Could not find session token\");\nvar sessToken = _receivedResMsgs[0].FindFieldValue(UFE_SESSION_TOKEN);\nif (sessToken == null || !(sessToken is Guid) || sessToken.ToString().Length==0)\n    throw new UFEedClientException($\"Invalid session token {sessToken}\");\nif (response.FindFieldValue(UFE_SESSION_TOKEN).ToString() != sessToken.ToString())\n    throw new UFEedClientException($\"Session token mimatch {response.FindFieldValue(UFE_SESSION_TOKEN)} != {sessToken}\");\n```\n\n`UFEMessage` and `UFEMessage.Builder` create NewOrderSingle with groups:\n\n```c#\nUFEField g1 = null;\nvar nos = _uc.CreateMessage()\n    .SetLongName(\"NewOrderSingle\")\n    .SetType(StFixmsg)\n    .SetServiceId(1)\n    .SetName(MsgType.NEWORDERSINGLE)\n    .AddField(ClOrdID.tag, \"123\")\n    .AddField(TransactTime.tag, DateTime.Now)\n    .AddField(ExecInst.tag, ExecInst.ALL_OR_NONE)\n    .AddField(OrdType.tag, OrdType.LIMIT)\n    .AddField(Side.tag, Side.BUY)\n    .AddGroup(NoAllocs.tag, out g1, (builder, group) =\u003e\n    {\n        builder.AddGroupItem(group)\n            .SetLongName(\"NoAlloc\")\n            .SetType(StFixmsg)\n            .SetSeq(1)\n            .AddField(AllocAccount.tag, \"ABC\", FlBody)\n            .AddField(AllocQty.tag, 2);\n        builder.AddGroupItem(group)\n            .SetLongName(\"NoAlloc\")\n            .SetType(StFixmsg)\n            .SetSeq(2)\n            .AddField(AllocAccount.tag, \"CDE\", FlBody)\n            .AddField(AllocQty.tag, 4);\n    });\n```\n\n## UFEedClient\n\nThe `UFEedClient` class is used as the interface to make both System and\nBusiness API calls to the UFEGW. Sessions between `UFEedClient` and the\nUFEGW are made up of ZeroMQ PUB/SUB and REQ/REP sockets. The network\naddresses and message topics inherent to these sockets are configurable\nvia `UFEedClient`. In addition, the `UFEedClient` manages these UFEGW\nsessions on behalf of the user (after the user has successfully logged\nin).\n\n`UFEedClient` provides a event callback interface that is a part of\n`UFEedClient` that must be subscribed by `UFEedClient` consumer:\n\n```c#\nclass UFEedClient\n{\n...\n    /// \u003csummary\u003e\n    /// Event for receiving subscription message. Will be called in a different thread in most cases.\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEMessageEventArgs\u003e SubscriptionMessageReceived;\n\n    /// \u003csummary\u003e\n    /// Event for receiving responder message. Will be called in a different thread in most cases.\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEMessageEventArgs\u003e ResponderMessageReceived;\n\n    /// \u003csummary\u003e\n    /// Event for receiving response message for a sent request.\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEMessageEventArgs\u003e ResponseMessageReceived;\n\n    /// \u003csummary\u003e\n    /// Event for authentication request. Will be called in a different thread in most cases.\n    /// Consumer must set UFEAuthEventArgs.Accept to false in case of wrong login/password.\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEAuthEventArgs\u003e AuthenticateRequested;\n\n    /// \u003csummary\u003e\n    /// Event for ZeroMQ errors.\n    /// Consumer must set UFEZeroMQErrorEventArgs.Continue to false in case of unrecoverable errors\n    /// \u003c/summary\u003e\n    // ReSharper disable once InconsistentNaming\n    public event EventHandler\u003cUFEZeroMQErrorEventArgs\u003e ZeroMQErrorHappened;\n\n    /// \u003csummary\u003e\n    /// Event for UFEedClintErrors\n    /// Consumer must set UFEErrorEventArgs.Continue to false in case of unrecoverable errors\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEErrorEventArgs\u003e ErrorHappened;\n}\n```\n\n`UFEedClient` is configured with `UFEconfiguration` class:\n\n```c#\npublic class UFEedConfiguration\n{\n    /// \u003csummary\u003e\n    /// Subscriber endpoint, defaults to \"tcp://127.0.0.1:55745\"\n    /// \u003c/summary\u003e\n    public string Subscriber { get; set; };\n\n    /// \u003csummary\u003e\n    /// Requester endpoint, defaults to \"tcp://127.0.0.1:55746\"\n    /// \u003c/summary\u003e\n    public string Requester { get; set; };\n\n    /// \u003csummary\u003e\n    /// Publisher endpoint, defaults to \"tcp://*:55747\"\n    /// \u003c/summary\u003e\n    public string Publisher { get; set; };\n\n    /// \u003csummary\u003e\n    /// Responder endpoint, defaults to \"tcp://*:55748\"\n    /// \u003c/summary\u003e\n    public string Responder { get; set; };\n\n    /// \u003csummary\u003e\n    /// Subscriber topic, defaults to \"ufegw-publisher\"\n    /// \u003c/summary\u003e\n    public string SubscriberTopic { get; set; };\n\n    /// \u003csummary\u003e\n    /// Requester topic, defaults to \"ufegw-responder\"\n    /// \u003c/summary\u003e\n    public string RequesterTopic { get; set; };\n\n    /// \u003csummary\u003e\n    /// Publisher topic, defaults to \"ufeedclient-publisher\"\n    /// \u003c/summary\u003e\n    public string PublisherTopic { get; set; };\n\n    /// \u003csummary\u003e\n    /// Responder topic, defaults to \"ufeedclient-responder\"\n    /// \u003c/summary\u003e\n    public string ResponderTopic { get; set; };\n\n    /// \u003csummary\u003e\n    /// Max IO threads for ZMQ background work, defaults to 1\n    /// \u003c/summary\u003e\n    public int MaxIoThreads { get; set; ;\n\n    /// \u003csummary\u003e\n    /// Poll interval in milliseconds, defaults to 10\n    /// \u003c/summary\u003e\n    public uint PollIntervalMs { get; set; };\n}\n```\n\n`UFEedClient` interface:\n\n```c#\npublic class UFEedClient : IDisposable\n{\n    /// \u003csummary\u003e\n    /// Constructs UFEedClient\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"configuration\"\u003econfiguration to setup UFEedClient object\u003c/param\u003e\n    public UFEedClient(UFEedConfiguration configuration);\n\n    /// \u003csummary\u003e\n    /// Disposes UFEedClient resources, implements IDisposable.Dispose()\n    /// \u003c/summary\u003e\n    public void Dispose();\n\n    /// \u003csummary\u003e\n    /// Returns UFEedClient configuration\n    /// \u003c/summary\u003e\n    public UFEedConfiguration Configuration { get; }\n\n    /// \u003csummary\u003e\n    /// Starts UFEedClient. When started in synchronous mode (wait = true)\n    /// it does not return until Stop() is called from a different thread.\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"wait\"\u003etrue for synchronous call, false for asynchronous\u003c/param\u003e\n    public void Start(bool wait = false);\n\n    /// \u003csummary\u003e\n    /// Stops UFEedClient\n    /// \u003c/summary\u003e\n    public void Stop();\n\n    /// \u003csummary\u003e\n    /// Creates UFEMEssage from \u003cc\u003eWireMessage\u003c/c\u003e\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"wm\"\u003e\u003cc\u003eWireMessage\u003c/c\u003e to create from\u003c/param\u003e\n    /// \u003creturns\u003enew \u003cc\u003eUFEMessage\u003c/c\u003e\u003c/returns\u003e\n    public UFEMessage CreateMessage(WireMessage wm = null);\n\n    /// \u003csummary\u003e\n    /// Synchronously sends request to UFE and waits for UFE response, REQ/REP pattern\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"request\"\u003eRequest to send \u003c/param\u003e\n    /// \u003creturns\u003eResponse received\u003c/returns\u003e\n    /// \u003cexception cref=\"UFEedClientException\"\u003eCan throw UFEedClientException\u003c/exception\u003e\n    public UFEMessage Request(UFEMessage,Builder request);\n\n    /// \u003csummary\u003e\n    /// Send message to responder channel. Back channel pattern.\n    /// IMPORTANT: Should be called as much as possible from within ResponderMessageReceived callback thread\n    /// \u003c/summary\u003e\n    /// \u003cparam name=\"msg\"\u003eMessage to send\u003c/param\u003e\n    public void Respond(UFEMessage.Builder msg);\n\n    /// \u003csummary\u003e\n    /// Events\n    /// \u003c/summary\u003e\n    public event EventHandler\u003cUFEMessageEventArgs\u003e SubscriptionMessageReceived;\n    public event EventHandler\u003cUFEMessageEventArgs\u003e ResponderMessageReceived;\n    public event EventHandler\u003cUFEMessageEventArgs\u003e ResponseMessageReceived;\n    public event EventHandler\u003cUFEAuthEventArgs\u003e AuthenticateRequested;\n    public event EventHandler\u003cUFEZeroMQErrorEventArgs\u003e ZeroMQErrorHappened;\n    public event EventHandler\u003cUFEErrorEventArgs\u003e ErrorHappened;\n}\n```\n\n`UFEedClient` usage sample:\n\n```c#\nusing (var uc = new UFEedClient(new UFEedConfiguration{Subscriber = SUBSCRIBER_DEFAULT}))\n{\n    uc.SubscriptionMessageReceived += (sender, args) =\u003e { ... };\n    uc.ResponderMessageReceived += (sender, args) =\u003e { ... };\n    uc.ZeroMQErrorHappened += (sender, args) =\u003e { ... };\n    uc.ErrorHappened += (sender, args) =\u003e { ... };\n    uc.Start();\n    var login = uc.CreateMessage()\n        .SetLongName(\"login\")\n        .SetType(StSystem)\n        .SetServiceId(UFE_CMD_LOGIN)\n        .AddField(UFE_CMD, UFE_CMD_LOGIN)\n        .AddField(UFE_LOGIN_ID, \"abcdef\")\n        .AddField(UFE_LOGIN_PW, \"1e884898da28047151d0e56f8df\");\n    var response = uc.Request(login);\n        ...\n}\n```\n\n# Constants\n\nThe `UFEed_C#` maintains a list of constant values that translate to integer\ncodes in the UFEGW. These integer codes are used to identify System API\nservices as well as general FIX functionality. A full list of these\nconstants is available at `UFE/UFE.UFEedClient/UFEConsts.cs` file.\nConstants could be regenerated using `UFE.UFEedClient.GenConsts` project.\n\n## FIX variants constants\n\nThe `UFEed_C#` provides constants for all stock FIX variants:\n\n```c#\nusing UFE.UFEedClient.FIX50SP2.Field;\n...\n// NOS creation\nvar nos = _uc.CreateMessage()\n    .SetLongName(\"NewOrderSingle\")\n    .SetType(StFixmsg)\n    .SetServiceId(1)\n    .SetName(MsgType.NEWORDERSINGLE)\n    .AddField(ClOrdID.tag, \"123\")\n    .AddField(TransactTime.tag, DateTime.Now)\n    .AddField(ExecInst.tag, ExecInst.ALL_OR_NONE)\n    .AddField(OrdType.tag, OrdType.LIMIT)\n    .AddField(Side.tag, Side.BUY);\n```\n\n# Building\n\nThe `UFEed_C#` build follows standard .NetCore build pattern. Solution file `UFE.netcore.sln` contains all the projects to be build.\n\nThe `UFEed_C#` provides a sample to use as a starting point for UFEed C#\ndevelopment. To build the sample, you have to open\n`UFE.UFEedClient.Sample.netcore.csproj` provided in the installation\npackage and reference `UFE.UFEedClient` project.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffix8mt%2Fufeed_bindings_csharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffix8mt%2Fufeed_bindings_csharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffix8mt%2Fufeed_bindings_csharp/lists"}