Beispiel #1
0
        public void CreateInsStore(List <string> args)
        {
            if (args.Count < 2)
            {
                _console.WriteError("Неверное число аргументов");
                return;
            }

            Timeframes tf;

            if (!Timeframes.TryParse <Timeframes>(args[0], out tf))
            {
                _console.WriteError("Неверный первый агрумент: Timeframe");
                return;
            }

            args.RemoveAt(0);

            _insStoreBL.CreateInsStores(args, tf);

            _console.WriteLine("InsStoreID\tInsID\tTicker\tTf\tIsEnable");
            _console.WriteSeparator();
            foreach (var ticker in args)
            {
                var insStore = _insStoreBL.GetInsStore(ticker, tf);
                if (insStore == null)
                {
                    continue;
                }

                _console.WriteLine(string.Format("{0}\t\t{1}\t{2}\t{3}\t{4}",
                                                 insStore.InsStoreID.ToString(),
                                                 insStore.InsID.ToString(),
                                                 ticker,
                                                 insStore.Tf.ToString(),
                                                 insStore.IsEnable ? "*" : "-"));
            }
        }
Beispiel #2
0
        /// <summary>
        /// Загрузка одного потока
        /// </summary>
        /// <param name="args">Date1, Date2, [Dirty], Tf, Ticker, Ticker, ...</param>
        public async void HistoryDownloadAsync(List <string> args)
        {
            DateTime   date1       = DateTime.Today;
            DateTime   date2       = DateTime.Today;
            bool       isLastDirty = false;
            Timeframes tf          = Timeframes.Min;

            if (args.Count == 1)
            {
                if (args[0].Trim().ToLower() == "progress")
                {
                    if (_progress != null)
                    {
                        ShowProgress(_progress);
                    }
                    else
                    {
                        _console.WriteLine("Нет операции");
                    }
                    return;
                }
                else if (args[0].Trim().ToLower() == "cancel")
                {
                    if (_cancel != null)
                    {
                        _cancel.Cancel();
                        _console.WriteLine("Операция прервана");
                    }
                    else
                    {
                        _console.WriteLine("Нет операции");
                    }
                    return;
                }
            }

            if (args.Count < 2)
            {
                _console.WriteError("Не указаны даты");
                return;
            }

            DateTime d;

            if (DateTime.TryParse(args[0].Trim(), out d))
            {
                date1 = d;
            }
            else
            {
                _console.WriteError("Неверно указана дата начала");
                return;
            }
            if (DateTime.TryParse(args[1].Trim(), out d))
            {
                date2 = d;
            }
            else
            {
                _console.WriteError("Неверно указана дата окончания");
                return;
            }

            args.RemoveRange(0, 2);

            if (args.Count < 1)
            {
                _console.WriteError("Неверное число аргументов");
                return;
            }

            if (args[0].Trim().ToLower() == "dirty")
            {
                isLastDirty = true;
                args.RemoveAt(0);
            }

            if (args.Count < 1)
            {
                _console.WriteError("Неверное число аргументов");
                return;
            }

            Timeframes tf_;

            if (!Timeframes.TryParse <Timeframes>(args[0].Trim(), out tf_))
            {
                _console.WriteError("Неверный агрумент: Timeframe");
                return;
            }
            tf = tf_;

            args.RemoveAt(0);

            if (args.Count < 1)
            {
                _console.WriteError("Неверное число аргументов");
                return;
            }

            List <CommonData.InsStore> insStores = new List <CommonData.InsStore>();

            foreach (string ticker in args)
            {
                CommonData.InsStore insStore = _insStoreBL.GetInsStore(ticker, tf);
                if (insStore == null)
                {
                    _console.WriteError("Не найден тикер: " + ticker);
                    continue;
                }
                insStores.Add(insStore);
            }
            if (insStores.Count == 0)
            {
                _console.WriteError("Пустой список тикеров");
                return;
            }

            if (_progress != null && _progress.IsWorking)
            {
                ShowProgress(_progress);
                return;
            }

            _console.WriteLine("Загрузка данных ... ");
            _progress = new BgTaskProgress(_syncContext, "Загрузка данных ...");
            _cancel   = new CancellationTokenSource();

            _progress.OnStart();
            int idx = 0;

            foreach (var insStore in insStores)
            {
                var instrum = _instrumBL.GetInstrumByID(insStore.InsID);
                if (instrum == null)
                {
                    continue;
                }

                var p = _progress.AddChildProgress(instrum.ShortName);
                await _historyDownloader.DownloadAsync(insStore, date1, date2, isLastDirty, true, p, _cancel.Token);

                idx++;
                _progress.OnProgress((double)idx * 100 / insStores.Count);
            }
            _progress.OnComplete();
        }
Beispiel #3
0
        /// <summary>
        /// Загрузка тиковых данных для всех инструментов
        /// </summary>
        /// <returns>Общее кол-во загруженных тиков</returns>
        public async Task <int> LoadDataAsync()
        {
            lock (_ticks)
            {
                _ticks.Clear();
            }
            _synTicksCount = _realDays = _synDays = 0;
            _insID_lastTick.Clear();

            foreach (var instrum in _instrums)
            {
                if (Timeframe != Timeframes.Tick)
                {
                    var barRow = new BarRow(Timeframe, instrum.InsID);
                    await _insStoreBL.LoadHistoryAsync(barRow, instrum.InsID, StartDate, EndDate);

                    await Task.Run(() =>
                    {
                        foreach (var bar in barRow.Bars)
                        {
                            lock (_ticks)
                            {
                                int v = bar.Volume < int.MaxValue ? (int)bar.Volume : int.MaxValue;
                                _ticks.Add(new Tick(0, bar.Time, instrum.InsID, 0, bar.Open));
                                _ticks.Add(new Tick(0, bar.Time, instrum.InsID, 0, bar.High));
                                _ticks.Add(new Tick(0, bar.Time, instrum.InsID, 0, bar.Low));
                                _ticks.Add(new Tick(0, bar.Time, instrum.InsID, v, bar.Close));
                            }
                        }
                    });
                }
                else
                {
                    List <DateTime> freeDays    = null;
                    var             minInsStore = _insStoreBL.GetInsStore(instrum.InsID, Timeframes.Min);
                    if (minInsStore != null)
                    {
                        freeDays = _insStoreBL.GetInsStoreCalendar(minInsStore.InsStoreID).FreeDays
                                   .Where(d => d >= StartDate && d <= EndDate).ToList();
                    }

                    DateTime date = StartDate;
                    while (date <= EndDate)
                    {
                        var ticks = await _tickHistoryBL.GetTicksAsync(instrum.InsID, date);

                        if (ticks != null && ticks.Any())
                        {
                            lock (_ticks)
                            {
                                _ticks.AddRange(ticks);
                            }
                            _realDays++;
                        }
                        else // тиковых данных нет, попробуем загрузить минутки и сделать из них тики
                        {
                            if (freeDays != null && !freeDays.Contains(date)) // дата не является выходным днем, значит должны быть минутки
                            {
                                BarRow barRow = new BarRow(Timeframes.Min, instrum.InsID);
                                await _insStoreBL.LoadHistoryAsync(barRow, instrum.InsID, date, date, minInsStore.InsStoreID);

                                if (barRow.Bars.Any())
                                {
                                    foreach (Bar bar in barRow.Bars)
                                    {
                                        var synTicks = SynTicks(bar, instrum); // синтезируем тики из минутного бара
                                        _synTicksCount += synTicks.Count();
                                        _ticks.AddRange(synTicks);
                                    }
                                    _synDays++;
                                }
                            }
                        }
                        date = date.AddDays(1);
                    }
                }

                if (_ticks.Any() && _ticks.Last().InsID == instrum.InsID) // тики внутри каждого инструмента отсортированы по времени, поэтому можно брать последний в списке и он будет последний по времени
                {
                    if (!_insID_lastTick.ContainsKey(instrum.InsID))
                    {
                        _insID_lastTick.Add(instrum.InsID, _ticks.Last());
                    }
                    else // перестраховка
                    {
                        _insID_lastTick[instrum.InsID] = _ticks.Last();
                    }
                }
            }

            await Task.Run(() =>
            {
                lock (_ticks)
                {
                    _ticks    = _ticks.OrderBy(t => t.Time).ToList();
                    int count = _ticks.Count;
                    for (int i = 0; i < count; i++)
                    {
                        var tick     = _ticks[i];
                        tick.TradeNo = i + 1;
                    }
                }
            });

            return(GetTicksCount());
        }
Beispiel #4
0
        /// <summary>
        /// Синхронизация данных симулятора для списка инструментов.
        /// Для каждого инструмента синхронизируется минимальный поток (кроме тиков).
        /// Синхронизация выполняется на размер форварда по умолчанию, свой для каждого таймфрейма.
        /// </summary>
        /// <param name="insIDs">Инструменты</param>
        /// <param name="startDate">Начало периода данных</param>
        /// <param name="cancel">Токен отмены</param>
        /// <returns>Асинхронная задача синхронизации</returns>
        public async Task SyncForward(IEnumerable <int> insIDs, DateTime startDate, CancellationToken cancel)
        {
            foreach (int insID in insIDs)
            {
                if (cancel.IsCancellationRequested)
                {
                    break;
                }

                var ins = _instrumBL.GetInstrumByID(insID);
                if (ins == null)
                {
                    continue;
                }

                var insStore = _insStoreBL.GetInsStore(insID, Timeframes.Min); // минимальный ТФ
                if (insStore == null || insStore.Tf == Timeframes.Tick)
                {
                    continue;
                }

                var insStores = _insStoreBL.GetInsStores(insID).ToList(); // список потоков всех кроме минимального, их мы будем синхронизировать особо
                var f_ss      = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min);
                if (f_ss != null)
                {
                    insStores.Remove(f_ss);
                }

                DateTime endDate = _insStoreBL.GetDefaultEndForwardDate(startDate, insStore.Tf);
                var      parts   = GetDownloadParts(insStore.Tf, startDate, endDate, true); // forward
                foreach (var part in parts)
                {
                    if (cancel.IsCancellationRequested)
                    {
                        break;
                    }

                    bool hasData = _insStoreBL.HasData(part.Date1, part.Date2, insStore.InsStoreID);
                    if (hasData)
                    {
                        continue;
                    }

                    var bars = await SyncDataBlock(insStore, part.Date1, part.Date2,
                                                   part.Date2 >= DateTime.Today, cancel); // синхронизируем поток с минимальным ТФ, данные за сегодня грязные

                    foreach (var ss in insStores)                                         // остальные потоки формируем из минимального
                    {
                        if (cancel.IsCancellationRequested)
                        {
                            break;
                        }

                        var  newBarRow   = _insStoreBL.ConvertBars(ss.InsID, ss.Tf, bars, cancel);
                        bool isLastDirty = part.Date2 >= DateTime.Today; // данные за сегодня помечаем как грязные, поскольку не уверены что они полные
                        _insStoreBL.InsertData(ss.InsStoreID, ins.Decimals, newBarRow.Bars, part.Date1, part.Date2,
                                               isLastDirty, cancel);
                    }
                }
            }
        }