public async static Task TxtToBinBarsAsync(string filePath, string binPrefix, Interval interval, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var cache = new BinaryCache <DataBar>(); var sr = new StreamReader(filePath); var dirPath = Path.GetDirectoryName(filePath); var items = new List <DataBar>(); // Пропустим первую строчку ибо в ней заголовки sr.ReadLine(); while (!sr.EndOfStream) { var line = sr.ReadLine(); var dataBar = FromFullString(line); items.Add(dataBar); } // После завершения работы пишем в файл те сделки которые еще не записаны if (items.Count > 0) { var path = Path.Combine(dirPath, @"{0}.{1}.bin".Put(binPrefix, interval.ToString())); cache.SaveCached(path, items); items.Clear(); } sr.Close(); return(1); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed }); }
public static List <BarsTickerInfo> GetBarsList(string dirPath) { const string rx = @"^(.+?)\.(\d+?[tsmhd])\.bin$"; // групапа 1 это имя, группа 2 это интервал 3 это база интервала var tickerInfos = new List <BarsTickerInfo>(); var files = Directory.GetFiles(dirPath, "*.bin"); foreach (var path in files) { // Читаем версию бинарника var binVer = BinaryCache <DataBar> .ReadVersion(path); // Получаем тикер из имени файла, и если тикер новый, добавляем имя тикера в общий список // Проверяем версии бинарников, если в двух версиях, то указываем обе версии. var name = Path.GetFileName(path) ?? ""; var match = Regex.Match(name, rx, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); if (!match.Success) { continue; } #region Проверка наличия группы 1 и 2 в результатах // в группе 1 у нас имя тикера, если группа не сматчилась значит чето пошло не так. if (match.Groups[1].Success == false) { MessageBox.Show("Не получилось извлечь имя провайдера из {0}.".Put(name), "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); return(tickerInfos); } // в группе 2 у нас таймфрейм, если группа не сматчилась значит чето пошло не так. if (match.Groups[2].Success == false) { MessageBox.Show("Не получилось извлечь интервал из {0}.".Put(name), "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); return(tickerInfos); } #endregion // Ищем в списке тикеров только что прочитанные, если он уже есть, // и версия бинарника уже такая есть, то переходим к след файлу. var ticker = match.Groups[1].Value; var intervalStr = match.Groups[2].Value; var timeframe = intervalStr.ToInterval(); // если тикер есть и такая версия файла тоже есть var et = tickerInfos.Find(info => info.Ticker == ticker); if (et != null && et.Versions.Contains(binVer) && et.TimeFrames.Contains(timeframe)) { continue; } // Если тикер уже есть но дата прочитана новая. if (et != null && et.TimeFrames.Contains(timeframe) == false) { et.TimeFrames.Add(timeframe); } // Если тикер уже есть но версия файла прочитана новая. if (et != null && et.Versions.Contains(binVer) == false) { et.Versions.Add(binVer); } // Если тикера еще нет, добавим новый тикер в список. if (et == null) { tickerInfos.Add(new BarsTickerInfo(ticker, new Interval[] { timeframe }, dirPath, new List <int>() { binVer })); } } tickerInfos.Sort((info1, info2) => string.Compare(info1.Ticker, info2.Ticker, StringComparison.InvariantCultureIgnoreCase)); return(tickerInfos); }
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> /// Перебирает все бин файлы с тиками и заменяет файлы где нашлись дубли или несортировано на новые версии. /// Старые версии сохраняет поставив перед именем префикс "__" /// </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 TxtToBinTradesAsync(string filePath, string binPrefix, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var cache = new BinaryCache <TradeInfo>(); var sr = new StreamReader(filePath); var dirPath = Path.GetDirectoryName(filePath); // будет сейвить данные на диск. убрали дублирование кода ниже Action <IList <TradeInfo>, DateTime> saveAndClear = (tradeList, dateTime) => { var path = Path.Combine(dirPath, @"{0}.{1}.bin".Put(binPrefix, dateTime.ToString(TickBinFileNameDateFormat))); // устраняем дубли, сортируем по номеру сделок var sorted = tradeList.Distinct(new TradeInfoComparer()).OrderBy(t => t.TradeNo).ToArray(); cache.SaveCached(path, sorted); tradeList.Clear(); }; // Пропустим первую строчку ибо в ней заголовки sr.ReadLine(); var trades = new List <TradeInfo>(); var currDate = DateTime.MinValue; var processedCount = 0; while (!sr.EndOfStream) { var line = sr.ReadLine(); var tradeInfo = new TradeInfo(); tradeInfo.FromFullString(line); if (currDate == DateTime.MinValue) { currDate = tradeInfo.Date.Date; } // Если взяли сделку со следующего дня, пишем то что есть в файл. if (tradeInfo.Date.Date > currDate) { saveAndClear(trades, currDate); // отчитались processedCount++; progress.Report(new ProgressReport() { ProcessedCount = processedCount, TimeUsed = timer.Elapsed, Date = currDate }); // currDate = tradeInfo.Date.Date; } trades.Add(tradeInfo); } // После завершения работы пишем в файл те сделки которые еще не записаны if (trades.Count > 0) { saveAndClear(trades, currDate); // отчитались processedCount++; progress.Report(new ProgressReport() { ProcessedCount = processedCount, TimeUsed = timer.Elapsed, Date = currDate }); } sr.Close(); return(processedCount); #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 }); }