private GridListaCryptosModel ObterModelListaCryptos(double valorBrlBtc, double valorUsdBtc, double valorBrlBtcReal,
                                                             PoloniexEntradaApiEntidade entradaPoloniex, BittrexEntradaApiEntidade entradaBittrex, KrakenEntradaApiEntidade entradaKraken,
                                                             BitfinexEntradaApiEntidade entradaBitfinex, List <MoedaEmCarteiraEntidade> listaBalancoColdWallet)
        {
            List <CryptoModel> lista = new List <CryptoModel>();
            var consulta             = new ConsultaExchangesBusiness().ConsultarExchanges(entradaPoloniex,
                                                                                          entradaBittrex, entradaKraken, entradaBitfinex, listaBalancoColdWallet);

            foreach (var quantidade in consulta.ListaQuantidades)
            {
                if (quantidade.Quantidade > 0)
                {
                    double valorTotalBtc     = ConsultaExchangesBusiness.ObterValorTotalEmBtc(consulta.ListaCotacoes, quantidade);
                    double valorUnidadeEmBtc = quantidade.Quantidade > 0 ? (valorTotalBtc / quantidade.Quantidade) : 0;
                    double valorTotalBrl     = valorTotalBtc * valorBrlBtc;
                    double valorTotalBrlReal = valorTotalBtc * valorBrlBtcReal;
                    if (valorTotalBrl >= 1 && valorTotalBrlReal >= 1)
                    {
                        double valorTotalUsd = valorTotalBtc * valorUsdBtc;
                        lista.Add(new CryptoModel
                        {
                            NomeCrypto              = quantidade.Tipo.Nome,
                            SiglaCrypto             = quantidade.Tipo.Sigla,
                            QuantidadeCryptoDouble  = quantidade.Quantidade,
                            ValorCryptoBtc          = valorUnidadeEmBtc.ToString("N8"),
                            ValorTotalBtcDouble     = valorTotalBtc,
                            ValorTotalBrlDouble     = valorTotalBrl,
                            ValorTotalBrlRealDouble = valorTotalBrlReal,
                            ValorTotalUsdDouble     = valorTotalUsd
                        });
                    }
                }
            }
            var model = new GridListaCryptosModel(valorBrlBtc, valorBrlBtcReal, valorUsdBtc)
            {
                Lista = lista.OrderByDescending(c => c.ValorTotalBrlRealDouble).ToList(),
                ResultadosOperacao = ObterListaResultadosOperacao(consulta.ListaResultadosOperacoesExchanges)
            };

            model.Lista.ForEach(c => c.PercentualRelativoDouble = (100 * c.ValorTotalBtcDouble / model.ValorTotalBtcDouble));
            return(model);
        }
        public ConsultaExchangesEntidade ConsultarExchanges(PoloniexEntradaApiEntidade entradaPoloniex,
                                                            BittrexEntradaApiEntidade entradaBittrex, KrakenEntradaApiEntidade entradaKraken,
                                                            BitfinexEntradaApiEntidade entradaBitfinex, List <MoedaEmCarteiraEntidade> listaBalancoColdWallet)
        {
            ConsultaExchangesEntidade retorno = new ConsultaExchangesEntidade();

            retorno.ListaCotacoes    = new List <CotacaoMoedaEntidade>();
            retorno.ListaQuantidades = new List <CryptoQuantidadeEntidade>();
            retorno.ListaResultadosOperacoesExchanges = new List <ResultadoOperacaoEntidade>();
            var  listaBalanco      = new List <BalancoMoedaEntidade>();
            long nonce             = DateTime.Now.Ticks;
            var  resultadoConsulta = new List <ResultadoConsultaExchangeEntidade>();

            if (entradaPoloniex != null)
            {
                resultadoConsulta.Add(ConsultarExchange(entradaPoloniex,
                                                        new ApiPoloniex(entradaPoloniex.ApiKey, entradaPoloniex.ApiSecret, nonce)));
            }

            if (entradaBittrex != null)
            {
                resultadoConsulta.Add(ConsultarExchange(entradaBittrex,
                                                        new ApiBittrex(entradaBittrex.ApiKey, entradaBittrex.ApiSecret, nonce)));
            }

            if (entradaKraken != null)
            {
                resultadoConsulta.Add(ConsultarExchange(entradaKraken,
                                                        new ApiKraken(entradaKraken.ApiKey, entradaKraken.ApiSecret, nonce)));
            }

            if (entradaBitfinex != null)
            {
                resultadoConsulta.Add(ConsultarExchange(entradaBitfinex,
                                                        new ApiBitfinex(entradaBitfinex.ApiKey, entradaBitfinex.ApiSecret, nonce)));
            }

            listaBalanco.AddRange(resultadoConsulta.SelectMany(r => r.Balanco));
            retorno.ListaCotacoes.AddRange(resultadoConsulta.SelectMany(r => r.Cotacao));
            retorno.ListaResultadosOperacoesExchanges.AddRange(resultadoConsulta.Select(r => r.ResultadoOperacoes));
            foreach (var balanco in listaBalanco)
            {
                if (!retorno.ListaQuantidades.Any(q => q != null && q.Tipo != null && q.Tipo.Sigla == balanco.Moeda.Sigla))
                {
                    retorno.ListaQuantidades.Add(new CryptoQuantidadeEntidade(balanco.Moeda));
                }
                retorno.ListaQuantidades.First(q => q != null && q.Tipo != null && q.Tipo.Sigla == balanco.Moeda.Sigla).ListaBalancos.Add(balanco);
            }
            if (listaBalancoColdWallet != null)
            {
                foreach (var moedaColdWallet in listaBalancoColdWallet)
                {
                    TipoCrypto moeda = TipoCrypto.ObterPorSigla(moedaColdWallet.SiglaMoeda);
                    if (!retorno.ListaQuantidades.Any(q => q != null && q.Tipo != null && q.Tipo.Sigla == moeda.Sigla))
                    {
                        retorno.ListaQuantidades.Add(new CryptoQuantidadeEntidade(moeda));
                    }
                    retorno.ListaQuantidades.First(q => q != null && q.Tipo != null && q.Tipo.Sigla == moeda.Sigla).ListaBalancos.Add(
                        new BalancoMoedaEntidade()
                    {
                        Exchange   = TipoExchange.Obter(Convert.ToInt32(moedaColdWallet.ExchangeCotacao)),
                        Moeda      = moeda,
                        Quantidade = moedaColdWallet.QuantidadeMoeda,
                        ColdWallet = true
                    });
                }
            }
            return(retorno);
        }