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);
        }
예제 #2
0
        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();
            }
        }