public static void GatherTaskElapsed(object sender, string currencyPair, int interval, Timer t, List <EventAction> eventActions) { t.Interval = TimerUtility.GetAdjustedInterval(interval); t.Start(); System.Threading.Tasks.Task.Run(() => { try { DateTime dateTimeNow = DateTime.UtcNow; DateTime dateTimePast = dateTimeNow.AddSeconds(-(60 * 4)); var result = PoloniexExchangeService.Instance.ReturnTradeHistory(currencyPair, dateTimePast, dateTimeNow); result = result.OrderBy(x => x.date).ToList(); var dataPoint = new CurrencyDataPoint { CurrencyPair = currencyPair, ClosingDateTime = dateTimeNow, }; if (result.Any()) { var curRate = result.Last().rate; dataPoint.ClosingValue = curRate; } else { using (var db = new PoloniexContext()) { dataPoint.ClosingValue = db.CurrencyDataPoints .Where(x => x.CurrencyPair == dataPoint.CurrencyPair) .OrderByDescending(x => x.ClosingDateTime) .First().ClosingValue; } } using (var db = new PoloniexContext()) { dataPoint.CreatedDateTime = DateTime.UtcNow; db.CurrencyDataPoints.Add(dataPoint); db.SaveChanges(); } if (eventActions != null) { var sortedActions = eventActions.OrderBy(x => x.Priority).ToList(); for (int i = 0; i < sortedActions.Count(); i++) { Logger.Write($"{sortedActions[i].EventActionId}: Executing action {i + 1} of {sortedActions.Count()} - {sortedActions[i].EventActionType}", Logger.LogType.ServiceLog); var threadEventAction = sortedActions[i]; threadEventAction.Action(threadEventAction.EventActionId); } } } catch (Exception exception) { Logger.WriteException(exception); } }); }
/* additional helpers */ public static void BackFillGatherTaskData(int numberOfQuarterDays, string currencyPair, DateTime?inputDateTime = null, DateTime?markerDate = null) { markerDate = markerDate ?? DateTime.Parse("01/01/1970"); // marker date is for setting CreatedDateTime (useful for knowing which data was prepopulated) var totalTimeToGoBack = numberOfQuarterDays * 21600; var curDateTime = inputDateTime ?? DateTime.UtcNow; // add 30 seconds for possible processing delay from gatherers (maintains begin inclusive and end exclusive) var delBeginDateTime = curDateTime.AddSeconds(30); var delEndDateTime = curDateTime.AddSeconds(-totalTimeToGoBack).AddSeconds(30); using (var db = new PoloniexContext()) { var del = db.CurrencyDataPoints .Where(x => x.ClosingDateTime <= delBeginDateTime && x.ClosingDateTime >= delEndDateTime && x.CurrencyPair == currencyPair).ToList(); db.CurrencyDataPoints.RemoveRange(del); db.SaveChanges(); } var currencyDataPoints = new List <CurrencyDataPoint>(); // 2678400 seconds = 31 days // 21600 seconds = 6 hours //for (int i = 2678400; i > 0; i = i - 21600) for (int i = totalTimeToGoBack; i > 0; i = i - 21600) { var intervalBeginningDateTime = curDateTime.AddSeconds(-i); var intervalEndDateTime = curDateTime.AddSeconds(-(i - 21600)); var poloniexData = PoloniexExchangeService.Instance.ReturnTradeHistory(currencyPair, intervalBeginningDateTime, intervalEndDateTime); poloniexData = poloniexData.OrderBy(x => x.date).ToList(); decimal rate = poloniexData.First().rate; // how many minute intervals in 21600 seconds ... 360 for (int j = 0; j < 360; j++) { int pos = 0; var currencyDataPoint = new CurrencyDataPoint { CurrencyPair = currencyPair, ClosingDateTime = intervalBeginningDateTime.AddSeconds((j + 1) * 60), CreatedDateTime = markerDate.Value // notify was populated by backfill }; bool isAnyData = false; while (pos < poloniexData.Count && poloniexData[pos].date < currencyDataPoint.ClosingDateTime) { isAnyData = true; pos++; } if (pos == poloniexData.Count) { pos--; } if (isAnyData) { rate = poloniexData[pos].rate; } currencyDataPoint.ClosingValue = rate; currencyDataPoints.Add(currencyDataPoint); } if (currencyDataPoints.Count > 25000) { BulkInsertCurrencyDataPoints(currencyDataPoints); currencyDataPoints = new List <CurrencyDataPoint>(); } } BulkInsertCurrencyDataPoints(currencyDataPoints); return; }