public async Task <ActionResult <Dictionary <string, List <Trend> > > > AnalyzeAllPortfolio([FromBody] ReqAnalyzePortfolio request)
        {
            return(await Task.Run(async() =>
            {
                var requestTime = DateTime.Now;

                var analyzer = new Analyzer();
                var reports = new Dictionary <string, List <Trend> >(); // key: StrategyType
                var completed = new List <string>();

                List <Subject> universe = null;

                if (request.Country.Contains("FX"))
                {
                    universe = UniverseManager.Instance.GetUniverse("JP", request.Country);
                }
                else
                {
                    universe = UniverseManager.Instance.GetUniverse(request.Country, null);
                }

                var tasks = new List <Task>();

                foreach (var subject in universe)
                {
                    var task = Task.Run(() =>
                    {
                        var requestCopy = request.Clone();
                        requestCopy.Portfolio = new List <PortfolioSubject>
                        {
                            new PortfolioSubject()
                            {
                                AssetCode = subject.AssetCode,
                                Volume = 1,
                                Ratio = 1,
                            }
                        };

                        foreach (var report in analyzer.AnalyzePortfolio(requestCopy, analyzeBenchmark: false))
                        {
                            var strategyType = report.StrategyType;

                            var trend = new Trend()
                            {
                                AssetCode = subject.AssetCode,
                                AssetName = subject.AssetName,
                                Exchange = subject.Exchange,
                                Sector = subject.Sector,
                                Industry = subject.Industry,
                                MarketCap = subject.MarketCap,
                                FirstDate = subject.FirstDate,
                                InitialBalance = report.Summary.InitialBalance,
                                EndBalance = report.Summary.EndBalance,
                                Commission = report.Summary.Commission,
                                Transactions = report.Transactions[subject.AssetCode].Count,
                                PeriodReturnRatio = report.Summary.PeriodReturnRatio,
                                AnnualizedReturnRatio = report.Summary.AnnualizedReturnRatio,
                                VolatilityRatio = report.Summary.VolatilityRatio,
                                PriceVolatilityRatio = report.Summary.PriceVolatilityRatio,
                                MddRatio = report.Summary.MddRatio,
                                SharpeRatio = report.Summary.SharpeRatio,
                                Per = UniverseManager.Instance.FindUniverse(subject.AssetCode).Per,
                                Pbr = UniverseManager.Instance.FindUniverse(subject.AssetCode).Pbr,
                                EvEvitda = UniverseManager.Instance.FindUniverse(subject.AssetCode).EvEvitda,
                                DivYield = UniverseManager.Instance.FindUniverse(subject.AssetCode).DivYield
                            };

                            lock (_sync)
                            {
                                if (reports.ContainsKey(strategyType))
                                {
                                    reports[strategyType].Add(trend);
                                }
                                else
                                {
                                    reports.Add(strategyType, new List <Trend> {
                                        trend
                                    });
                                }
                            }
                        }

                        Console.WriteLine($"[{requestTime.ToShortTimeString()}] {subject.AssetCode}");
                    });

                    tasks.Add(task);
                }

                Console.WriteLine("Wait tasks...");
                await Task.WhenAll(tasks);
                Console.WriteLine($"Start - {requestTime.ToShortTimeString()} End - {DateTime.Now.ToShortTimeString()}");

                return reports;
            }));
        }
        public ActionResult <List <Report> > AnalyzePortfolio([FromBody] ReqAnalyzePortfolio request)
        {
            var analyzer = new Analyzer();

            return(analyzer.AnalyzePortfolio(request));
        }