Скорость вывода данных


Скорость вывода данных
Atom Reply
5/28/2010


Добрый день, Михаил!
Сколько не бился над проблемой, но при эскпорте "все сделки" все время
начинается замедление поступления данных из квика. Причем чем больше
времени проходит - тем больше оставание - сегодня за 3 часа отставание
достигло аж 30 минут! Перепробовал разные способы. И в S#1.8 и в
S#2.0 ситуация одинковая. В конце концов до предела отфильтровал
данные всех сделок в квике - стал получать только даныне по фьючерсам.
Только тогда скорость вроде бы нормализовалась. А до этого во "всех
сделках" были действиетльно "все сделки".
Заметил также, что во время вечерней сессии скорость обработки и
отрисовки нормальная - т.е. фактически после завершения торговли
акциями = уменьшения постуающей информации.
Получается, что для системы есть какой-то предел количества
поступающей информации?

Tags:


Thanks:




18 Answers
Mikhail Sukhov

Avatar
Date: 5/31/2010
Reply


Для того, чтобы точно убедиться в чем проблема, попробуйте перестать
отрисовывать (кстати что именно). Например, просто выводить сигнал о
данных в консоль. Например, как сделано здесь

http://groups.google.ru/group/stocksharp/browse_thread/thread/b68f5d9bc2134b48


Thanks:

ddd888

Avatar
Date: 5/31/2010
Reply


Да, так и сделаю. Создал отдельный проект с классом вывода данных в
консоль:
_trader.NewTrades += trades => Console.WriteLine(trades.Max
(c=>c.Time).ToString ())

Поскольку уже вечер и сделок мало, то сейчас данные идут нормально.
Завтра потестю во время основных торгов.

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/1/2010
Reply


С учетом того, что QuikTrader всасывает все данные за сессию (а
следовательно, вечерка должна иметь больше данных, чем дневная), уже
уменьшает вероятность ошибки в S#. Но тест конечно провести нужно.
Возможно проблема не с памятью, а с производительностью.

Thanks:

ddd888

Avatar
Date: 6/1/2010
Reply


С производительностью компьютера? Похоже на это. Сегодня я с утра веду
тестирование. В таблицу "все сделки" специально по такому случаю
загнал все бумаги, что дает квик. Результаты следующие: в целом,
задержки с выводом в консоль практически нет - максимум отставание
составляет 5 сек, но обычно - 1-2 сек. (Могу выложить скринскан).
Правда, где-то в середине дня заметил отставание в 10 минут (после
того как таблицу загрузил по максимуму), но потом оно само собой куда-
то исчезло. Единственно что смущает - это отставание то возникает, то
пропадает почти полностью. Надо делать какой-то вывод, а он
напрашивается такой, что в моем "сампле" основное время "воруется"
GUI? А как же без него совсем обойтись - писать все настройки через
код? :)....

В целях этого же теста еще попытался вывести паралелльно котировки
"стакана" таким образом:

_test.somesec = (Security)_test._trader.Securities.Where(q => q.Code
== "RIM0").LastOrDefault();
_test._trader.RegisterQuotes(_test.somesec);

но последняя строка выдала исключение: "в экземпляре объекта нет
ссылки на объект". Хотя через отладку _test.somesec был вполне
"загружен" данными. Про какой объект тогда говорит исключение?

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/1/2010
Reply


1. Попроьбуйте выключить вообще все окна. Чтобы в них данные не
добавлялись на отображение.
2. NullReferenceException говорит о том, что _test равен null. А то
что Вы подумали, называется ArgumentNullException.

Thanks:

ddd888

Avatar
Date: 6/1/2010
Reply


1. Выключить окна в квике? Или вообще в среде? В самой программе
только консоль включается.
2. Он исключение мне по-русски выдает. Хотя я бы все равно, конечно,
разницы не понял. Спасибо за подсказку. :)

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/1/2010
Reply


У Вас уже обычная консоль или все таки WPF?

Thanks:

ddd888

Avatar
Date: 6/1/2010
Reply


Да, тест я сделал в обычной консоли без всяких WPF. Сейчас работает и
задержек нет. Но правда уже вечер. И правда, стакан что-то не
получается там туда отобразить. Куда этот экземпляр объекта девается,
не пойму?

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/1/2010
Reply


И Вы говорите на консоли начинает подтормаживать днем?

Thanks:

ddd888

Avatar
Date: 6/1/2010
Reply


Да, у меня сегодня в среднем было - 1-2 сек. И это то, что видно чисто
визуально. А иногда быаает так - в какой-то момент заметил, что квик
сам не всегда стабильно выдает данные - иногда он сам как бы
тормозится, а потом за раз выдает то, что задержал на какое-то время -
в этот момент, по-моему, и происходит основное "торможение" в
QuikTrader. Сейчас визуально задержек не видно, но я добавил функцию
вычисления разницы между текущим временем и временем последней сделки
в миллисекундах. Интересно, что разброс выдается от 60 мс до 900 мс.

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/2/2010
Reply


Я кое-что подкрутил. Сохраните проект. Когда выпушу новый билд 2.0 -
проверьте еще раз. Ок?

Thanks:

ddd888

Avatar
Date: 6/2/2010
Reply


Да, конечно! :) Когда ожидается новый билд?

Topic starter
Thanks:

ddd888

Avatar
Date: 6/8/2010
Reply


Пытаюсь теперь проверить все на последней версии 2.0.1. В моей версии
с GUI все вроде пошло очень шустро и в самый разгар наплыва информации
о торгах - после обеда. Теперь пытаюсь в консоле отследить время
появления сделок. Но начали появляться новые доселе неизвестные
ошибки:
- при запуске _trader.StartDde("инструменты") - появляется ошибка: "в
экземпляре объекта нет ссылки на объект", а просто _trader.StartDde()
- "Нет информации о главном окне Quik. Возможно, было неуспешное
подключение." Хотя окна, как я понимаю ведь не менялись? Функция
StartDde("инструменты") как-то изменилась?
Вручную, экспорт запускается нормально и все идет, но зачем так, если
есть программные методы? :)

"

Topic starter
Thanks:

ddd888

Avatar
Date: 6/8/2010
Reply


И еще вопрос. Для теста скорости вывода данных я добавил такой код для
экспорта стакана:

this.somesec = this._trader.Securities.Where(q => q.Code ==
"RIM0").LastOrDefault();
this._trader.RegisterQuotes(this.somesec);
var _marketDepth1 = this._trader.GetMarketDepth(this.somesec);
this.Quotes.AddRange(_marketDepth1.OrderByDescending(e =>
e.Price).Select( e => new SampleQuote
{
Price = e.Price,
Ask = e.OrderDirection ==
OrderDirections.Buy ? e.Volume.ToString() : "",
Bid = e.OrderDirection ==
OrderDirections.Sell ? e.Volume.ToString() : "",
}));
this._trader.GetMarketDepth(this.somesec).Changed += new
Action(TestSpeed_Changed);

Аналогичный код в другой программе на 1.8 у меня работал нормально, а
сейчас почему-то нет. Из квика экспорт стакана идет, а в прогрмму
ничего не приходит. Что тут может быть неправильно?

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 6/8/2010
Reply


Запускать экспорт теперь нужно только после событие Connected
(например, в его обработчике). Я в SampleConsole показал это.

Thanks:

ddd888

Avatar
Date: 6/9/2010
Reply


Спасибо, попробую с Connected.

Запустил тест 2.0.1 после 18:00. Скорость хорошая, впрочем после 18
часов и на 1.8 была нормальная. Среднее время задержки 400-500 мс.
Общее количество загруженных сделок - больше 1 млн. Самое интересное
посмотрю завтра - как на максимальной загрузке себя поведет.

Topic starter
Thanks:

ddd888

Avatar
Date: 6/9/2010
Reply


Наблюдается очень хорошая скорость! Вы молодец, Михаил! :) Задержка
при максимуме информации в среднем не более 1-2 с. По-моему, это очень
хороший результат. В связи с этими тестами, заметил, что часто сам
Квик тормозит - оставание вывода информации может доходить до 5-10 с.
Но S#2.0.1 справляется вполне адекватно. Хочу еще проверить как
зависит производительность программы от количества одновременно
получаемой информации - потому что это явно влияет на скорость вывода:
во время вечерних торгов после 18 часов как я писал - запаздывание
0.4-0.5 с, в разгар сессии - 1-2 с. Пока только не придумал, как это
измерить.

Topic starter
Thanks:

ddd888

Avatar
Date: 6/10/2010
Reply


Что еще радует - в моем варианте со всевозможными GUI скорость
остается такой же высокой. Значит,раньше все-таки дело было не совсем
в отрисовке. =)

Topic starter
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy