private List<Cortege2<DateTime, float>> LoadCandlesFromServer(string ticker, DateSpan span)
        {
            var candles = new List<CandleData>();
            const int stepDays = 7;
            for (var start = span.start; start < span.end; start = start.AddDays(stepDays))
            {
                var end = start.AddDays(stepDays);
                if (end > span.end) end = span.end;
                end = end.AddMinutes(1);

                bool error;
                var candlesM1 = FileGapActualizator.LoadQuotesFromDbSynch(ticker, start, end, out error);
                if (candlesM1 == null || candlesM1.Count == 0) continue;

                candles.AddRange(candlesM1);
            }

            // проредить котировки до дневных
            var dailyCandles = new List<Cortege2<DateTime, float>>();
            DateTime? lastTime = null;
            foreach (var quote in candles)
            {
                if (lastTime == null || lastTime.Value.Date != quote.timeOpen.Date)
                {
                    dailyCandles.Add(new Cortege2<DateTime, float>(quote.timeOpen, quote.open));
                    lastTime = quote.timeOpen;
                }
            }

            return dailyCandles;
        }
示例#2
0
        /// <summary>
        /// сообщить о возникшем гэпе - предложить закачать котировки или же
        /// закачать их автоматом
        /// </summary>
        private void ReportOnGapFound(DateTime startOfGap)
        {
            // определить, не пришелся ли "гэп" на выходные
            var gapInterval = new DateSpan(startOfGap, DateTime.Now);
            var miniHoles = DaysOff.Instance.GetIntersected(gapInterval);
            var gaps = QuoteCacheManager.SubtractPeriods(gapInterval, miniHoles);
            if (gaps == null || gaps.Count == 0) return;
            var sumMinutes = gaps.Sum(g => (g.end - g.start).TotalMinutes);
            if (sumMinutes < MinutesOfGapInQuoteStream) return;

            // вывести уведомление
            var msg = gaps.Count == 1
                          ? string.Format("заполнить гэп ({0} минут)", (int) sumMinutes)
                          : string.Format("заполнить гэпы ({0} минут суммарно)", (int) sumMinutes);
            AddUrlToStatusPanelSafe(DateTime.Now, msg, LinkTargetFillGaps);
            var action = UserSettings.Instance.GetAccountEventAction(AccountEventCode.GapFound);
            if (action == AccountEventAction.StatusPanelOnly || action == AccountEventAction.DoNothing)
                return;

            // показать желтое окошко
            var repeatNotification = false;
            var shouldFill = !UserSettings.Instance.ConfirmGapFilling ||
                (NotificationBox.Show(msg + Environment.NewLine + "Заполнить сейчас?", "Обнаружен гэп",
                    MessageBoxButtons.YesNo, out repeatNotification) == DialogResult.Yes);

            if (UserSettings.Instance.ConfirmGapFilling != repeatNotification)
            {
                UserSettings.Instance.ConfirmGapFilling = repeatNotification;
                UserSettings.Instance.SaveSettings();
            }
            if (!shouldFill) return;
            Invoke(new Action<string>(FillGapAfterReport), LinkTargetFillGaps);
        }
示例#3
0
 /// <summary>
 /// расчитываем все нерабочие периоды, пересекающиеся с указанным
 /// </summary>
 public List<DateSpan> GetIntersected(DateSpan interval)
 {
     var result = new List<DateSpan>();
     foreach (var dayOff in daysOff)
         result.AddRange(dayOff.GetIntersected(interval));
     return result;
 }
示例#4
0
        public void SmallGapIsStillAGap()
        {
            var gapInterval = new DateSpan(new DateTime(2013, 5, 31, 17, 49, 0),
                new DateTime(2013, 5, 31, 17, 51, 16));
            var miniHoles = DaysOff.Instance.GetIntersected(gapInterval);
            var gaps = QuoteCacheManager.SubtractPeriods(gapInterval, miniHoles);

            Assert.AreNotEqual(gaps.Count, 0, "после склейки таки должны оставаться гэпы (SmallGapIsStillAGap)");
            // закомментировал, т.к. пересекается с другими тестами
            //moq.Verify(lw => lw.GetMetadataByCategory(It.Is<string>(s => s == "DayOff")), Times.Once(),
            //    "выходные дни должны быть зачитаны из базы ровно один раз");
        }
示例#5
0
        public void Can_handle_composite_spans()
        {
            var start = new DateTime(2009, 9, 30);
            var end = new DateTime(2009, 10, 31);
            var span = new DateSpan(start, end);

            Assert.AreEqual(1, span.Months);
            Assert.AreEqual(1, span.Days);

            Console.WriteLine(span.Months);
            Console.WriteLine(span.Days);

            var difference = DateSpan.GetDifference(DateInterval.Days, start, end);
            Console.WriteLine(difference);
        }
示例#6
0
        public static DateSpan[] MakeGapsOnDaysOff(DateTime startTime, DateTime endTime)
        {
            var spans = new List<DateSpan>();
            DateSpan curSpan = null;
            for (var time = startTime; time <= endTime; time = time.AddHours(1))
            {
                if (DaysOff.Instance.IsDayOff(time))
                {
                    if (curSpan == null)
                        curSpan = new DateSpan(time, time);
                    else
                        curSpan.end = time;
                    continue;
                }
                if (curSpan != null)
                {
                    if (curSpan.end != curSpan.start)
                        spans.Add(curSpan);
                    curSpan = null;
                }
            }

            return spans.ToArray();
        }
示例#7
0
        public static List<CandleData> MakeQuotes(DateTime timeHistStart, DateTime timeHistEnd,
            DateSpan[] serverGaps)
        {
            // подготовить список котировок для "клиента" и "сервера"
            var allCandles = new List<CandleData>();

            var index = 0;
            for (var time = timeHistStart; time <= timeHistEnd; time = time.AddMinutes(1))
            {
                // проверить попадание в дырку на сервере
                if (serverGaps.Any(g => g.IsIn(time))) continue;

                if (DaysOff.Instance.IsDayOff(time)) continue;
                var o = (float)Math.Sin((index++) / 15.0);
                var candle = new CandleData(o, o + 0.001f, o - 0.003f, o - 0.001f, time, time.AddMinutes(1));
                allCandles.Add(candle);
            }

            return allCandles;
        }
		private void LoadAppointments(DateSpan dateSpan)
		{
			this.Appointments.Clear();
			this.IsLoading = true;

			ScheduleViewRepository.Context.Load(ScheduleViewRepository.Context.GetSqlAppointmentsByRangeQuery(dateSpan.Start, dateSpan.End)).Completed += (o, u) =>
			{
				ScheduleViewRepository.Context.Load(ScheduleViewRepository.Context.GetSqlAppointmentResourcesByRangeQuery(dateSpan.Start, dateSpan.End));

				ScheduleViewRepository.Context.Load(ScheduleViewRepository.Context.GetSqlExceptionOccurrencesByRangeQuery(dateSpan.Start, dateSpan.End)).Completed += (os, us) =>
				{
					ScheduleViewRepository.Context.Load(ScheduleViewRepository.Context.GetSqlExceptionAppointmentsByRangeQuery(dateSpan.Start, dateSpan.End)).Completed += (ea, ua) =>
					{
						ScheduleViewRepository.Context.Load(ScheduleViewRepository.Context.GetSqlExceptionResourcesByRangeQuery(dateSpan.Start, dateSpan.End)).Completed += (s, t) =>
						{
							this.Appointments.AddRange((o as LoadOperation).Entities.Select(a => a as SqlAppointment));
							this.IsLoading = false;
						};
					};
				};
			};
		}
		private void GenerateAppointments(DateSpan dateSpan)
		{
			if (!this.isInitialLoad)
			{
				ScheduleViewRepository.SaveData(() => this.LoadAppointments(dateSpan));
			}
			else
			{
				LoadAppointments(dateSpan);

				isInitialLoad = false;
			}
		}
        private void LoadAppointments(DateSpan dateSpan)
        {
            this.Appointments.Clear();

            this.IsLoading = true;

            this.Appointments.AddRange(ScheduleViewRepository.GetSqlAppointmentsByRange(dateSpan.Start, dateSpan.End));

            this.IsLoading = false;
        }
示例#11
0
 // ReSharper restore ReturnTypeCanBeEnumerable.Local
 // вычитание из временного интервала множества интервалов
 // ReSharper disable ReturnTypeCanBeEnumerable.Local
 public static List<DateSpan> SubtractPeriods(DateSpan p1, List<DateSpan> p2)
 {
     if (p2 == null || p2.Count == 0) return new List<DateSpan> { p1 };
     var result = new List<DateSpan>();
     var hasCross = false;
     foreach (var period in p2)
     {
         // нет пересечения
         if ((period.end < p1.start) || (period.start > p1.end))
             continue;
         hasCross = true;
         // возможно разделение на 2 части
         if (p1.start < period.start)
             result.Add(new DateSpan(p1.start, period.start));
         p1.start = period.end;
         if (p1.start > p1.end)
             return result;
     }
     if (hasCross)
         result.Add(p1);
     return result;
 }
示例#12
0
        private void LoadHistoryFromServer(string ticker, List<CandleData> candles, DateSpan range)
        {
            var loadedList = new List<CandleData>();
            var pointCost = DalSpot.Instance.GetPrecision10(ticker);

            try
            {
                IQuoteStorage quoteStorage;
                try
                {
                    quoteStorage = Contract.Util.Proxy.QuoteStorage.Instance.proxy;
                }
                catch (Exception)
                {
                    Logger.Error("LoadHistoryFromServer - связь с сервером (IQuoteStorageBinding) не установлена");
                    throw;
                }

                for (var start = range.start.AddMinutes(1); start < range.end;)
                {
                    var end = start.AddDays(10);
                    if (end > range.end)
                        end = range.end;
                    else
                    {
                        if ((range.end - end).TotalDays < 2)
                            end = range.end;
                    }

                    var candlesPacked = quoteStorage.GetMinuteCandlesPacked(ticker, start, end);
                    start = end.AddMinutes(1);

                    if (candlesPacked == null || candlesPacked.count == 0) continue;

                    // добавить свечи в список закачанных
                    loadedList.AddRange(candlesPacked.GetCandles().Select(c => new CandleData(c, pointCost)));
                }

                if (loadedList.Count == 0) return;

                // добавить свечи в общий список
                if (candles.Count == 0 || candles[candles.Count - 1].timeOpen < loadedList[0].timeOpen)
                {
                    candles.AddRange(loadedList);
                    return;
                }
                candles.InsertRange(0, loadedList);
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в LoadHistoryFromServer (" + ticker + ")", ex);
                throw;
            }
        }
示例#13
0
        private void UpdateTicker(string ticker)
        {
            // прочитать содержимое файла
            var tickerQuotes = LoadTickerQuotesFromFile(ticker);

            // интервал истории, хранимой на сервере
            var serverRange = quoteHistoryOnServer.GetServerTickerHistorySpan(ticker);
            if (serverRange == null && tickerQuotes.Count == 0) return;
            if (serverRange != null && serverRange.TotalDays < 1)
                serverRange = null;
            if (serverRange == null) // записать, что есть
            {
                var oldQuotes = quotes.ReceiveValue(ticker);
                if (oldQuotes == null || oldQuotes.Count < tickerQuotes.Count)
                {
                    quotes.UpdateValues(ticker, tickerQuotes);
                    SaveUpdatedQuotesInFile(ticker, tickerQuotes);
                }
                return;
            }

            // уточнить, за какой период загружать данные
            var intervalsToUpdate = new List<DateSpan>();
            if (tickerQuotes.Count == 0)
                intervalsToUpdate.Add(serverRange);
            else
            {
                if (serverRange.start.Date < tickerQuotes[0].a)
                    intervalsToUpdate.Add(new DateSpan(serverRange.start.Date, tickerQuotes[0].a));
                var lastDate = tickerQuotes[tickerQuotes.Count - 1].a;
                if ((DateTime.Now.Date - lastDate).TotalDays < 2)
                    lastDate = DateTime.Now.Date.AddDays(-2);
                if (intervalsToUpdate.Count > 0 && lastDate <= intervalsToUpdate[0].end)
                    intervalsToUpdate[0] = new DateSpan(intervalsToUpdate[0].start, DateTime.Now.Date);
                else
                    intervalsToUpdate.Add(new DateSpan(lastDate, DateTime.Now.Date));
            }

            // таки загрузить данные
            tickerQuotes = UpdateTickerQuotesFromServer(ticker, intervalsToUpdate, tickerQuotes);

            // и сохранить их в файле
            quotes.UpdateValues(ticker, tickerQuotes);
            if (tickerQuotes.Count > 0)
                SaveUpdatedQuotesInFile(ticker, tickerQuotes);
        }
示例#14
0
        public void Can_handle_composite_spans()
        {
            var start = new DateTime(2009, 9, 30);
            var end = new DateTime(2009, 10, 31);

            var span = new DateSpan(start, end);

            Assert.AreEqual(1, span.Months);
            Assert.AreEqual(1, span.Days);
        }
示例#15
0
        public void WeekendIsNotGap()
        {
            // Выходные дни: май 2013, 4,5    9   11,12
            // выходной
            var gap = new DateSpan(new DateTime(2013, 5, 4, 3, 51, 12),
                                                       new DateTime(2013, 5, 5, 1, 19, 0));

            var miniHoles = DaysOff.Instance.GetIntersected(gap);
            var gaps = QuoteCacheManager.SubtractPeriods(gap, miniHoles);
            Assert.AreEqual(gaps.Count, 0);

            // праздник
            gap = new DateSpan(new DateTime(2013, 5, 9, 3, 21, 0),
                                                       new DateTime(2013, 5, 9, 11, 19, 0));
            miniHoles = DaysOff.Instance.GetIntersected(gap);
            gaps = QuoteCacheManager.SubtractPeriods(gap, miniHoles);
            Assert.AreEqual(gaps.Count, 0);

            // гэп присутствует
            gap = new DateSpan(new DateTime(2013, 5, 5, 16, 30, 0),
                                                       new DateTime(2013, 5, 6, 8, 30, 0));
            miniHoles = DaysOff.Instance.GetIntersected(gap);
            Assert.AreNotEqual(miniHoles.Count, 0, "DaysOff.Instance.GetIntersected");
            gaps = QuoteCacheManager.SubtractPeriods(gap, miniHoles);

            Assert.AreNotEqual(gaps.Count, 0, "gaps");
            // закомментировал, т.к. пересекается с другими тестами
            //moq.Verify(lw => lw.GetMetadataByCategory(It.Is<string>(s => s == "DayOff")), Times.Once(),
            //    "выходные дни должны быть зачитаны из базы ровно один раз");
        }
示例#16
0
    protected void Page_Load (object sender, EventArgs e)
    {
        string fileName = "PPDK"+DateTime.Now.ToString("yyyyMMdd_HHmm")+".txt";

        if (Request.Browser.Browser == "IE" )
        {

            fileName = Server.UrlPathEncode(fileName);

            if (fileName != null) fileName = fileName.Replace(@"+", @"%20");

        }


        Response.ContentType = "text/plain";
        Response.ContentEncoding = Encoding.UTF8 ;

        //Response.ContentType = "application/octet-stream";

        Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");

       if (_authority.HasPermission(Permission.CanSeePeople, Organization.PPDKid, Geography.DenmarkId , Authorization.Flag.ExactGeographyExactOrganization))
        {
            StringBuilder sb = new StringBuilder();
            int org = "" + Request["o"] == "UP" ? Organization.UPDKid : Organization.PPDKid;
            People danishPeople = People.FromOrganizationAndGeography(org, Geography.RootIdentity);
            danishPeople = danishPeople.GetVisiblePeopleByAuthority(_authority).RemoveUnlisted();
            
            sb.Append("Identity");
            sb.Append("\tName");
            sb.Append("\tEmail");
            sb.Append("\tStreet");
            sb.Append("\tPostalCode");
            sb.Append("\tCity");
            sb.Append("\tCountry.Name");
            sb.Append("\tPhone");
            sb.Append("\tBirthdate");
            sb.Append("\tGender");
            sb.Append("\tGeography.Name");
            sb.Append("\tpp.start");
            sb.Append("\tpp.end");
            sb.Append("\tup.start");
            sb.Append("\tup.end");
            sb.Append("\r\n");
            foreach (Person p in danishPeople)
            {
                sb.Append(p.Identity);
                sb.Append("\t" + p.Name);
                sb.Append("\t" + p.Email);
                sb.Append("\t" + p.Street);
                sb.Append("\t" + p.PostalCode);
                sb.Append("\t" + p.CityName);
                sb.Append("\t" + p.Country.Name);
                sb.Append("\t" + p.Phone);
                sb.Append("\t" + p.Birthdate);
                sb.Append("\t" + p.Gender);
                sb.Append("\t" + p.Geography.Name);
                Memberships pMemberships = p.GetMemberships();
                DateSpan ppdkspan = null;
                DateSpan updkspan = null;
                foreach (Membership m in pMemberships)
                {
                    if (m.OrganizationId == Organization.PPDKid)
                        ppdkspan = new DateSpan(m.MemberSince, m.Expires);
                    else if (m.OrganizationId == Organization.UPDKid || m.Organization.Inherits(Organization.UPDKid))
                        updkspan = new DateSpan(m.MemberSince, m.Expires);
                }
                if (ppdkspan != null)
                {
                    sb.Append("\t" + ppdkspan.start);
                    sb.Append("\t" + ppdkspan.end);
                }
                else
                    sb.Append("\t\t");

                if (updkspan != null)
                {
                    sb.Append("\t" + updkspan.start);
                    sb.Append("\t" + updkspan.end);
                }
                else
                    sb.Append("\t\t");
                sb.Append("\r\n");
            }

        Response.Write(sb.ToString());
        }
    }
示例#17
0
 // создать список нерабочих интервалов, имеющих пересечение с заданным
 public List<DateSpan> GetIntersected(DateSpan interval)
 {
     var result = new List<DateSpan>();
     if (!valid)
         return result;
     DateTime beginInterval;
     if (format == "WD")
     {
         beginInterval = new DateTime(interval.start.Year, interval.start.Month, interval.start.Day, hour, 0, 0);
         // ищем первый периодический нерабочий интервал, пересекающийся с указанным,
         // соблюдая условие, что начало его раньше начала указанного
         var dayDelta = (int)interval.start.DayOfWeek - day;
         if (dayDelta < 0)
             dayDelta += 7;
         beginInterval = beginInterval.AddDays(-dayDelta);
         // dayDelta = 0 и возможно расхождение в часах
         if (beginInterval > interval.start)
             beginInterval = beginInterval.AddDays(-7); // convert to GetPrevDate/GetNextDate to calc periodic DateTime
         // этот нерабочий интервал не пересекается с указанным
         // подставляем следующий
         if (beginInterval.AddHours(duration) < interval.start)
             beginInterval = beginInterval.AddDays(7);
         while (beginInterval < interval.end)
         {
             result.Add(new DateSpan(beginInterval, beginInterval.AddHours(duration)));
             beginInterval = beginInterval.AddDays(7);
         }
     }
     else if (format == "D")
     {
         // непериодический интервал
         if (year.HasValue)
         {
             beginInterval = new DateTime(year.Value, month, day, hour, 0, 0);
             // есть пересечение
             if ((beginInterval > interval.start) || (beginInterval.AddHours(duration) < interval.end))
                 result.Add(new DateSpan(beginInterval, beginInterval.AddHours(duration)));
         }
         // периодический ежегодный интервал
         else
         {
             beginInterval = new DateTime(interval.start.Year, month, day, hour, 0, 0);
             if (beginInterval > interval.start)
                 beginInterval = beginInterval.AddYears(-1); // convert to GetPrevDate/GetNextDate to calc periodic DateTime
             if (beginInterval.AddHours(duration) < interval.start)
                 beginInterval = beginInterval.AddYears(1);
             while (beginInterval < interval.end)
             {
                 result.Add(new DateSpan(beginInterval, beginInterval.AddHours(duration)));
                 beginInterval = beginInterval.AddYears(1);
             }
         }
     }
     return result;
 }