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