示例#1
0
        public void PreparaCenario(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas, ParametrosPernaCenario[] parametrosPernasCenario, int perna)
        {
            ParametrosPerna parametrosPerna = parametrosPernas[perna];

            if (perna < parametrosPernas.Length - 1)
            {
                for (decimal x = parametrosPerna.MinX; x <= parametrosPerna.MaxX; x = decimal.Add(x, 0.01m))
                {
                    parametrosPernasCenario[perna].X = x;

                    PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, perna + 1);
                }
            }
            else
            {
                Cenario cenario = new Cenario(parametrosPernasCenario);

                cenario = CalculaUltimaPernaCenario(parametrosPernas, cenario, perna);

                if (cenario != null)
                {
                    cenario = CalculaCenario(cenario);

                    cenarios.Add(cenario);
                }
            }
        }
示例#2
0
        public void PreparaCenario(List <Cenario> cenarios, ParametrosPerna[] parametrosPernas, ParametrosPernaCenario[] parametrosPernasCenario, int perna)
        {
            ParametrosPerna parametrosPerna = parametrosPernas[perna];

            if (perna < parametrosPernas.Length - 1)
            {
                List <Task>            tasks            = new List <Task>();
                List <List <Cenario> > cenariosPorTasks = new List <List <Cenario> >();

                for (decimal x = parametrosPerna.MinX; x <= parametrosPerna.MaxX; x = decimal.Add(x, 0.01m))
                {
                    parametrosPernasCenario[perna].X = x;

                    if (perna == 0)
                    {
                        ParametrosPernaCenario[] parametrosPernasNovoCenario = new ParametrosPernaCenario[parametrosPernas.Length];

                        for (int i = 0; i < parametrosPernas.Length; i++)
                        {
                            parametrosPernasNovoCenario[i] = new ParametrosPernaCenario(parametrosPernasCenario[i]);
                        }

                        /// Cada task tem uma lista de cenários, para evitar problemas de concorrência
                        List <Cenario> cenariosPorTask = new List <Cenario>();
                        cenariosPorTasks.Add(cenariosPorTask);

                        Task task = Task.Run(() => PreparaCenario(cenariosPorTask, parametrosPernas, parametrosPernasNovoCenario, perna + 1));

                        tasks.Add(task);
                    }
                    else
                    {
                        PreparaCenario(cenarios, parametrosPernas, parametrosPernasCenario, perna + 1);
                    }
                }

                if (tasks.Count > 0)
                {
                    Task.WaitAll(tasks.ToArray());

                    foreach (List <Cenario> cenariosPorTask in cenariosPorTasks)
                    {
                        cenarios.AddRange(cenariosPorTask);
                    }
                }
            }
            else
            {
                Cenario cenario = new Cenario(parametrosPernasCenario);

                cenario = CalculaUltimaPernaCenario(parametrosPernas, cenario, perna);

                if (cenario != null)
                {
                    cenario = CalculaCenario(cenario);

                    cenarios.Add(cenario);
                }
            }
        }
示例#3
0
        public Cenario CalculaCenario(Cenario cenario)
        {
            for (int i = 0; i < cenario.Parametros.Length; i++)
            {
                decimal resultado = (cenario.Parametros[i].X - cenario.Parametros[i].PrecoExec) / cenario.Parametros[i].Vega;
                resultado         *= resultado;
                cenario.Resultado += resultado;
            }

            if (cenario.Resultado == 0.0m)
            {
                cenario.Print();
            }

            return(cenario);
        }
示例#4
0
        public void Modula(ParametrosPerna[] parametrosPernas)
        {
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            List <Cenario> cenarios = new List <Cenario>();

            PreparaCenarios(cenarios, parametrosPernas);

            //foreach (Cenario cenario in cenarios)
            //{
            //    if (cenario == null)
            //    {
            //        cenario.Print();
            //    }

            //    CalculaCenario(cenario);
            //}

            Cenario melhorCenario = cenarios.OrderBy(s => s.Resultado).FirstOrDefault();

            Console.WriteLine("ModulacaoSync");
            Console.WriteLine();

            Console.WriteLine($"Cenarios: {cenarios.Count}");
            Console.WriteLine();

            melhorCenario.Print();
            Console.WriteLine();

            stopWatch.Stop();

            Console.WriteLine($"ExecutionTime: {stopWatch.ElapsedMilliseconds}");
            Console.WriteLine();
        }
示例#5
0
        private Cenario CalculaUltimaPernaCenario(ParametrosPerna[] parametrosPernas, Cenario cenario, int n)
        {
            decimal sum = 0m;

            for (int i = 0; i < n; i++)
            {
                sum = decimal.Add(sum, cenario.Parametros[i].X);
            }

            cenario.Parametros[n].X = sum * -1;

            if (cenario.Parametros[n].X >= parametrosPernas[n].MinX && cenario.Parametros[n].X <= parametrosPernas[n].MaxX)
            {
                return(cenario);
            }
            else
            {
                return(null);
            }
        }