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