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));
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 5
0
        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)}");
            }
        }