public void LoadFromFiles(string quoteDir) { foreach (var fileName in Directory.GetFiles(quoteDir, "*.quote")) { // получить название торгуемого актива var symbol = Path.GetFileNameWithoutExtension(fileName); if (string.IsNullOrEmpty(symbol)) { continue; } symbol = symbol.ToUpper(); // прочитать файл List <CandleData> fileCandles; try { fileCandles = CandleData.LoadFromFile(fileName, symbol); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в AtomCandleStorage.LoadFromFiles({0}): {1}", symbol, ex); continue; } if (fileCandles == null || fileCandles.Count == 0) { continue; } if (!locker.TryEnterWriteLock(LockTimeout)) { Logger.ErrorFormat("Ошибка в AtomCandleStorage.LoadFromFiles({0}): невозможно получить доступ на запись", symbol); continue; } // записать в словарь try { if (candles.ContainsKey(symbol)) { candles [symbol] = new ThreadSafeCandleList(fileCandles); } else { candles.Add(symbol, new ThreadSafeCandleList(fileCandles)); } } finally { locker.ExitWriteLock(); } } }
public Cortege2 <DateTime, DateTime>?LoadFromFile(string quoteDir, string symbol) { if (string.IsNullOrEmpty(quoteDir)) { throw new ArgumentException("LoadFromFile - директория пуста", "quoteDir"); } if (string.IsNullOrEmpty(symbol)) { throw new ArgumentException("LoadFromFile - котировка не указана", "symbol"); } var fileName = quoteDir + "\\" + symbol + ".quote"; if (!File.Exists(fileName)) { return(null); } // прочитать файл List <CandleData> fileCandles; try { fileCandles = CandleData.LoadFromFile(fileName, symbol); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в AtomCandleStorage.LoadFromFile({0}): {1}", symbol, ex); return(null); } if (fileCandles == null || fileCandles.Count == 0) { return(null); } if (!locker.TryEnterWriteLock(LockTimeout)) { Logger.ErrorFormat("Ошибка в AtomCandleStorage.LoadFromFile({0}): невозможно получить доступ на запись", symbol); return(null); } // записать в словарь var dates = new Cortege2 <DateTime, DateTime>(fileCandles[0].timeOpen, fileCandles[fileCandles.Count - 1].timeOpen); try { if (candles.ContainsKey(symbol)) { candles[symbol] = new ThreadSafeCandleList(fileCandles); } else { candles.Add(symbol, new ThreadSafeCandleList(fileCandles)); } } finally { locker.ExitWriteLock(); } return(dates); }
public static void LoadCandlesSilent( Dictionary <string, Cortege2 <DateTime, DateTime> > tickersToUpload, QuoteStorageProxy quoteStorage, string quoteFolder, int minMinutesOfGap) { const int daysInRequest = 5, minDaysInRequest = 2; foreach (var ticker in tickersToUpload) { var pointCost = DalSpot.Instance.GetPrecision10(ticker.Key); var filePath = string.Format("{0}\\{1}.quote", ExecutablePath.ExecPath + quoteFolder, ticker.Key); DateTime?lastDateStore = null; DateTime?oldStart = null, oldEnd = null; bool endsUpNewLine; if (File.Exists(filePath)) { GetFirstAndLastFileDates(filePath, out oldStart, out oldEnd, out endsUpNewLine); } else { var dirName = Path.GetDirectoryName(filePath); if (!Directory.Exists(dirName)) { try { Directory.CreateDirectory(dirName); } catch (Exception ex) { Logger.Error(String.Format("Невозможно создать каталог котировок \"{0}\": {1}", dirName, ex)); throw; } } } if (oldStart.HasValue && oldEnd.HasValue) { var deltaStart = (oldStart.Value - ticker.Value.a).TotalMinutes; var deltaEnd = (ticker.Value.b - oldEnd.Value).TotalMinutes; if (deltaStart <= minMinutesOfGap && deltaEnd <= minMinutesOfGap) { continue; } if (deltaStart <= minMinutesOfGap) { lastDateStore = oldEnd.Value; } } var dateLast = DateTime.Now; for (var dateStart = lastDateStore.HasValue ? lastDateStore.Value.AddMinutes(1) : ticker.Value.a; dateStart < ticker.Value.b;) { var dateEnd = dateStart.AddDays(daysInRequest); if ((dateLast - dateEnd).TotalDays < minDaysInRequest) { dateEnd = dateLast; } // запрос List <CandleData> curCandles = null; var numFaultsLeft = 2; while (numFaultsLeft > 0) { // попытка подгрузить котировки try { var packedQuotes = quoteStorage.GetMinuteCandlesPacked(ticker.Key, dateStart, dateEnd); if (packedQuotes != null && packedQuotes.count > 0) { var denseCandles = packedQuotes.GetCandles(); if (denseCandles != null && denseCandles.Count > 0) { curCandles = denseCandles.Select(c => new CandleData(c, pointCost)).ToList(); } } } catch (Exception ex) { Logger.ErrorFormat("Ошибка закачки котировок {0} c {1:dd.MM.yyyy}: {2}", ticker.Key, dateStart, ex.Message); curCandles = null; } if (curCandles == null) { // попытка неуспешна - еще одна? numFaultsLeft--; if (numFaultsLeft > 0) { continue; } break; } break; } if (curCandles != null && curCandles.Count > 0) { // записать в файл прочитанные из БД котировки try { var existData = CandleData.LoadFromFile(filePath, ticker.Key); if (existData != null && existData.Count > 0) { CandleData.MergeCandles(ref curCandles, existData, true); } } catch (Exception ex) { Logger.ErrorFormat("QuoteCacheManager.LoadQuotesSilent() - ошибка чтения / склейки котировок \"{0}\": {1}", filePath, ex); } try { CandleData.SaveInFile(filePath, ticker.Key, curCandles); } catch (Exception ex) { Logger.ErrorFormat("QuoteCacheManager.LoadQuotesSilent() - ошибка сохранения котировок \"{0}\": {1}", filePath, ex); } } dateStart = dateEnd; } } }