private static async Task <DateTime> calcStaPrice(List <Stock> stockList, StockContext db, StaPrice lastItem) { DateTime startDateThisTime = default; if (lastItem != null) { startDateThisTime = lastItem.Date; } var query = from i in db.DayDataSet where i.StockId == Constants.IndexBase && i.Date >= startDateThisTime orderby i.Date ascending select i.Date; var needHandleList = await query.ToListAsync(); List <DayData> previousDayDataList = new List <DayData>(); //需要list升序排列 foreach (var dateItem in needHandleList) { System.Diagnostics.Debug.WriteLine($"calc limit num for {dateItem}"); var query2 = from i in db.DayDataSet where i.Date == dateItem select i; var currentDayDataList = await query2.AsNoTracking().ToListAsync(); if (previousDayDataList.Count > 0) { var staItem = await( from i in db.StaPrice where i.Date == dateItem select i ).FirstOrDefaultAsync(); if (staItem == null) { //进行统计 staItem = new StaPrice(); staItem.Date = dateItem; db.StaPrice.Add(staItem); } staItem.HighlimitNum = 0; staItem.LowlimitNum = 0; staItem.FailNum = 0; staItem.Permanent = true; foreach (var currentDayData in currentDayDataList) { var previousItem = previousDayDataList.FirstOrDefault(s => s.StockId == currentDayData.StockId); if (previousItem != null) { double zhangtingjia = Math.Round(previousItem.Close * 1.1, 2, MidpointRounding.AwayFromZero); double dietingjia = Math.Round(previousItem.Close * 0.9, 2, MidpointRounding.AwayFromZero); var stock = ( from i in stockList where i.StockId == currentDayData.StockId select i ).FirstOrDefault(); if (stock != null) { if (currentDayData.Date - stock.MarketStartDate >= TimeSpan.FromDays(30)) { ///只统计上市30天以后的。 if (currentDayData.Close >= zhangtingjia) { staItem.HighlimitNum++; } else if (currentDayData.Close <= dietingjia) { staItem.LowlimitNum++; } } } } } } //结束后 previousDayDataList = currentDayDataList; } return(startDateThisTime); }
private async Task staLimitNum() { DateTime lastDateTime = await GetLastTradeDayFromWebPage(); lastDateTime = new DateTime(lastDateTime.Year, lastDateTime.Month, lastDateTime.Day); var stockList = base.GetStockList(); using (var db = new StockContext()) { var querySta = from i in db.StaPrice where i.Date == lastDateTime select i; var staItem = await querySta.FirstOrDefaultAsync(); if (staItem != null) { if (staItem.Permanent) { return; } } else { staItem = new StaPrice() { Date = lastDateTime, }; db.StaPrice.Add(staItem); } staItem.HighlimitNum = 0; staItem.LowlimitNum = 0; staItem.FailNum = 0; staItem.Permanent = false; DateTime previousDate = await( from i in db.DayDataSet where i.StockId == Constants.IndexBase && i.Date < lastDateTime orderby i.Date descending select i.Date ).FirstOrDefaultAsync(); System.Diagnostics.Debug.WriteLine($"calc realtime limit num for {lastDateTime}"); var query2 = from i in db.DayDataSet where i.Date == previousDate select i; var previousDayDataList = await query2.AsNoTracking().ToListAsync(); foreach (var previousDayData in previousDayDataList) { var realTimeItem = await( from i in db.RealTimeDataSet where i.StockId == previousDayData.StockId orderby i.Date descending select i ).FirstOrDefaultAsync(); if (realTimeItem != null) { double zhangtingjia = Math.Round(previousDayData.Close * 1.1, 2, MidpointRounding.AwayFromZero); double dietingjia = Math.Round(previousDayData.Close * 0.9, 2, MidpointRounding.AwayFromZero); var stock = ( from i in stockList where i.StockId == previousDayData.StockId select i ).FirstOrDefault(); if (stock != null) { if (realTimeItem.Date - stock.MarketStartDate >= TimeSpan.FromDays(30)) { ///只统计上市30天以后的。 if (realTimeItem.Close >= zhangtingjia) { staItem.HighlimitNum++; } else if (realTimeItem.Close <= dietingjia) { staItem.LowlimitNum++; } } } } } await db.SaveChangesAsync(); } }