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)); }