示例#1
0
        public JsonResult ObtenerEstadistico(string strFechaInicio, string strFechaFinal, List <CatCapital> ListCatCapital)
        {
            ResultadoMercadoCapital resultadoMercadoCapital = new ResultadoMercadoCapital();

            DateTime fechaInicio = new DateTime();
            DateTime fechafinal  = new DateTime();

            List <Parametro> listParametro = new List <Parametro>();
            Parametro        parametro     = new Parametro();

            double totalDias = 0;

            bool   primerRegistro = true;
            int    cont           = 0;
            int    cont2          = 0;
            double rendimiento    = 0;
            double promedio       = 0;
            double varianza       = 0;
            double desviacion     = 0;
            //List<YahooHistoricalPriceData> yahooPriceHistoryTemp = new List<YahooHistoricalPriceData>();
            List <CandleT> yahooPriceHistoryTemp = new List <CandleT>();
            List <CandleT> yahooPriceHistory     = new List <CandleT>();

            //LISTA DE EMPRESAS
            List <Empresa>          ListaEmpresa          = new List <Empresa>();
            List <EmpresaVsEmpresa> ListaEmpresaVsEmpresa = new List <EmpresaVsEmpresa>();

            List <CalculoMercadoCapital> ListaCalculoMercadoCapital = new List <CalculoMercadoCapital>();

            List <EncabezadoEmpresa> ListaEncabezadoEmpresa = new List <EncabezadoEmpresa>();
            EncabezadoEmpresa        encabezadoEmpresa      = new EncabezadoEmpresa();

            fechaInicio = Convert.ToDateTime(strFechaInicio);
            fechafinal  = Convert.ToDateTime(strFechaFinal);

            List <GrupoParametro> listGrupoParametro   = new List <GrupoParametro>();
            GrupoParametro        grupoParametro       = new GrupoParametro();
            List <Parametro>      listParametroDetalle = new List <Parametro>();

            string mensaje = string.Empty;

            try
            {
                totalDias = (fechafinal - fechaInicio).TotalDays;

                //OBTENER EMPRESAS SELECCIONADAS
                foreach (CatCapital catCapital in ListCatCapital.Where(n => n.Check).ToList())
                {
                    Empresa empresa = new Empresa();
                    empresa.Nombre = catCapital.Valor;

                    ListaEmpresa.Add(empresa);
                }

                if (ListaEmpresa.Count <= 2)
                {
                    resultadoMercadoCapital.Mensaje = "Se debe seleccionar por lo menos tres empresas.";

                    return(Json(resultadoMercadoCapital, JsonRequestBehavior.AllowGet));
                }

                if (ListaEmpresa.Count > 7)
                {
                    resultadoMercadoCapital.Mensaje = "Se debe seleccionar como maximo 7 empresas.";

                    return(Json(resultadoMercadoCapital, JsonRequestBehavior.AllowGet));
                }


                ////////////////////////
                //1.-DATOS
                ////////////////////////

                //OBTENER INFORMACION DE DIVISAS POR CADA EMPRESA
                //ListaEmpresa.ForEach(x =>
                foreach (Empresa x in ListaEmpresa)
                {
                    /////////////////////////
                    ///OBTENER CRUMB
                    ////////////////////////
                    //YahooFinance.NET.Token.Refresh();
                    //YahooFinance.NET.Token.Refresh();
                    //crumb = Token.Crumb;
                    //cookie = Token.Cookie;

                    //var yahooFinance = new YahooFinanceClient(cookie, crumb);
                    var yahooStockCode = x.Nombre; //yahooFinance.GetYahooStockCode(exchange, symbol);
                    List <YahooHistoricalPriceData> yahooPriceHistory = yahooFinance.GetDailyHistoricalPriceData(yahooStockCode, fechaInicio, fechafinal);

                    //OBTENER REGISTROS TOTALES
                    x.Cantidad = yahooPriceHistory.Count;

                    //CALCULAR RENDIMIENTO
                    cont           = 0;
                    primerRegistro = true;
                    foreach (var data in yahooPriceHistory)
                    {
                        if (primerRegistro)
                        {
                            primerRegistro = false;
                        }
                        else
                        {
                            if (yahooPriceHistory[cont - 1].Close != 0)
                            {
                                rendimiento      = (Convert.ToDouble(data.Close) / Convert.ToDouble(yahooPriceHistory[cont - 1].Close)) - 1;
                                data.Rendimiento = rendimiento;
                            }
                            else
                            {
                                data.Rendimiento = 0;
                            }
                        }

                        cont++;
                    }

                    //AGREGAR LISTA DE PRECIOS
                    x.ListaPrecio = yahooPriceHistory;

                    //OBTENEMOS SUMATORIA DEL RENDIMIENTO
                    x.Rendimiento = yahooPriceHistory.Sum(n => n.Rendimiento);

                    //decimal promedio = yahooPriceHistory.Average(n => n.Close);
                    //x.Media = Convert.ToDouble(promedio);


                    //OBTENER VARIANZA RENDIMIENTO
                    double M = 0.0;
                    double S = 0.0;
                    int    k = 1;

                    yahooPriceHistoryTemp = yahooPriceHistory.ToList();

                    if (yahooPriceHistoryTemp.Count > 0)
                    {
                        yahooPriceHistoryTemp.RemoveAt(0);

                        yahooPriceHistoryTemp.ForEach(n =>
                        {
                            double tmpM = M;
                            M          += (Convert.ToDouble(n.Rendimiento) - tmpM) / k;
                            S          += (Convert.ToDouble(n.Rendimiento) - tmpM) * (Convert.ToDouble(n.Rendimiento) - M);
                            k++;
                        });

                        varianza   = S / (k - 2);
                        desviacion = Math.Sqrt(S / (k - 2));
                    }
                    else
                    {
                        varianza   = 0;
                        desviacion = 0;
                    }

                    x.VarianzaRendimiento   = varianza;
                    x.DesviacionRendimiento = desviacion;
                }

                //CALCULAR MEDIA RENDIMIENTO
                ListaEmpresa.ForEach(n =>
                {
                    promedio           = n.Rendimiento / (n.Cantidad - 1);
                    n.MediaRendimiento = promedio;
                });

                ListaEmpresa.ForEach(n =>
                {
                    n.MaxPrecio = n.ListaPrecio.Max(m => m.Close);
                    n.MinPrecio = n.ListaPrecio.Min(m => m.Close);
                });

                //dgvTotales.DataBind();

                //POSIBLES COMBINACIONES
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    //cont2 = cont + 1;
                    for (cont2 = cont + 1; ListaEmpresa.Count > cont2; cont2++)
                    {
                        EmpresaVsEmpresa empresaVsEmpresa = new EmpresaVsEmpresa();

                        //ELEMENTO X
                        empresaVsEmpresa.NombreX                = ListaEmpresa[cont].Nombre;
                        empresaVsEmpresa.CantidadX              = ListaEmpresa[cont].Cantidad;
                        empresaVsEmpresa.RendimientoX           = ListaEmpresa[cont].Rendimiento;
                        empresaVsEmpresa.MediaRendimientoX      = ListaEmpresa[cont].MediaRendimiento;
                        empresaVsEmpresa.VarianzaRendimientoX   = ListaEmpresa[cont].VarianzaRendimiento;
                        empresaVsEmpresa.DesviacionRendimientoX = ListaEmpresa[cont].DesviacionRendimiento;
                        empresaVsEmpresa.VarianzaX              = ListaEmpresa[cont].Varianza;
                        empresaVsEmpresa.ListaPrecioX           = ListaEmpresa[cont].ListaPrecio;
                        empresaVsEmpresa.indiceX                = cont;
                        //ELEMENTO Y
                        empresaVsEmpresa.NombreY                = ListaEmpresa[cont2].Nombre;
                        empresaVsEmpresa.CantidadY              = ListaEmpresa[cont2].Cantidad;
                        empresaVsEmpresa.RendimientoY           = ListaEmpresa[cont2].Rendimiento;
                        empresaVsEmpresa.MediaRendimientoY      = ListaEmpresa[cont2].MediaRendimiento;
                        empresaVsEmpresa.VarianzaRendimientoY   = ListaEmpresa[cont2].VarianzaRendimiento;
                        empresaVsEmpresa.DesviacionRendimientoY = ListaEmpresa[cont2].DesviacionRendimiento;
                        empresaVsEmpresa.VarianzaY              = ListaEmpresa[cont2].Varianza;
                        empresaVsEmpresa.ListaPrecioY           = ListaEmpresa[cont2].ListaPrecio;
                        empresaVsEmpresa.indiceY                = cont2;

                        ListaEmpresaVsEmpresa.Add(empresaVsEmpresa);
                    }
                }

                //CALCULAR RENDIMIENTO X POR RENDIMIENTO Y
                //CALCULAR COVARIANZA
                primerRegistro = true;
                foreach (EmpresaVsEmpresa empresaVsEmpresa in ListaEmpresaVsEmpresa)
                {
                    for (cont = 0; empresaVsEmpresa.ListaPrecioX.Count > cont; cont++)
                    {
                        if (primerRegistro)
                        {
                            primerRegistro = false;
                            empresaVsEmpresa.RendimientoXPorY = 0;
                        }
                        else
                        {
                            empresaVsEmpresa.RendimientoXPorY = empresaVsEmpresa.RendimientoXPorY +
                                                                ((empresaVsEmpresa.ListaPrecioX[cont].Rendimiento - empresaVsEmpresa.MediaRendimientoX)
                                                                 * (empresaVsEmpresa.ListaPrecioY[cont].Rendimiento - empresaVsEmpresa.MediaRendimientoY));
                        }
                    }

                    empresaVsEmpresa.Covarianza = empresaVsEmpresa.RendimientoXPorY / (empresaVsEmpresa.ListaPrecioX.Count - 1);
                }

                int numEmpresas = ListaEmpresa.Count;
                EmpresaVsEmpresa empresaVsEmpresaCovarianza = new EmpresaVsEmpresa();
                //double covarianza = 0;
                int indiceX = 0;
                int indiceY = 0;

                double[,] matrizVarianzaComp = new double[numEmpresas + 1, numEmpresas + 1];
                //GENERAR MATRIZ VARIANZA COVARIANZA
                for (cont = 0; numEmpresas + 1 > cont; cont++)
                {
                    for (cont2 = 0; numEmpresas + 1 > cont2; cont2++)
                    {
                        if (cont >= numEmpresas || cont2 >= numEmpresas)
                        {
                            if (cont == cont2)
                            {
                                matrizVarianzaComp[cont, cont2] = 0;
                            }
                            else
                            {
                                matrizVarianzaComp[cont, cont2] = 1;
                            }
                        }
                        else
                        {
                            if (cont == cont2)
                            {
                                matrizVarianzaComp[cont, cont2] = ListaEmpresa[cont].VarianzaRendimiento;
                            }
                            else
                            {
                                if (cont <= cont2)
                                {
                                    indiceX = cont;
                                    indiceY = cont2;
                                }
                                else
                                {
                                    indiceX = cont2;
                                    indiceY = cont;
                                }

                                empresaVsEmpresaCovarianza = ListaEmpresaVsEmpresa.Where(n => n.indiceX == indiceX && n.indiceY == indiceY).FirstOrDefault();

                                if (empresaVsEmpresaCovarianza != null)
                                {
                                    matrizVarianzaComp[cont, cont2] = empresaVsEmpresaCovarianza.Covarianza;
                                }
                            }
                        }
                    }
                }

                ////////////////////////
                //2.-PUNTO DE VARIANZA MINIMA GLOBAL
                ////////////////////////

                Matrix matrizInversa = new Matrix(matrizVarianzaComp);

                double[,] matrizInversaFinal = matrizInversa.Inversa();

                //MATRIZ B1 DEL PUNTO
                double[,] B1 = new double[numEmpresas + 1, 1];

                for (cont = 0; numEmpresas + 1 > cont; cont++)
                {
                    if (cont >= numEmpresas)
                    {
                        B1[cont, 0] = 1;
                    }
                    else
                    {
                        B1[cont, 0] = 0;
                    }
                }

                //MATRIZ W
                double[,] matrizW = matrizInversa.ProductoMatrices(matrizInversaFinal, B1);


                ////////////////////////
                //3.-TASA DE RENDIMIENTO DEL PORTAFOLIO
                ////////////////////////

                //CREAR MATRIZ DE 1X3
                double[,] matrizR1x3 = new double[1, ListaEmpresa.Count];
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizR1x3[0, cont] = ListaEmpresa[cont].MediaRendimiento;
                }

                //CRAR MATRIZ DE 3X1
                double[,] matrizR3x1 = new double[ListaEmpresa.Count, 1];
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizR3x1[cont, 0] = ListaEmpresa[cont].MediaRendimiento;
                }

                //MULTIPLICAR MATRICES DE RENDIMIENTOS
                Matrix matrizOperacion = new Matrix();
                double[,] matrizRendiPortafolio = matrizOperacion.ProductoMatrices(matrizR1x3, matrizR3x1);

                double rendimientoPortafolio = matrizRendiPortafolio[0, 0];

                ////////////////////////
                //4.-VARIANZA DEL PORTAFOLIO
                ////////////////////////
                double[,] matrizVarianza = new double[ListaEmpresa.Count, ListaEmpresa.Count];
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    for (cont2 = 0; ListaEmpresa.Count > cont2; cont2++)
                    {
                        matrizVarianza[cont, cont2] = matrizVarianzaComp[cont, cont2];
                    }
                }

                double[,] matrizWS = matrizOperacion.ProductoMatrices(matrizR1x3, matrizVarianza);

                double[,] matrizVarianzaPorta = matrizOperacion.ProductoMatrices(matrizWS, matrizR3x1);

                double varianzaPortafolio = matrizVarianzaPorta[0, 0];

                double varianzaPortaRaiz = Math.Sqrt(varianzaPortafolio);

                ////////////////////////
                //5.-BUSQUEDA DEL CONJUNTO DE PORTAFOLIOS EFICIENTE
                ////////////////////////

                //AGREGAR DATOS VARIANZA
                double[,] matrizV2 = new double[ListaEmpresa.Count + 2, ListaEmpresa.Count + 2];
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    for (cont2 = 0; ListaEmpresa.Count > cont2; cont2++)
                    {
                        matrizV2[cont, cont2] = matrizVarianza[cont, cont2];
                    }
                }

                //AGREGAR INFORMACION DEL RENDIMIENTO DE LA MATRIZ 1x3
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizV2[ListaEmpresa.Count, cont] = matrizR1x3[0, cont];
                }

                //AGREGAR INFORMACION DEL RENDIMIENTO DE LA MATRIZ 3X1
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizV2[cont, ListaEmpresa.Count] = matrizR3x1[cont, 0];
                }

                //RELLENAR CON 1 LA MATRIZ EN EJE X
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizV2[ListaEmpresa.Count + 1, cont] = 1;
                }

                //RELLENAR CON 1 LA MATRIZ EN EJE Y
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    matrizV2[cont, ListaEmpresa.Count + 1] = 1;
                }


                matrizOperacion = new Matrix(matrizV2);

                double[,] matrizV2Inversa = matrizOperacion.Inversa();

                double[,] B2V = new double[ListaEmpresa.Count + 2, 1];

                B2V[ListaEmpresa.Count + 1, 0] = 1;


                ////////////////////////
                //6.-NUMEROS PORTAFLIO QUE FORMARAN PARTE DE LA CURVA DE VARIANZA MINIMA
                ////////////////////////

                List <double> ListaNumeroAleatorio = new List <double>();
                Random        random = new Random();

                double a = random.NextDouble();
                a = a / 100;

                for (cont = 0; 20 > cont; cont++)
                {
                    ListaNumeroAleatorio.Add(random.NextDouble() / 1000);
                }

                ListaNumeroAleatorio = ListaNumeroAleatorio.OrderBy(n => n).ToList();

                double[,] W2;
                List <CurvaVarianza> ListaCurvaVarianza = new List <CurvaVarianza>();
                double[,] W2T;


                listGrupoParametro = new List <GrupoParametro>();

                int w = 0;
                foreach (double valor in ListaNumeroAleatorio)
                {
                    B2V[ListaEmpresa.Count, 0] = valor;

                    W2 = matrizOperacion.ProductoMatrices(matrizV2Inversa, B2V);

                    double[,] W2Resumen = new double[ListaEmpresa.Count, 1];

                    for (cont = 0; ListaEmpresa.Count > cont; cont++)
                    {
                        W2Resumen[cont, 0] = W2[cont, 0];
                    }

                    matrizOperacion = new Matrix(W2Resumen);
                    W2T             = matrizOperacion.TranspuestaX();

                    //OBTENER RENDIMIENTO ASUMIDO
                    double[,] matrizRA = matrizOperacion.ProductoMatrices(W2T, matrizR3x1);
                    double rendimientoAsumido = matrizRA[0, 0];

                    //OBTENER SIGMA
                    double[,] matrizSigmaA = matrizOperacion.ProductoMatrices(W2T, matrizVarianza);
                    double[,] matrizSigmaB = matrizOperacion.ProductoMatrices(matrizSigmaA, W2Resumen);

                    double sigma = matrizSigmaB[0, 0];

                    CurvaVarianza curvaVarianza = new CurvaVarianza();
                    curvaVarianza.Numero             = w + 1;
                    curvaVarianza.RendimientoAsumido = rendimientoAsumido;
                    curvaVarianza.Sigma = sigma;
                    curvaVarianza.W     = W2T;

                    ListaCurvaVarianza.Add(curvaVarianza);


                    //EMPRESAS
                    for (int l = 0; curvaVarianza.W.Length > l; l++)
                    {
                        //AGREGAR INFORMACION DE LOG
                        listParametroDetalle = new List <Parametro>();

                        //AGREGAR DETALLE DE LOG
                        parametro        = new Parametro();
                        parametro.Nombre = "Numero";
                        parametro.Valor  = w + 1;

                        listParametroDetalle.Add(parametro);

                        parametro        = new Parametro();
                        parametro.Nombre = "Rendimiento";
                        parametro.Valor  = rendimientoAsumido;

                        listParametroDetalle.Add(parametro);

                        parametro        = new Parametro();
                        parametro.Nombre = "Sigma";
                        parametro.Valor  = sigma;

                        listParametroDetalle.Add(parametro);

                        parametro        = new Parametro();
                        parametro.Nombre = "Usuario";
                        parametro.Valor  = ((Entidades.Usuario)Session["Usuario"]).Login;

                        listParametroDetalle.Add(parametro);

                        parametro        = new Parametro();
                        parametro.Nombre = "Empresa";
                        parametro.Valor  = ListaEmpresa[l].Nombre;

                        listParametroDetalle.Add(parametro);

                        parametro        = new Parametro();
                        parametro.Nombre = "Valor";
                        parametro.Valor  = curvaVarianza.W[0, l].ToString("0.0000##");

                        listParametroDetalle.Add(parametro);

                        grupoParametro = new GrupoParametro();
                        grupoParametro.ListGrupoParametro = listParametroDetalle;
                        listGrupoParametro.Add(grupoParametro);
                    }


                    w++;
                }

                DataTable dtExportarInformacion = new DataTable();

                Session["dtInformacionCapital"] = dtExportarInformacion;

                if (Session["Usuario"] == null)
                {
                    resultadoMercadoCapital.Mensaje = "Sesion Expirada";

                    return(Json(resultadoMercadoCapital, JsonRequestBehavior.AllowGet));
                }


                double minCurvaVarianzaX = 0;

                minCurvaVarianzaX = ListaCurvaVarianza.Min(n => n.Sigma);

                dtExportarInformacion.Columns.Add("Numero");
                dtExportarInformacion.Columns.Add("Rendimiento_Asumido");
                dtExportarInformacion.Columns.Add("Riesgo");
                for (cont = 0; ListaEmpresa.Count > cont; cont++)
                {
                    dtExportarInformacion.Columns.Add(ListaEmpresa[cont].Nombre);
                }

                cont = 0;
                foreach (CurvaVarianza curVarianza in ListaCurvaVarianza)
                {
                    dtExportarInformacion.Rows.Add(curVarianza.Numero.ToString("0"), curVarianza.RendimientoAsumido.ToString("0.0000##"), curVarianza.Sigma.ToString("0.0000##"));

                    for (cont2 = 0; curVarianza.W.Length > cont2; cont2++)
                    {
                        dtExportarInformacion.Rows[cont][cont2 + 3] = curVarianza.W[0, cont2].ToString("0.0000##");
                    }

                    cont++;
                }


                dtExportarInformacion.Columns.Cast <DataColumn>().ToList().ForEach(n =>
                {
                    encabezadoEmpresa         = new EncabezadoEmpresa();
                    encabezadoEmpresa.Columna = n.ColumnName;
                    ListaEncabezadoEmpresa.Add(encabezadoEmpresa);
                });

                int i         = 0;
                var ListDatos = dtExportarInformacion.Rows.Cast <DataRow>().ToList().Select(n => new DatosMecadoCapital
                {
                    id    = i++,
                    datos = n.ItemArray
                }).ToList();

                resultadoMercadoCapital.ListaEmpresa               = ListaEmpresa;
                resultadoMercadoCapital.ListaEncabezadoEmpresa     = ListaEncabezadoEmpresa;
                resultadoMercadoCapital.ListaCurvaVarianza         = ListaCurvaVarianza;
                resultadoMercadoCapital.ListaCalculoMercadoCapital = ListaCalculoMercadoCapital;
                resultadoMercadoCapital.ListaDatos = ListDatos.ToList();



                //INSERTAR INFORMACION LOG
                listParametro = new List <Parametro>();

                parametro        = new Parametro();
                parametro.Nombre = "Usuario";
                parametro.Valor  = ((Entidades.Usuario)Session["Usuario"]).Login;

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Modulo";
                parametro.Valor  = "Mercado Capital";

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Empresa";
                parametro.Valor  = string.Join(", ", ListaEmpresa.Select(n => n.Nombre).ToArray());

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Resumen";
                parametro.Valor  = "Generar Estadistico Mercado Capital";

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Detalle";
                parametro.Valor  = "Fecha Inicio: " + strFechaInicio + ", Fecha Final: " + strFechaFinal;

                listParametro.Add(parametro);

                //INSERTAR LOG
                Negocio.Log.Log log = new Negocio.Log.Log();
                log.InsertLogCapital(listParametro, listGrupoParametro);

                resultadoMercadoCapital.Mensaje = "OK";
            }
            catch (Exception ex)
            {
                mensaje = "ERROR: Metodo: ObtenerEstadistico_Mercado, Source: " + ex.Source + ", Mensaje: " + ex.Message;
                ArchivoLog.EscribirLog(null, mensaje);

                resultadoMercadoCapital.Mensaje = mensaje;
            }

            return(Json(resultadoMercadoCapital, JsonRequestBehavior.AllowGet));
        }
示例#2
0
        public JsonResult ObtenerEstadistico(string strFechaInicio, string strFechaFinal, List <CatDivisa> ListCatDivisa)
        {
            ResultadoMercadoDivisa resultadoMercadoDivisa = new ResultadoMercadoDivisa();

            resultadoMercadoDivisa.ListaDatos = new List <DatosDivisa>();
            DatosDivisa datosDivisa = new DatosDivisa();

            string seriesID    = "";
            string fechainicio = "";
            string fechafinal  = "";

            CatDivisa catDivisaDefault = new CatDivisa();
            string    divisa           = string.Empty;

            List <Parametro> listParametro = new List <Parametro>();
            Parametro        parametro     = new Parametro();

            List <GrupoParametro> listGrupoParametro   = new List <GrupoParametro>();
            GrupoParametro        grupoParametro       = new GrupoParametro();
            List <Parametro>      listParametroDetalle = new List <Parametro>();

            string mensaje = string.Empty;

            string Lang = "es-MX";//set your culture here

            try
            {
                System.Threading.Thread.CurrentThread.CurrentCulture =
                    new System.Globalization.CultureInfo(Lang);

                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Lang);

                //Se solicita la información al cliente para definir el código que realizará la petición al API:
                //string valor = "";

                //OBTENER LA DIVISA SELECCIONADA
                catDivisaDefault = ListCatDivisa.Where(n => !string.IsNullOrEmpty(n.Check)).FirstOrDefault();

                if (catDivisaDefault != null)
                {
                    seriesID = catDivisaDefault.Valor;
                    divisa   = catDivisaDefault.Nombre;
                }
                else
                {
                    resultadoMercadoDivisa.Mensaje = "Debe seleccionar por lo menos una moneda.";

                    return(Json(resultadoMercadoDivisa, JsonRequestBehavior.AllowGet));
                }


                fechainicio = Convert.ToDateTime(strFechaInicio).ToString("yyyy-MM-dd");

                fechafinal = Convert.ToDateTime(strFechaFinal).ToString("yyyy-MM-dd");

                string url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/" + seriesID + "/datos/" + fechainicio + "/" + fechafinal;

                ServicePointManager.Expect100Continue = true;
                ServicePointManager.SecurityProtocol  = SecurityProtocolType.Tls12;

                //Se crea una cadena con los valores que se requiera consumir
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.Accept = "application/json; charset=utf-8";
                request.Headers["Bmx-Token"] = "6af6e6645653ed1cb3ecb5165c3d30df2d5289600811f7067b2169c9ff030eb4";
                //request.Method = "GET";
                request.PreAuthenticate = true;
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new Exception(String.Format(
                                            "Server error (HTTP {0}: {1}).",
                                            response.StatusCode,
                                            response.StatusDescription));
                }

                //De esta forma se obtiene el JSON de la respuesta en una cadena. Esta cadena puede ser mapeada a objetos de la siguiente forma:
                DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response));


                object c = jsonSerializer.ReadObject(response.GetResponseStream());

                Response resBan = (Response)c;

                var uno1 = resBan.seriesResponse.series[0];

                //LINQ C#
                //PARA BUSCAR MAS INFORMACION
                //var dos1 = uno1.Data.Where(n => (Convert.ToDecimal(n.Data)) > 9).ToList();

                if (uno1.Data == null)
                {
                    resultadoMercadoDivisa.Mensaje = "No Datos";

                    return(Json(resultadoMercadoDivisa, JsonRequestBehavior.AllowGet));
                }

                var dos1 = uno1.Data.ToList();

                DataTable dt1 = new DataTable();

                dt1.Columns.Add("Fecha");
                dt1.Columns.Add("Valor");


                if (Session["Usuario"] == null)
                {
                    resultadoMercadoDivisa.Mensaje = "Sesion Expirada";

                    return(Json(resultadoMercadoDivisa, JsonRequestBehavior.AllowGet));
                }

                listGrupoParametro = new List <GrupoParametro>();

                int cont = 0;
                dos1.ForEach(m =>
                {
                    dt1.Rows.Add(m.Date, Convert.ToDouble(m.Data).ToString("0.0000##"));

                    datosDivisa       = new DatosDivisa();
                    datosDivisa.Fecha = m.Date;
                    datosDivisa.Valor = Convert.ToDouble(m.Data);

                    resultadoMercadoDivisa.ListaDatos.Add(datosDivisa);

                    listParametroDetalle = new List <Parametro>();

                    //AGREGAR DETALLE DE LOG
                    parametro        = new Parametro();
                    parametro.Nombre = "Empresa";
                    parametro.Valor  = divisa;

                    listParametroDetalle.Add(parametro);

                    parametro        = new Parametro();
                    parametro.Nombre = "Fecha";
                    parametro.Valor  = DateTime.ParseExact(m.Date, "dd/MM/yyyy", CultureInfo.CurrentCulture);

                    listParametroDetalle.Add(parametro);

                    parametro        = new Parametro();
                    parametro.Nombre = "Valor";
                    parametro.Valor  = m.Data;

                    listParametroDetalle.Add(parametro);

                    parametro        = new Parametro();
                    parametro.Nombre = "Usuario";
                    parametro.Valor  = ((Entidades.Usuario)Session["Usuario"]).Login;

                    listParametroDetalle.Add(parametro);

                    grupoParametro = new GrupoParametro();
                    grupoParametro.ListGrupoParametro = listParametroDetalle;
                    listGrupoParametro.Add(grupoParametro);

                    cont++;
                });


                Session["dtInformacionDivisa"] = dt1;


                //INSERTAR INFORMACION LOG
                listParametro = new List <Parametro>();

                parametro        = new Parametro();
                parametro.Nombre = "Usuario";
                parametro.Valor  = ((Entidades.Usuario)Session["Usuario"]).Login;

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Modulo";
                parametro.Valor  = "Mercado Divisa";

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Empresa";
                parametro.Valor  = divisa;

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Resumen";
                parametro.Valor  = "Generar Estadistico Mercado Divisa";

                listParametro.Add(parametro);

                parametro        = new Parametro();
                parametro.Nombre = "Detalle";
                parametro.Valor  = "Fecha Inicio: " + strFechaInicio + ", Fecha Final: " + strFechaFinal;

                listParametro.Add(parametro);

                //INSERTAR LOG
                Negocio.Log.Log log = new Negocio.Log.Log();
                log.InsertLogDivisa(listParametro, listGrupoParametro);

                resultadoMercadoDivisa.Mensaje = "OK";
            }
            catch (Exception ex)
            {
                mensaje = "ERROR: Metodo: ObtenerEstadistico_Divisa, Source: " + ex.Source + ", Mensaje: " + ex.Message;
                ArchivoLog.EscribirLog(null, mensaje);

                resultadoMercadoDivisa.Mensaje = mensaje;
            }

            return(Json(resultadoMercadoDivisa, JsonRequestBehavior.AllowGet));
        }