static internal void Init() // инициирую allTicksFileList
        {
            staticLock.AcquireWriterLock(1000);
            try
            {
                if (allTicksFileList == null)
                {
                    allTicksFileList = new List <TicksFile>();

                    if (File.Exists(Path.Combine(dataDir, "CaptionOfAllFiles.txt")))
                    {
                        using (StreamReader sr = new StreamReader(Path.Combine(dataDir, "CaptionOfAllFiles.txt"), new System.Text.UTF8Encoding()))
                        {
                            while (!sr.EndOfStream)
                            {
                                allTicksFileList.Add(TicksFile.LoadFromAllTicksFileList(dataDir, sr));
                            }
                        }
                    }
                    else
                    {
                        DirectoryInfo di    = new DirectoryInfo(dataDir);
                        FileInfo[]    files = di.GetFiles("*" + TicksFile.FileExt);
                        foreach (FileInfo f in files)
                        {
                            allTicksFileList.Add(new TicksFile(f.FullName));
                        }
                    }
                }
            }
            finally
            {
                staticLock.ReleaseWriterLock();
            }
        }
        TicksFile GetFile(int dt)
        {
            _lock.AcquireReaderLock(1000);
            try
            {
                if ((file_GetFileCache != null) && (file_GetFileCache.Include(dt)))
                {
                    return(file_GetFileCache);
                }

                foreach (TicksFile f in ticksFileList)
                {
                    if (f.Include(dt))
                    {
                        file_GetFileCache = f;
                        return(f);
                    }
                }

                LockCookie lc = _lock.UpgradeToWriterLock(1000);
                try
                {
                    DateTime startDate = new DateTime(DateTime2Int.DateTime(dt).Year, DateTime2Int.DateTime(dt).Month, 1);
                    DateTime endDate   = startDate.AddMonths(1).AddSeconds(-1);

                    string fileName = Path.Combine(dataDir, symbol + " " + startDate.ToString("yyyyMM") + TicksFile.FileExt);
                    //Создаю уникальное имя для файла, чтобы не затереть данные
                    int i = 1;
                    while (File.Exists(fileName))
                    {
                        l.Error("Не уникальное имя файла с тиками " + fileName);
                        fileName = Path.Combine(dataDir, symbol + " " + startDate.ToString("yyyyMM") + "[" + i + "]" + TicksFile.FileExt);
                        ++i;
                    }

                    TicksFile newTickFile = new TicksFile(
                        fileName,
                        symbol,
                        DateTime2Int.Int(startDate),
                        DateTime2Int.Int(endDate));

                    ticksFileList.Add(newTickFile);

                    staticLock.AcquireWriterLock(10000);
                    try { allTicksFileList.Add(newTickFile); }
                    finally { staticLock.ReleaseLock(); }

                    file_GetFileCache = newTickFile;
                    return(newTickFile);
                }
                finally
                {
                    _lock.DowngradeFromWriterLock(ref lc);
                }
            }
            finally
            {
                _lock.ReleaseReaderLock();
            }
        }
        public IBar GetNext(IBar bar)
        {
            TicksFile currentFile = GetFile(bar.DT);

            _lock.AcquireReaderLock(1000);
            try
            {
                IBar result = currentFile.GetNext(bar);
                if (result == null)
                {
                    TicksFile nextFile = null;
                    foreach (TicksFile f in ticksFileList)
                    {
                        if ((f.startDateTime > currentFile.startDateTime) && ((nextFile == null) || ((nextFile.startDateTime > f.startDateTime) && (f.Count > 0))))
                        {
                            nextFile = f;
                        }
                    }
                    if (nextFile != null)
                    {
                        return(nextFile.First);
                    }
                }
                return(result);
            }
            finally
            {
                _lock.ReleaseReaderLock();
            }
        }
        public IBar GetPrevious(IBar bar)
        {
            TicksFile currentFile = GetFile(bar.DT);

            _lock.AcquireReaderLock(1000);
            try
            {
                IBar result = currentFile.GetPrevious(bar);
                if (result == null)
                {
                    TicksFile previusFile = null;
                    foreach (TicksFile f in ticksFileList)
                    {
                        if ((f.startDateTime < currentFile.startDateTime) && ((previusFile == null) || ((previusFile.startDateTime < f.startDateTime) && (f.Count > 0))))
                        {
                            previusFile = f;
                        }
                    }
                    if (previusFile != null)
                    {
                        return(previusFile.Last);
                    }
                }
                return(result);
            }
            finally
            {
                _lock.ReleaseReaderLock();
            }
        }
        TicksFile forConcatCreateFile(DateTime from, DateTime till, string maskForDateTime, int count)
        {
            int intTill = DateTime2Int.Int(till);
            int intFrom = DateTime2Int.Int(from);

            // Проверяю, возможно данный файл уже существует
            foreach (TicksFile tf in ticksFileList)
            {
                if ((tf.startDateTime == intFrom) && (tf.endDateTime == intTill))
                {
                    return(tf);
                }
            }

            // ну а если нет, то создаю
            IBar bar = Get(DateTime2Int.Int(from));

            if (bar == null)
            {
                bar = First;
            }

            IList <IBar> ticks = new List <IBar>(count);

            while ((bar != null) && (bar.DT <= intTill))
            {
                if (bar.DT >= intFrom)
                {
                    ticks.Add(bar);
                }
                bar = GetNext(bar);
            }

            string fileName = string.Empty;

            if (maskForDateTime == string.Empty)
            {
                fileName = Path.Combine(dataDir, symbol + TicksFile.FileExt);
            }
            else
            {
                fileName = Path.Combine(dataDir, symbol + from.ToString(maskForDateTime) + TicksFile.FileExt);
            }

            //  Создаю уникальное имя для файла, чтобы не затереть данные
            int i = 1;

            while (File.Exists(fileName))
            {
                l.Info("Не уникальное имя файла с тиками " + fileName);
                fileName = Path.Combine(dataDir, symbol + from.ToString(maskForDateTime) + "[" + i + "]" + TicksFile.FileExt);
                ++i;
            }

            TicksFile result = new TicksFile(fileName, symbol, intFrom, intTill);

            result.ticks = ticks;
            return(result);
        }
Exemple #6
0
 public static void Add4Save(TicksFile ticksFile, IList <IBar> notGarbage)
 {
     lock (queue)
     {
         foreach (SaveTask st in queue)
         {
             if (st.ticksFile == ticksFile)
             {
                 st.lastAdd = DateTime.Now;
                 return;
             }
         }
         queue.Add(new SaveTask(ticksFile, notGarbage));
     }
     mre.Set();
 }
Exemple #7
0
 public SaveTask(TicksFile ticksFile, IList <IBar> notGarbage)
 {
     this.ticksFile  = ticksFile;
     this.notGarbage = notGarbage;
 }
        // Объеденяет файлы
        public void Concat(int count = 100 *1024 *1024 / Simple.Tick.Size)
        {
            _lock.AcquireWriterLock(10000);
            try
            {
                List <TicksFile> newTicksFileList = new List <TicksFile>();

                if (Count <= count)
                {
                    //Объединяю всё в один файл
                    newTicksFileList.Add(
                        forConcatCreateFile(DateTime.MinValue, DateTime.MaxValue, string.Empty, Count)
                        );
                }
                else
                {
                    // Как минимум разбиваю по годам
                    IBar bar      = First;
                    int  year     = bar.GetDateTime().Year;
                    int  lastYear = Last.GetDateTime().Year;
                    while (year <= lastYear)
                    {
                        // расчитываю кво баров в данном году
                        int barCountOfYear = 0;
                        int nextYear       = DateTime2Int.Int(new DateTime(year + 1, 1, 1));
                        while ((bar != null) && (bar.DT < nextYear))
                        {
                            ++barCountOfYear;
                            bar = GetNext(bar);
                        }
                        if (barCountOfYear <= count)
                        {
                            //Объединяю год в один файл
                            if (barCountOfYear > 0)
                            {
                                newTicksFileList.Add(
                                    forConcatCreateFile(new DateTime(year, 1, 1), new DateTime(year + 1, 1, 1).AddSeconds(-1), " yyyy", barCountOfYear)
                                    );
                            }
                        }
                        else
                        {
                            //Разбивыаю по месяцам
                            for (int i = 1; i <= 12; ++i)
                            {
                                TicksFile tf = forConcatCreateFile(new DateTime(year, i, 1), new DateTime(year, i, 1).AddMonths(1).AddSeconds(-1), " yyyyMM", (barCountOfYear / 12 * 2));
                                if (tf.Count > 0)
                                {
                                    newTicksFileList.Add(tf);
                                }
                            }
                        }
                        ++year;
                    }
                }
                // Удаляю все существующие файлы
                staticLock.AcquireWriterLock(10000);
                try
                {
                    foreach (TicksFile tf in ticksFileList)
                    {
                        if (!newTicksFileList.Contains(tf))
                        {
                            tf.Delete();
                            allTicksFileList.Remove(tf); // TODO возможно здесь баг, т.к. после Concat файл CaptionOfAllFiles.txt был больше 15M, а после пересоздания стал 800K
                        }
                    }

                    ticksFileList = newTicksFileList;
                    foreach (TicksFile tf in ticksFileList)
                    {
                        if (!allTicksFileList.Contains(tf))
                        {
                            allTicksFileList.Add(tf);
                        }
                    }
                }
                finally
                {
                    staticLock.ReleaseWriterLock();
                }
            }
            finally
            {
                _lock.ReleaseWriterLock();
            }
        }