Beispiel #1
0
        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("Запуск осуществлен");
        }
Beispiel #2
0
        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("Запуск осуществлен");
        }
Beispiel #3
0
        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, "добрались до последней котировки?");
        }