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); } }
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); } }
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); } }
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); } }