public void ClearData() { DailyCandles.Clear(); MinuteData.Clear(); UnfilledGaps.Clear(); GapFibRetraceLevels = NewFibRetraceDictionary(); GapFibExtensionLevels = NewFibExtensionDictionary(); }
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); } } } }
/// <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); } }
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); }
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); }
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; } } }
/// <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); } }