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; } }
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); } }
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; }
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); } }
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); } }