示例#1
0
        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);
                }
            });
        }
示例#2
0
        /* 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;
        }