public IndiceGradualQuantidadeTeorica()
        {
            if (CalcularIndiceGradual)
            {
                if (ConfigurationManager.AppSettings["IntervaloChecagemArquivo"] != null)
                {
                    gIntervalo = int.Parse(ConfigurationManager.AppSettings["IntervaloChecagemArquivo"]);
                }

                if (ConfigurationManager.AppSettings["DiretorioChecagemArquivo"] != null)
                {
                    gDiretorio = ConfigurationManager.AppSettings["DiretorioChecagemArquivo"];
                }

                listaIndices.Clear();
                DCotacoes _DCotacoes = new DCotacoes();
                listaIndices = _DCotacoes.ObterListaIndicesGradual();

                foreach (IndiceGradual.ItemIndice item in listaIndices)
                {
                    logger.Info("Preparado para tratar Indice Gradual[" + item.indice + "] codigo[" + item.codigoIndice + "]");
                }

                logger.Info("Ativando monitoramento de Arquivo de Quantidades Teoricas (Intervalo = " + gIntervalo + " segs) (Diretorio = " + gDiretorio + ")");
                gTimer = new Timer(new TimerCallback(VerificaArquivos), null, 0, gIntervalo * 1000);
            }
        }
        private void DivulgarQuantidadesTeoricas(int codigoIndice, string indice)
        {
            try
            {
                DCotacoes _DCotacoes = new DCotacoes();

                List <IndiceGradual.ItemComposicaoIndice> lista = _DCotacoes.ObterListaComposicaoIndiceGradual(codigoIndice);

                logger.Info("Montando e-mail informativo de atualização de Quantidades Teóricas Indice[" + indice + "]");

                string subject = "[" + indice + "] Atualização das Quantidades Teóricas";

                string body = "E-Mail Automático gerado pelo Sistema Gradual.OMS.Cotacao - Servidor [" + System.Environment.MachineName + "]";
                body += "\r\n";
                body += "\r\n";
                body += "Quantidades Teóricas atualizadas em " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                body += "\r\n";
                body += "\r\n";
                body += "\r\n";

                foreach (IndiceGradual.ItemComposicaoIndice item in lista)
                {
                    body += String.Format("Ativo [{0,-14}] Qtd.Teórica [{1,12:######0.0000}]", item.ativo, item.qtdeTeorica);
                    body += "\r\n";
                }

                _enviarEmail(subject, body);
            }
            catch (Exception ex)
            {
                logger.Error("Falha em DivulgarQuantidadesTeoricas(): " + ex.Message);
            }
        }
        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);
        }
示例#4
0
        public void RecarregarComposicaoIndices()
        {
            try
            {
                if (CalcularIndiceGradual)
                {
                    logger.Info("*** Carregando Composição dos Índices Gradual...");

                    listaIndice     = new Dictionary <string, ItemIndice>();
                    listaComposicao = new Dictionary <string, List <ItemComposicaoIndice> >();

                    DCotacoes         _DCotacoes = new DCotacoes();
                    List <ItemIndice> lista      = _DCotacoes.ObterListaIndicesGradual();

                    foreach (ItemIndice item in lista)
                    {
                        logger.Info("Indice Gradual[" +
                                    item.indice + "]: cod[" +
                                    item.codigoIndice + "] cotacao[" +
                                    item.cotacaoAtual + "] fechamento[" +
                                    item.fechamentoAnterior + "] variacao[" +
                                    item.variacao + "] data[" +
                                    item.dataCotacao + "]");
                        listaIndice.Add(item.indice, item);

                        List <ItemComposicaoIndice> listaComposicaoIndice = _DCotacoes.ObterListaComposicaoIndiceGradual(item.codigoIndice);
                        logger.Info("Indice Gradual[" + item.indice + "] com " + listaComposicaoIndice.Count + " ativos carregados");
                        foreach (ItemComposicaoIndice itemComposicao in listaComposicaoIndice)
                        {
                            logger.Info("Indice Gradual[" +
                                        item.indice + "]: ativo[" +
                                        itemComposicao.ativo + "] qtdeTeorica[" +
                                        itemComposicao.qtdeTeorica + "] data[" +
                                        itemComposicao.dataCotacao + "]");
                        }
                        listaComposicao.Add(item.indice, listaComposicaoIndice);
                    }

                    logger.Info("*** Composição dos Índices carregados!");
                }
            }
            catch (Exception ex)
            {
                logger.Error("RecarregarComposicaoIndices(): " + ex.Message, ex);
            }
        }
示例#5
0
        protected void ObterDadosPapel()
        {
            DCotacoes _DCotacoes = new DCotacoes();

            Dictionary <string, string> papeisCadastro = _DCotacoes.ObterHashDadosCotacao();

            foreach (KeyValuePair <string, string> item in papeisCadastro)
            {
                MemoriaCotacao.hstDadosPapel.AddOrUpdate(item.Key, item.Value, (key, oldvalue) => item.Value);
            }

            //Hashtable listaIndices = composicaoIndice.GetListaIndices();

            foreach (string instrumento in papeisCadastro.Keys)
            {
                if (!MemoriaCotacao.hstCotacoes.ContainsKey(instrumento))
                {
                    string fakemsg = "";

                    /*
                     * if (listaIndices.Contains(instrumento))
                     * {
                     *  logger.Info("Inicializando dados de cotacao para indice [" + instrumento + "]");
                     *
                     *  ComposicaoIndice.ItemIndice indice = (ComposicaoIndice.ItemIndice)listaIndices[instrumento];
                     *
                     *  fakemsg = "NEBV";                               // Tipo msg + bolsa
                     *  fakemsg += "00000000000000000";                 // Dthr
                     *  fakemsg += instrumento.PadRight(20);            // Instrumento
                     *  fakemsg += indice.dataCotacao.ToString("yyyyMMdd");
                     *                                                  // Data
                     *  fakemsg += indice.dataCotacao.ToString("HHmmss") + "000";
                     *                                                  // Hora
                     *  fakemsg += "0".PadLeft(8, '0');                 // Corretora compradora
                     *  fakemsg += "0".PadLeft(8, '0');                 // Corretora vendedora
                     *  fakemsg += indice.valor.ToString("0.00", ciBR).PadLeft(13, '0');
                     *                                                  // Preco
                     *  fakemsg += "0".PadLeft(12, '0');                // Quantidade
                     *  fakemsg += "0".PadLeft(9, '0') + ",000";        // Max
                     *  fakemsg += "0".PadLeft(9, '0') + ",000";        // Min
                     *  fakemsg += "0".PadLeft(9, '0') + ",000";        // Volume
                     *  fakemsg += "1".PadLeft(8, '0');                 // Num Neg
                     *  fakemsg += (indice.oscilacao < 0) ? "-" : " ";  // Indic. Variacao
                     *  fakemsg += Math.Abs(indice.oscilacao).ToString("0.00", ciBR).PadLeft(8, '0');
                     *                                                  // Variacao
                     *  fakemsg += "2";                                 // "2" - negociado
                     *  fakemsg += "0".PadLeft(12, '0');                // Qtde compra
                     *  fakemsg += "0".PadLeft(12, '0');                // Qtde venda
                     * }
                     * else
                     * {
                     */
                    logger.Info("Inicializando dados de cotacao para [" + instrumento + "]");

                    fakemsg  = "NEB-";                                       // Tipo msg + bolsa
                    fakemsg += "00000000000000000";                          // Dthr
                    fakemsg += instrumento.PadRight(20);                     // Instrumento
                    fakemsg += "0".PadLeft(8, '0');                          // Data
                    fakemsg += "0".PadLeft(9, '0');                          // Hora
                    fakemsg += "0".PadLeft(8, '0');                          // Corretora compradora
                    fakemsg += "0".PadLeft(8, '0');                          // Corretora vendedora
                    fakemsg += "0".PadLeft(9, '0') + ",000";                 // Preco
                    fakemsg += "0".PadLeft(12, '0');
                    fakemsg += "0".PadLeft(9, '0') + ",000";                 // Max
                    fakemsg += "0".PadLeft(9, '0') + ",000";                 // Min
                    fakemsg += "0".PadLeft(9, '0') + ",000";                 // Volume
                    fakemsg += "0".PadLeft(8, '0');                          // Num Neg
                    fakemsg += " ";                                          // Indic. Variacao
                    fakemsg += "0".PadLeft(5, '0') + ",00";                  // Variacao
                    fakemsg += "0";                                          // "0" - nao negociado
                    fakemsg += "0".PadLeft(12, '0');                         // Qtde compra
                    fakemsg += "0".PadLeft(12, '0');                         // Qtde venda
                    fakemsg += "0".PadLeft(12, '0');                         // Qtde negociada dia
                    fakemsg += "000000000,000";                              // Preco medio
                    fakemsg += "000000000,000";                              // Preco teorico abertura
                    fakemsg += " 00000.00";                                  // Variacao teorica
                    fakemsg += DateTime.MinValue.ToString("yyyyMMddHHmmss"); // Horario teorico abertura
                    //}

                    List <string> valores = MemoriaCotacao.hstCotacoes.GetOrAdd(instrumento, new List <string>());
                    valores.Add(fakemsg);
                }
            }

            Dictionary <string, string> dadosOpcoes = _DCotacoes.ObterHashDadosOpcoes();

            foreach (KeyValuePair <string, string> item in dadosOpcoes)
            {
                MemoriaCotacao.hstDadosOpcoes.AddOrUpdate(item.Key, item.Value, (key, oldvalue) => item.Value);
            }
        }
示例#6
0
        public void RecalcularIndice(string instrumento, string mensagem)
        {
            if (EfetuarCalculosIndice)
            {
                // Tratar apenas cotações existentes nos papéis dos Índices
                if (hstPapeis.Contains(instrumento))
                {
                    // Usar o índice IBOV para definir o momento do recarregamento de composição ou fechamento dos índices
                    if (instrumento.Equals(INDICE_IBOV))
                    {
                        string   dataMsg     = mensagem.Substring(41, 14);
                        DateTime dataCotacao = new DateTime(
                            int.Parse(dataMsg.Substring(0, 4)),
                            int.Parse(dataMsg.Substring(4, 2)),
                            int.Parse(dataMsg.Substring(6, 2)),
                            int.Parse(dataMsg.Substring(8, 2)),
                            int.Parse(dataMsg.Substring(10, 2)),
                            int.Parse(dataMsg.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      = status;
                            dataCotacaoIBOV = dataCotacao;
                            logger.Info("Iniciando dia de negociações com dataCotação[" + dataCotacaoIBOV + "] e status[" + statusIBOV + "]");
                            RecarregarComposicaoIndices();
                        }

                        // Se cotação do IBOV não está mais em negociação, de um mesmo dia, grava fechamento dos Índices no SQL
                        else if (statusIBOV == 2 && status == 0 && dataCotacao.Date == dataCotacaoIBOV.Date)
                        {
                            statusIBOV = status;
                            DCotacoes             _DCotacoes  = new DCotacoes();
                            IDictionaryEnumerator itensIndice = hstIndices.GetEnumerator();
                            while (itensIndice.MoveNext())
                            {
                                logger.Info("Gravando Índice[" + ((ItemIndice)itensIndice.Value).indice + "] na tabela TB_ATIVO");
                                _DCotacoes.AtualizarTbAtivo((ItemIndice)itensIndice.Value);
                                logger.Info("Gravando Índice[" + ((ItemIndice)itensIndice.Value).indice + "] na tabela TB_HISTORICO_INDICE");
                                _DCotacoes.InserirTbHistoricoAtivo((ItemIndice)itensIndice.Value);
                            }
                        }
                    }
                    else
                    {
                        // Tratar apenas cotações de papéis em negociação
                        if (mensagem.Substring(155, 1).Equals("2"))
                        {
                            // Efetua o recálculo para todos os Índices onde o papel existe
                            foreach (string itemIndice in (List <string>)hstPapeis[instrumento])
                            {
                                double   valorIndice = 0;
                                DateTime data        = DateTime.Now;

                                foreach (ItemQtdeTeorica itemQtdeTeorica in (List <ItemQtdeTeorica>)hstComposicaoIndice[itemIndice])
                                {
                                    if (itemQtdeTeorica.papel.Equals(instrumento))
                                    {
                                        string dataMsg = mensagem.Substring(41, 14);
                                        data = new DateTime(
                                            int.Parse(dataMsg.Substring(0, 4)),
                                            int.Parse(dataMsg.Substring(4, 2)),
                                            int.Parse(dataMsg.Substring(6, 2)),
                                            int.Parse(dataMsg.Substring(8, 2)),
                                            int.Parse(dataMsg.Substring(10, 2)),
                                            int.Parse(dataMsg.Substring(12, 2)));
                                        double valor = Convert.ToDouble(mensagem.Substring(74, 13), ciBR);
                                        logger.Debug("Atualizando Cotação do papel[" + instrumento + "]: DataHora[" + data + "] valor[" + valor + "]");
                                        itemQtdeTeorica.dataCotacao = data;
                                        itemQtdeTeorica.valor       = valor;
                                    }

                                    if (itemQtdeTeorica.dataCotacao.Date >= dataCotacaoIBOV.Date)
                                    {
                                        valorIndice += itemQtdeTeorica.qtdeTeorica * itemQtdeTeorica.valor;
                                        logger.Debug("Acumula para papel[" + itemQtdeTeorica.papel + "] o valor     [" + itemQtdeTeorica.valor + "]");
                                    }
                                    else
                                    {
                                        valorIndice += itemQtdeTeorica.qtdeTeorica * itemQtdeTeorica.fechamento;
                                        logger.Debug("Acumula para papel[" + itemQtdeTeorica.papel + "] o fechamento[" + itemQtdeTeorica.fechamento + "]");
                                    }
                                }

                                double oscilacao  = 0;
                                double fechamento = ((ItemIndice)hstIndices[itemIndice]).fechamento;
                                if (fechamento != 0)
                                {
                                    oscilacao = ((valorIndice / fechamento) - 1) * 100;
                                }
                                logger.Debug("Indice[" + itemIndice + "]: Valor[" + valorIndice + "] Oscilacao[" + oscilacao + "]");

                                string mensagemIndice = "NEBV";                                               // Tipo msg + bolsa
                                mensagemIndice += "00000000000000000";                                        // Dthr
                                mensagemIndice += itemIndice.PadRight(20);                                    // Instrumento
                                mensagemIndice += mensagem.Substring(41, 8);                                  // Data
                                mensagemIndice += mensagem.Substring(49, 9);                                  // Hora
                                mensagemIndice += "0".PadLeft(8, '0');                                        // Corretora compradora
                                mensagemIndice += "0".PadLeft(8, '0');                                        // Corretora vendedora
                                mensagemIndice += valorIndice.ToString("0.00", ciBR).PadLeft(13, '0');        // Preco
                                mensagemIndice += "0".PadLeft(12, '0');                                       // Quantidade
                                mensagemIndice += "0".PadLeft(9, '0') + ",000";                               // Max
                                mensagemIndice += "0".PadLeft(9, '0') + ",000";                               // Min
                                mensagemIndice += "0".PadLeft(9, '0') + ",000";                               // Volume
                                mensagemIndice += "1".PadLeft(8, '0');                                        // Num Neg
                                mensagemIndice += (oscilacao < 0) ? "-" : " ";                                // Indic. Variacao
                                mensagemIndice += Math.Abs(oscilacao).ToString("0.00", ciBR).PadLeft(8, '0'); // Variacao
                                mensagemIndice += "2";                                                        // "2" - negociado
                                mensagemIndice += "0".PadLeft(12, '0');                                       // Qtde compra
                                mensagemIndice += "0".PadLeft(12, '0');                                       // Qtde venda

                                ((ItemIndice)hstIndices[itemIndice]).valor       = valorIndice;
                                ((ItemIndice)hstIndices[itemIndice]).oscilacao   = oscilacao;
                                ((ItemIndice)hstIndices[itemIndice]).dataCotacao = data;

                                List <string> lstCotacoes;

                                lstCotacoes = MemoriaCotacao.hstCotacoes.GetOrAdd(itemIndice, new List <string>());
                                lstCotacoes.Add(mensagemIndice);
                                logger.Debug("Mensagem indice[" + mensagemIndice + "]");
                                //lock (MemoriaCotacao.hstCotacoes)
                                //{
                                //    if (MemoriaCotacao.hstCotacoes[itemIndice] == null)
                                //    {
                                //        MemoriaCotacao.hstCotacoes.Add(itemIndice, new List<string>());
                                //    }

                                //    List<string> cotacoes = (List<string>)(MemoriaCotacao.hstCotacoes[itemIndice]);
                                //    cotacoes.Add(mensagemIndice);
                                //    logger.Debug("Mensagem indice[" + mensagemIndice + "]");
                                //}
                            }
                        }
                    }
                }
            }
        }
示例#7
0
        public void RecarregarComposicaoIndices()
        {
            if (EfetuarCalculosIndice)
            {
                logger.Info("*** Carregando Composição dos Índices...");

                DCotacoes _DCotacoes = new DCotacoes();

                List <ItemIndice>           listaIndice           = _DCotacoes.ObterDadosIndice();
                List <ItemComposicaoIndice> listaComposicaoIndice = _DCotacoes.ObterDadosComposicaoIndice();

                hstIndices.Clear();
                foreach (ItemIndice item in listaIndice)
                {
                    hstIndices.Add(item.indice,
                                   new ItemIndice(
                                       item.indice,
                                       item.codigoIndice,
                                       item.fechamento,
                                       item.fechamento,
                                       item.oscilacao,
                                       item.dataCotacao));
                }

                hstPapeis.Clear();
                hstComposicaoIndice.Clear();
                foreach (ItemComposicaoIndice item in listaComposicaoIndice)
                {
                    if (!hstPapeis.Contains(item.papel))
                    {
                        List <string> listaNomeIndices = new List <string>();
                        listaNomeIndices.Add(item.indice);
                        hstPapeis.Add(item.papel, listaNomeIndices);
                    }
                    else
                    {
                        List <string> listaNomeIndices = (List <string>)hstPapeis[item.papel];
                        listaNomeIndices.Add(item.indice);
                    }

                    if (!hstComposicaoIndice.Contains(item.indice))
                    {
                        List <ItemQtdeTeorica> listaQtdeTeorica = new List <ItemQtdeTeorica>();
                        listaQtdeTeorica.Add(new ItemQtdeTeorica(item.papel, item.qtdeTeorica, item.valor, item.fechamento, item.dataCotacao));
                        hstComposicaoIndice.Add(item.indice, listaQtdeTeorica);
                    }
                    else
                    {
                        List <ItemQtdeTeorica> listaQtdeTeorica = (List <ItemQtdeTeorica>)hstComposicaoIndice[item.indice];
                        listaQtdeTeorica.Add(new ItemQtdeTeorica(item.papel, item.qtdeTeorica, item.valor, item.fechamento, item.dataCotacao));
                    }
                }
                hstPapeis.Add(INDICE_IBOV, null);

                IDictionaryEnumerator itensIndice = hstIndices.GetEnumerator();
                while (itensIndice.MoveNext())
                {
                    logger.Info("Índice [" + itensIndice.Key + "]: fechamento[" + ((ItemIndice)itensIndice.Value).fechamento + "] dataCotacao[" + ((ItemIndice)itensIndice.Value).dataCotacao + "]");
                }

                IDictionaryEnumerator itens = hstComposicaoIndice.GetEnumerator();
                while (itens.MoveNext())
                {
                    logger.Info("Índice [" + itens.Key + "] contém [" + ((List <ItemQtdeTeorica>)itens.Value).Count + "] papéis");
                    foreach (ItemQtdeTeorica item in (List <ItemQtdeTeorica>)itens.Value)
                    {
                        logger.Info("Papel[" + item.papel + "] qtd teorica[" + item.qtdeTeorica + "] valor[" + item.valor + "] fechamento[" + item.fechamento + "] dataCotacao[" + item.dataCotacao + "]");
                    }
                }

                logger.Info("*** Composição dos Índices carregados!");
            }
        }
示例#8
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);
            }
        }