using Axiom.Interpreter; using MarketData.DataAccess; using MarketData.MarketDataModel; using MarketData.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MarketData.Generator.CMTrend { public class CMTTrendGenerator { private CMTTrendGenerator() { } public static CMTGeneratorResult GenerateCMTCandidates(DateTime tradeDate,CMTParams cmtParams,List symbolsHeld) { CMTGeneratorResult cmtGeneratorResult=new CMTGeneratorResult(); try { List symbols=PricingDA.GetSymbols(); // Filter out symbols where we do not have a price on trade date Profiler profiler = new Profiler(); Dictionary latestDates = PricingDA.GetLatestDates(symbols); symbols=symbols.Where(x => latestDates.ContainsKey(x) && latestDates[x].Date>=tradeDate.Date).ToList(); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded pricing dates in {Utility.FormatNumber(profiler.End(),2)} (ms)"); // Prefetch a subset of fundamentals where each fundamental.asof is no greater than tradeDate profiler.Reset(); FundamentalsV2 fundamentals = FundamentalDA.GetFundamentalsMaxDateV2(tradeDate); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded fundamentals in {Utility.FormatNumber(profiler.End(),2)} (ms)"); // Prefetch the Company Profiles profiler.Reset(); Dictionary companyProfiles = CompanyProfileDA.GetCompanyProfiles(symbols); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded company profiles in {Utility.FormatNumber(profiler.End(),2)} (ms)"); // Prefetch the pricing dates required for 200 day moving average. profiler.Reset(); DateGenerator dateGenerator = new DateGenerator(); DateTime historicalDate=dateGenerator.GenerateHistoricalDate(tradeDate,cmtParams.DMA200Horizon+10); List historicalDates=PricingDA.GetPricingDatesBetween(historicalDate,tradeDate); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded moving average dates in {Utility.FormatNumber(profiler.End(),2)} (ms)"); // Prefetch the EPS time series profiler.Reset(); Dictionary epsTimeSeriesCollectionDictionary = FundamentalDA.GetEPS(symbols,tradeDate,3); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded EPS Time Series in {Utility.FormatNumber(profiler.End(),2)} (ms)"); // Prefetch the profit margin time series profiler.Reset(); Dictionary profitMarginTimeSeriesCollectionDictionary = IncomeStatementDA.GetProfitMarginMaxAsOf(symbols,tradeDate,3,IncomeStatement.PeriodType.Quarterly); MDTrace.WriteLine(LogLevel.DEBUG,$"Loaded Profit Margin Time Series in {Utility.FormatNumber(profiler.End(),2)} (ms)"); for(int index=0;index