コード例 #1
0
        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();
            }
        }
コード例 #2
0
ファイル: Scale.cs プロジェクト: vvsur/open-wealth-project
        string SetName()
        {
            string from;

            if (this.beginning == -1)
            {
                from = string.Empty;
            }
            else
            {
                from = "From" + DateTime2Int.DateTime(beginning).ToString("yyMMdd hhmmss");
            }


            if ((interval == 1) && (scaleType != ScaleEnum.month))
            {
                return(scaleType.ToString() + from);
            }
            if (scaleType == ScaleEnum.sec)
            {
                if ((interval >= 604800) && (interval % 604800 == 0))
                {
                    return(interval / 604800 + "w" + from);
                }

                if ((interval >= 86400) && (interval % 86400 == 0))
                {
                    return(interval / 86400 + "d" + from);
                }

                if ((interval >= 3600) && (interval % 3600 == 0))
                {
                    return(interval / 3600 + "h" + from);
                }

                if ((interval >= 60) && (interval % 60 == 0))
                {
                    return(interval / 60 + "min" + from);
                }
                return(interval + "sec" + beginning);
            }
            else
            if (scaleType == ScaleEnum.month)
            {
                return(interval.ToString() + "m" + beginning);
            }
            else
            {
                return(interval.ToString() + scaleType.ToString() + beginning);
            }
        }
コード例 #3
0
        public int TimeAlignment(int dt)
        {
            if (scale.scaleType != ScaleEnum.sec)
            {
                throw new InvalidOperationException("Для scaleType отличного от ScaleEnum.sec вызов данного метода ошибочен");
            }

            int periods = (dt - scale.beginning) / scale.interval;

            int result = scale.beginning + periods * scale.interval;

            if (l.IsDebugEnabled)
            {
                l.Debug(debKey + "Округлил время " + DateTime2Int.DateTime(dt) + " до " + DateTime2Int.DateTime(result));
            }
            return(result);
        }
コード例 #4
0
 public DateTime GetDateTime()
 {
     return(DateTime2Int.DateTime(dt));
 }
コード例 #5
0
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            l.Debug("стартовал backgroundWorker_DoWork");

            Random             random        = new Random(DateTime.Now.Millisecond);
            List <EmitentInfo> listDownloads = new List <EmitentInfo>();

            #region Формирование списка эмитентов
            backgroundWorker.ReportProgress(0, "Формирую список эмитентов для обработки");
            l.Debug("Формирую список эмитентов для обработки");

            lock (FinamHelper.Lock)
            {
                foreach (EmitentInfo emitent in FinamHelper.Emitents)
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        e.Cancel = true; return;
                    }                                                                      // пользователь отменил операцию
                    if ((emitent.Id != -1) && (emitent.Checked))
                    {
                        listDownloads.Add(emitent);
                    }
                }
            }
            #endregion Формирование списка эмитентов

            IScale tickScale = Core.Data.GetScale(ScaleEnum.tick, 1);

            for (int i = 0; i < listDownloads.Count; ++i)
            {
                ISymbol symbol = Core.Data.GetSymbol(listDownloads[i].MarketName, listDownloads[i].Name);

                backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "==== Работаю с " + symbol);
                l.Debug("==== Работаю с " + symbol);

                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true; return;
                }                                                                      // пользователь отменил операцию

                #region Определение начальной date
                DateTime date = settings.from;

                switch (settings.fromType)
                {
                case 0:
                    date = settings.from;
                    break;

                case 1:
                    date = DateTime.Now.Date.AddDays(-1);
                    break;

                case 2:
                    date = DateTime2Int.DateTime(Core.Data.GetBars(symbol, tickScale).Last.DT);
                    break;

                case 3:
                    date = DateTime2Int.DateTime(Core.Data.GetBars(symbol, tickScale).Last.DT).AddDays(-1);
                    break;

                default:
                    l.Error("settings.fromType=" + settings.fromType);
                    break;
                }
                #endregion Определение начальной date

                for (; date <= settings.to; date = date.AddDays(1))
                {
                    string filename = Path.Combine(settings.saveCSVFolder, listDownloads[i].MarketName + "-" + listDownloads[i].Code + "-" + date.ToString("yyyyMMdd") + ".csv");
                    string csv      = string.Empty;

                    if (!File.Exists(filename))
                    {
                        #region Загрузка c финама
                        if (settings.downloadChecked)
                        {
                            backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Загружаю " + symbol + " за " + date.ToShortDateString());
                            l.Debug("Загружаю " + symbol + " за " + date.ToShortDateString());
                            do
                            {
                                if (backgroundWorker.CancellationPending)
                                {
                                    e.Cancel = true; return;
                                }                                                                      // пользователь отменил операцию
                                try
                                {
                                    csv = FinamHelper.Download(settings, listDownloads[i], date);
                                }
                                catch
                                {
                                    l.Error("Необробатываемый Exception в FinamHelper.Download");
                                    csv = "Exception";
                                }
                                if (csv == "Система уже обрабатывает Ваш запрос. Дождитесь окончания обработки.")
                                {
                                    backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Финам просит подождать");
                                    System.Threading.Thread.Sleep(random.Next(30000));
                                    if (backgroundWorker.CancellationPending)
                                    {
                                        e.Cancel = true; return;
                                    }                                                                      // пользователь отменил операцию
                                    backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Пробую снова");
                                }
                                if (csv == "Exception")
                                {
                                    backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Ошибка при скачивании");
                                    System.Threading.Thread.Sleep(random.Next(30000));
                                    if (backgroundWorker.CancellationPending)
                                    {
                                        e.Cancel = true; return;
                                    }                                                                      // пользователь отменил операцию
                                    backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Пробую снова");
                                }
                            } while
                            (
                                (csv == "Система уже обрабатывает Ваш запрос. Дождитесь окончания обработки.")
                                ||
                                (csv == "Exception")
                            );

                            if ((csv == String.Empty) || (csv.Length < 30))
                            {
                                backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "нет данных \r\n" + csv);
                                l.Debug("нет данных \r\n" + csv);
                                if (backgroundWorker.CancellationPending)
                                {
                                    e.Cancel = true; return;
                                }                                                                      // пользователь отменил операцию
                            }
                        }
                        #endregion Загрузка с финама

                        #region Сохранение
                        if ((settings.saveCSVChecked) && (csv.Length >= 30))
                        {
                            backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Сохраняю csv");
                            l.Debug("Сохраняю csv");

                            try
                            {
                                if (!Directory.Exists(settings.saveCSVFolder))
                                {
                                    Directory.CreateDirectory(settings.saveCSVFolder);
                                }

                                File.WriteAllText(filename, csv, Encoding.UTF8);
                            }
                            catch (Exception exc)
                            {
                                l.Error("Не смог сохранить csv в файл ", exc);
                            }
                        }
                        #endregion Сохранение
                    }

                    #region Анализ
                    if (settings.analyzeChecked)
                    {
                        if ((csv.Length < 30) && (File.Exists(filename)))
                        {
                            csv = File.ReadAllText(filename, Encoding.UTF8);
                        }

                        if ((settings.analyzeChecked) && (csv.Length >= 30))
                        {
                            backgroundWorker.ReportProgress((100 * i / listDownloads.Count), "Анализирую " + symbol + " за " + date.ToShortDateString());
                            l.Debug("Анализирую " + symbol + " за " + date.ToShortDateString());
                            using (StringReader csvStringReader = new StringReader(csv))
                            {
                                FinamHelper.LoadCSV(csvStringReader, symbol);
                            }
                        }
                    }
                    #endregion Анализ

                    System.Threading.Thread.Sleep(random.Next(100)); // дадим интерфейсу отрисоваться, а финуму отдохнуть
                }
            }

            if (backgroundWorker.CancellationPending)
            {
                e.Cancel = true; return;
            }                                                 // пользователь отменил операцию

            System.Threading.Thread.Sleep(random.Next(1000)); // дадим интерфейсу отрисоваться, а финуму отдохнуть

            backgroundWorker.ReportProgress(100, "Всё!!!");
            l.Info("backgroundWorker_DoWork закончил");
        }
コード例 #6
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            DoWorkParam doWorkParam = e.Argument as DoWorkParam;

            if (doWorkParam != null)
            {
                if (!Directory.Exists(doWorkParam.Dir))
                {
                    Directory.CreateDirectory(doWorkParam.Dir);
                }

                IScale scale;
                if (doWorkParam.TimeFrame > 0)
                {
                    scale = Core.Data.GetScale(ScaleEnum.sec, doWorkParam.TimeFrame);
                }
                else
                {
                    scale = Core.Data.GetScale(ScaleEnum.tick, 1);
                }

                for (int i4Symbol = 0; i4Symbol < doWorkParam.SymbolList.Count; ++i4Symbol)
                {
                    if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true; return;
                    }
                    IBars bars = Core.Data.GetBars(doWorkParam.SymbolList[i4Symbol], scale);
                    if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true; return;
                    }
                    IBar bar = bars.Get(doWorkParam.From);
                    if (bar == null)
                    {
                        bar = bars.First;
                    }
                    if ((bar != null) && (bar.DT <= doWorkParam.To))
                    {
                        double progressDelta = 1 / doWorkParam.SymbolList.Count;
                        int    count         = 0;
//                        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\Users\Public\TestFolder\WriteLines2.txt"))
                        using (BinaryWriter file = new BinaryWriter(File.Open(Path.Combine(doWorkParam.Dir, string.Concat(doWorkParam.SymbolList[i4Symbol], ".", doWorkParam.FileType)), FileMode.Create, FileAccess.Write)))
                        {
                            //заголовок файла
                            if (doWorkParam.FileType == "wl")
                            {
                                file.Write((int)0);
                            }
                            else
                            if (doWorkParam.TimeFrame == 0)
                            {
                                file.Write(Encoding.ASCII.GetBytes("<DATE>;<TIME>;<LAST>;<VOL>;<ID>" + Environment.NewLine));
                            }
                            else
                            {
                                file.Write(Encoding.ASCII.GetBytes("<DATE>;<TIME>;<OPEN>;<HIGH>;<LOW>;<CLOSE>;<VOL>" + Environment.NewLine));
                            }

                            // данные файла
                            while ((bar != null) && (bar.DT <= doWorkParam.To))
                            {
                                if (backgroundWorker1.CancellationPending)
                                {
                                    e.Cancel = true; return;
                                }

                                if (doWorkParam.FileType == "wl")
                                {
                                    file.Write((double)DateTime2Int.DateTime(bar.DT).ToOADate());
                                    file.Write((float)bar.Open);
                                    file.Write((float)bar.High);
                                    file.Write((float)bar.Low);
                                    file.Write((float)bar.Close);
                                    file.Write((float)bar.Volume);
                                }
                                else
                                {
                                    string s = string.Empty;
                                    if (doWorkParam.TimeFrame == 0)
                                    {
                                        s = string.Concat(
                                            DateTime2Int.DateTime(bar.DT).ToString("yyyyMMdd;"),
                                            DateTime2Int.DateTime(bar.DT).ToString("hhmmss;"),
                                            bar.Close.ToString(),
                                            ";",
                                            bar.Volume.ToString(),
                                            ";",
                                            bar.Number.ToString(),
                                            Environment.NewLine
                                            );
                                    }
                                    else
                                    {
                                        s = string.Concat(
                                            DateTime2Int.DateTime(bar.DT).ToString("yyyyMMdd;"),
                                            DateTime2Int.DateTime(bar.DT).ToString("hhmmss;"),
                                            bar.Open.ToString(),
                                            ";",
                                            bar.High.ToString(),
                                            ";",
                                            bar.Low.ToString(),
                                            ";",
                                            bar.Close.ToString(),
                                            ";",
                                            bar.Volume.ToString(),
                                            Environment.NewLine
                                            );
                                    }
                                    byte[] bytes = Encoding.ASCII.GetBytes(s);
                                    file.Write(bytes);
                                }

                                ++count;
                                backgroundWorker1.ReportProgress((int)(100 * i4Symbol / doWorkParam.SymbolList.Count + progressDelta));
                                bar = bars.GetNext(bar);
                            }
                            if (doWorkParam.FileType == "wl")
                            {
                                file.Seek(0, SeekOrigin.Begin);
                                file.Write(count);
                            }
                            file.Close();
                        }
                    }
                }
            }
            if (backgroundWorker1.CancellationPending)
            {
                e.Cancel = true; return;
            }
        }
コード例 #7
0
        void m_TickBars_NewBarEvent(object sender, BarsEventArgs e) // TODO возможная оптимизация (слишком часто вызываю TimeAlignment(e.bar.dt))
        {
            if (l.IsDebugEnabled)
            {
                l.Debug(debKey + "m_TickBars_NewBarEvent новый тик " + e.bar);
            }
            Lock.AcquireWriterLock(1000);
            try
            {
                AggregateBar bar = FindBar(e.bar.DT) as AggregateBar;

                if (bar == null)
                {
                    int timeAlignment = TimeAlignment(e.bar.DT);

                    if (l.IsDebugEnabled)
                    {
                        l.Debug(debKey + "m_TickBars_NewBarEvent Создаю новый бар " + DateTime2Int.DateTime(timeAlignment));
                    }

                    bar = new AggregateBar(timeAlignment, timeAlignment + scale.interval - 1, e.bar.Number, e.bar.Close, e.bar.Close, e.bar.Close, e.bar.Close, e.bar.Volume);

                    bars.Add(bar);

                    EventHandler <BarsEventArgs> ev = NewBarEvent;
                    if (ev != null)
                    {
                        ev(this, new BarsEventArgs(this, bar));
                    }
                }
                else
                {
                    l.Debug(debKey + "m_TickBars_NewBarEvent Добавляю тик в бар");

                    if ((m_LastTick != null) &&
                        ((m_LastTick.DT > e.bar.DT) ||
                         ((m_LastTick.DT == e.bar.DT) && (m_LastTick.Number > e.bar.Number))))
                    {
                        l.Debug(debKey + "Тики пришли не по порядку. Пересчитываю весь бар");
                        RecalcBar(bar);
                    }
                    else
                    {
                        bar.AddTick(e.bar);
                    }

                    m_LastTick = e.bar;

                    EventHandler <BarsEventArgs> changeBarEvent = ChangeBarEvent;
                    if (changeBarEvent != null)
                    {
                        changeBarEvent(this, new BarsEventArgs(this, bar));
                    }
                }
            }
            finally
            {
                Lock.ReleaseWriterLock();
            }
        }