← Zurück

Нет информации о главном окне Quik. Возможно, было неуспешное подключение.

В чем может быть причина сообщения об ошибке? Квик запущен, путь к нему прописан.

War dieses Thema hilfreich?

Thema teilen

Kommentare (33)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

Запускать экспорт нужно только после событие Connected.

sergun
sergun Autor

Это событие не наступает.

Mikhail Sukhov
Mikhail Sukhov

Пример Sample пробовали? Там как раз по такому сценарию. Он работает? Значит наступает.

sergun
sergun Autor

Разумеется, правда SampleConsole. При запуске примера также не наступает событие Connected.

При этом никакие эксепшены или ошибочные события не появляются..

Что может влиять? Версия квик 5.16.0.145

Mikhail Sukhov
Mikhail Sukhov

А Квик вообще запущен? Подключен к торгам?

sergun
sergun Autor

Да, квик запущен. К торгам подключен.

Mikhail Sukhov
Mikhail Sukhov

А если запустить Sample? Я консоль не проверял.

sergun
sergun Autor

А вот Sample работает.

Но мне пока с WPF экспериментировать рано.. Особой разницы в коде подключения не вижу, похоже дело именно в работе с другими окошками из окошечного либо консольного приложения..

Что-нибудь посоветуете?

Mikhail Sukhov
Mikhail Sukhov

QuikTrader не зависит от консоли или WPF - ему без разницы.

ddd888
ddd888

Кстати, у меня аналогичная проблема - Sample нормально работает, а SampleConsole - нет. StartDde() дает такую же ошибку, а StartDde(string или array) - "нет ссылки на объект". Может это связано с изменением логики работы метода StartDde? Раньше в 1.8 таких проблем не было. Можно увидеть код этого метода?

Mikhail Sukhov
Mikhail Sukhov

Нет ссылки на объект - приведите полный текст.

ddd888
ddd888

SystemNullReferenceException: В экземпляре объекта не задана ссылка на объект. Далее указание на строку: trader.StartDde(new[] { trader.SecuritiesTable, trader.MyTradesTable });

Mikhail Sukhov
Mikhail Sukhov

это скорее всего то, что trader null. Это уж совсем не зависит от события Connected =)

ddd888
ddd888

Так почему же он null? Это в Вашем же примере в Sample Console происходит! Кстати, а когда именно возникает событие Connected?

Mikhail Sukhov
Mikhail Sukhov

Если это мой пример, то тогда надо посмотреть в чем бага.

Событие Connected вызывается сразу после соединения с Квиком.

ddd888
ddd888

Под "соединением" имеется ввиду соединение через Trans2quik или подключение через DDE?

Mikhail Sukhov
Mikhail Sukhov

Первое.

Mikhail Sukhov
Mikhail Sukhov

Взглянул на пример. Оформлен неправильно. Дде стартует до того, как было произведено подключение. Вы это учитываете?

ddd888
ddd888

Нет, в примере, я ничего от себя не добавлял. Т.е. StartDde надо тоже "засунуть" под событие Connected?

ddd888
ddd888

Еще такой вопрос. Если добавлять какие-нибудь манипуляции со стаканом (Quotes), типа Max(t=t>t.Price), то иногда в этом месте возникает исключение "последовательность не содержит элементов". Пробовал поставить тест на null или Count=0, но исключение все равно появляется. Из-за чего это происходит и как этого избежать?

Mikhail Sukhov
Mikhail Sukhov

Из-за того, что стакан еще пуст.

ddd888
ddd888

Но тогда должна работать проверка на null? Еще раз проверил аналогичную ситуацию на 1.8 - там такая ошибка обычно иногда возникает при первичном запуске стакана, но раз запустившись потом никогда не появляется. В 2.0.1 она возникает периодически уже при открытом стакане. У меня GetMarketDepth изменилась логика?

Mikhail Sukhov
Mikhail Sukhov

Периодически - это как? По таймеру? Или пользователь что-то кликает? Или в стратегии?

ddd888
ddd888

Обновление стакана у меня происходит по событию GetMarketDepth(this.Security).Changed Вот во время периодического обновления иногда и выскакивает эта ошибка.

  • опять-таки иногда при инициализации стакана выскакивает ошибка "последовательность не содержит соответствующего элемента". В отладке при этом this.Security - вроде вполне нормально загруженный.
ddd888
ddd888

Заметил такую особенность - пока все сделки до конца не подгрузились в S#, при открытии стакана GetMarketDepth может вызывать ошибку ("последовательность не содержит элементов"). А RegisterQuotes - "последовательность не содержит соответствующего элемента".

Mikhail Sukhov
Mikhail Sukhov

Да, я уже писал о присутствующей ошибке в запуске ДДЕ. Это она. Квик загружен, а S# - нет. S# нажимает на кнопки и ожидает моментального появления окон. Квик же думает, и не всегда может реагировать моментально. Я бы исправил ошибку, если бы она стабильно возникала. Но дело в том, что на моем компе она не возникает практически никогда (да, я шустр!).

ddd888
ddd888

Да, Вам больше повезло! Хотя вроде у меня тоже комп не слабый. :) При первичном запуске стакана такая ошибка некритична. Хуже когда она возникает уже в процессе от метода GetMarketDepth. В 1.8. такого точно ни разу не было, а сейчас почему-то есть. При этом никак не могу понять такое поведение. Вот, например код:

строка 801. this.BestBid = _marketDepth.Where(t => t.Bid != 0).Max(t => t.Price); строка 802. this.BestAsk = _marketDepth.Where(t => t.Ask != 0).Min(t => t.Price); строка 803. this.MinBid = _marketDepth.Where(t => t.Bid != 0).Min(t => t.Price); строка 804. this.MaxAsk = _marketDepth.Where(t => t.Ask != 0).Max(t => t.Price);

И когда возникает ошибка ("последовательность не содержит элементов"), смотрю куда она указывает и вот странность: каждый раз она указывает на разные строки! Как это может быть? Ведь если коллекция пустая, то ошибка всегда должна появляться на 1-й же строке, т.е. здесь например на 801-й?

Mikhail Sukhov
Mikhail Sukhov

Стоп, Вы не разделяете проблемы. Есть ошибка с запуском ДДЕ. Я уже описал симптомы. А есть по работе со стаканом. Я пока не могу понять, у меня она или у Вас.

  1. Лучший бид и аск вычисляются и так стаканом.
  2. Ошибки могут быть на разных строчках, если, например, биды заполнены, а офера еще нет.

Еще рас прочитал, что Вы писал выше. MarketDepth.Changed вызывается при любом изменении стакана. Пришла новая котировка и т.д. Тоесть, стакан может быть даже не заполнен, а событие будет выведено. По вышепреведенному коду могу сказать, что Вам нужно событие ITrader.QuotesChanged потому что Вам нужно вычислять по всему стакану (иначе, просто код бессмыслен - вычисление будет показывать ерунду по неполному стакану). Скорее всего, в этом и ошибка. И это точно не зависит от версии.

ddd888
ddd888

Да, я понимаю, что это уже другая проблема. Про событие QuotesChanged и MarketDepth.Changed тоже помню, но как это влияет на метод GetMarketDepth?

  1. Лучший бид и аск я стал так выводить потому, что у Вас BestBid и BestAsk на самом деле выводят максимальную и минимальные цены стакана почему-то.
  2. Получается, что GetMarketDepth может выводить стакан не полностью в зависимости от того на какое событие QuotesChanged и MarketDepth.Changed подписался?
Mikhail Sukhov
Mikhail Sukhov

Что-то не так внутри метода GetMarketDepth? Как я понял, проблема с наружи - использование результатов этого метода. Что делать, если программа пытается обратиться к стакану слишком рано?

  1. Ни разу такое не встречал. Как это проверили?
  2. GetMarketDepth возвращает всегда стакан. И этот стакан параллельно наполняется QuikTrader.
ddd888
ddd888

GetMarketDepth у меня вызывается по событию GetMarketDepth.Change. Там же в коде я пытаюсь получить дополнительные данные из уже раз вызванного GetMarketDepth. И в ходе торгов, когда экспорт уже давно запущен и выскакивает периодически эта ошибка. Сам код примерно такой:

this.GuiAsync(() => { this.Quotes.Clear(); var _marketDepth = this._trader.GetMarketDepth(this.Security).OrderByDescending(q => q.Price) .Select(q => new SampleQuote { Price = q.Price, Ask = q.OrderDirection == OrderDirections.Buy ? q.Volume : 0, Bid = q.OrderDirection == OrderDirections.Sell ? q.Volume : 0, OwnVolume = q.ExtensionInfo != null ? (int) (q.ExtensionInfo.TryGetValue("OwnVolume") ?? 0) : 0, }); this.BestBid = _marketDepth.Where(t => t.Bid != 0).Max(t => t.Price); this.BestAsk = _marketDepth.Where(t => t.Ask != 0).Min(t => t.Price); ... this.Quotes.AddRange(_marketDepth);

Слишком рано - это когда?

  1. Получал через _marketDepth.Select(q => q.BestBid). В отладчике останавливал, проверял содержимое _trader и там тоже в _marketdepth.BestBid.Price так же максимальное значение стакана..... А!!! Похоже понял - наверное это зависит от настроек вида стакана? Я привык, что у меня самая высокая цена - аск - всегда наверху - у вас судя по инструкции - наоборот. :)
  2. Т.е. возвращает полностью, как есть? Что значит "параллельно наполняется"?
ddd888
ddd888

Для верности решил изменить вид стакана как в инструкции - все равно BestBid - максимальная цена

Andrey
Andrey

Михаил, добрый день!

Если Вы здесь описывали проблему, когда робот запускает экспорт по DDE и при этом квик не успевает отреагировать быстро на нажатие всех кнопок, т.е., например, остается открытым окно настроек экспорта по DDE. У меня такая проблема возникает достаточно часто при запуске с утра. (робот сам запускается в 10-00 после автоматического подключение QUIK к серверу). Компьютер сравнительно мощный, правда на нем стоит виртуальный сервер.

Скажите, пожалуйста, фиксили ли Вы это как то в версии 2.0.1?