private void ActualizeQuotesAndStartCyborgs(object quotesObj) { var quotes = (Dictionary<string, DateTime?>)quotesObj; Dictionary<string, List<CandleDataBidAsk>> dicQuote = null; if (quotes.Count > 0) { // создать директорию котировок, если не существует var quotesFolder = ExecutablePath.ExecPath + QuoteFolder; try { if (!Directory.Exists(quotesFolder)) Directory.CreateDirectory(quotesFolder); } catch (Exception ex) { AppendLogMessage("Ошибка создания директории \"" + quotesFolder + "\": " + ex); State = FarmState.Stopped; return; } // освежить котировки в директории за указанный период dicQuote = TickerStorage.Instance.GetQuotes(quotes).Where(p => p.Value.Count > 0).ToDictionary( p => p.Key, p => p.Value); AppendLogMessage("Завершена актуализация " + quotes.Count + " котировок"); } // подготовить контекст var accountList = Accounts; var countOk = accountList.Count; foreach (var account in accountList) { if (!account.SetupLiveContext()) countOk--; } if (countOk == 0) { State = FarmState.Stopped; return; } AppendLogMessage("Контекст роботов инициализирован"); // собрать статистику по времени обработки истории котировок // дать роботам переварить историю котировок, заботливо подкачанную заранее if (quotes.Count > 0) { var stream = new HistoryTickerStream(dicQuote); using (new TimeLogger("Ферма роботов стартовала, обработка истории заняла")) while (true) { string[] names; CandleDataBidAsk[] histQuotes; if (!stream.Step(out names, out histQuotes)) break; foreach (var account in accountList) { try { account.OnQuotesReceived(names, histQuotes, true); } catch (Exception ex) { Logger.Error("Ошибка обработки котировок по счету " + account.AccountId + ": " + ex); } } } } // запланировать обновления портфелей try { FarmScheduler.Instance.ScheduleTopPortfolioUpdates(accounts); FarmScheduler.Instance.Start(); } catch (Exception ex) { Logger.Error("Ошибка старта обновления портфелей", ex); throw; } State = FarmState.Started; // запустить поток, по-расписанию выполняющий процедуры timerThread.Start(); AppendLogMessage("Запуск осуществлен"); }
private void ActualizeQuotesAndStartCyborgs(object quotesObj) { var quotes = (Dictionary <string, DateTime?>)quotesObj; Dictionary <string, List <CandleDataBidAsk> > dicQuote = null; if (quotes.Count > 0) { // создать директорию котировок, если не существует var quotesFolder = ExecutablePath.ExecPath + QuoteFolder; try { if (!Directory.Exists(quotesFolder)) { Directory.CreateDirectory(quotesFolder); } } catch (Exception ex) { AppendLogMessage("Ошибка создания директории \"" + quotesFolder + "\": " + ex); State = FarmState.Stopped; return; } // освежить котировки в директории за указанный период dicQuote = TickerStorage.Instance.GetQuotes(quotes).Where(p => p.Value.Count > 0).ToDictionary( p => p.Key, p => p.Value); AppendLogMessage("Завершена актуализация " + quotes.Count + " котировок"); } // подготовить контекст var accountList = Accounts; var countOk = accountList.Count; foreach (var account in accountList) { if (!account.SetupLiveContext()) { countOk--; } } if (countOk == 0) { State = FarmState.Stopped; return; } AppendLogMessage("Контекст роботов инициализирован"); // собрать статистику по времени обработки истории котировок // дать роботам переварить историю котировок, заботливо подкачанную заранее if (quotes.Count > 0) { var stream = new HistoryTickerStream(dicQuote); using (new TimeLogger("Ферма роботов стартовала, обработка истории заняла")) while (true) { string[] names; CandleDataBidAsk[] histQuotes; if (!stream.Step(out names, out histQuotes)) { break; } foreach (var account in accountList) { try { account.OnQuotesReceived(names, histQuotes, true); } catch (Exception ex) { Logger.Error("Ошибка обработки котировок по счету " + account.AccountId + ": " + ex); } } } } // запланировать обновления портфелей try { FarmScheduler.Instance.ScheduleTopPortfolioUpdates(accounts); FarmScheduler.Instance.Start(); } catch (Exception ex) { Logger.Error("Ошибка старта обновления портфелей", ex); throw; } State = FarmState.Started; // запустить поток, по-расписанию выполняющий процедуры timerThread.Start(); AppendLogMessage("Запуск осуществлен"); }
public void TestHistoryTickerStreamCountSteps() { var stream = new HistoryTickerStream(quotes); var longestChain = quotes.Max(q => q.Value.Count); var maxSteps = longestChain * 2; var firstDate = quotes.Min(q => q.Value[0].timeClose); var lastDate = quotes.Max(q => q.Value[q.Value.Count - 1].timeClose); var countSteps = 0; var prevDate = default(DateTime); var firstIter = true; while (true) { string[] names; CandleDataBidAsk[] curQuotes; if (!stream.Step(out names, out curQuotes)) break; Assert.IsNotEmpty(names, "массив не пуст (names)?"); Assert.IsNotEmpty(curQuotes, "массив не пуст (curQuotes)?"); Assert.IsTrue(curQuotes.Select(q => q.timeClose).Distinct().Count() == 1, "все котировки одной даты?"); prevDate = curQuotes[0].timeClose; Assert.Less(++countSteps, maxSteps, "не зациклились нафиг?"); if (firstIter) { firstIter = false; Assert.AreEqual(firstDate, curQuotes[0].timeClose, "начали с самой первой котировки?"); } } Assert.GreaterOrEqual(countSteps, longestChain, "не слишком мало шагов пройдено?"); Assert.AreEqual(prevDate, lastDate, "добрались до последней котировки?"); }