/// <summary> /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set. For example, to filter on the left portfolio Code, use \"left.portfolioId.code eq 'string'\" Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param> /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param> /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> /// <returns>Task of ResourceListOfReconciliationBreak</returns> public async System.Threading.Tasks.Task <ResourceListOfReconciliationBreak> ReconcileHoldingsAsync(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest), System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = await ReconcileHoldingsWithHttpInfoAsync(sortBy, start, limit, filter, portfoliosReconciliationRequest, cancellationToken).ConfigureAwait(false); return(localVarResponse.Data); }
/// <summary> /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set. For example, to filter on the left portfolio Code, use \"left.portfolioId.code eq 'string'\" Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param> /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param> /// <param name="cancellationToken">Cancellation Token to cancel the request.</param> /// <returns>Task of ApiResponse (ResourceListOfReconciliationBreak)</returns> public async System.Threading.Tasks.Task <Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> > ReconcileHoldingsWithHttpInfoAsync(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest), System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { Lusid.Sdk.Client.RequestOptions localVarRequestOptions = new Lusid.Sdk.Client.RequestOptions(); String[] _contentTypes = new String[] { "application/json-patch+json", "application/json", "text/json", "application/_*+json" }; // to determine the Accept header String[] _accepts = new String[] { "text/plain", "application/json", "text/json" }; var localVarContentType = Lusid.Sdk.Client.ClientUtils.SelectHeaderContentType(_contentTypes); if (localVarContentType != null) { localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType); } var localVarAccept = Lusid.Sdk.Client.ClientUtils.SelectHeaderAccept(_accepts); if (localVarAccept != null) { localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); } if (sortBy != null) { localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("multi", "sortBy", sortBy)); } if (start != null) { localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "start", start)); } if (limit != null) { localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "limit", limit)); } if (filter != null) { localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "filter", filter)); } localVarRequestOptions.Data = portfoliosReconciliationRequest; // authentication (oauth2) required // oauth required if (!String.IsNullOrEmpty(this.Configuration.AccessToken)) { localVarRequestOptions.HeaderParameters.Add("Authorization", "Bearer " + this.Configuration.AccessToken); } // set the LUSID header localVarRequestOptions.HeaderParameters.Add("X-LUSID-Sdk-Language", "C#"); localVarRequestOptions.HeaderParameters.Add("X-LUSID-Sdk-Version", "0.11.4385"); // make the HTTP request var localVarResponse = await this.AsynchronousClient.PostAsync <ResourceListOfReconciliationBreak>("/api/portfolios/$reconcileholdings", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false); if (this.ExceptionFactory != null) { Exception _exception = this.ExceptionFactory("ReconcileHoldings", localVarResponse); if (_exception != null) { throw _exception; } } return(localVarResponse); }
/// <summary> /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set. For example, to filter on the left portfolio Code, use \"left.portfolioId.code eq 'string'\" Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param> /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param> /// <returns>ResourceListOfReconciliationBreak</returns> public ResourceListOfReconciliationBreak ReconcileHoldings(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest)) { Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = ReconcileHoldingsWithHttpInfo(sortBy, start, limit, filter, portfoliosReconciliationRequest); return(localVarResponse.Data); }
/// <summary> /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set (optional)</param> /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param> /// <returns>Task of ApiResponse (ResourceListOfReconciliationBreak)</returns> public async System.Threading.Tasks.Task <ApiResponse <ResourceListOfReconciliationBreak> > ReconcileHoldingsAsyncWithHttpInfo(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null) { var localVarPath = "./api/portfolios/$reconcileholdings"; var localVarPathParams = new Dictionary <String, String>(); var localVarQueryParams = new List <KeyValuePair <String, String> >(); var localVarHeaderParams = new Dictionary <String, String>(this.Configuration.DefaultHeader); var localVarFormParams = new Dictionary <String, String>(); var localVarFileParams = new Dictionary <String, FileParameter>(); Object localVarPostBody = null; // to determine the Content-Type header String[] localVarHttpContentTypes = new String[] { }; String localVarHttpContentType = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes); // to determine the Accept header String[] localVarHttpHeaderAccepts = new String[] { "text/plain", "application/json", "text/json" }; String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); if (localVarHttpHeaderAccept != null) { localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); } if (sortBy != null) { localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("multi", "sortBy", sortBy)); // query parameter } if (start != null) { localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "start", start)); // query parameter } if (limit != null) { localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "limit", limit)); // query parameter } if (filter != null) { localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "filter", filter)); // query parameter } if (request != null && request.GetType() != typeof(byte[])) { localVarPostBody = this.Configuration.ApiClient.Serialize(request); // http body (model) parameter } else { localVarPostBody = request; // byte array } // authentication (oauth2) required // oauth required if (!String.IsNullOrEmpty(this.Configuration.AccessToken)) { localVarHeaderParams["Authorization"] = "Bearer " + this.Configuration.AccessToken; } // set the LUSID header localVarHeaderParams["X-LUSID-Sdk-Language"] = "C#"; localVarHeaderParams["X-LUSID-Sdk-Version"] = "0.10.730"; // make the HTTP request IRestResponse localVarResponse = (IRestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); int localVarStatusCode = (int)localVarResponse.StatusCode; if (ExceptionFactory != null) { Exception exception = ExceptionFactory("ReconcileHoldings", localVarResponse); if (exception != null) { throw exception; } } return(new ApiResponse <ResourceListOfReconciliationBreak>(localVarStatusCode, localVarResponse.Headers.ToDictionary(x => x.Key, x => string.Join(",", x.Value)), (ResourceListOfReconciliationBreak)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(ResourceListOfReconciliationBreak)))); }
/// <summary> /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set (optional)</param> /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param> /// <returns>Task of ResourceListOfReconciliationBreak</returns> public async System.Threading.Tasks.Task <ResourceListOfReconciliationBreak> ReconcileHoldingsAsync(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null) { ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = await ReconcileHoldingsAsyncWithHttpInfo(sortBy, start, limit, filter, request); return(localVarResponse.Data); }
/// <summary> /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios. /// </summary> /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception> /// <param name="sortBy">Optional. Order the results by these fields. Use use the '-' sign to denote descending order e.g. -MyFieldName (optional)</param> /// <param name="start">Optional. When paginating, skip this number of results (optional)</param> /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param> /// <param name="filter">Optional. Expression to filter the result set (optional)</param> /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param> /// <returns>ResourceListOfReconciliationBreak</returns> public ResourceListOfReconciliationBreak ReconcileHoldings(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null) { ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = ReconcileHoldingsWithHttpInfo(sortBy, start, limit, filter, request); return(localVarResponse.Data); }
public void Reconcile_Portfolio() { var portfolioCode = _testDataUtilities.CreateTransactionPortfolio(TestDataUtilities.TutorialScope); var today = new DateTimeOffset(DateTimeOffset.UtcNow.Date).ToUniversalTime(); var yesterday = today.AddDays(-1).ToUniversalTime(); // Create transactions for yesterday var yesterdaysTransactions = new List <TransactionRequest> { _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 1000, 100, "GBP", yesterday.AddHours(8), "StockIn"), _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 2300, 101, "GBP", yesterday.AddHours(12), "StockIn"), _testDataUtilities.BuildTransactionRequest(_instrumentIds[1], -1000, 102, "GBP", yesterday.AddHours(9), "StockIn"), _testDataUtilities.BuildTransactionRequest(_instrumentIds[2], 1200, 103, "GBP", yesterday.AddHours(16), "StockIn"), _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 2000, 103, "GBP", yesterday.AddHours(9), "StockIn") }; // Add transactions _apiFactory.Api <ITransactionPortfoliosApi>().UpsertTransactions(TestDataUtilities.TutorialScope, portfolioCode, yesterdaysTransactions); var todaysTransactions = new List <TransactionRequest> { _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], -3000, 101.78M, "GBP", today.AddHours(8), "StockIn"), // net long 300 _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 1500, 101.78M, "GBP", today.AddHours(12), "StockIn"), // net long 1800 _testDataUtilities.BuildTransactionRequest(_instrumentIds[1], 1000, 102, "GBP", today.AddHours(12), "StockIn"), // flat _testDataUtilities.BuildTransactionRequest(_instrumentIds[2], 1200, 103, "GBP", today.AddHours(16), "StockIn"), // long 2400 _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 1000, 103, "GBP", today.AddHours(9), "StockIn"), // long 3000 _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 2000, 103, "GBP", today.AddHours(20), "StockIn") // long 5000 but outside recon window }; // add transactions var finalResult = _apiFactory.Api <ITransactionPortfoliosApi>().UpsertTransactions(TestDataUtilities.TutorialScope, portfolioCode, todaysTransactions); //Using the last result find out its AsAtDate (based on the servers clock at the time of the test) var finalAsAtTime = finalResult.Version.AsAtDate; //So now we have the portfolio with 2 days worth of transactions, going to reconcile from T-1 20:00 to now, //this should reflect breaks for each instrument equal to the transactions from yesterday till 20 today. var reconcileRequest = new PortfoliosReconciliationRequest( new PortfolioReconciliationRequest( new ResourceId(TestDataUtilities.TutorialScope, portfolioCode), yesterday.AddHours(20).ToString("o"), finalAsAtTime), new PortfolioReconciliationRequest( new ResourceId(TestDataUtilities.TutorialScope, portfolioCode), today.AddHours(16).ToString("o"), finalAsAtTime), new List <string>()); var listOfBreaks = _apiFactory.Api <IReconciliationsApi>().ReconcileHoldings(portfoliosReconciliationRequest: reconcileRequest); Console.WriteLine($"Breaks at {yesterday.AddHours(20)}"); PrintBreaks(listOfBreaks.Values); /* * Expecting * _instrumentIds[0] -1500 -8094.73 * _instrumentIds[3] 1000 10300 * _instrumentIds[2] 1200 10300 * _instrumentIds[1] 1000 -10200 */ Assert.AreEqual(listOfBreaks.Values.Count, 4); var map = listOfBreaks.Values.ToDictionary(abreak => abreak.InstrumentUid); Assert.AreEqual(map[_instrumentIds[0]].DifferenceUnits, -1500); Assert.AreEqual(map[_instrumentIds[3]].DifferenceUnits, 1000); Assert.AreEqual(map[_instrumentIds[2]].DifferenceUnits, 1200); Assert.AreEqual(map[_instrumentIds[1]].DifferenceUnits, 1000); void PrintBreaks(IEnumerable <ReconciliationBreak> breaks) { foreach (var abreak in breaks) { Console.WriteLine($"{abreak.InstrumentUid}\t{abreak.DifferenceUnits}\t{abreak.DifferenceCost.Amount}"); } Console.WriteLine(); } }