/// <summary> /// Get InsStore by Id /// </summary> /// <param name="insStoreID"></param> /// <returns></returns> public CommonData.InsStore GetInsStoreByID(int insStoreID) { CommonData.InsStore insStore = null; using (var db = new DaContext(_options)) { insStore = db.InsStore.Find(insStoreID); } return(insStore); }
/// <summary> /// Update InsStore /// </summary> /// <param name="insStore">InsStore</param> public void UpdateInsStore(CommonData.InsStore insStore) { InsStore db_secStore = new InsStore() { InsStoreID = insStore.InsStoreID, InsID = insStore.InsID, Tf = (byte)insStore.Tf, IsEnable = insStore.IsEnable }; _da.DbContext.Update(db_secStore); }
/// <summary> /// Асинхронная загрузка исторических данных по фин. инструменту /// </summary> /// <param name="insStore">Поток данных</param> /// <param name="date1">Начальная дата</param> /// <param name="date2">Конечная дата</param> /// <param name="isLastDirty">Последняя дата содердит неполные данные</param> /// <param name="isForward">Загрузка блоками от начальной даты к конечной (иначе от конечной к начальной)</param> /// <param name="progress">Объект управления фоновой задачей</param> /// <param name="cancel">Объект отмены длительной операции</param> /// <returns>Асинхронная задача загрузки</returns> public async Task DownloadAsync(CommonData.InsStore insStore, DateTime date1, DateTime date2, bool isLastDirty, bool isForward, BgTaskProgress progress, CancellationToken cancel) { try { var parts = GetDownloadParts(insStore.Tf, date1, date2, isForward); int idx = 1; int count = parts.Count(); if (progress != null) { progress.OnStart(count > 1); } foreach (var part in parts) { if (cancel.IsCancellationRequested) { if (progress != null) { progress.OnAbort(); } break; } await SyncDataBlock(insStore, part.Date1, part.Date2, isLastDirty, cancel); if (progress != null) { progress.OnProgress((double)idx++ / count * 100); } } if (progress != null) { if (cancel.IsCancellationRequested) { progress.OnAbort(); } else { progress.OnComplete(); } } } catch (Exception ex) { if (progress != null) { progress.OnFault(ex); } } }
/// <summary> /// Create InsStore (array of fin. instrument quotes) /// </summary> /// <param name="insID">Instrument</param> /// <param name="tf">Timeframe</param> /// <param name="isEnable">Active for sync</param> /// <returns></returns> public int CreateInsStore(int insID, Timeframes tf, bool isEnable) { var insStore = new CommonData.InsStore() { InsID = insID, Tf = tf, IsEnable = isEnable }; using (var db = new DaContext(_options)) { db.InsStore.Add(insStore); db.SaveChanges(); } return(insStore.InsStoreID); }
/// <summary> /// Обновить объект InsStore /// </summary> /// <param name="insStore"></param> public void UpdateInsStore(CommonData.InsStore insStore) { _insStoreDA.UpdateInsStore(insStore.InsStoreID, insStore.IsEnable); }
/// <summary> /// Наилучший insStore для загрузки. /// Например, требуется сформировать бары с таймфреймом Hour, но такого insStore в базе нет. /// Тогда из имеющихся insStore будет выбран наиболее подходящий. /// </summary> /// <param name="insID">Инструмент</param> /// <param name="tf">ТФ у BarRow</param> /// <returns>Наиболее подходящий insStore для загрузки.</returns> public CommonData.InsStore GetLoadHistoryInsStore(int insID, Timeframes tf) { CommonData.InsStore ss = null; var insStores = GetInsStores(insID); if (tf == Timeframes.Tick) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } if (tf == Timeframes.Min) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Min5) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Min10) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Min15) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min15); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Min20) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min20); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Min30) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min30); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min15); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Hour) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Hour); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min30); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min20); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min15); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Day) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Day); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Hour); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min30); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min20); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min15); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } if (tf == Timeframes.Week) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Week); if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Day); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Hour); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min30); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min20); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min15); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min10); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min5); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Min); } if (ss == null) { ss = insStores.FirstOrDefault(s => s.Tf == Timeframes.Tick); } } return(ss); }
/// <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(); }