/// <summary> /// Перебирает все бин файлы с тиками и заменяет файлы где нашлись дубли или несортировано на новые версии. /// Старые версии сохраняет поставив перед именем префикс "__" /// </summary> /// <param name="tickerInfo"></param> /// <param name="range"></param> /// <param name="progress"></param> /// <returns></returns> public async static Task BinDeDupTradesAdync(TradesTickerInfo tickerInfo, DateRange range, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalReplaced = await Task.Factory.StartNew <int>(() => { #region Тело метода // получим список путей до бинарников с учетом ограничений по дате var matсhingDates = range == null ? tickerInfo.Dates : tickerInfo.Dates.Where(range.Includes); var pathList = matсhingDates.Select(date => { var fileName = "{0}.{1}.bin".Put(tickerInfo.Ticker, date.ToString(TickBinFileNameDateFormat)); return(Path.Combine(tickerInfo.BinPath, fileName)); }).ToArray(); // Для каждого бинарного файла тикер, производим проверку и перезапись если нужно сортировать var cache = new BinaryCache <TradeInfo>(); var filesProcessed = 0; var filesReplaced = 0; foreach (var path in pathList) { var version = BinaryCache <TradeInfo> .ReadVersion(path); if (version == 0) { throw new Exception("Не удалось получить версию формата файла."); } // загружаем тики из бинарного кэша var trades = cache.LoadCached(path, version); // удалим дубли, и если увидим что число сделок упало, значит надо переписать исходный файл var origCount = trades.Count; var sorted = trades.Distinct(new TradeInfoComparer()).OrderBy(t => t.TradeNo).ToList(); if (sorted.Count != origCount) { var bakFileName = "__" + Path.GetFileName(path); var bakDirName = Path.GetDirectoryName(path); var bakPath = Path.Combine(bakDirName, bakFileName); File.Move(path, bakPath); cache.SaveCached(path, sorted); filesReplaced++; } // отчитались filesProcessed++; progress.Report(new ProgressReport() { Percent = (double)filesProcessed * 100 / pathList.Length, TimeUsed = timer.Elapsed, ProcessedCount = filesProcessed }); } return(filesReplaced); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalReplaced }); }
public async static Task BinToTxtBarsAsync(BarsTickerInfo tickerInfo, Interval timeframe, int decimals, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var trdName = "{0}.{1}.bar".Put(tickerInfo.Ticker, timeframe); var trdPath = Path.Combine(tickerInfo.BinPath, trdName); var streamW = new StreamWriter(trdPath, false); streamW.WriteLine(BarTxtHeaderFull); // получим список путей до бинарников с учетом ограничений по дате var mathingItems = tickerInfo.TimeFrames.Where(tf => tf == timeframe); var pathList = mathingItems.Select(item => { var fileName = "{0}.{1}.bin".Put(tickerInfo.Ticker, item.ToString()); return(Path.Combine(tickerInfo.BinPath, fileName)); }).ToList(); // Для каждого бинарного файла тикер, производим процедуру записи в ТХТ файл. var cache = new BinaryCache <DataBar>(); var filesProcessed = 0; foreach (var path in pathList) { var version = BinaryCache <DataBar> .ReadVersion(path); if (version == 0) { throw new Exception("Не удалось получить версию формата файла."); } var items = cache.LoadCached(path, version); items.ForEach(databar => streamW.WriteLine(databar.ToFullString(decimals))); // отчитались filesProcessed++; progress.Report(new ProgressReport() { Percent = (double)filesProcessed * 100 / pathList.Count, TimeUsed = timer.Elapsed, ProcessedCount = filesProcessed }); } // Скидываем на диск и закрываем потоки. streamW.Flush(); streamW.Close(); return(filesProcessed); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed }); }
/// <summary> /// Пишет весь тикер в текстовый файл с учетом временных ограничений. /// Для каждого бин файла вызывается <paramref name="progress"/> /// </summary> /// <param name="tickerInfo"></param> /// <param name="range">Временной диапазон, за который конвертить данные. Если задать null то все данные брать.</param> /// <param name="progress">прогрессор. Для отчетности о выполнении работы</param> public async static Task BinToTxtTradesAsync(TradesTickerInfo tickerInfo, DateRange range, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var trdName = "{0}.trd".Put(tickerInfo.Ticker); var trdPath = Path.Combine(tickerInfo.BinPath, trdName); var streamW = new StreamWriter(trdPath, false); streamW.WriteLine(TickTxtHeaderFull); // получим список путей до бинарников с учетом ограничений по дате var matсhingDates = range == null ? tickerInfo.Dates : tickerInfo.Dates.Where(range.Includes); var pathList = matсhingDates.Select(date => { var fileName = "{0}.{1}.bin".Put(tickerInfo.Ticker, date.ToString(TickBinFileNameDateFormat)); return(Path.Combine(tickerInfo.BinPath, fileName)); }).ToArray(); // Для каждого бинарного файла тикер, производим процедуру записи в ТХТ файл. var cache = new BinaryCache <TradeInfo>(); var filesProcessed = 0; foreach (var path in pathList) { var version = BinaryCache <TradeInfo> .ReadVersion(path); if (version == 0) { throw new Exception("Не удалось получить версию формата файла."); } // пишем в текст var trades = cache.LoadCached(path, version); trades.ForEach(t => streamW.WriteLine(t.ToFullString())); // отчитались filesProcessed++; progress.Report(new ProgressReport() { Percent = (double)filesProcessed * 100 / pathList.Length, TimeUsed = timer.Elapsed, ProcessedCount = filesProcessed }); } // Скидываем на диск и закрываем потоки. streamW.Flush(); streamW.Close(); return(pathList.Length); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed }); }