public async Task <OperationsResponse> Get(OperationsFilter filter, string brokerAccountId = null, CancellationToken cancellationToken = default) { var query = new Dictionary <string, string> { { "to", filter.To.ToString("yyyy-MM-ddTHH:mm:ss.ffffffK") }, { "from", filter.From.ToString("yyyy-MM-ddTHH:mm:ss.ffffffK") }, { "interval", filter.Interval.GetEnumMemberAttributeValue() } }; if (!string.IsNullOrWhiteSpace(brokerAccountId)) { query.Add("brokerAccountId", brokerAccountId); } if (!string.IsNullOrEmpty(filter.Figi)) { query.Add("figi", filter.Figi); } return(await _http.Get <OperationsResponse>( "operations", query, cancellationToken : cancellationToken)); }
public async Task <OperationsResponse> Get(OperationsFilter filter, CancellationToken cancellationToken = default) { var from = HttpUtility.UrlEncode(filter.From.ToString("yyyy-MM-ddTHH:mm:ss.ffffffK")); var to = HttpUtility.UrlEncode(filter.To.ToString("yyyy-MM-ddTHH:mm:ss.ffffffK")); return(await _rest.Get <OperationsResponse>( $"operations?from={from}&to={to}&interval={filter.Interval.GetEnumMemberAttributeValue()}&figi={filter.Figi}", cancellationToken)); }
public ContentResult GetItems(OperationsFilter filter) { userLogic.SetSetting(CurrentUserId, "Operations.Sort", filter.Sort); userLogic.SetSetting(CurrentUserId, "Operations.SortDirection", filter.SortDirection); userLogic.SetSetting(CurrentUserId, "Operations.PageNumber", filter.PageNumber.ToString()); var totalCount = orderLogic.GetOperationsCount(filter); var list = orderLogic.GetOperations(filter); return(Content(JsonConvert.SerializeObject(new { Items = list, TotalCount = totalCount }))); }
public async Task Should_get_operations() { var filter = new OperationsFilter { From = DateTime.Now - TimeSpan.FromDays(30), To = DateTime.Now, // Accenture Figi = "BBG000D9D830", Interval = OperationInterval.Month }; var response = await _operationService.Get(filter, CancellationToken.None); ValidateRestResponse(response); Assert.NotNull(response.Operations); }
static void Main(string[] args) { var token = File.ReadAllText("token.txt").Replace("\n", "").Replace("\t", "").Replace(" ", ""); RestConfiguration = new RestConfiguration { AccessToken = token, BaseUrl = "https://api-invest.tinkoff.ru/openapi/", SandboxMode = false }; MarketService = new MarketService(RestConfiguration); PortfolioService = new PortfolioService(RestConfiguration); OperationService = new OperationService(RestConfiguration); var result = PortfolioService.GetPortfolio().Result; Console.WriteLine("Портфель:"); Console.WriteLine($"Тикер \tКол-во \tСредняя(FIFO)\tСредняя(Норм)\tДоход(FIFO)"); foreach (var position in result.Positions) { var operationsOfOpenPosition = new[] { new { OperationType = ExtendedOperationType.BrokerCommission, Trade = new Trade() } }.ToList(); operationsOfOpenPosition.Clear(); var filter = new OperationsFilter(); filter.Figi = position.Figi; filter.Interval = OperationInterval.Month; filter.To = DateTime.Now; filter.From = DateTime.Now.AddYears(-1); var operations = OperationService.Get(filter).Result.Operations; var buySellOperations = operations.Where(x => (x.OperationType == ExtendedOperationType.Buy || x.OperationType == ExtendedOperationType.Sell) && x.Status != OperationStatus.Decline) .SelectMany(x => x.Trades.Select(y => new { x.OperationType, Trade = y })).OrderByDescending(x => x.Trade.Date); var balance = position.Balance; foreach (var operation in buySellOperations) { balance = operation.OperationType == ExtendedOperationType.Buy ? (balance - operation.Trade.Quantity) : (balance + operation.Trade.Quantity); operationsOfOpenPosition.Add(operation); if (balance == 0) { break; } } var averageValue = 0m; var qty = 0; var orderedOperations = operationsOfOpenPosition.OrderBy(x => x.Trade.Date); foreach (var operation in orderedOperations.OrderBy(x => x.Trade.Date)) { if (averageValue == 0m) { averageValue = operation.Trade.Price; qty = operation.Trade.Quantity; } else if (operation.OperationType == ExtendedOperationType.Buy) { averageValue = (averageValue * qty + operation.Trade.Price * operation.Trade.Quantity) / (qty + operation.Trade.Quantity); qty += operation.Trade.Quantity; } else { averageValue = (averageValue * qty - operation.Trade.Price * operation.Trade.Quantity) / (qty - operation.Trade.Quantity); qty -= operation.Trade.Quantity; } } if (position.ExpectedYield.Value > 0) { Console.ForegroundColor = ConsoleColor.Green; } else { Console.ForegroundColor = ConsoleColor.Red; } Console.WriteLine($"{position.Ticker,-15}\t{position.Balance, -8}\t{position.AveragePositionPrice.Value, -8}\t{averageValue,-8:0.00}\t{position.ExpectedYield?.Value,-8} {position.ExpectedYield?.Currency,-8}"); //if(position.Ticker == "M") //{ // foreach(var operation in orderedOperations) // { // Console.WriteLine($"{position.Ticker} {operation.Trade.Date} {operation.OperationType} {operation.Trade.Price}x{operation.Trade.Quantity}={operation.Trade.Price*operation.Trade.Quantity} "); // } //} //foreach (var operation in operations.Where(x=>x.OperationType != ExtendedOperationType.BrokerCommission && x.Status != OperationStatus.Decline)) //{ // // Console.WriteLine($"{position.Ticker} {operation.Date} {operation.OperationType} {operation.Price} {operation.Quantity} {operation.Payment} {operation.Commission?.Value} {operation.Status}"); //} //var buyOperations = operations.Where(x => x.OperationType == ExtendedOperationType.Buy && x.Status != OperationStatus.Decline).SelectMany(x=>x.Trades); //var sellOperations = operations.Where(x => x.OperationType == ExtendedOperationType.Sell && x.Status != OperationStatus.Decline).SelectMany(x => x.Trades); //Console.WriteLine($"{position.Ticker} count {buyOperations.Sum(x => x.Quantity) - sellOperations.Sum(x => x.Quantity)}"); } }