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 Dictionary latestDates = PricingDA.GetLatestDates(symbols); symbols=symbols.Where(x => latestDates.ContainsKey(x) && latestDates[x].Date>=tradeDate.Date).ToList(); // Prefetch a subset of fundamentals where each fundamental.asof is no greater than tradeDate FundamentalsV2 fundamentals = FundamentalDA.GetFundamentalsMaxDateV2(tradeDate); // Prefetch the Company Profiles Dictionary companyProfiles = CompanyProfileDA.GetCompanyProfiles(symbols); // Prefetch the pricing dates requires for 200 day moving average. DateGenerator dateGenerator = new DateGenerator(); DateTime historicalDate=dateGenerator.GenerateHistoricalDate(tradeDate,cmtParams.DMA200Horizon+10); List historicalDates=PricingDA.GetPricingDatesBetween(historicalDate,tradeDate); // Prefetch the EPS time series Dictionary epsTimeSeriesCollectionDictionary = FundamentalDA.GetEPS(symbols,tradeDate,3); // Prefetch the profit margin time series Dictionary profitMarginTimeSeriesCollectionDictionary = IncomeStatementDA.GetProfitMarginMaxAsOf(symbols,tradeDate,3,IncomeStatement.PeriodType.Quarterly); for(int index=0;index