private bool ProcessarQuantidadesTeoricas(string indice, string arquivo) { try { Dictionary <string, double> listaQtdTeoricas = new Dictionary <string, double>(); string linha; StreamReader streamReader = new StreamReader(arquivo); while ((linha = streamReader.ReadLine()) != null) { if (linha != null && linha.Trim().Length > 0) { string[] parametros = linha.Split('\t'); string ativo = parametros[0].Trim(); double qtdTeorica; if (!double.TryParse(parametros[1].Replace(',', '.'), numberStyles, ciUS, out qtdTeorica)) { qtdTeorica = 0; } if (ativo.Length > 0 && qtdTeorica > 0) { listaQtdTeoricas.Add(ativo, qtdTeorica); } } } streamReader.Close(); if (listaQtdTeoricas.Count == 0) { logger.Error("Não há linhas válidas no arquivo lido!"); return(false); } logger.Info("Atualizando Quantidades Teoricas"); DCotacoes _DCotacoes = new DCotacoes(); logger.Info("Ativos lidos e tratados do arquivo: " + listaQtdTeoricas.Count); foreach (KeyValuePair <string, double> item in listaQtdTeoricas) { logger.Info("Gravando ComposicaoIndice Ativo[" + item.Key + "] QtdTeorica[" + item.Value + "]"); IndiceGradual.ItemComposicaoIndice itemComposicaoIndice = new IndiceGradual.ItemComposicaoIndice(); itemComposicaoIndice.ativo = item.Key; itemComposicaoIndice.qtdeTeorica = item.Value; itemComposicaoIndice.dataCotacao = DateTime.Now; _DCotacoes.AtualizarComposicaoIndiceGradual(indice, itemComposicaoIndice, true); } } catch (Exception ex) { logger.Error("Falha em ProcessarQuantidadesTeoricas(): " + ex.Message); return(false); } return(true); }
public void AtualizarIndiceGradual(string instrumento, string mensagem) { try { if (CalcularIndiceGradual) { DCotacoes _DCotacoes = new DCotacoes(); string dataHoraMensagem = mensagem.Substring(41, 14); DateTime dataCotacao = new DateTime( int.Parse(dataHoraMensagem.Substring(0, 4)), int.Parse(dataHoraMensagem.Substring(4, 2)), int.Parse(dataHoraMensagem.Substring(6, 2)), int.Parse(dataHoraMensagem.Substring(8, 2)), int.Parse(dataHoraMensagem.Substring(10, 2)), int.Parse(dataHoraMensagem.Substring(12, 2))); int status = int.Parse(mensagem.Substring(155, 1)); // Se serviço ativado ou cotação já é do dia seguinte, recarrega a composição dos Índices if (dataCotacaoIBOV.Equals(DateTime.MinValue) || dataCotacao.Date > dataCotacaoIBOV.Date) { statusIBOV = 2; dataCotacaoIBOV = dataCotacao; logger.Info("Iniciando dia de negociações com dataCotação[" + dataCotacaoIBOV + "] e status[" + statusIBOV + "]"); RecarregarComposicaoIndices(); foreach (ItemIndice dadosIndice in listaIndice.Values) { dadosIndice.fechamentoAnterior = dadosIndice.cotacaoAtual; logger.Info("Indice[" + dadosIndice.indice + "]: Atualizando Fechamento Anterior[" + dadosIndice.fechamentoAnterior + "] com a Cotação Atual[" + dadosIndice.cotacaoAtual + "]"); } } // Se cotação do IBOV não está mais em negociação, de um mesmo dia, atualiza o fechamento dos Índices else if (statusIBOV == 2 && status == 0 && dataCotacao.Date == dataCotacaoIBOV.Date) { foreach (ItemIndice dadosIndice in listaIndice.Values) { if (dataCotacao.Date == dadosIndice.dataCotacao) { dadosIndice.fechamentoAnterior = dadosIndice.cotacaoAtual; _DCotacoes.AtualizarCotacaoIndice(dadosIndice); logger.Info("Indice[" + dadosIndice.indice + "]: Atualizado Fechamento Anterior[" + dadosIndice.fechamentoAnterior + "] com a Cotação Atual[" + dadosIndice.cotacaoAtual + "] variacao[" + dadosIndice.variacao + "] data[" + dadosIndice.dataCotacao + "]"); statusIBOV = status; } } } if (status == 2 && statusIBOV == 2) { foreach (ItemIndice dadosIndice in listaIndice.Values) { double valorIndice = 0; bool gravarComposicaoIndice = true; foreach (ItemComposicaoIndice item in listaComposicao[dadosIndice.indice]) { lock (MemoriaCotacao.hstCotacoesIndiceGradual) { if (MemoriaCotacao.hstCotacoesIndiceGradual.ContainsKey(item.ativo)) { string cotacao = (string)MemoriaCotacao.hstCotacoesIndiceGradual[item.ativo]; item.cotacao = Convert.ToDouble(cotacao.Substring(74, 13), ciBR); string dataHora = cotacao.Substring(41, 14); DateTime data = new DateTime( int.Parse(dataHora.Substring(0, 4)), int.Parse(dataHora.Substring(4, 2)), int.Parse(dataHora.Substring(6, 2)), int.Parse(dataHora.Substring(8, 2)), int.Parse(dataHora.Substring(10, 2)), int.Parse(dataHora.Substring(12, 2))); if (item.cotacao == 0.0 || !DateTime.Now.ToString("yyyyMMdd").Equals(data.ToString("yyyyMMdd"))) { logger.FatalFormat("Ativo [{0}] cotacao [{1}] ult neg [{2}] impedindo o calculo do indice", item.ativo, item.cotacao, data.ToString("dd/MM/yyyy HH:mm:ss.fff")); gravarComposicaoIndice = false; break; } item.variacao = Convert.ToDouble(cotacao.Substring(146, 9).Trim(), ciBR); item.qtdeAjustada = item.qtdeTeorica * item.cotacao; valorIndice += item.qtdeAjustada; item.dataCotacao = dataCotacao; } else { logger.FatalFormat("Ativo [{0}] sem cotacao na memoria, impedindo o calculo do indice", item.ativo); gravarComposicaoIndice = false; break; } } } // Apenas grava as atualizações de composição do indice e as atualizações do indice, // se todas as cotações dos ativos estiverem com valor > 0 e tiverem cotações no dia corrente if (gravarComposicaoIndice) { foreach (ItemComposicaoIndice item in listaComposicao[dadosIndice.indice]) { _DCotacoes.AtualizarComposicaoIndiceGradual(dadosIndice.indice, item, false); logger.Info("Gravado Composicao de Indice[" + dadosIndice.indice + "]: ativo[" + item.ativo + "]: cotacao[" + item.cotacao + "] variacao[" + item.variacao + "] qtdeAjustada[" + item.qtdeAjustada + "] data[" + item.dataCotacao + "]"); } double variacao = 0; double fechamento = dadosIndice.fechamentoAnterior; if (fechamento != 0) { variacao = ((valorIndice / fechamento) - 1) * 100; } dadosIndice.cotacaoAtual = valorIndice; dadosIndice.variacao = variacao; dadosIndice.dataCotacao = dataCotacao; _DCotacoes.AtualizarCotacaoIndice(dadosIndice); logger.Info("Gravado Indice[" + dadosIndice.indice + "]: cotacao[" + dadosIndice.cotacaoAtual + "] fechamento[" + dadosIndice.fechamentoAnterior + "] variacao[" + dadosIndice.variacao + "] data[" + dadosIndice.dataCotacao + "]"); if (EnviarPriceLinkBloomberg) { PriceLink.PriceLinkSession sessionPriceLink = new PriceLink.PriceLinkSession(); string indiceAtual = String.Format("{0:0.00}", dadosIndice.cotacaoAtual).Replace(",", "."); sessionPriceLink.Contribute( BloombergSecurityID, indiceAtual, BloombergTransactionType, BloombergSecurityType, BloombergSecurityIdType); logger.Info("Enviado Bloomberg PriceLink SecurityID[" + BloombergSecurityID + "]: cotacaoAtual[" + indiceAtual + "] TransactionType[" + BloombergTransactionType + "] SecurityType[" + BloombergSecurityType + "] SecurityIdType[" + BloombergSecurityIdType + "]"); sessionPriceLink = null; } } } } } } catch (Exception ex) { logger.Error("AtualizarIndiceGradual(): " + ex.Message, ex); } }