Exemplo n.º 1
0
        public void UpdateGaps(string ticker,
                               List <DateSpan> gaps, bool mergeAdjacent = true)
        {
            if (gaps == null || gaps.Count == 0)
            {
                return;
            }
            GapMapRecord oldRec = null;

            serverGaps.TryGetValue(ticker, out oldRec);
            // если кеш пуст либо старая запись устарела...
            if (oldRec == null || !oldRec.IsActual || oldRec.serverGaps.Count == 0)
            {
                var record = new GapMapRecord(gaps, DateTime.Now, gaps[0].start);
                if (serverGaps.ContainsKey(ticker))
                {
                    serverGaps[ticker] = record;
                }
                else
                {
                    serverGaps.Add(ticker, record);
                }
                return;
            }

            if (gaps.Count == 0)
            {
                return;
            }

            // получить общий список гэпов
            var dicUnited = oldRec.serverGaps.ToDictionary(g => g.start, g => g);

            foreach (var g in gaps)
            {
                DateSpan exist;
                if (!dicUnited.TryGetValue(g.start, out exist))
                {
                    dicUnited.Add(g.start, g);
                    continue;
                }
                if (exist.end == g.end)
                {
                    continue;
                }
                dicUnited[g.start] = g;
            }

            var newGaps = dicUnited.Values.OrderBy(v => v.start);

            // склеить соседние гэпы
            var resultGaps = new List <DateSpan>();

            foreach (var gap in newGaps)
            {
                if (resultGaps.Count == 0)
                {
                    resultGaps.Add(gap);
                    continue;
                }
                var lastGap = resultGaps[resultGaps.Count - 1];
                if (lastGap.end >= gap.start)
                {
                    // таки склеить
                    lastGap.end = gap.end;
                    continue;
                }
                resultGaps.Add(gap);
            }
            if (resultGaps.Count == 0)
            {
                return;
            }

            oldRec.serverGaps = resultGaps;
            if (oldRec.requestedStart < resultGaps[0].start)
            {
                oldRec.requestedStart = resultGaps[0].start;
            }
        }
Exemplo n.º 2
0
        private void LoadMapFromFile()
        {
            if (!File.Exists(filePath))
            {
                return;
            }
            serverGaps.Clear();

            try
            {
                using (var fs = new StreamReader(filePath, Encoding.ASCII))
                {
                    while (!fs.EndOfStream)
                    {
                        var line = fs.ReadLine();
                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        // разобрать строку - все гэпы по тикеру, вида:
                        // "EURUSD:14.06.2013 15:07,04.02.2012 00:00:201201050400-201201050503,2012010602120-2012010602136
                        var indexOfTick = line.IndexOf(':');
                        if (indexOfTick <= 0)
                        {
                            continue;
                        }
                        var ticker = line.Substring(0, indexOfTick);
                        line = line.Substring(indexOfTick + 1);
                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        indexOfTick = line.IndexOf(';');
                        if (indexOfTick <= 0)
                        {
                            continue;
                        }
                        var timeRecStr = line.Substring(0, indexOfTick);
                        var timeParts  = timeRecStr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        if (timeParts.Length != 2)
                        {
                            continue;
                        }
                        var timeRec = timeParts[0].ToDateTimeUniformSafe();
                        if (!timeRec.HasValue)
                        {
                            continue;
                        }
                        var timeRequested = timeParts[1].ToDateTimeUniformSafe();
                        if (!timeRequested.HasValue)
                        {
                            continue;
                        }

                        line = line.Substring(indexOfTick + 1);

                        var parts  = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        var record = new GapMapRecord(new List <DateSpan>(), timeRec.Value, timeRequested.Value);
                        foreach (var part in parts)
                        {
                            // 201201050400-201201050503
                            var startEndParts = part.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                            if (startEndParts.Length != 2)
                            {
                                continue;
                            }

                            DateTime timeStart;
                            if (!DateTime.TryParseExact(startEndParts[0], "yyyyMMddHHmm", CultureProvider.Common,
                                                        DateTimeStyles.None, out timeStart))
                            {
                                continue;
                            }
                            DateTime timeEnd;
                            if (!DateTime.TryParseExact(startEndParts[1], "yyyyMMddHHmm", CultureProvider.Common,
                                                        DateTimeStyles.None, out timeEnd))
                            {
                                continue;
                            }

                            if ((timeEnd - timeStart).TotalMinutes < 1)
                            {
                                continue;
                            }

                            record.serverGaps.Add(new DateSpan(timeStart, timeEnd));
                        }

                        serverGaps.Add(ticker, record);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("Ошибка чтения \"{0}\": {1}", filePath, ex);
            }
        }
Exemplo n.º 3
0
        public void UpdateGaps(string ticker,
            List<DateSpan> gaps, bool mergeAdjacent = true)
        {
            if (gaps == null || gaps.Count == 0) return;
            GapMapRecord oldRec = null;
            serverGaps.TryGetValue(ticker, out oldRec);
            // если кеш пуст либо старая запись устарела...
            if (oldRec == null || !oldRec.IsActual || oldRec.serverGaps.Count == 0)
            {
                var record = new GapMapRecord(gaps, DateTime.Now, gaps[0].start);
                if (serverGaps.ContainsKey(ticker))
                    serverGaps[ticker] = record;
                else
                    serverGaps.Add(ticker, record);
                return;
            }

            if (gaps.Count == 0) return;

            // получить общий список гэпов
            var dicUnited = oldRec.serverGaps.ToDictionary(g => g.start, g => g);
            foreach (var g in gaps)
            {
                DateSpan exist;
                if (!dicUnited.TryGetValue(g.start, out exist))
                {
                    dicUnited.Add(g.start, g);
                    continue;
                }
                if (exist.end == g.end) continue;
                dicUnited[g.start] = g;
            }

            var newGaps = dicUnited.Values.OrderBy(v => v.start);

            // склеить соседние гэпы
            var resultGaps = new List<DateSpan>();
            foreach (var gap in newGaps)
            {
                if (resultGaps.Count == 0)
                {
                    resultGaps.Add(gap);
                    continue;
                }
                var lastGap = resultGaps[resultGaps.Count - 1];
                if (lastGap.end >= gap.start)
                {
                    // таки склеить
                    lastGap.end = gap.end;
                    continue;
                }
                resultGaps.Add(gap);
            }
            if (resultGaps.Count == 0) return;

            oldRec.serverGaps = resultGaps;
            if (oldRec.requestedStart < resultGaps[0].start) oldRec.requestedStart = resultGaps[0].start;
        }
Exemplo n.º 4
0
        private void LoadMapFromFile()
        {
            if (!File.Exists(filePath)) return;
            serverGaps.Clear();

            try
            {
                using (var fs = new StreamReader(filePath, Encoding.ASCII))
                {
                    while (!fs.EndOfStream)
                    {
                        var line = fs.ReadLine();
                        if (string.IsNullOrEmpty(line)) continue;

                        // разобрать строку - все гэпы по тикеру, вида:
                        // "EURUSD:14.06.2013 15:07,04.02.2012 00:00:201201050400-201201050503,2012010602120-2012010602136
                        var indexOfTick = line.IndexOf(':');
                        if (indexOfTick <= 0) continue;
                        var ticker = line.Substring(0, indexOfTick);
                        line = line.Substring(indexOfTick + 1);
                        if (string.IsNullOrEmpty(line)) continue;

                        indexOfTick = line.IndexOf(';');
                        if (indexOfTick <= 0) continue;
                        var timeRecStr = line.Substring(0, indexOfTick);
                        var timeParts = timeRecStr.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        if (timeParts.Length != 2) continue;
                        var timeRec = timeParts[0].ToDateTimeUniformSafe();
                        if (!timeRec.HasValue) continue;
                        var timeRequested = timeParts[1].ToDateTimeUniformSafe();
                        if (!timeRequested.HasValue) continue;

                        line = line.Substring(indexOfTick + 1);

                        var parts = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        var record = new GapMapRecord(new List<DateSpan>(), timeRec.Value, timeRequested.Value);
                        foreach (var part in parts)
                        {
                            // 201201050400-201201050503
                            var startEndParts = part.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                            if (startEndParts.Length != 2) continue;

                            DateTime timeStart;
                            if (!DateTime.TryParseExact(startEndParts[0], "yyyyMMddHHmm", CultureProvider.Common,
                                DateTimeStyles.None, out timeStart)) continue;
                            DateTime timeEnd;
                            if (!DateTime.TryParseExact(startEndParts[1], "yyyyMMddHHmm", CultureProvider.Common,
                                DateTimeStyles.None, out timeEnd)) continue;

                            if ((timeEnd - timeStart).TotalMinutes < 1) continue;

                            record.serverGaps.Add(new DateSpan(timeStart, timeEnd));
                        }

                        serverGaps.Add(ticker, record);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("Ошибка чтения \"{0}\": {1}", filePath, ex);
            }
        }
Exemplo n.º 5
0
            public GapsByTicker(string ticker, GapMapRecord rec)
            {
                Ticker = ticker;

                if (rec.serverGaps != null && rec.serverGaps.Count > 0)
                {
                    GapsCount = rec.serverGaps.Count;
                    var sumMinutes = rec.serverGaps.Sum(g => g.TotalMinutes);
                    GapsSummaryStr = new TimeSpan(0, (int)sumMinutes, 0).ToStringUniform(false, false);

                    var longestMinutes = rec.serverGaps.Max(g => g.TotalMinutes);
                    GapLongestStr = new TimeSpan(0, (int)longestMinutes, 0).ToStringUniform(false, false);
                }
            }