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 <Stock> GetAllStocks(GetAllStocksFilter filter) { #region Command var command = @" SELECT B.CODIGO_BDI 'BdiCode', B.DESCRICAO_BDI 'BdiDescription', P.CODIGO_NEGOCIACAO 'Code', M.CODIGO_MERCADO 'MarketCode', M.DESCRICAO_MERCADO 'MarketDescription', P.EMPRESA 'Company', E.CODIGO_ESPECIFICACAO 'SpecificationCode', E.DESCRICAO_ESPECIFICACAO 'SpecificationDescription', P.MOEDA 'Currency', I.CODIGO_INDICADOR_CORRECAO 'CorrectionIndicatorCode', I.SIGLA_INDICADOR_CORRECAO 'CorrectionIndicatorSymbol', I.DESCRICAO_INDICADOR_CORRECAO 'CorrectionIndicatorDescription', P.FATOR_COTACAO 'CotationFactor', P.ISIN 'IsinCode' FROM TB_PAPEL P WITH(NOLOCK) LEFT JOIN TB_MERCADO M WITH(NOLOCK) ON P.CODIGO_MERCADO = M.CODIGO_MERCADO LEFT JOIN TB_BDI B WITH(NOLOCK) ON P.CODIGO_BDI = B.CODIGO_BDI LEFT JOIN TB_ESPECIFICACAO E WITH(NOLOCK) ON P.CODIGO_ESPECIFICACAO = E.CODIGO_ESPECIFICACAO LEFT JOIN TB_INDICADOR_CORRECAO I WITH(NOLOCK) ON P.CODIGO_INDICADOR_CORRECAO = I.CODIGO_INDICADOR_CORRECAO WHERE (@MarketCode IS NULL OR M.CODIGO_MERCADO = @MarketCode) AND (@SpecificationCode IS NULL OR E.CODIGO_ESPECIFICACAO = @SpecificationCode) AND (@BdiCode IS NULL OR B.CODIGO_BDI = @BdiCode) ORDER BY P.CODIGO_NEGOCIACAO" ; #endregion var result = new List <Stock>(); using (var connection = new System.Data.SqlClient.SqlConnection(connectionString)) { connection.Open(); var resultModel = connection.Query <StockModel>(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()); }