/// <summary> /// Carrega uam lista de ofertas no sentido indicado /// </summary> /// <param name="sentido"></param> /// <param name="listaofertas"></param> public void AddList(int sentido, List <KeyValuePair <string, LivroOfertasEntry> > listaofertas) { // Limpa o livro e carregas as ofertas lock (sentidos) { sentidos[sentido].porOferta.Clear(); sentidos[sentido].porPreco.Clear(); foreach (KeyValuePair <string, LivroOfertasEntry> entry in listaofertas) { string idOferta = entry.Key; LivroOfertasEntry oferta = entry.Value; sentidos[sentido].porOferta.Add(idOferta, oferta); // atualiza Mapa de Preços if (sentidos[sentido].porPreco.ContainsKey(oferta.Preco)) { sentidos[sentido].porPreco[oferta.Preco].Add(idOferta); } else { // se o preço ainda não foi inserido no mapa, // criar um novo Set de ofertas para esse preço SortedSet <string> ofertasDoPreco = new SortedSet <string>(); ofertasDoPreco.Add(idOferta); sentidos[sentido].porPreco.Add(oferta.Preco, ofertasDoPreco); } } } }
/// <summary> /// /// </summary> /// <param name="idOferta"></param> /// <param name="sentido"></param> public void cancelarOfertaSomente(string idOferta, char sentido) { int sentidoOferta = determinaSentido(sentido); if (sentidoOferta == -1) { return; } // Verifica preco anterior desta oferta LivroOfertasEntry dadosDestaOferta = sentidos[sentidoOferta].porOferta.RemoveAndReturn(idOferta); if (dadosDestaOferta == null) { throw new BovespaLivroOfertasException("Oferta não encontrada"); } Decimal precoAnterior = dadosDestaOferta.Preco; // Remove oferta para este preco SortedSet <string> ofertasDoPrecoAnterior = (SortedSet <string>)sentidos[sentidoOferta].porPreco[precoAnterior]; ofertasDoPrecoAnterior.Remove(idOferta); return; }
/// <summary> /// /// </summary> /// <param name="idOferta"></param> /// <param name="sentido"></param> /// <param name="preco"></param> /// <param name="quantidade"></param> public void alterar(string idOferta, char sentido, Decimal preco, long quantidade) { int sentidoOferta = determinaSentido(sentido); if (sentidoOferta == -1) { return; } // Atualiza preco da oferta e armazena preco anterior if (sentidos[sentidoOferta].porOferta.ContainsKey(idOferta) == false) { throw new BovespaLivroOfertasException("Oferta não encontrada:" + idOferta); } LivroOfertasEntry dadosDestaOferta = sentidos[sentidoOferta].porOferta[idOferta]; Decimal precoAnterior = dadosDestaOferta.Preco; dadosDestaOferta.Preco = preco; dadosDestaOferta.Quantidade = quantidade; sentidos[sentidoOferta].porOferta[idOferta] = dadosDestaOferta; // Remove oferta para este preco SortedSet <string> ofertasDoPrecoAnterior = (SortedSet <string>)sentidos[sentidoOferta].porPreco[precoAnterior]; ofertasDoPrecoAnterior.Remove(idOferta); // Adiciona a oferta no novo preco sentidos[sentidoOferta].porPreco[preco].Add(idOferta); return; }
/// <summary> /// /// </summary> /// <param name="sentido"></param> /// <returns></returns> public List <string> serializarLivro(int sentido) { // MUITO CUIDADO com a chamada desta rotina!!! Para altos // volumes, o tempo de processamento aumenta exponencialmente List <string> livro = new List <string>(); try { List <LivroOfertasEntry> ofertas = null; if (sentido == LIVRO_COMPRA) { ofertas = this.LivrosCompraBMF; } else { ofertas = this.LivrosVendaBMF; } livro.Add(("Livro de " + ((sentido == LIVRO_COMPRA) ? "Compra:" : "Venda:")).PadRight(30)); livro.Add("-".PadLeft(30, '-')); IEnumerator <LivroOfertasEntry> itOfertas = ofertas.GetEnumerator(); while (itOfertas.MoveNext()) { // itera o mapa de preços LivroOfertasEntry entry = itOfertas.Current; Decimal precoAtual = entry.Preco; StringBuilder livroSerializado = new StringBuilder(); livroSerializado.Append(entry.Corretora + " - " + entry.Preco.ToString() + " - " + entry.Quantidade.ToString("D10")); livro.Add(livroSerializado.ToString()); } livro.Add("-".PadLeft(30, '-')); } catch (Exception e) { logger.Error("Exception em serializarLivro: " + e.Message); } return(livro); }
public void recarregar(int sentidoOferta, string idOferta, LivroOfertasEntry dadosOferta) { LivroPorSentido livroDoSentido = sentidos[sentidoOferta]; livroDoSentido.porOferta.Put(idOferta, dadosOferta); Decimal precoOferta = dadosOferta.Preco; SortedSet <string> ofertasDoPreco = livroDoSentido.porPreco[precoOferta]; if (ofertasDoPreco == null) { ofertasDoPreco = new SortedSet <string>(); } ofertasDoPreco.Add(idOferta); livroDoSentido.porPreco.Put(precoOferta, ofertasDoPreco); return; }
/// <summary> /// /// </summary> /// <param name="idOferta"></param> /// <param name="sentido"></param> /// <param name="preco"></param> /// <param name="quantidade"></param> public void inserir(string idOferta, char sentido, Decimal preco, long quantidade, string instrumento, string tipopreco, string datahoraoferta) { int sentidoOferta = determinaSentido(sentido); if (sentidoOferta == -1) { return; } LivroOfertasEntry dadosDestaOferta = new LivroOfertasEntry(); dadosDestaOferta.Preco = preco; dadosDestaOferta.Quantidade = quantidade; dadosDestaOferta.LadoOferta = Convert.ToString(sentido); dadosDestaOferta.Corretora = idOferta.Substring(POS_COD_CORRETORA_INI, POS_COD_CORRETORA_FIM - POS_COD_CORRETORA_INI); dadosDestaOferta.DataHora = datahoraoferta; dadosDestaOferta.Instrumento = instrumento; dadosDestaOferta.TipoPreco = tipopreco; // atualiza Map de Ofertas sentidos[sentidoOferta].porOferta.Add(idOferta, dadosDestaOferta); // atualiza Mapa de Preços if (sentidos[sentidoOferta].porPreco.ContainsKey(preco)) { sentidos[sentidoOferta].porPreco[preco].Add(idOferta); } else { // se o preço ainda não foi inserido no mapa, // criar um novo Set de ofertas para esse preço SortedSet <string> ofertasDoPreco = new SortedSet <string>(); ofertasDoPreco.Add(idOferta); sentidos[sentidoOferta].porPreco.Add(preco, ofertasDoPreco); } return; }
/// <summary> /// /// </summary> public void LoadLOFBovespa() { string file = _config.DiretorioDB + "\\LofBov.dat"; try { SortedDictionary <string, BovespaLivroOfertas> livrosDic = new SortedDictionary <string, BovespaLivroOfertas>(); FileStream fs = File.Open(file, FileMode.Open, FileAccess.Read); BinaryFormatter bformatter = new BinaryFormatter(); string msgID = (string)bformatter.Deserialize(fs); long numLivros = (long)bformatter.Deserialize(fs); logger.Info("Existem " + numLivros + " livros a serem carregados"); for (int i = 0; i < numLivros; i++) { string instrumento = (string)bformatter.Deserialize(fs); BovespaLivroOfertas livro = new BovespaLivroOfertas(); long numOfertasCompras = (long)bformatter.Deserialize(fs); if (numOfertasCompras > 0) { List <KeyValuePair <string, LivroOfertasEntry> > ofertasC = new List <KeyValuePair <string, LivroOfertasEntry> >(); for (int j = 0; j < numOfertasCompras; j++) { string key = (string)bformatter.Deserialize(fs); LivroOfertasEntry entry = (LivroOfertasEntry)bformatter.Deserialize(fs); KeyValuePair <string, LivroOfertasEntry> oferta = new KeyValuePair <string, LivroOfertasEntry>(key, entry); ofertasC.Add(oferta); } livro.AddList(BovespaLivroOfertas.LIVRO_COMPRA, ofertasC); } long numOfertasVenda = (long)bformatter.Deserialize(fs); if (numOfertasVenda > 0) { List <KeyValuePair <string, LivroOfertasEntry> > ofertasV = new List <KeyValuePair <string, LivroOfertasEntry> >(); for (int j = 0; j < numOfertasVenda; j++) { string key = (string)bformatter.Deserialize(fs); LivroOfertasEntry entry = (LivroOfertasEntry)bformatter.Deserialize(fs); KeyValuePair <string, LivroOfertasEntry> oferta = new KeyValuePair <string, LivroOfertasEntry>(key, entry); ofertasV.Add(oferta); } livro.AddList(BovespaLivroOfertas.LIVRO_VENDA, ofertasV); } logger.InfoFormat("Carregou {0} ofertas de compra, {1} de venda para instrumento {2}", numOfertasCompras, numOfertasVenda, instrumento); livrosDic.Add(instrumento, livro); } // Limpa o livro anterior e seta o novo livro lock (_dadosglobais.TodosLOF) { _dadosglobais.TodosLOF.Clear(); _dadosglobais.TodosLOF = livrosDic; } _dadosglobais.LastMdgIDBov = msgID; fs.Close(); } catch (Exception ex) { logger.Error("Erro: " + ex.Message, ex); } }
/// <summary> /// Cancela uma oferta e as ofertas melhores /// </summary> /// <param name="idOferta"></param> /// <param name="sentido"></param> public void cancelarOfertaEMelhores(string idOferta, char sentido) { List <string> listaCancelarOfertas = new List <string>(); List <KeyValuePair <Decimal, SortedSet <string> > > listaCancelarPreco = new List <KeyValuePair <Decimal, SortedSet <string> > >(); int sentidoOferta = determinaSentido(sentido); if (sentidoOferta == -1) { return; } // Remove oferta do mapa de Ofertas LivroOfertasEntry dadosDestaOferta = sentidos[sentidoOferta].porOferta.RemoveAndReturn(idOferta); if (dadosDestaOferta == null) { throw new BovespaLivroOfertasException("Oferta não encontrada"); } Decimal precoReferencia = dadosDestaOferta.Preco; // obtem o entrySet do mapa de preços HashSet <KeyValuePair <Decimal, SortedSet <string> > > todosPrecos = sentidos[sentidoOferta].porPreco.AsHashSet(); IEnumerator <KeyValuePair <Decimal, SortedSet <string> > > it = todosPrecos.GetEnumerator(); while (it.MoveNext()) { // itera o mapa de preços KeyValuePair <Decimal, SortedSet <string> > entry = it.Current; int comparResult = entry.Key.CompareTo(precoReferencia); // para ofertas de compra, é necessário inverter o sinal // do resultado da comparação comparResult *= (sentidoOferta == LIVRO_COMPRA) ? -1 : 1; if (comparResult <= 0) { // para ofertas melhores (preço maior no caso de compra e // preço menor no caso de venda), remove as ofertas e o preço SortedSet <string> ofertas = entry.Value; IEnumerator <string> itOfertas = ofertas.GetEnumerator(); while (itOfertas.MoveNext()) { string estaOferta = itOfertas.Current; sentidos[sentidoOferta].porOferta.Remove(estaOferta); //itOfertas.remove(); listaCancelarOfertas.Add(estaOferta); //ofertas.Remove(estaOferta); // para ofertas com mesmo preço, remove // somente as ofertas anteriores à corrente (id menor) if (estaOferta.CompareTo(idOferta) == 0) { break; } } foreach (string oferta in listaCancelarOfertas) { ofertas.Remove(oferta); } listaCancelarOfertas.Clear(); //if (ofertas.Count==0) // todosPrecos.Remove(it.Current); if (ofertas.Count == 0) { listaCancelarPreco.Add(it.Current); } } else { break; } } // Remove os precos sem ofertas correspondentes. foreach (KeyValuePair <Decimal, SortedSet <string> > item in listaCancelarPreco) { todosPrecos.Remove(item); } return; }