示例#1
0
        public static void AcompanhamentoLeilao(NegocioInfo negocio, Queue <DadosFilaAcompanhamentoLeilao> filaLeilao)
        {
            try
            {
                // Contabiliza apenas as mensagens na data atual
                if (!DateTime.Now.ToString("yyyyMMdd").Equals(negocio.DataHora.ToString("yyyyMMdd")))
                {
                    return;
                }

                // Se mensagem não for de leilão, remove instrumento do acompanhamento de leilao e envia lista atualizada para o Streamer
                if (negocio.Status != 1)
                {
                    if (dictInstrumentosLeilao.ContainsKey(negocio.Instrumento))
                    {
                        logger.Info("Remove instrumento[" + negocio.Instrumento + "] do acompanhamento de leilao");
                        dictInstrumentosLeilao.Remove(negocio.Instrumento);
                        MontagemAcompanhamentoLeilaoStreamer(null);
                    }
                    return;
                }

                if (negocio.PrecoTeoricoAbertura > 0)
                {
                    if (dictInstrumentosLeilao.ContainsKey(negocio.Instrumento))
                    {
                        dictInstrumentosLeilao[negocio.Instrumento] = negocio;
                        logger.Info("Atualiza instrumento[" + negocio.Instrumento + "] do acompanhamento de leilao");
                    }
                    else
                    {
                        dictInstrumentosLeilao.Add(negocio.Instrumento, negocio);
                        logger.Info("Adiciona instrumento[" + negocio.Instrumento + "] do acompanhamento de leilao");
                    }
                    MontagemAcompanhamentoLeilaoStreamer(null);
                }
            }
            catch (Exception ex)
            {
                logger.Fatal("AcompanhamentoLeilao(): " + ex.Message, ex);
            }
        }
示例#2
0
        public static void ContabilizaNegocio(NegocioInfo negocio)
        {
            try
            {
                if (dictInstrumentos.ContainsKey(negocio.Instrumento))
                {
                    // Ignora instrumentos que não constar na lista predefinida de segmentos de mercado
                    string segmentoMercado = dictInstrumentos[negocio.Instrumento].SegmentoMercado;
                    if (!((IList <string>)SEGMENTOS_MERCADO).Contains(segmentoMercado))
                    {
                        return;
                    }

                    // Contabiliza os instrumentos do segmento de mercado fracionario junto com os instrumentos a vista
                    if (segmentoMercado.Equals(SEGMENTOMERCADO_BOVESPA_FRACIONARIO))
                    {
                        segmentoMercado = SEGMENTOMERCADO_BOVESPA_VISTA;
                    }

                    // Contabiliza apenas as mensagens de negocio, na data atual, e com número de negocio > 0
                    if (!DateTime.Now.ToString("yyyyMMdd").Equals(negocio.DataHora.ToString("yyyyMMdd")) || negocio.NumeroNegocio == 0)
                    {
                        return;
                    }

                    // Inicializa dicionarios, se mensagem de negociacao em novo dia
                    if (negocio.DataHora.ToString("yyyyMMdd").CompareTo(dataAtual.ToString("yyyyMMdd")) > 0 && negocio.NumeroNegocio > 0)
                    {
                        dataAtual = negocio.DataHora;
                        logger.Info("Novo dia de negociacoes [" + negocio.DataHora.ToString("dd/MM/yyyy") + "]. Inicializando contabilizacao!");
                        InicializarDicionarios();
                    }

                    // Despreza mensagens onde a corretora compradora ou vendedora esta zerada
                    if (negocio.Compradora == 0 || negocio.Vendedora == 0)
                    {
                        return;
                    }

                    // Despreza mensagens de negocios ja contabilizados
                    if (dictInstrumentos[negocio.Instrumento].NumeroNegocios >= negocio.NumeroNegocio)
                    {
                        return;
                    }

                    logger.Debug(String.Format("Contabiliza Instrumento[{0,19:dd/MM/yyyy HH:mm:ss} {1,2} {2,-14} {3,-2} {4,8} {5,13} {6,12} {7,6}% {8,8} {9,8}]",
                                               negocio.DataHora, negocio.Status, negocio.Instrumento, negocio.TipoBolsa, negocio.NumeroNegocio, negocio.Preco,
                                               negocio.Quantidade, negocio.Variacao, negocio.Compradora, negocio.Vendedora));

                    string compradora   = negocio.Compradora.ToString("D8");
                    string vendedora    = negocio.Vendedora.ToString("D8");
                    double valorNegocio = negocio.Preco * negocio.Quantidade;

                    lock (dictMaioresVolumesPorCorretora)
                    {
                        AtualizarDicionariosSegmentos(COMPRADORA, SEGMENTOMERCADO_TODOS, compradora, valorNegocio);
                        AtualizarDicionariosSegmentos(VENDEDORA, SEGMENTOMERCADO_TODOS, vendedora, valorNegocio);

                        AtualizarDicionariosSegmentos(COMPRADORA, segmentoMercado, compradora, valorNegocio);
                        AtualizarDicionariosSegmentos(VENDEDORA, segmentoMercado, vendedora, valorNegocio);
                    }

                    lock (dictInstrumentos)
                    {
                        dictInstrumentos[negocio.Instrumento].DataUltimoNegocio = negocio.DataHora;
                        dictInstrumentos[negocio.Instrumento].NumeroNegocios    = negocio.NumeroNegocio;
                        dictInstrumentos[negocio.Instrumento].VolumeNegocios    = negocio.Volume;
                        dictInstrumentos[negocio.Instrumento].Preco             = negocio.Preco;
                        dictInstrumentos[negocio.Instrumento].Variacao          = negocio.Variacao;
                        dictInstrumentos[negocio.Instrumento].QuantidadePapeis += negocio.Quantidade;

                        AtualizarDicionarioInstrumento(COMPRADORA, compradora, valorNegocio, dictInstrumentos[negocio.Instrumento]);
                        AtualizarDicionarioInstrumento(VENDEDORA, vendedora, valorNegocio, dictInstrumentos[negocio.Instrumento]);
                    }

                    lock (dictCorretoras)
                    {
                        AtualizarDicionarioCorretora(COMPRADORA, compradora, negocio.Instrumento, valorNegocio);
                        AtualizarDicionarioCorretora(VENDEDORA, vendedora, negocio.Instrumento, valorNegocio);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Fatal("ContabilizaNegocio(): " + ex.Message, ex);
            }
        }
示例#3
0
        public static void ContabilizaNegocio(NegocioInfo negocio)
        {
            try
            {
                if (dictInstrumentos.ContainsKey(negocio.Instrumento))
                {
                    // Ignora instrumentos que não constar na lista predefinida de segmentos de mercado
                    string segmentoMercado = dictInstrumentos[negocio.Instrumento].SegmentoMercado;
                    if (!((IList <string>)SEGMENTOS_MERCADO).Contains(segmentoMercado))
                    {
                        return;
                    }

                    // Contabiliza apenas as mensagens de negocio, na data atual, e com número de negocio > 0
                    if (!DateTime.Now.ToString("yyyyMMdd").Equals(negocio.DataHora.ToString("yyyyMMdd")) || negocio.NumeroNegocio == 0)
                    {
                        return;
                    }

                    // Inicializa dicionarios, se mensagem de negociacao em novo dia
                    if (negocio.DataHora.ToString("yyyyMMdd").CompareTo(dataAtual.ToString("yyyyMMdd")) > 0 && negocio.NumeroNegocio > 0)
                    {
                        dataAtual = negocio.DataHora;
                        logger.Info("Novo dia de negociacoes [" + negocio.DataHora.ToString("dd/MM/yyyy") + "]. Inicializando contabilizacao!");
                        InicializarDicionarios();
                    }

                    /*
                     * logger.Debug(String.Format("Contabiliza Instrumento[{0,19:dd/MM/yyyy HH:mm:ss} {1,2} {2,-14} {3,-2} {4,8} {5,13} {6,12} {7,6}% {8,8} {9,8}]",
                     *  negocio.DataHora, negocio.Status, negocio.Instrumento, negocio.TipoBolsa, negocio.NumeroNegocio, negocio.Preco,
                     *  negocio.Quantidade, negocio.Variacao, negocio.Compradora, negocio.Vendedora));
                     */

                    RankingInfo rankingNovo = null;
                    SortedDictionary <RankingInfo, string> dict             = null;
                    SortedDictionary <string, RankingInfo> dictPorCorretora = null;

                    string compradora = negocio.Compradora.ToString("D8");
                    string vendedora  = negocio.Vendedora.ToString("D8");

                    lock (dictMaioresAltasBaixasPorInstrumento)
                    {
                        // Atualiza dicionarios de maiores altas e baixas do instrumento
                        rankingNovo = new RankingInfo(negocio.Variacao, negocio.Instrumento);
                        if (dictMaioresAltasBaixasPorInstrumento[segmentoMercado].ContainsKey(negocio.Instrumento))
                        {
                            RankingInfo rankingAtual = dictMaioresAltasBaixasPorInstrumento[segmentoMercado][negocio.Instrumento];
                            dictMaioresAltas[segmentoMercado].Remove(rankingAtual);
                            dictMaioresBaixas[segmentoMercado].Remove(rankingAtual);
                            dictMaioresAltasBaixasPorInstrumento[segmentoMercado][negocio.Instrumento] = rankingNovo;
                        }
                        else
                        {
                            dictMaioresAltasBaixasPorInstrumento[segmentoMercado].Add(negocio.Instrumento, rankingNovo);
                        }
                        dictMaioresAltas[segmentoMercado].Add(rankingNovo, negocio.Instrumento);
                        dictMaioresBaixas[segmentoMercado].Add(rankingNovo, negocio.Instrumento);
                    }

                    lock (dictMaioresVolumesPorInstrumento)
                    {
                        // Atualiza dicionarios de maiores volumes do instrumento
                        rankingNovo = new RankingInfo(negocio.Volume, negocio.Instrumento);
                        if (dictMaioresVolumesPorInstrumento[segmentoMercado].ContainsKey(negocio.Instrumento))
                        {
                            RankingInfo rankingAtual = dictMaioresVolumesPorInstrumento[segmentoMercado][negocio.Instrumento];
                            dictMaioresVolumes[segmentoMercado].Remove(rankingAtual);
                            dictMaioresVolumesPorInstrumento[segmentoMercado][negocio.Instrumento] = rankingNovo;
                        }
                        else
                        {
                            dictMaioresVolumesPorInstrumento[segmentoMercado].Add(negocio.Instrumento, rankingNovo);
                        }
                        dictMaioresVolumes[segmentoMercado].Add(rankingNovo, negocio.Instrumento);
                    }

                    lock (dictMaisNegociadosPorInstrumento)
                    {
                        // Atualiza dicionarios de mais negociados do instrumento
                        rankingNovo = new RankingInfo(negocio.NumeroNegocio, negocio.Instrumento);
                        if (dictMaisNegociadosPorInstrumento[segmentoMercado].ContainsKey(negocio.Instrumento))
                        {
                            RankingInfo rankingAtual = dictMaisNegociadosPorInstrumento[segmentoMercado][negocio.Instrumento];
                            dictMaisNegociados[segmentoMercado].Remove(rankingAtual);
                            dictMaisNegociadosPorInstrumento[segmentoMercado][negocio.Instrumento] = rankingNovo;
                        }
                        else
                        {
                            dictMaisNegociadosPorInstrumento[segmentoMercado].Add(negocio.Instrumento, rankingNovo);
                        }
                        dictMaisNegociados[segmentoMercado].Add(rankingNovo, negocio.Instrumento);
                    }

                    lock (dictInstrumentos)
                    {
                        dictInstrumentos[negocio.Instrumento].DataUltimoNegocio = negocio.DataHora;
                        dictInstrumentos[negocio.Instrumento].NumeroNegocios    = negocio.NumeroNegocio;
                        dictInstrumentos[negocio.Instrumento].VolumeNegocios    = negocio.Volume;
                        dictInstrumentos[negocio.Instrumento].Preco             = negocio.Preco;
                        dictInstrumentos[negocio.Instrumento].Variacao          = negocio.Variacao;

                        dictInstrumentos[negocio.Instrumento].QuantidadePapeis += negocio.Quantidade;

                        // Atualiza dicionarios de Corretoras Compradoras mais negociadas do instrumento
                        dict             = dictInstrumentos[negocio.Instrumento].DictCompradorasMaisNegociadas;
                        dictPorCorretora = dictInstrumentos[negocio.Instrumento].DictCompradorasMaisNegociadasPorCorretora;
                        AcumulaCorretoras(1, compradora, 1, dict, dictPorCorretora);

                        // Atualiza dicionarios de Corretoras Vendedoras mais negociadas do instrumento
                        dict             = dictInstrumentos[negocio.Instrumento].DictVendedorasMaisNegociadas;
                        dictPorCorretora = dictInstrumentos[negocio.Instrumento].DictVendedorasMaisNegociadasPorCorretora;
                        AcumulaCorretoras(1, vendedora, 1, dict, dictPorCorretora);

                        double valor = negocio.Preco * negocio.Quantidade;

                        // Atualiza dicionarios de Corretoras Compradoras com mais volume do instrumento
                        dict             = dictInstrumentos[negocio.Instrumento].DictCompradorasMaioresVolumes;
                        dictPorCorretora = dictInstrumentos[negocio.Instrumento].DictCompradorasMaioresVolumesPorCorretora;
                        AcumulaCorretoras(0, compradora, valor, dict, dictPorCorretora);

                        // Atualiza dicionarios de Corretoras Vendedoras com mais volume do instrumento
                        dict             = dictInstrumentos[negocio.Instrumento].DictVendedorasMaioresVolumes;
                        dictPorCorretora = dictInstrumentos[negocio.Instrumento].DictVendedorasMaioresVolumesPorCorretora;
                        AcumulaCorretoras(0, vendedora, valor, dict, dictPorCorretora);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Fatal("ContabilizaNegocio(): " + ex.Message, ex);
            }
        }
示例#4
0
        protected void OnNegocio(object sender, MDSMessageEventArgs args)
        {
            try
            {
                NegocioInfo negocio = new NegocioInfo();

                // Layout da mensagem de negocio
                // Header
                // Nome	Tipo	Tamanho	Observação
                // Tipo de Mensagem X(2)
                // Tipo de Bolsa	X(2) Espaços, ou:
                //    Bovespa = BV
                //    BM&F = BF
                // Data	N(8) - Formato AAAAMMDD
                // Hora	N(9) - Formato HHMMSSmmm (mmm = milisegundos)
                // Código do Instrumento	X(20)

                // Tipo de Mensagem = NE
                // Nome	Tipo	Tamanho	Observação
                // Data	N(8) - Formato AAAAMMDD
                // Hora	N(9) - Formato HHMMSSmmm (mmm = milisegundos)
                // Corretora Compradora	N(8)
                // Corretora Vendedora	N(8)
                // Preço	N(13)
                // Quantidade N(12)
                // Máxima do dia	N(13)
                // Mínima do dia	N(13)
                // Volume Acumulado	N(13)
                // Número de Negócios	N(8)
                // Indicador de Variação em Relação ao Fechamento do Dia Anterior	X(1)
                //     Variação positiva: “ “ (espaço em branco)
                //     Variação negativa: “-“
                // Percentual de var. em relação ao Fechamento do Dia Anterior	N(8)
                // Estado do Papel	N(1)
                //    0 – Papel não negociado
                //    1 – Papel em leilão
                //    2 – Papel em negociação
                //    3 – Papel suspenso
                //    4 – Papel congelado
                //    5 – Papel inibido

                // Exemplos de mensagens:
                //<---              header             --->data    hora     comprad vend    preco        quantidade  max dia      min dia      vol          nneg    VvFech   E
                //0 2 4       12       21                  41      49       58      66      74           87          99           112          125          138      147     155           169                   191          204          217     225          238
                //NEBV20100702162034355PETR4               201007021618470000000013100000027000000026,800000000000200000000026,860000000026,5200209283409,0000010513 00001,3220000000029.900000000026.45C000000950000000026,79000000002800V000000270000000026,80000000000200
                //NEBV20100702162238788PETR4               201007021620510000000002700000131000000026,850000000000200000000026,870000000026,5200211588300,0000010621 00001,5120000000029.900000000026.45C000000270000000026,85000000000200V000000080000000026,86000000000200

                string dataNegocio = args.Mensagem.Substring(41, 8);

                if (dataNegocio.StartsWith("0000") == false)
                {
                    negocio.Instrumento          = args.Mensagem.Substring(21, 20).Trim();
                    negocio.TipoBolsa            = args.Mensagem.Substring(2, 2);
                    negocio.DataHora             = DateTime.ParseExact(args.Mensagem.Substring(41, 14), "yyyyMMddHHmmss", ciBR);
                    negocio.Compradora           = Convert.ToInt32(args.Mensagem.Substring(58, 8), ciBR);
                    negocio.Vendedora            = Convert.ToInt32(args.Mensagem.Substring(66, 8), ciBR);
                    negocio.Preco                = Convert.ToDouble(args.Mensagem.Substring(74, 13), ciBR);
                    negocio.Quantidade           = Convert.ToDouble(args.Mensagem.Substring(87, 12), ciBR);
                    negocio.Maxima               = Convert.ToDouble(args.Mensagem.Substring(99, 13), ciBR);
                    negocio.Minima               = Convert.ToDouble(args.Mensagem.Substring(112, 13), ciBR);
                    negocio.Volume               = Convert.ToDouble(args.Mensagem.Substring(125, 13), ciBR);
                    negocio.NumeroNegocio        = Convert.ToInt32(args.Mensagem.Substring(138, 8), ciBR);
                    negocio.Variacao             = Convert.ToDouble(args.Mensagem.Substring(146, 9).Trim(), ciBR);
                    negocio.Status               = Convert.ToInt32(args.Mensagem.Substring(155, 1), ciBR);
                    negocio.PrecoTeoricoAbertura = Convert.ToDouble(args.Mensagem.Substring(157, 13), ciBR);
                    negocio.VariacaoTeorica      = Convert.ToDouble(args.Mensagem.Substring(170, 9).Trim(), ciBR);
                    negocio.HorarioTeorico       = DateTime.ParseExact(args.Mensagem.Substring(179, 14), "yyyyMMddHHmmss", ciBR);

                    lock (filaNegociosDestaque)
                    {
                        filaNegociosDestaque.Enqueue(negocio);
                    }
                    lock (filaAcompanhamentoLeilao)
                    {
                        filaAcompanhamentoLeilao.Enqueue(negocio);
                    }
                    lock (filaResumoCorretoras)
                    {
                        filaResumoCorretoras.Enqueue(negocio);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error("OnNegocio: Erro na mensagem[" + args.Mensagem + "]: " + ex.Message, ex);
            }
        }