private void ProcessarMensagemUnitario(string mensagem) { try { // Layout mensagem UNITARIO: // // Tipo de Mensagem X(2) // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // Data mensagem N(8) Formato AAAAMMDD // Hora mensagem N(6) Formato HHMMSS // Preço Unitario N(13) // CotacaoANG cotacao = new CotacaoANG(); cotacao.A = mensagem.Substring(19, 20).Trim(); if (!mensagem.Substring(39, 14).Equals("00000000000000")) { cotacao.Dt = DateTime.ParseExact(mensagem.Substring(39, 14), "yyyyMMddHHmmss", ciBR); } cotacao.Pu = Convert.ToDouble(mensagem.Substring(53, 13), ciBR); _db.GravaCotacao(cotacao); _db.GravaCotacaoOMS(cotacao); logger.DebugFormat("Gravado Unitario: Ativo[{0}] Data[{1}] PrecoUnitario[{2}]", cotacao.A, cotacao.Dt, cotacao.Pu); } catch (Exception ex) { logger.Error("ProcessarMensagemUnitario: " + ex.Message, ex); } }
public void AtualizarCotacao(CotacaoANG cotacao) { try { if (!cotacao.A.Equals("IBOV")) { if (cotacao.Cp != 0) { _volumeIbovespa += cotacao.Vl; } _db.AtualizaCotacao(cotacao); } else { CotacaoANG cotacaoIbovespa = cotacao.Clone() as CotacaoANG; cotacaoIbovespa.Vl = _volumeIbovespa; _volumeIbovespa = 0; _db.AtualizaCotacao(cotacaoIbovespa); } } catch (Exception ex) { logger.Debug("AtualizarCotacao: " + ex.Message, ex); } }
private void ProcessarMensagemFechamento(string mensagem) { try { // Layout mensagem FECHAMENTO: // // Tipo de Mensagem X(2) // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // Data mensagem N(8) Formato AAAAMMDD // Hora mensagem N(6) Formato HHMMSS // Preço Fechamento N(13) // CotacaoANG cotacao = new CotacaoANG(); cotacao.A = mensagem.Substring(19, 20).Trim(); cotacao.Dt = DateTime.Now; if (!mensagem.Substring(39, 14).StartsWith("000")) { cotacao.Dt = DateTime.ParseExact(mensagem.Substring(39, 14), "yyyyMMddHHmmss", ciBR); } cotacao.Fe = Convert.ToDouble(mensagem.Substring(53, 13), ciBR); cotacao.Vl = Convert.ToDouble(mensagem.Substring(68, 13), ciBR); cotacao.To = Convert.ToDouble(mensagem.Substring(81, 8), ciBR); _db.GravaCotacao(cotacao); _db.GravaCotacaoOMS(cotacao); DateTime inicioPregao = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0); DateTime hj = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); if ((cotacao.Dt.CompareTo(hj) < 0 || cotacao.Dt.CompareTo(inicioPregao) > 0) && cotacao.Fe > 0 && cotacao.Vl > 0 && cotacao.To > 0) { _db.GravaCotacaoPLD(cotacao); logger.DebugFormat("Gravado Fechamento PLD: Ativo[{0}] Data[{1}] Fechamento [{2}] Volume[{3}] Qtde Negocios [{4}]", cotacao.A, cotacao.Dt, cotacao.Fe, cotacao.Vl, cotacao.To); } logger.DebugFormat("Gravado Fechamento: Ativo[{0}] Data[{1}] PrecoFechamento[{2}]", cotacao.A, cotacao.Dt, cotacao.Fe); } catch (Exception ex) { if (!String.IsNullOrEmpty(mensagem)) { logger.Error("MENSAGEM [" + mensagem + "]"); } logger.Error("ProcessarMensagemFechamento: " + ex.Message, ex); } }
/// <summary> /// /// </summary> /// <param name="cotacao"></param> public void GravarNegocio(CotacaoANG negocio, string id) { string dump = string.Format("Gravar: Ativo[{0}] DataCotacao[{1}] Id[{2}] Preco[{3}]", negocio.A, negocio.Dt, id, negocio.Pr); logger.Debug(dump); _db.GravaNegocio(negocio, id); }
/// <summary> /// ProcessaSerieHistorica - /// Essa funcao trata as mensagens de Serie Historica, /// efetuando a gravacao quando necessario no banco de dados /// </summary> /// <param name="cotacao"></param> public void ProcessaSerieHistorica(CotacaoANG cotacao) { try { GravarSerieHistorica(cotacao); } catch (Exception ex) { logger.Debug("ProcessaSerieHistorica: " + ex.Message); } }
private void ProcessarMensagemFechamento(string mensagem) { try { // Layout mensagem FECHAMENTO: // // Tipo de Mensagem X(2) // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // Data mensagem N(8) Formato AAAAMMDD // Hora mensagem N(6) Formato HHMMSS // Preço Fechamento N(13) // Tipo de Bolsa X(2) Espaços, ou Bovespa = BV, ou BM&F = BF // CotacaoANG cotacao = new CotacaoANG(); string ativo = mensagem.Substring(19, 20).Trim(); string dataHora = mensagem.Substring(39, 14); string fechamento = mensagem.Substring(53, 13); string bolsa = mensagem.Substring(66, 2); cotacao.Dt = DateTime.Now; if (!dataHora.StartsWith("000")) { cotacao.Dt = DateTime.ParseExact(dataHora, "yyyyMMddHHmmss", ciBR); } logger.DebugFormat("Instrumento[{0}]: Fechamento [{1}]", ativo, mensagem); if (bolsa.Equals("BV")) { cotacao.Bo = "BOV"; } else { cotacao.Bo = "BMF"; } cotacao.A = ativo; cotacao.Fe = Convert.ToDouble(fechamento, ciBR); _db.GravaCotacaoOracle(cotacao); logger.DebugFormat("Gravado Fechamento: Ativo[{0}] Data[{1}] PrecoFechamento[{2}]", cotacao.A, cotacao.Dt, cotacao.Fe); } catch (Exception ex) { logger.Error("ProcessarMensagemFechamento: " + ex.Message, ex); } }
private void ProcessarMensagemCotacao(string mensagem) { try { // Layout mensagem NEGOCIO: // // Tipo de Mensagem X(2) // Tipo de Bolsa X(2) Espaços, ou Bovespa = BV, ou BM&F = BF // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // 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 Variação X(1) Variação positiva: “ “ (espaço em branco), Variação negativa: “-“ // Variação N(8) // Estado do Papel N(1) 0 – não negociado, 1 – em leilão, 2 – em negociação, 3 – suspenso, 4 – congelado, 5 – inibido // CotacaoANG cotacao = new CotacaoANG(); string dataNegocio = mensagem.Substring(41, 14); string estado = mensagem.Substring(155, 1); // Grava instrumentos em negociação e com data válida if (estado.Equals("2") && dataNegocio.StartsWith("0000") == false) { cotacao.A = mensagem.Substring(21, 20).Trim(); cotacao.Dt = DateTime.ParseExact(dataNegocio, "yyyyMMddHHmmss", ciBR); cotacao.Pr = Convert.ToDouble(mensagem.Substring(74, 13), ciBR); cotacao.Os = Convert.ToDouble(mensagem.Substring(146, 9).Trim(), ciBR); _db.GravaCotacao(cotacao); _db.GravaCotacaoOMS(cotacao); logger.DebugFormat("Gravado Cotacao: Ativo[{0}] Data[{1}] Preco[{2}] Variacao[{3}]", cotacao.A, cotacao.Dt, cotacao.Pr, cotacao.Os); } } catch (Exception ex) { logger.Error("ProcessarMensagemCotacao: " + ex.Message, ex); } }
/// <summary> /// /// </summary> /// <param name="cotacao"></param> public void GravarSerieHistorica(CotacaoANG cotacao) { string dump = string.Format("Gravar serie historica: {0} D:{1} A:{2} F:{3} m:{4} M:{5} O:{6}", cotacao.A, cotacao.Dt, cotacao.Ab, cotacao.Fe, cotacao.Mi, cotacao.Mx, cotacao.Os); logger.Debug(dump); _db.GravaSerieHistorica(cotacao); }
private void ProcessarMensagemAbertura(string mensagem) { try { ANGAbertura angAbertura = Utils.FromBinaryString <ANGAbertura>(mensagem); // Layout mensagem ABERTURA: // // Tipo de Mensagem X(2) // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // Data mensagem N(8) Formato AAAAMMDD // Hora mensagem N(6) Formato HHMMSS // Preço Abertura N(13) // CotacaoANG cotacao = new CotacaoANG(); cotacao.A = angAbertura.Instrumento.ByteArrayToString().Trim(); cotacao.Dt = DateTime.Now; if (!angAbertura.DataHoraAbertura.ByteArrayToString().StartsWith("000")) { cotacao.Dt = DateTime.ParseExact(angAbertura.DataHoraAbertura.ByteArrayToString(), "yyyyMMddHHmmss", ciBR); } cotacao.Ab = Convert.ToDouble(angAbertura.PrecoAbertura.ByteArrayToString(), ciBR); //cotacao.A = mensagem.Substring(19, 20).Trim(); //if (!mensagem.Substring(39, 14).Equals("00000000000000")) // cotacao.Dt = DateTime.ParseExact(mensagem.Substring(39, 14), "yyyyMMddHHmmss", ciBR); //cotacao.Ab = Convert.ToDouble(mensagem.Substring(53, 13), ciBR); _db.GravaCotacao(cotacao); _db.GravaCotacaoOMS(cotacao); logger.DebugFormat("Gravado Abertura: Ativo[{0}] Data[{1}] PrecoAbertura[{2}]", cotacao.A, cotacao.Dt, cotacao.Ab); } catch (Exception ex) { if (!String.IsNullOrEmpty(mensagem)) { logger.Error("MENSAGEM [" + mensagem + "]"); } logger.Error("ProcessarMensagemAbertura: " + ex.Message, ex); } }
/// <summary> /// /// </summary> /// <param name="cotacao"></param> public void GravarCotacao(CotacaoANG cotacao) { string dump = string.Format("Gravar ponto: {0} D:{1} A:{2} F:{3} m:{4} M:{5} O:{6} P:{7}", cotacao.A, cotacao.Dt, cotacao.Ab, cotacao.Fe, cotacao.Mi, cotacao.Mx, cotacao.Os, cotacao.Pr); logger.Debug(dump); // Primeiro remove as cotacoes de dias anteriores, depois grava //_db.LimparCotacao(cotacao, _config.DiasRetencaoCotacao); _db.GravaAtivoCotacao(cotacao); }
public void Run() { bool bWait = false; long lastlog = 0; while (_bKeepRunning) { if (_mds == null || _mds.IsConectado() == false) { _mds = new MDSPackageSocket(); _mds.IpAddr = _config.MDSAddress; _mds.Port = _config.MDSPort; _mds.OnFastQuoteReceived += new MDSMessageReceivedHandler(OnCotacao); _mds.OpenConnection(); } CotacaoANG cotacao = null; if (queueCotacao.TryDequeue(out cotacao)) { GravarNegocio(cotacao); TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - lastlog); if (ts.TotalMilliseconds > 2000) { logger.Info("Mensagens de cotacao para gravar no banco: " + queueCotacao.Count); lastlog = DateTime.Now.Ticks; } continue; } Thread.Sleep(100); } }
public void ProcessarMensagemSerieHistorica(string pMensagem) { try { CotacaoANG mensagem = new CotacaoANG(); // Layout da mensagem de Serie Historica // // Nome Tipo(Tamanho) Observação // Tipo de Mensagem X(2) 'SH' // Tipo de Bolsa X(2) Bovespa = BV, BM&F = BF // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código do Instrumento X(20) // // Data da Cotação N(8) Formato AAAAMMDD // Hora da Cotação N(9) Formato HHMMSSmmm (mmm = milisegundos) // Preço Abertura N(13) // Preço Fechamento N(13) // Preço Médio N(13) // Preço Máximo N(13) // Preço Mínimo N(13) // Ind Oscilação X(1) positiva: “ “ (espaço em branco), Variação negativa: “-“ // Percentual Oscilação N(8) // Melhor Oferta de Compra N(13) // Melhor Oferta de Venda N(13) // Quantidade de Negócios N(8) // Quantidade de Papéis N(12) // Volume Acumulado N(13) // Preço de Ajuste N(13) mensagem.A = pMensagem.Substring(21, 20).Trim(); // Obtem o tipo da bolsa if (pMensagem.Substring(2, 2).Equals("BV")) { mensagem.Bo = "BOV"; } else { mensagem.Bo = "BMF"; } mensagem.Ab = Convert.ToDouble(pMensagem.Substring(58, 13), ciBR); mensagem.Mx = Convert.ToDouble(pMensagem.Substring(97, 13), ciBR); mensagem.Mi = Convert.ToDouble(pMensagem.Substring(110, 13), ciBR); mensagem.Me = Convert.ToDouble(pMensagem.Substring(84, 13), ciBR); mensagem.Fe = Convert.ToDouble(pMensagem.Substring(71, 13), ciBR); mensagem.Os = Convert.ToDouble(pMensagem.Substring(123, 9).Trim(), ciBR); mensagem.OfC = Convert.ToDouble(pMensagem.Substring(132, 13), ciBR); mensagem.OfV = Convert.ToDouble(pMensagem.Substring(145, 13), ciBR); mensagem.To = Convert.ToDouble(pMensagem.Substring(158, 8), ciBR); mensagem.Qt = Convert.ToDouble(pMensagem.Substring(166, 12), ciBR); mensagem.Vl = Convert.ToDouble(pMensagem.Substring(178, 13), ciBR); mensagem.Aj = Convert.ToDouble(pMensagem.Substring(191, 13), ciBR); String data = pMensagem.Substring(41, 8) + "000000"; mensagem.Dt = DateTime.ParseExact(data, "yyyyMMddHHmmss", ciBR); lock (queueSerieHistorica) { queueSerieHistorica.Enqueue(mensagem); } } catch (Exception ex) { logger.Error("ProcessarMensagem: " + ex.Message, ex); } }
public void ProcessarMensagemCotacao(string pMensagem) { try { CotacaoANG cotacao = new CotacaoANG(); // 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 // Estado do Instrumento para Análise Gráfica N(1) // 0 - Inicial // 1 - Congela data/hora // 2 - Fechamento do dia // 3 - Despreza mensagens // 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 //try { this.HeaderTipoMensagem = pMensagem.Substring(0, 2); } string bolsa = pMensagem.Substring(2, 2); string ativo = pMensagem.Substring(21, 20).Trim(); string dataNegocio = pMensagem.Substring(41, 8); string horaNegocio = pMensagem.Substring(49, 6); string preco = pMensagem.Substring(74, 13); string quantidade = pMensagem.Substring(87, 12); string oscilacao = pMensagem.Substring(146, 9).Trim(); string compradora = pMensagem.Substring(58, 8); string estado = pMensagem.Substring(155, 1); string estadoAnaliseGrafica = pMensagem.Substring(156, 1); // Ignora mensagens que não estiverem no estado "Papel em negociação" if (!estado.Equals("2")) { return; } // Ignora mensagens que estiverem no estado "Despreza Mensagens" if (estadoAnaliseGrafica.Equals("3")) { return; } // Obtem o tipo da bolsa if (bolsa.Equals("BV")) { cotacao.Bo = "BOV"; } else { cotacao.Bo = "BMF"; } cotacao.A = ativo; string dataHoraNegocio = dataNegocio + horaNegocio; if (dataHoraNegocio.StartsWith("0000") == false) { cotacao.Pr = Convert.ToDouble(preco, ciBR); // Ignora mensagens com preço zerado if (cotacao.Pr == 0) { return; } // Despreza a data/hora das mensagens que estiverem no estado "Congela DataHora" if (estadoAnaliseGrafica.Equals("1")) { cotacao.Dt = DateTime.MinValue; } else { cotacao.Dt = DateTime.ParseExact(dataHoraNegocio, "yyyyMMddHHmmss", ciBR); } cotacao.Qt = Convert.ToDouble(quantidade, ciBR); cotacao.Vl = cotacao.Pr * cotacao.Qt; cotacao.Os = Convert.ToDouble(oscilacao, ciBR); cotacao.Cp = Convert.ToInt32(compradora); cotacao.St = Convert.ToInt32(estadoAnaliseGrafica); lock (queueCotacao) { queueCotacao.Enqueue(cotacao); } } } catch (Exception ex) { logger.Error("ProcessarMensagem: " + ex.Message, ex); } }
public void ProcessarMensagemCotacao(string pMensagem) { try { CotacaoANG cotacao = new CotacaoANG(); // 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 //try { this.HeaderTipoMensagem = pMensagem.Substring(0, 2); } string id = pMensagem.Substring(4, 17); string ativo = pMensagem.Substring(21, 20).Trim(); string bolsa = pMensagem.Substring(2, 2); string dataHoraNegocio = pMensagem.Substring(41, 14); string compradora = pMensagem.Substring(58, 8); string vendedora = pMensagem.Substring(66, 8); string preco = pMensagem.Substring(74, 13); string quantidade = pMensagem.Substring(87, 12); string maximo = pMensagem.Substring(99, 13); string minimo = pMensagem.Substring(112, 13); string volume = pMensagem.Substring(125, 13); string totalNegocios = pMensagem.Substring(138, 8); string oscilacao = pMensagem.Substring(146, 9).Trim(); string status = pMensagem.Substring(155, 1); if (dataHoraNegocio.StartsWith("0000") == false) { cotacao.A = ativo; cotacao.Bo = bolsa; cotacao.Dt = DateTime.ParseExact(dataHoraNegocio, "yyyyMMddHHmmss", ciBR); cotacao.Cp = Convert.ToInt16(compradora, ciBR); cotacao.Vd = Convert.ToInt16(vendedora, ciBR); cotacao.Pr = Convert.ToDouble(preco, ciBR); cotacao.Qt = Convert.ToDouble(quantidade, ciBR); cotacao.Mx = Convert.ToDouble(maximo, ciBR); cotacao.Mi = Convert.ToDouble(minimo, ciBR); cotacao.Vl = Convert.ToDouble(volume, ciBR); cotacao.To = Convert.ToDouble(totalNegocios, ciBR); cotacao.Os = Convert.ToDouble(oscilacao, ciBR); cotacao.St = Convert.ToInt16(status, ciBR); GravarNegocio(cotacao, id); } } catch (Exception ex) { logger.Error("ProcessarMensagem: " + ex.Message, ex); } }
private void ProcessarMensagemCotacao(string pMensagem) { try { // Layout mensagem NEGOCIO: // // Tipo de Mensagem X(2) // Tipo de Bolsa X(2) Espaços, ou Bovespa = BV, ou BM&F = BF // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // 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 Variação X(1) Variação positiva: “ “ (espaço em branco), Variação negativa: “-“ // Variação N(8) // Estado do Papel N(1) 0 – não negociado, 1 – em leilão, 2 – em negociação, 3 – suspenso, 4 – congelado, 5 – inibido // CotacaoANG cotacao = new CotacaoANG(); string bolsa = pMensagem.Substring(2, 2); string ativo = pMensagem.Substring(21, 20).Trim(); string dataNegocio = pMensagem.Substring(41, 8); string horaNegocio = pMensagem.Substring(49, 6); string preco = pMensagem.Substring(74, 13); string minimo = pMensagem.Substring(112, 13); string maximo = pMensagem.Substring(99, 13); string volume = pMensagem.Substring(125, 13); string numeroNegocios = pMensagem.Substring(138, 8); string oscilacao = pMensagem.Substring(146, 9).Trim(); string estado = pMensagem.Substring(155, 1); if (bolsa.Equals("BV")) { // Ignora mensagens que não estiverem no estado "Papel em negociação", para BOVESPA if (!estado.Equals("2")) { return; } } else { // Ignora mensagens que não estiverem no estado "Papel em negociação" e "Em leilão", para BMF if (!estado.Equals("2") && !estado.Equals("1")) { return; } } // Grava instrumentos em negociação e com data válida cotacao.Dt = DateTime.Now; if (!dataNegocio.StartsWith("000")) { string dataHoraNegocio = dataNegocio + horaNegocio; cotacao.Dt = DateTime.ParseExact(dataHoraNegocio, "yyyyMMddHHmmss", ciBR); } logger.DebugFormat("Instrumento[{0}]: Cotacao [{1}]", ativo, pMensagem); // Obtem o tipo da bolsa if (bolsa.Equals("BV")) { cotacao.Bo = "BOV"; } else { cotacao.Bo = "BMF"; } cotacao.A = ativo; cotacao.Pr = Convert.ToDouble(preco, ciBR); cotacao.Os = Convert.ToDouble(oscilacao, ciBR); cotacao.Mi = Convert.ToDouble(minimo, ciBR); cotacao.Mx = Convert.ToDouble(maximo, ciBR); cotacao.Vl = Convert.ToDouble(volume, ciBR); cotacao.To = Convert.ToDouble(numeroNegocios, ciBR); _db.GravaCotacaoOracle(cotacao); logger.DebugFormat("Gravado Cotacao: Ativo[{0}] Data[{1}] Preco[{2}] Variacao[{3}]", cotacao.A, cotacao.Dt, cotacao.Pr, cotacao.Os); } catch (Exception ex) { logger.Error("ProcessarMensagem: " + ex.Message, ex); } }
private void ProcessarMensagemCotacao(string mensagem) { try { // Layout mensagem NEGOCIO: // // Tipo de Mensagem X(2) // Tipo de Bolsa X(2) Espaços, ou Bovespa = BV, ou BM&F = BF // Data N(8) Formato AAAAMMDD // Hora N(9) Formato HHMMSSmmm (mmm = milisegundos) // Código Instrumento X(20) // // 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 Variação X(1) Variação positiva: “ “ (espaço em branco), Variação negativa: “-“ // Variação N(8) // Estado do Papel N(1) 0 – não negociado, 1 – em leilão, 2 – em negociação, 3 – suspenso, 4 – congelado, 5 – inibido // CotacaoANG cotacao = new CotacaoANG(); string dataNegocio = mensagem.Substring(41, 14); string estado = mensagem.Substring(155, 1); string fase = mensagem.Substring(156, 1); cotacao.A = mensagem.Substring(21, 20).Trim(); //cotacao.Dt = DateTime.ParseExact(dataNegocio, "yyyyMMddHHmmss", ciBR); cotacao.Pr = Convert.ToDouble(mensagem.Substring(74, 13), ciBR); cotacao.Os = Convert.ToDouble(mensagem.Substring(146, 9).Trim(), ciBR); cotacao.Vl = Convert.ToDouble(mensagem.Substring(126, 13), ciBR); cotacao.To = Convert.ToDouble(mensagem.Substring(138, 8), ciBR); // Grava instrumentos em negociação e com data válida if (estado.Equals("2") && dataNegocio.StartsWith("000") == false) { cotacao.Dt = DateTime.ParseExact(dataNegocio, "yyyyMMddHHmmss", ciBR); _db.GravaCotacao(cotacao); _db.GravaCotacaoOMS(cotacao); //if (!dctTimeStamp.ContainsKey(cotacao.A)) //{ // _db.GravaCotacaoPLD(cotacao); // dctTimeStamp.AddOrUpdate(cotacao.A, DateTime.Now.Ticks, (key, oldValue) => DateTime.Now.Ticks); //} //else //{ // long lastsignal = 0; // if (dctTimeStamp.TryGetValue(cotacao.A, out lastsignal)) // { // TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - lastsignal); // if (ts.TotalSeconds > 1.0) // { // _db.GravaCotacaoPLD(cotacao); // } // } //} logger.DebugFormat("Gravado Cotacao: Ativo[{0}] Data[{1}] Preco[{2}] Variacao[{3}]", cotacao.A, cotacao.Dt, cotacao.Pr, cotacao.Os); } // Grava fechamento if (!estado.Equals("1") && !estado.Equals("2") && !dataNegocio.StartsWith("000") && fase.Equals(FASE_NEGOCIACAO_ENVIADO_SERIE_HISTORICA)) { cotacao.Dt = DateTime.ParseExact(dataNegocio, "yyyyMMddHHmmss", ciBR); cotacao.Fe = cotacao.Pr; DateTime inicioPregao = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0); DateTime hj = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0); if (cotacao.Dt.CompareTo(hj) < 0 || cotacao.Dt.CompareTo(inicioPregao) > 0) { if (cotacao.Fe > 0 && cotacao.Vl > 0 && cotacao.To > 0) { _db.GravaCotacaoPLD(cotacao); logger.DebugFormat("Gravado Fechamento PLD: Ativo[{0}] Data[{1}] Fechamento [{2}] Volume[{3}] Qtde Negocios [{4}]", cotacao.A, cotacao.Dt, cotacao.Fe, cotacao.Vl, cotacao.To); } } } } catch (Exception ex) { if (!String.IsNullOrEmpty(mensagem)) { logger.Error("MENSAGEM [" + mensagem + "]"); } logger.Error("ProcessarMensagemCotacao: " + ex.Message, ex); } }
private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*"; openFileDialog1.FilterIndex = 1; DialogResult okClicked = openFileDialog1.ShowDialog(); if (okClicked == System.Windows.Forms.DialogResult.OK) { // Open the selected file to read. System.IO.Stream fileStream = openFileDialog1.OpenFile(); System.IO.StreamReader reader = new System.IO.StreamReader(fileStream); do { string line = reader.ReadLine(); string regtype = line.Substring(0, 2); switch (regtype) { case "00": CotaHist_Header header = Utilities.MarshalFromStringBlock <CotaHist_Header>(line); break; case "01": CotaHist_DadosCotacao registro = Utilities.MarshalFromStringBlock <CotaHist_DadosCotacao>(line); CotacaoANG cotacao = new CotacaoANG(); cotacao.A = registro.CodNegociacao.ByteArrayToString().Trim(); cotacao.Ab = Convert.ToDouble(registro.PrecoAbertura.ByteArrayToDecimal(2)); cotacao.Bo = "BOV"; string datapregao = registro.DataPregao.ByteArrayToString() + "000000"; cotacao.Dt = DateTime.ParseExact(datapregao, "yyyyMMddHHmmss", CultureInfo.InvariantCulture); cotacao.Fe = Convert.ToDouble(registro.PrecoUltimo.ByteArrayToDecimal(2)); cotacao.Id = DateTime.Now.ToString("yyyyMMddHHmmssfff"); cotacao.Me = Convert.ToDouble(registro.PrecoMedio.ByteArrayToDecimal(2)); cotacao.Mi = Convert.ToDouble(registro.PrecoMinimo.ByteArrayToDecimal(2)); cotacao.Mx = Convert.ToDouble(registro.PrecoMaximo.ByteArrayToDecimal(2)); cotacao.OfC = Convert.ToDouble(registro.MelhorPrecoCompra.ByteArrayToDecimal(2)); cotacao.OfV = Convert.ToDouble(registro.MelhorPrecoVenda.ByteArrayToDecimal(2)); cotacao.Pr = Convert.ToDouble(registro.PrecoUltimo.ByteArrayToDecimal(2)); cotacao.Qt = Convert.ToDouble(registro.QuantidadeTotal.ByteArrayToString()); cotacao.To = Convert.ToDouble(registro.TotalNegocios.ByteArrayToString()); cotacao.Vl = Convert.ToDouble(registro.VolumeTotal.ByteArrayToDecimal(2)); if (cotacao.Fe > cotacao.Ab) { cotacao.Os = (cotacao.Fe / cotacao.Ab); } else if (cotacao.Fe < cotacao.Ab) { cotacao.Os = ((1 - (cotacao.Fe / cotacao.Ab)) * 100) * -1; } else { cotacao.Os = 0.0; } string msg = String.Format("Gravando Historico: A:[{0}] Dt [{1}] Ab[{2}] Max[{3}] Med[{4}] Min[{5}] Fe[{6}] Osc[{7}] Qt[{8}] Vl[{9}] Neg[{10}]", cotacao.A, cotacao.Dt.ToString("yyyy/MM/dd HH:mm:ss"), cotacao.Ab, cotacao.Mx, cotacao.Me, cotacao.Mi, cotacao.Fe, cotacao.Os, cotacao.Qt, cotacao.Vl, cotacao.To); txtResult.Text += msg + "\r\n"; ANGPersistenciaDB db = new ANGPersistenciaDB(); db.ConnectionString = ConfigurationManager.ConnectionStrings["MDS"].ConnectionString; db.GravaSerieHistorica(cotacao); Application.DoEvents(); break; case "99": CotaHist_Trailer trailer = Utilities.MarshalFromStringBlock <CotaHist_Trailer>(line); break; } }while(!reader.EndOfStream); reader.Close(); fileStream.Close(); } }