public CalculateRealStateFundsResult CalculateRealStateFunds(CalculateRealStateFundsParam param) { var result = new CalculateRealStateFundsResult(); var actualYear = DateTime.Now.Year; var initialDate = new DateTime((actualYear - 10), 1, 1); var finalDate = new DateTime(actualYear, 12, 31); var stockRepository = new StockRepository(); var filter = new GetAllStocksFilter(10, "12"); var stocks = stockRepository.GetAllStocks(filter); foreach (var stock in stocks) { var getFilter = new GetStockNegotiationFilter(stock.Code, initialDate, finalDate); var stockNegotiations = stockRepository.GetStockNegotiation(getFilter); var realStateFundsStatistics = new RealStateFundsStatistics(stock, stockNegotiations); result.Statistics.Add(realStateFundsStatistics.MapToResult()); } return(result); }
public List <StockNegotiation> GetStockNegotiation(GetStockNegotiationFilter filter) { #region Command var command = @" SELECT C.CODIGO_NEGOCIACAO 'Code', C.DATA_NEGOCIACAO 'Date', C.MELHOR_OFERTA_COMPRA 'BestBuyValue', C.MELHOR_OFERTA_VENDA 'BestSellValue', C.QUANTIDADE_NEGOCIOS 'AmountOfTrade', C.QUANTIDADE_TITULOS 'AmountOfBonds', C.VALOR_ABERTURA 'FirstValue', C.VALOR_FECHAMENTO 'LastValue', C.VALOR_MAXIMO 'MaxValue', C.VALOR_MEDIO 'AverageValue', C.VALOR_MINIMO 'MinValue', C.VOLUME_TOTAL_TITULOS 'TotalValueOfBonds' FROM TB_COTACAO C WHERE C.CODIGO_NEGOCIACAO = @StockCode AND (C.DATA_NEGOCIACAO BETWEEN @InitialDate AND @FinalDate) "; #endregion var result = new List <StockNegotiation>(); using (var connection = new System.Data.SqlClient.SqlConnection(connectionString)) { connection.Open(); var resultModel = connection.Query <StockNegotiationModel>(command, filter); foreach (var model in resultModel) { result.Add(model.ToEntity()); } connection.Close(); } return(result); }
public List <StockAverage> CalculateAverage(CalculateAverageParam param) { var validate = new CalculateAverageParamValidator().Validate(param); if (!validate.IsValid) { throw new ApplicationException($"Falha nos parâmetros de entrada ({string.Join(",", validate.Errors)})"); } var stockRepository = new StockRepository(); var getAllStocksFilter = new GetAllStocksFilter(param.MarketCode, param.SpecificationCode, param.BdiCode); var stockList = stockRepository.GetAllStocks(getAllStocksFilter); if (!string.IsNullOrEmpty(param.Code)) { stockList = stockList.Where(a => string.Compare(a.Code, param.Code, true) == 0).ToList(); } var po = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }; var averageResults = new ConcurrentBag <StockAverage>(); Parallel.ForEach(stockList, po, (stock) => { try { var getStockNegotiationFilter = new GetStockNegotiationFilter(stock.Code, param.InitialDate, param.FinalDate); var stockNegotiationList = stockRepository.GetStockNegotiation(getStockNegotiationFilter); stockNegotiationList = stockNegotiationList.OrderBy(a => a.Date).ToList(); var averageValue = 0M; var daysCount = 0; var values = new List <StockDayValue>(); var lastValue = 0M; var percentageAboveAverage = 0M; var percentageBelowAverage = 0M; var amountOfTradeInLastDay = 0; if (stockNegotiationList.Count() > 0) { averageValue = stockNegotiationList.Average(a => a.LastValue); daysCount = stockNegotiationList.Count(); values = stockNegotiationList.ConvertAll(a => new StockDayValue { Day = a.Date.Date, Value = a.LastValue, AmountOfTrade = a.AmountOfTrade }); var maxDate = values.Max(b => b.Day.Date); var lastStockDayValue = values.First(a => a.Day.Date.Equals(maxDate)); lastValue = lastStockDayValue.Value; amountOfTradeInLastDay = lastStockDayValue.AmountOfTrade; if (lastStockDayValue.Value > averageValue) { percentageAboveAverage = ((lastStockDayValue.Value - averageValue) / averageValue); } else if (lastStockDayValue.Value < averageValue) { percentageBelowAverage = ((averageValue - lastStockDayValue.Value) / averageValue); } } var average = new StockAverage { StockCode = stock.Code, InitialDate = param.InitialDate.Date, FinalDate = param.FinalDate.Date, AverageValue = Math.Round(averageValue, 2), PercentageAboveAverage = Math.Round(percentageAboveAverage, 4), PercentageBelowAverage = Math.Round(percentageBelowAverage, 4), DaysCount = daysCount, Values = values, LastValue = lastValue, AmountOfTradeInLastDay = amountOfTradeInLastDay }; averageResults.Add(average); } catch (Exception ex) { Console.WriteLine($"{stock.Code}"); Console.WriteLine(ex.Message); } }); return(averageResults.ToList()); }