Пример #1
0
        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
            });
        }
Пример #2
0
        /// <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
            });
        }
Пример #3
0
        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
            });
        }