diff --git a/MatchTraderBApi/Constants/RestEndpoints/AccountEndpoints.cs b/MatchTraderBApi/Constants/RestEndpoints/AccountEndpoints.cs new file mode 100644 index 0000000..ad73c1e --- /dev/null +++ b/MatchTraderBApi/Constants/RestEndpoints/AccountEndpoints.cs @@ -0,0 +1,35 @@ +using MatchTraderBApi.Enums; +using MatchTraderBApi.Enums.SortingFields; +using MatchTraderBApi.Extensions; + +namespace MatchTraderBApi.Constants.RestEndpoints; + +internal static class AccountEndpoints +{ + internal static string GetAccounts( + string? query, int? page, int? size, DateTime? from, DateTime? to, MTrAccountType? accountType, MTrAccountSortingField? sortField, MTrSortingOrder? sortingOrder) + => "/v1/accounts" + + $"?query={query}" + + $"&page={page.ToString()}" + + $"&size={size.ToString()}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&accountType={accountType?.ToEnumString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortingOrder?.ToEnumString())}"; + + internal static string GetAccountByEmail(string email) => $"/v1/accounts/by-email/{email}"; + internal static string GetAccountByUuid(string accountUuid) => $"/v1/accounts/by-uuid/{accountUuid}"; + + internal static string GetAccountTimelineEvents(string accountUuid, MTrAccountTimelineEventType? eventType, DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) + => $"/v1/accounts/{accountUuid}/timeline-events" + + $"?eventType={eventType?.ToEnumString()}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; + + internal static string CreateAccount() => "/v1/accounts"; + internal static string UpdateAccountInfo(string accountUuid) => $"/v1/accounts/{accountUuid}"; + internal static string ChangeAccountPassword() => "/v1/change-password"; + internal static string AddNote() => "/v1/note"; + internal static string AddTask() => "/v1/task"; +} \ No newline at end of file diff --git a/MatchTraderBApi/Constants/RestEndpoints/GeneralEndpoints.cs b/MatchTraderBApi/Constants/RestEndpoints/GeneralEndpoints.cs new file mode 100644 index 0000000..69e79f1 --- /dev/null +++ b/MatchTraderBApi/Constants/RestEndpoints/GeneralEndpoints.cs @@ -0,0 +1,32 @@ +using MatchTraderBApi.Enums; +using MatchTraderBApi.Enums.SortingFields; +using MatchTraderBApi.Extensions; + +namespace MatchTraderBApi.Constants.RestEndpoints; + +public static class GeneralEndpoints +{ + public static string ServiceInfo() => "/service-info"; + + public static string GetBranches(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/branches" + + $"?from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; + + public static string GetOffers(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/offers" + + $"?from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; + + public static string GetRoles(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/roles" + + $"?from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; + + public static string RetrievePlatformLogsV2(int? page, int? size, DateTime? from, DateTime? to, MTrSortingOrder? sortOrder) => "/v2/platform-logs" + + $"?page={page.ToString()}" + + $"&size={size.ToString()}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={sortOrder?.ToEnumString()}"; +} \ No newline at end of file diff --git a/MatchTraderBApi/Constants/RestEndpoints/TradingAccountEndpoints.cs b/MatchTraderBApi/Constants/RestEndpoints/TradingAccountEndpoints.cs new file mode 100644 index 0000000..42285ab --- /dev/null +++ b/MatchTraderBApi/Constants/RestEndpoints/TradingAccountEndpoints.cs @@ -0,0 +1,23 @@ +using MatchTraderBApi.Enums; +using MatchTraderBApi.Enums.SortingFields; +using MatchTraderBApi.Extensions; + +namespace MatchTraderBApi.Constants.RestEndpoints; + +public static class TradingAccountEndpoints +{ + public static string GetTradingAccounts( + string? query, int? page, int? size, DateTime? from, DateTime? to, MTrTradingAccountSortingField? sortField, MTrSortingOrder? sortOrder) + => "/v1/trading-accounts" + + $"?query={query}" + + $"&page={page.ToString()}" + + $"&size={size.ToString()}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; + + public static string GetTradingAccountByLogin(string systemUuid, string login) => $"/v1/trading-account?systemUuid={systemUuid}&login={login}"; + public static string CreateNewTradingAccount(string accountUuid) => $"/v1/accounts/{accountUuid}/trading-accounts"; + public static string UpdateTradingAccount(string systemUuid, string login) => $"/v1/trading-account?systemUuid={systemUuid}&login={login}"; + public static string ChangeLeverage(string systemUuid, string login) => $"/v1/trading-account/leverage?systemUuid={systemUuid}&login={login}"; +} \ No newline at end of file diff --git a/MatchTraderBApi/Constants/RestEndpoints/TradingDataEndpoints.cs b/MatchTraderBApi/Constants/RestEndpoints/TradingDataEndpoints.cs new file mode 100644 index 0000000..ff34c0d --- /dev/null +++ b/MatchTraderBApi/Constants/RestEndpoints/TradingDataEndpoints.cs @@ -0,0 +1,45 @@ +using System.Globalization; +using MatchTraderBApi.Enums; +using MatchTraderBApi.Extensions; + +namespace MatchTraderBApi.Constants.RestEndpoints; + +public static class TradingDataEndpoints +{ + public static string GetOpenPositions(string systemUuid, string login) + => $"/v1/trading-accounts/trading-data/open-positions?systemUuid={systemUuid}&login={login}"; + + public static string GetClosedPositions(string systemUuid, string login, DateTime? from, DateTime? to) + => $"/v1/trading-accounts/trading-data/closed-positions?systemUuid={systemUuid}&login={login}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}"; + + public static string GetActiveOrders(string systemUuid, string login) => $"/v1/trading-accounts/trading-data/active-orders?systemUuid={systemUuid}&login={login}"; + public static string GetLedgers(string systemUuid, string login, MTrLedgerType[] types, DateTime? from, DateTime? to, int? limit) + => $"/v1/trading-accounts/trading-data/ledgers" + + $"?systemUuid={systemUuid}" + + $"&login={login}" + + $"&types[]={string.Join(',', types.Select(x => x.ToEnumString()))}" + + $"&from={from.ToString()}" + + $"&to={to.ToString()}" + + $"&limit={limit.ToString()}"; + + public static string GetGroups(string systemUuid) => $"/v1/groups?systemUuid={systemUuid}"; + public static string GetGroupNames(string systemUuid) => $"/v1/group-names?systemUuid={systemUuid}"; + public static string RetrieveOrdersHistoryByLoginsOrGroups() => "/v1/trading-accounts/trading-data/order-history"; + public static string RetrieveLedgersByLoginsOrGroups() => "/v1/trading-accounts/trading-data/ledgers"; + public static string RetrieveOpenPositionsByLoginsOrGroups() => "/v1/trading-accounts/open-positions"; + public static string RetrieveClosedPositionsByLoginsOrGroups() => "/v1/trading-accounts/closed-positions"; + public static string RetrieveOrdersHistoryByIds() => "/v1/trading-accounts/trading-data/order-history-by-ids"; + public static string RetrieveOpenPositionsByIds() => "/v1/trading-accounts/trading-data/open-positions-by-ids"; + public static string RetrieveClosedPositionsByIds() => "/v1/trading-accounts/trading-data/closed-positions-by-ids"; + public static string RetrieveActiveOrdersByIds() => "/v1/trading-accounts/trading-data/active-orders-by-ids"; + + public static string GetCandles(string systemUuid, string symbol, MTrCandleInterval interval, DateTime from, DateTime to) + => $"/v1/candles" + + $"?systemUuid={systemUuid}" + + $"&symbol={symbol}" + + $"&interval={interval.ToEnumString()}" + + $"&from={from.ToString(CultureInfo.InvariantCulture)}" + + $"&to={to.ToString(CultureInfo.InvariantCulture)}"; +} \ No newline at end of file diff --git a/MatchTraderBApi/Constants/RestEndpoints/TradingEndpoints.cs b/MatchTraderBApi/Constants/RestEndpoints/TradingEndpoints.cs new file mode 100644 index 0000000..2f09777 --- /dev/null +++ b/MatchTraderBApi/Constants/RestEndpoints/TradingEndpoints.cs @@ -0,0 +1,18 @@ +namespace MatchTraderBApi.Constants.RestEndpoints; + +public static class TradingEndpoints +{ + public static string GetSymbols(string systemUuid, string group, string[]? symbols) + => symbols is null + ? $"/v1/symbols?systemUuid={systemUuid}&group={group}" + : $"/v1/symbols?systemUuid={systemUuid}&group={group}&symbols={string.Join(',', symbols)}"; + + public static string OpenPosition() => "/v1/trading-accounts/positions/open"; + public static string CreatePendingOrder() => "/v1/trading-accounts/pending-order/create"; + public static string CancelPendingOrder() => "/v1/trading-accounts/pending-order/cancel"; + public static string CreateCorrectionOrder() => "/v1/trading-accounts/correction-order/create"; + public static string EditPosition() => "/v1/trading-accounts/positions/edit"; + public static string ClosePosition() => "/v1/trading-accounts/positions/close"; + public static string ClosePartialPosition() => "/v1/trading-accounts/positions/close-partially"; + public static string CloseAllPosition() => "/v1/trading-accounts/positions/close-all"; +} \ No newline at end of file diff --git a/MatchTraderBApi/Constants/gRPCEndpoints/BaseEndpoints.cs b/MatchTraderBApi/Constants/gRPCEndpoints/BaseEndpoints.cs new file mode 100644 index 0000000..bae7735 --- /dev/null +++ b/MatchTraderBApi/Constants/gRPCEndpoints/BaseEndpoints.cs @@ -0,0 +1,6 @@ +namespace MatchTraderBApi.Constants.gRPCEndpoints; + +public static class BaseEndpoints +{ + +} \ No newline at end of file diff --git a/MatchTraderBApi/Endpoints/MTraderPaths.cs b/MatchTraderBApi/Endpoints/MTraderPaths.cs deleted file mode 100644 index a756029..0000000 --- a/MatchTraderBApi/Endpoints/MTraderPaths.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System.Globalization; -using MatchTraderBApi.Enums; -using MatchTraderBApi.Enums.SortingFields; -using MatchTraderBApi.Extensions; - -namespace MatchTraderBApi.Endpoints; - -public static class MTraderPaths -{ - // General - public static string ServiceInfo() => "/service-info"; - - public static string GetBranches(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/branches" + - $"?from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; - - public static string GetOffers(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/offers" + - $"?from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; - - public static string GetRoles(DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) => "/v1/roles" + - $"?from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; - - public static string RetrievePlatformLogsV2(int? page, int? size, DateTime? from, DateTime? to, MTrSortingOrder? sortOrder) => "/v2/platform-logs" + - $"?page={page.ToString()}" + - $"&size={size.ToString()}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={sortOrder?.ToEnumString()}"; - - // Accounts - public static string GetAccounts( - string? query, int? page, int? size, DateTime? from, DateTime? to, MTrAccountType? accountType, MTrAccountSortingField? sortField, MTrSortingOrder? sortingOrder) - => "/v1/accounts" + - $"?query={query}" + - $"&page={page.ToString()}" + - $"&size={size.ToString()}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&accountType={accountType?.ToEnumString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortingOrder?.ToEnumString())}"; - - public static string GetAccountByEmail(string email) => $"/v1/accounts/by-email/{email}"; - public static string GetAccountByUuid(string accountUuid) => $"/v1/accounts/by-uuid/{accountUuid}"; - - public static string GetAccountTimelineEvents(string accountUuid, MTrAccountTimelineEventType? eventType, DateTime? from, DateTime? to, MTrBasicSortingField? sortField, MTrSortingOrder? sortOrder) - => $"/v1/accounts/{accountUuid}/timeline-events" + - $"?eventType={eventType?.ToEnumString()}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; - - public static string CreateAccount() => "/v1/accounts"; - public static string UpdateAccountInfo(string accountUuid) => $"/v1/accounts/{accountUuid}"; - public static string ChangeAccountPassword() => "/v1/change-password"; - public static string AddNote() => "/v1/note"; - public static string AddTask() => "/v1/task"; - - // Trading Accounts - public static string GetTradingAccounts( - string? query, int? page, int? size, DateTime? from, DateTime? to, MTrTradingAccountSortingField? sortField, MTrSortingOrder? sortOrder) - => "/v1/trading-accounts" + - $"?query={query}" + - $"&page={page.ToString()}" + - $"&size={size.ToString()}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&sort={string.Join(',', sortField?.ToEnumString(), sortOrder?.ToEnumString())}"; - - public static string GetTradingAccountByLogin(string systemUuid, string login) => $"/v1/trading-account?systemUuid={systemUuid}&login={login}"; - public static string CreateNewTradingAccount(string accountUuid) => $"/v1/accounts/{accountUuid}/trading-accounts"; - public static string UpdateTradingAccount(string systemUuid, string login) => $"/v1/trading-account?systemUuid={systemUuid}&login={login}"; - public static string ChangeLeverage(string systemUuid, string login) => $"/v1/trading-account/leverage?systemUuid={systemUuid}&login={login}"; - - // Trading - public static string GetSymbols(string systemUuid, string group, string[]? symbols) - => symbols is null - ? $"/v1/symbols?systemUuid={systemUuid}&group={group}" - : $"/v1/symbols?systemUuid={systemUuid}&group={group}&symbols={string.Join(',', symbols)}"; - - public static string OpenPosition() => "/v1/trading-accounts/positions/open"; - public static string CreatePendingOrder() => "/v1/trading-accounts/pending-order/create"; - public static string CancelPendingOrder() => "/v1/trading-accounts/pending-order/cancel"; - public static string CreateCorrectionOrder() => "/v1/trading-accounts/correction-order/create"; - public static string EditPosition() => "/v1/trading-accounts/positions/edit"; - public static string ClosePosition() => "/v1/trading-accounts/positions/close"; - public static string ClosePartialPosition() => "/v1/trading-accounts/positions/close-partially"; - public static string CloseAllPosition() => "/v1/trading-accounts/positions/close-all"; - - // Trading Data - public static string GetOpenPositions(string systemUuid, string login) - => $"/v1/trading-accounts/trading-data/open-positions?systemUuid={systemUuid}&login={login}"; - - public static string GetClosedPositions(string systemUuid, string login, DateTime? from, DateTime? to) - => $"/v1/trading-accounts/trading-data/closed-positions?systemUuid={systemUuid}&login={login}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}"; - - public static string GetActiveOrders(string systemUuid, string login) => $"/v1/trading-accounts/trading-data/active-orders?systemUuid={systemUuid}&login={login}"; - public static string GetLedgers(string systemUuid, string login, MTrLedgerType[] types, DateTime? from, DateTime? to, int? limit) - => $"/v1/trading-accounts/trading-data/ledgers" + - $"?systemUuid={systemUuid}" + - $"&login={login}" + - $"&types[]={string.Join(',', types.Select(x => x.ToEnumString()))}" + - $"&from={from.ToString()}" + - $"&to={to.ToString()}" + - $"&limit={limit.ToString()}"; - - public static string GetGroups(string systemUuid) => $"/v1/groups?systemUuid={systemUuid}"; - public static string GetGroupNames(string systemUuid) => $"/v1/group-names?systemUuid={systemUuid}"; - public static string RetrieveOrdersHistoryByLoginsOrGroups() => "/v1/trading-accounts/trading-data/order-history"; - public static string RetrieveLedgersByLoginsOrGroups() => "/v1/trading-accounts/trading-data/ledgers"; - public static string RetrieveOpenPositionsByLoginsOrGroups() => "/v1/trading-accounts/open-positions"; - public static string RetrieveClosedPositionsByLoginsOrGroups() => "/v1/trading-accounts/closed-positions"; - public static string RetrieveOrdersHistoryByIds() => "/v1/trading-accounts/trading-data/order-history-by-ids"; - public static string RetrieveOpenPositionsByIds() => "/v1/trading-accounts/trading-data/open-positions-by-ids"; - public static string RetrieveClosedPositionsByIds() => "/v1/trading-accounts/trading-data/closed-positions-by-ids"; - public static string RetrieveActiveOrdersByIds() => "/v1/trading-accounts/trading-data/active-orders-by-ids"; - - // Candles - public static string GetCandles(string systemUuid, string symbol, MTrCandleInterval interval, DateTime from, DateTime to) - => $"/v1/candles" + - $"?systemUuid={systemUuid}" + - $"&symbol={symbol}" + - $"&interval={interval.ToEnumString()}" + - $"&from={from.ToString(CultureInfo.InvariantCulture)}" + - $"&to={to.ToString(CultureInfo.InvariantCulture)}"; -} diff --git a/MatchTraderBApi/Enums/MTrRetCode.cs b/MatchTraderBApi/Enums/MTrRetCode.cs index fad2f56..3e926ca 100644 --- a/MatchTraderBApi/Enums/MTrRetCode.cs +++ b/MatchTraderBApi/Enums/MTrRetCode.cs @@ -2,12 +2,12 @@ namespace MatchTraderBApi.Enums; public enum MTrRetCode { - MTrRet200Ok, - MTrRet204OkNone, - MTrRet400BadRequest, - MTrRet401Unauthorized, - MTrRet403Forbidden, - MTrRet405WrongMethod, - MTrRet422Unprocessed, - MTrRet500InternalError + MTrRet200Ok = 200, + MTrRet204OkNone = 204, + MTrRet400BadRequest = 400, + MTrRet401Unauthorized = 401, + MTrRet403Forbidden = 403, + MTrRet405WrongMethod = 405, + MTrRet422Unprocessed = 422, + MTrRet500InternalError = 500, } \ No newline at end of file diff --git a/MatchTraderBApi/Exceptions/MTrRequestException.cs b/MatchTraderBApi/Exceptions/MTrRequestException.cs new file mode 100644 index 0000000..a6795cd --- /dev/null +++ b/MatchTraderBApi/Exceptions/MTrRequestException.cs @@ -0,0 +1,23 @@ +using MatchTraderBApi.Enums; + +namespace MatchTraderBApi.Exceptions; + +public class MTrRequestException : Exception +{ + public MTrRetCode MTrRetCode { get; set; } + public string MtrContent { get; set; } + + public MTrRequestException(MTrRetCode mtrRetCode, string mtrContent) + : base($"Match Trader API request failed. MTrRetCode = {mtrRetCode}, MTrContent: {mtrContent}") + { + MTrRetCode = mtrRetCode; + MtrContent = mtrContent; + } + + public MTrRequestException(MTrRetCode mtrRetCode, string mtrContent, Exception innerException) + : base($"Match Trader API request failed. MTrRetCode = {mtrRetCode}, MTrContent: {mtrContent}", innerException) + { + MTrRetCode = mtrRetCode; + MtrContent = mtrContent; + } +} \ No newline at end of file diff --git a/MatchTraderBApi/Helpers/HttpClientHelper.cs b/MatchTraderBApi/Helpers/HttpClientHelper.cs index 62805b1..246d5b3 100644 --- a/MatchTraderBApi/Helpers/HttpClientHelper.cs +++ b/MatchTraderBApi/Helpers/HttpClientHelper.cs @@ -1,5 +1,9 @@ +using System.Net.Http.Headers; using System.Text.Json; using System.Text.Json.Serialization; +using MatchTraderBApi.Enums; +using MatchTraderBApi.Exceptions; +using MatchTraderBApi.Options; namespace MatchTraderBApi.Helpers; @@ -9,4 +13,51 @@ public static class HttpClientHelper { Converters = { new JsonStringEnumConverter() } }; + + private static readonly MediaTypeHeaderValue MediaTypeHeaderValue = new MediaTypeHeaderValue("application/json"); + private static readonly ProductInfoHeaderValue UserAgentHeaderValue = new ProductInfoHeaderValue("MatchTraderBApi", "1.0"); + + internal static async Task SendAuthorizedAsync + ( + HttpClient httpClient, + MTrSettingsOptions settings, + HttpMethod method, + string path, + TReqBody? content, + CancellationToken cancellationToken + ) + { + if (string.IsNullOrWhiteSpace(settings.ApiKey)) + { + throw new InvalidOperationException($"API key is not set."); + } + + var request = new HttpRequestMessage(method, path); + + // Append request body + var requestBody = new StringContent(JsonSerializer.Serialize(content, JsonSerializerOptions)); + requestBody.Headers.ContentType = MediaTypeHeaderValue; + request.Content = requestBody; + + // Set headers + request.Headers.Host = settings.RestHost; + request.Headers.UserAgent.Add(UserAgentHeaderValue); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", settings.ApiKey); + + var response = await httpClient.SendAsync(request, cancellationToken); + var responseContent = await response.Content.ReadAsStringAsync(cancellationToken); + + if (!response.IsSuccessStatusCode) + { + throw new MTrRequestException((MTrRetCode)response.StatusCode, responseContent); + } + + var responseData = JsonSerializer.Deserialize(responseContent, JsonSerializerOptions); + if (responseData is null) + { + throw new InvalidOperationException($"Failed to deserialize response data: {responseContent}"); + } + + return responseData; + } } \ No newline at end of file diff --git a/MatchTraderBApi/Options/MTraderSettings.cs b/MatchTraderBApi/Options/MTrSettingsOptions.cs similarity index 59% rename from MatchTraderBApi/Options/MTraderSettings.cs rename to MatchTraderBApi/Options/MTrSettingsOptions.cs index ac92b61..63d1f29 100644 --- a/MatchTraderBApi/Options/MTraderSettings.cs +++ b/MatchTraderBApi/Options/MTrSettingsOptions.cs @@ -1,8 +1,9 @@ namespace MatchTraderBApi.Options; -public class MTraderSettings +public class MTrSettingsOptions { - public string Host { get; set; } = string.Empty; + public string RestHost { get; set; } = string.Empty; + public string gRpcHost { get; set; } = string.Empty; public string ApiKey { get; set; } = string.Empty; public string SystemUuid { get; set; } = string.Empty; public string ApiVersion { get; set; } = string.Empty; diff --git a/MatchTraderBApi/Services/IMTrBrokerApi.cs b/MatchTraderBApi/Services/IMTrBrokerApi.cs new file mode 100644 index 0000000..1c7b179 --- /dev/null +++ b/MatchTraderBApi/Services/IMTrBrokerApi.cs @@ -0,0 +1,6 @@ +namespace MatchTraderBApi.Services; + +public interface IMTrBrokerApi +{ + +} \ No newline at end of file diff --git a/MatchTraderBApi/Services/MTrBrokerApi.cs b/MatchTraderBApi/Services/MTrBrokerApi.cs new file mode 100644 index 0000000..5620af8 --- /dev/null +++ b/MatchTraderBApi/Services/MTrBrokerApi.cs @@ -0,0 +1,6 @@ +namespace MatchTraderBApi.Services; + +public class MTrBrokerApi : IMTrBrokerApi +{ + +} \ No newline at end of file