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);
        }
예제 #2
0
        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);
            }
        }