Beispiel #1
0
 public void ClearData()
 {
     DailyCandles.Clear();
     MinuteData.Clear();
     UnfilledGaps.Clear();
     GapFibRetraceLevels   = NewFibRetraceDictionary();
     GapFibExtensionLevels = NewFibExtensionDictionary();
 }
Beispiel #2
0
        internal static void ProcessSleepData(SleepData sleepData)
        {
            if ((sleepData != null) && (sleepData.Sleep != null))
            {
                foreach (SleepLog sleepLog in sleepData.Sleep)
                {
                    if (sleepLog.MinuteData == null)
                    {
                        continue;
                    }

                    int startSleepSeconds = sleepLog.StartTime.ToElapsedSeconds();

                    for (int i = 0; i < sleepLog.MinuteData.Count; i++)
                    {
                        //work with a local minute data info instance
                        MinuteData minuteData = sleepLog.MinuteData[i];

                        // determine how many seconds have elapsed since mightnight in the date
                        int currentSeconds = minuteData.DateTime.ToElapsedSeconds();

                        // if the current time is post midnight then we've clicked over to the next day
                        int      daysToAdd   = (currentSeconds < startSleepSeconds) ? 1 : 0;
                        DateTime derivedDate = sleepLog.StartTime.AddDays(daysToAdd);

                        // update the time value with the updated asociated date of the sleep log
                        sleepLog.MinuteData[i].DateTime = new DateTime(
                            derivedDate.Year,
                            derivedDate.Month,
                            derivedDate.Day,
                            minuteData.DateTime.Hour,
                            minuteData.DateTime.Minute,
                            minuteData.DateTime.Second);
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// 获取并清空该 Domain 下的所有数据
        /// </summary>
        /// <returns></returns>
        /// <param name="removeReadItems">是否移除已读取的项目,默认为 true</param>
        /// <param name="keepTodayData">当 removeReadItems = true 时有效,在清理的时候是否保留当天的数据</param>
        public async Task <List <MinuteDataPack> > ReadAndCleanDataItemsAsync(bool removeReadItems = true, bool keepTodayData = true)
        {
            try
            {
                var dt1 = SystemTime.Now;

                var cacheStragety = CacheStrategyFactory.GetObjectCacheStrategyInstance();
                Dictionary <string, List <DataItem> > tempDataItems = new Dictionary <string, List <DataItem> >();

                var systemNow     = SystemTime.Now.UtcDateTime;                                                                     //统一UTC时间
                var nowMinuteTime = SystemTime.Now.AddSeconds(-SystemTime.Now.Second).AddMilliseconds(-SystemTime.Now.Millisecond); // new DateTimeOffset(systemNow.Year, systemNow.Month, systemNow.Day, systemNow.Hour, systemNow.Minute, 0, TimeSpan.Zero);

                //快速获取并清理数据
                foreach (var item in KindNameStore[_domain])
                {
                    var kindName = item.Key;
                    var finalKey = BuildFinalKey(kindName);
                    using (await cacheStragety.BeginCacheLockAsync("SenparcAPM", finalKey).ConfigureAwait(false))
                    {
                        var list = await GetDataItemListAsync(item.Key).ConfigureAwait(false);        //获取列表

                        var completedStatData = list.Where(z => z.DateTime < nowMinuteTime).ToList(); //统计范围内的所有数据

                        tempDataItems[kindName] = completedStatData;                                  //添加到列表

                        if (removeReadItems)
                        {
                            //筛选需要删除的数据
                            var tobeRemove = completedStatData.Where(z => keepTodayData ? z.DateTime < SystemTime.Today : true);

                            //移除已读取的项目
                            if (tobeRemove.Count() == list.Count())
                            {
                                //已经全部删除
                                await cacheStragety.RemoveFromCacheAsync(finalKey, true).ConfigureAwait(false);//删除
                            }
                            else
                            {
                                //部分删除
                                var newList = list.Except(tobeRemove).ToList();
                                await cacheStragety.SetAsync(finalKey, newList, OFoodConfig.DataExpire, true).ConfigureAwait(false);
                            }
                        }
                    }
                }


                //开始处理数据(分两步是为了减少同步锁的时间)
                var result = new List <MinuteDataPack>();
                foreach (var kv in tempDataItems)
                {
                    var kindName   = kv.Key;
                    var domainData = kv.Value;

                    var lastDataItemTime = DateTimeOffset.MinValue;

                    MinuteDataPack minuteDataPack = new MinuteDataPack();
                    minuteDataPack.KindName = kindName;
                    result.Add(minuteDataPack);   //添加一个指标

                    MinuteData minuteData = null; //某一分钟的指标
                    foreach (var dataItem in domainData)
                    {
                        if (DataHelper.IsLaterMinute(lastDataItemTime, dataItem.DateTime))
                        {
                            //新的一分钟
                            minuteData = new MinuteData();
                            minuteDataPack.MinuteDataList.Add(minuteData);

                            minuteData.KindName     = dataItem.KindName;
                            minuteData.Time         = new DateTimeOffset(dataItem.DateTime.Year, dataItem.DateTime.Month, dataItem.DateTime.Day, dataItem.DateTime.Hour, dataItem.DateTime.Minute, 0, TimeSpan.Zero);
                            minuteData.StartValue   = dataItem.Value;
                            minuteData.HighestValue = dataItem.Value;
                            minuteData.LowestValue  = dataItem.Value;
                        }

                        minuteData.EndValue  = dataItem.Value;
                        minuteData.SumValue += dataItem.Value;

                        if (dataItem.Value > minuteData.HighestValue)
                        {
                            minuteData.HighestValue = dataItem.Value;
                        }

                        if (dataItem.Value < minuteData.LowestValue)
                        {
                            minuteData.LowestValue = dataItem.Value;
                        }


                        minuteData.SampleSize++;

                        lastDataItemTime = dataItem.DateTime;
                    }
                }

                //if (SenparcTrace.RecordAPMLog)
                {
                    LogTrace.SendCustomLog("APM 记录 - DataOperation.ReadAndCleanDataItems", (SystemTime.Now - dt1).TotalMilliseconds + " ms");
                }

                return(result);
            }
            catch (Exception e)
            {
                new APMException(e.Message, _domain, "", "DataOperation.ReadAndCleanDataItems");
                return(null);
            }
        }
Beispiel #4
0
        private void ValidateSleepOld(SleepData sleep)
        {
            // general
            Assert.IsNotNull(sleep);
            Assert.IsNotNull(sleep.Summary);
            Assert.IsNotNull(sleep.Sleep);

            // summary
            SleepSummary summary = sleep.Summary;

            Assert.AreEqual(518, summary.TotalMinutesAsleep);
            Assert.AreEqual(2, summary.TotalSleepRecords);
            Assert.AreEqual(540, summary.TotalTimeInBed);

            // logs
            Assert.AreEqual(2, sleep.Sleep.Count);
            SleepLog l = sleep.Sleep.First();

            Assert.AreEqual(true, l.IsMainSleep);
            Assert.AreEqual(29744, l.LogId);
            Assert.AreEqual(98, l.Efficiency);
            Assert.AreEqual(new DateTime(2011, 6, 16), l.StartTime);
            Assert.AreEqual(28800000, l.Duration);
            Assert.AreEqual(0, l.MinutesToFallAsleep);
            Assert.AreEqual(480, l.MinutesAsleep);
            Assert.AreEqual(0, l.MinutesAwake);
            Assert.AreEqual(0, l.MinutesAfterWakeup);
            // awakenings count - depcrecated
            Assert.AreEqual(0, l.AwakeCount);
            Assert.AreEqual(0, l.AwakeDuration);
            Assert.AreEqual(0, l.RestlessCount);
            Assert.AreEqual(0, l.RestlessDuration);
            Assert.AreEqual(480, l.TimeInBed);
            Assert.AreEqual(3, l.MinuteData.Count);

            MinuteData min = l.MinuteData.First();

            Assert.IsNotNull(min);
            Assert.AreEqual(new DateTime(1900, 1, 1).TimeOfDay, min.DateTime.TimeOfDay);
            Assert.AreEqual(3, min.Value);
            l.MinuteData.Remove(min);

            min = l.MinuteData.First();
            Assert.IsNotNull(min);
            Assert.AreEqual(new DateTime(1900, 1, 1, 0, 1, 0).TimeOfDay, min.DateTime.TimeOfDay);
            Assert.AreEqual(2, min.Value);
            l.MinuteData.Remove(min);

            min = l.MinuteData.First();
            Assert.IsNotNull(min);
            Assert.AreEqual(new DateTime(1900, 1, 1, 0, 2, 0).TimeOfDay, min.DateTime.TimeOfDay);
            Assert.AreEqual(1, min.Value);

            sleep.Sleep.Remove(l);
            l = sleep.Sleep.First();

            Assert.AreEqual(false, l.IsMainSleep);
            Assert.AreEqual(29745, l.LogId);
            Assert.AreEqual(93, l.Efficiency);
            Assert.AreEqual(new DateTime(2011, 6, 16, 14, 0, 0), l.StartTime);
            Assert.AreEqual(3600000, l.Duration);
            Assert.AreEqual(20, l.MinutesToFallAsleep);
            Assert.AreEqual(38, l.MinutesAsleep);
            Assert.AreEqual(0, l.MinutesAwake);
            Assert.AreEqual(2, l.MinutesAfterWakeup);
            // awakenings count - depcrecated
            Assert.AreEqual(0, l.AwakeCount);
            Assert.AreEqual(0, l.AwakeDuration);
            Assert.AreEqual(0, l.RestlessCount);
            Assert.AreEqual(0, l.RestlessDuration);
            Assert.AreEqual(60, l.TimeInBed);
            Assert.AreEqual(1, l.MinuteData.Count);

            min = l.MinuteData.First();
            Assert.IsNotNull(min);
            Assert.AreEqual(new DateTime(1900, 1, 1, 14, 0, 0).TimeOfDay, min.DateTime.TimeOfDay);
            Assert.AreEqual(3, min.Value);
        }
Beispiel #5
0
        private void GenerateDetails()
        {
            var startDate = DateTime.MinValue;
            var endDate   = DateTime.MaxValue;

            foreach (var dailyCandle in DailyCandles.Where(dailyCandle => MinuteData.ContainsKey(dailyCandle.Date.Date)))
            {
                startDate = dailyCandle.Date;
                break;
            }

            for (var i = DailyCandles.Count - 1; i > 0; i--)
            {
                if (MinuteData.ContainsKey(DailyCandles[i].Date.Date))
                {
                    endDate = DailyCandles[i].Date;
                    break;
                }
            }

            var high     = double.MinValue;
            var low      = double.MaxValue;
            var date     = startDate;
            var highTime = DateTime.MinValue;
            var lowTime  = DateTime.MinValue;

            while (date <= endDate)
            {
                if (MinuteData.TryGetValue(date.Date, out var minuteCandles))
                {
                    foreach (var candle in minuteCandles.Where(candle => candle.IsCash))
                    {
                        if (candle.AskHigh > high)
                        {
                            high     = candle.AskHigh;
                            highTime = candle.DateTime;
                        }

                        if (candle.BidLow < low)
                        {
                            low     = candle.BidLow;
                            lowTime = candle.DateTime;
                        }
                    }
                }

                date = date.AddDays(1);
            }

            var openTime  = new TimeSpan(14, 30, 00);
            var closeTime = new TimeSpan(21, 00, 00);

            if (IsUkData)
            {
                openTime  = new TimeSpan(8, 00, 00);
                closeTime = new TimeSpan(16, 30, 00);
            }

            DataDetails = new DataDetails(startDate, endDate, high, highTime, low, lowTime, _averageGapSize, openTime,
                                          closeTime);
        }
Beispiel #6
0
        private void CalculateGapFibLevelPreHitAdverseExcursions() // todo rename this
        {
            var retraces = (FibonacciLevel[])Enum.GetValues(typeof(FibonacciLevel));

            for (var i = 0; i < 19; i++)
            {
                var    hitCount                        = 0;
                double preHitMaxTotal                  = 0;
                double postHitMaxFavourableTotal       = 0;
                double postHitMaxAdverseTotal          = 0;
                double highestPreHitMax                = 0;
                double highestPostHitMaxFavourable     = 0;
                double highestPostHitMaxAdverse        = 0;
                var    highestPreHitMaxDate            = DateTime.MinValue;
                var    highestPostHitMaxFavourableDate = DateTime.MinValue;
                var    highestPostHitMaxAdverseDate    = DateTime.MinValue;

                foreach (var dailyCandle in DailyCandles)
                {
                    var level = i < 10
                        ? dailyCandle.Open - dailyCandle.Gap.GapPoints * ((double)retraces[i] / 1000)
                        : dailyCandle.Open + dailyCandle.Gap.GapPoints * ((double)retraces[i] / 1000 - 1);


                    if (MinuteData.TryGetValue(dailyCandle.Date.Date, out var minuteCandles))
                    {
                        var excursions = CompareMinuteData(minuteCandles, dailyCandle, level, false);

                        excursions.IfExistsThen(x =>
                        {
                            var(preHitMax, postHitMaxFavourable, postHitMaxAdverse) = x;

                            if (preHitMax > highestPreHitMax)
                            {
                                highestPreHitMax     = preHitMax;
                                highestPreHitMaxDate = dailyCandle.Date;
                            }

                            if (postHitMaxFavourable > highestPostHitMaxFavourable)
                            {
                                highestPostHitMaxFavourable     = postHitMaxFavourable;
                                highestPostHitMaxFavourableDate = dailyCandle.Date;
                            }

                            if (postHitMaxAdverse > highestPostHitMaxAdverse)
                            {
                                highestPostHitMaxAdverse     = postHitMaxAdverse;
                                highestPostHitMaxAdverseDate = dailyCandle.Date;
                            }

                            hitCount++;
                            preHitMaxTotal            += preHitMax;
                            postHitMaxFavourableTotal += postHitMaxFavourable;
                            postHitMaxAdverseTotal    += postHitMaxAdverse;
                        });
                    }
                }

                if (GapFibRetraceLevels.TryGetValue(retraces[i], out var retraceLevel)) // todo refactor this
                {
                    retraceLevel.AveragePreHitAdverseExcursion       = preHitMaxTotal / hitCount;
                    retraceLevel.HighestPreHitAdverseExcursion       = highestPreHitMax;
                    retraceLevel.DateOfHighestPreHitAdverseExcursion = highestPreHitMaxDate;

                    retraceLevel.AveragePostHitFavourableExcursion       = postHitMaxFavourableTotal / hitCount;
                    retraceLevel.HighestPostHitFavourableExcursion       = highestPostHitMaxFavourable;
                    retraceLevel.DateOfHighestPostHitFavourableExcursion = highestPostHitMaxFavourableDate;

                    retraceLevel.AveragePostHitAdverseExcursion       = postHitMaxAdverseTotal / hitCount;
                    retraceLevel.HighestPostHitAdverseExcursion       = highestPostHitMaxAdverse;
                    retraceLevel.DateOfHighestPostHitAdverseExcursion = highestPostHitMaxAdverseDate;
                }

                if (GapFibExtensionLevels.TryGetValue(retraces[i], out var extensionLevel))
                {
                    extensionLevel.AveragePreHitAdverseExcursion       = preHitMaxTotal / hitCount;
                    extensionLevel.HighestPreHitAdverseExcursion       = highestPreHitMax;
                    extensionLevel.DateOfHighestPreHitAdverseExcursion = highestPreHitMaxDate;

                    extensionLevel.AveragePostHitFavourableExcursion       = postHitMaxFavourableTotal / hitCount;
                    extensionLevel.HighestPostHitFavourableExcursion       = highestPostHitMaxFavourable;
                    extensionLevel.DateOfHighestPostHitFavourableExcursion = highestPostHitMaxFavourableDate;

                    extensionLevel.AveragePostHitAdverseExcursion       = postHitMaxAdverseTotal / hitCount;
                    extensionLevel.HighestPostHitAdverseExcursion       = highestPostHitMaxAdverse;
                    extensionLevel.DateOfHighestPostHitAdverseExcursion = highestPostHitMaxAdverseDate;
                }
            }
        }
Beispiel #7
0
        /// <summary>
        /// 十分钟数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (DateTime.Now.Minute % 10 == 0 && DateTime.Now.Second == 0)
            {
                //取得十分钟内实时数据
                List <RealData> realDatas = GetRealDatas();
                if (realDatas.Count == 0)
                {
                    return;
                }
                //获取监测点污染物
                List <MonitorPointPollutan> monitorPointPollutans = GetMonitorPointPollutans();
                //用于数据库中十分钟浓度的添加

                List <MinuteData> minuteDatas = new List <MinuteData>();
                //用于求十分钟的AQI

                List <AvgData>  minuteAvgDatas = new List <AvgData>();
                DateTime        dateTime       = DateTime.Now;
                List <HourData> hourDatas      = GetLastHourDatas();
                foreach (HourData hourData in hourDatas)
                {
                    MinuteData minuteData = new MinuteData();
                    minuteData.AVGValue            = hourData.AVGValue;
                    minuteData.Monitor_PollutionId = hourData.Monitor_PollutionId;
                    minuteData.MonitorTime         = dateTime;
                    minuteDatas.Add(minuteData);
                }
                //循环遍历除AQI之外的监测点污染物
                foreach (MonitorPointPollutan monitorPointPollutan in monitorPointPollutans.Where(m => m.PollutantId != 11))
                {
                    MinuteData minuteData    = new MinuteData();
                    AvgData    minuteAvgData = new AvgData();
                    var        mpRealDatas   = realDatas.Where(m => m.Monitor_PollutionId == monitorPointPollutan.Id);

                    minuteData.Monitor_PollutionId = monitorPointPollutan.Id;
                    minuteData.MaxValue            = mpRealDatas.Max(m => m.MonitorValue);
                    minuteData.MinValue            = mpRealDatas.Min(m => m.MonitorValue);
                    minuteData.AVGValue            = mpRealDatas.Average(m => m.MonitorValue);
                    minuteData.MonitorTime         = dateTime;
                    minuteDatas.Add(minuteData);

                    minuteAvgData.AvgValue    = mpRealDatas.Average(m => m.MonitorValue);
                    minuteAvgData.PointID     = monitorPointPollutan.PointId;
                    minuteAvgData.PollutantID = monitorPointPollutan.PollutantId;
                    minuteAvgDatas.Add(minuteAvgData);
                }
                AQICompute aqiCompute = new AQICompute();
                foreach (MonitorPointPollutan monitorPointPollutan in monitorPointPollutans.Where(m => m.PollutantId == 11))
                {
                    MinuteData minuteData = new MinuteData();
                    minuteData.Monitor_PollutionId = monitorPointPollutan.Id;
                    minuteData.MonitorTime         = dateTime;
                    decimal pm2  = 0;
                    decimal pm10 = 0;
                    decimal co   = 0;
                    decimal no2  = 0;
                    decimal o3   = 0;
                    decimal so2  = 0;
                    foreach (AvgData avgData in minuteAvgDatas)
                    {
                        if (avgData.PointID == monitorPointPollutan.PointId)
                        {
                            switch (avgData.PollutantID)
                            {
                            case 12: pm2 = avgData.AvgValue; break;

                            case 13: co = avgData.AvgValue; break;

                            case 14: no2 = avgData.AvgValue; break;

                            case 15: o3 = avgData.AvgValue; break;

                            case 16: so2 = avgData.AvgValue; break;

                            case 17: pm10 = avgData.AvgValue; break;
                            }
                        }
                    }
                    minuteData.AVGValue = Convert.ToDecimal(aqiCompute.GetAQI(pm2, co, no2, o3, so2, pm10));
                    minuteDatas.Add(minuteData);
                }
                AddMinuteData(minuteDatas);
            }
        }