Ejemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
        /// <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);
            }
        }
Ejemplo n.º 8
0
        /// <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;
        }