Trading algorítmico para .NET e Python✦86+ conectores · bolsas · corretoras · cripto✦S#.Designer · backtest · otimizar · ao vivo✦Uma comunidade de 31,458+ traders e desenvolvedores✦Trading algorítmico para .NET e Python✦86+ conectores · bolsas · corretoras · cripto✦S#.Designer · backtest · otimizar · ao vivo✦Uma comunidade de 31,458+ traders e desenvolvedores✦
Но мне пока с WPF экспериментировать рано..
Особой разницы в коде подключения не вижу, похоже дело именно в работе
с другими окошками из окошечного либо консольного приложения..
Кстати, у меня аналогичная проблема - Sample нормально работает, а
SampleConsole - нет. StartDde() дает такую же ошибку, а
StartDde(string или array) - "нет ссылки на объект". Может это связано
с изменением логики работы метода StartDde? Раньше в 1.8 таких
проблем не было. Можно увидеть код этого метода?
SystemNullReferenceException: В экземпляре объекта не задана ссылка на
объект.
Далее указание на строку:
trader.StartDde(new[] { trader.SecuritiesTable,
trader.MyTradesTable });
Еще такой вопрос. Если добавлять какие-нибудь манипуляции со стаканом
(Quotes), типа Max(t=t>t.Price), то иногда в этом месте возникает
исключение "последовательность не содержит элементов". Пробовал
поставить тест на null или Count=0, но исключение все равно
появляется. Из-за чего это происходит и как этого избежать?
Но тогда должна работать проверка на null? Еще раз проверил
аналогичную ситуацию на 1.8 - там такая ошибка обычно иногда возникает
при первичном запуске стакана, но раз запустившись потом никогда не
появляется. В 2.0.1 она возникает периодически уже при открытом
стакане. У меня GetMarketDepth изменилась логика?
Обновление стакана у меня происходит по событию
GetMarketDepth(this.Security).Changed
Вот во время периодического обновления иногда и выскакивает эта
ошибка.
опять-таки иногда при инициализации стакана выскакивает ошибка
"последовательность не содержит соответствующего элемента". В отладке
при этом this.Security - вроде вполне нормально загруженный.
Заметил такую особенность - пока все сделки до конца не подгрузились в
S#, при открытии стакана GetMarketDepth может вызывать ошибку
("последовательность не содержит элементов"). А RegisterQuotes -
"последовательность не содержит соответствующего элемента".
Да, я уже писал о присутствующей ошибке в запуске ДДЕ. Это она. Квик
загружен, а S# - нет. S# нажимает на кнопки и ожидает моментального
появления окон. Квик же думает, и не всегда может реагировать
моментально. Я бы исправил ошибку, если бы она стабильно возникала. Но
дело в том, что на моем компе она не возникает практически никогда
(да, я шустр!).
Да, Вам больше повезло! Хотя вроде у меня тоже комп не слабый. :)
При первичном запуске стакана такая ошибка некритична. Хуже когда она
возникает уже в процессе от метода GetMarketDepth. В 1.8. такого точно
ни разу не было, а сейчас почему-то есть. При этом никак не могу
понять такое поведение. Вот, например код:
И когда возникает ошибка ("последовательность не содержит элементов"),
смотрю куда она указывает и вот странность: каждый раз она указывает
на разные строки! Как это может быть? Ведь если коллекция пустая, то
ошибка всегда должна появляться на 1-й же строке, т.е. здесь например
на 801-й?
Стоп, Вы не разделяете проблемы. Есть ошибка с запуском ДДЕ. Я уже
описал симптомы. А есть по работе со стаканом. Я пока не могу понять,
у меня она или у Вас.
Лучший бид и аск вычисляются и так стаканом.
Ошибки могут быть на разных строчках, если, например, биды
заполнены, а офера еще нет.
Еще рас прочитал, что Вы писал выше. MarketDepth.Changed вызывается
при любом изменении стакана. Пришла новая котировка и т.д. Тоесть,
стакан может быть даже не заполнен, а событие будет выведено. По
вышепреведенному коду могу сказать, что Вам нужно событие
ITrader.QuotesChanged потому что Вам нужно вычислять по всему стакану
(иначе, просто код бессмыслен - вычисление будет показывать ерунду по
неполному стакану). Скорее всего, в этом и ошибка. И это точно не
зависит от версии.
Да, я понимаю, что это уже другая проблема. Про событие QuotesChanged
и MarketDepth.Changed тоже помню, но как это влияет на метод
GetMarketDepth?
Лучший бид и аск я стал так выводить потому, что у Вас BestBid и
BestAsk на самом деле выводят максимальную и минимальные цены стакана
почему-то.
Получается, что GetMarketDepth может выводить стакан не полностью
в зависимости от того на какое событие QuotesChanged и
MarketDepth.Changed подписался?
Что-то не так внутри метода GetMarketDepth? Как я понял, проблема с
наружи - использование результатов этого метода. Что делать, если
программа пытается обратиться к стакану слишком рано?
Ни разу такое не встречал. Как это проверили?
GetMarketDepth возвращает всегда стакан. И этот стакан параллельно
наполняется QuikTrader.
GetMarketDepth у меня вызывается по событию GetMarketDepth.Change. Там
же в коде я пытаюсь получить дополнительные данные из уже раз
вызванного GetMarketDepth. И в ходе торгов, когда экспорт уже давно
запущен и выскакивает периодически эта ошибка. Сам код примерно такой:
Получал через _marketDepth.Select(q => q.BestBid). В отладчике
останавливал, проверял содержимое _trader и там тоже в
_marketdepth.BestBid.Price так же максимальное значение стакана.....
А!!! Похоже понял - наверное это зависит от настроек вида стакана? Я
привык, что у меня самая высокая цена - аск - всегда наверху - у вас
судя по инструкции - наоборот. :)
Т.е. возвращает полностью, как есть? Что значит "параллельно
наполняется"?
Если Вы здесь описывали проблему, когда робот запускает экспорт по DDE
и при этом квик не успевает отреагировать быстро на нажатие всех
кнопок, т.е., например, остается открытым окно настроек экспорта по
DDE.
У меня такая проблема возникает достаточно часто при запуске с утра.
(робот сам запускается в 10-00 после автоматического подключение QUIK
к серверу).
Компьютер сравнительно мощный, правда на нем стоит виртуальный сервер.
Скажите, пожалуйста, фиксили ли Вы это как то в версии 2.0.1?
Utilizamos cookies para garantir a melhor experiência em nosso site. Ao continuar a usar nosso site, você concorda com o uso de cookies.
Comentários (33)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
Запускать экспорт нужно только после событие Connected.
Это событие не наступает.
Пример Sample пробовали? Там как раз по такому сценарию. Он работает? Значит наступает.
Разумеется, правда SampleConsole. При запуске примера также не наступает событие Connected.
При этом никакие эксепшены или ошибочные события не появляются..
Что может влиять? Версия квик 5.16.0.145
А Квик вообще запущен? Подключен к торгам?
Да, квик запущен. К торгам подключен.
А если запустить Sample? Я консоль не проверял.
А вот Sample работает.
Но мне пока с WPF экспериментировать рано.. Особой разницы в коде подключения не вижу, похоже дело именно в работе с другими окошками из окошечного либо консольного приложения..
Что-нибудь посоветуете?
QuikTrader не зависит от консоли или WPF - ему без разницы.
Кстати, у меня аналогичная проблема - Sample нормально работает, а SampleConsole - нет. StartDde() дает такую же ошибку, а StartDde(string или array) - "нет ссылки на объект". Может это связано с изменением логики работы метода StartDde? Раньше в 1.8 таких проблем не было. Можно увидеть код этого метода?
Нет ссылки на объект - приведите полный текст.
SystemNullReferenceException: В экземпляре объекта не задана ссылка на объект. Далее указание на строку: trader.StartDde(new[] { trader.SecuritiesTable, trader.MyTradesTable });
это скорее всего то, что trader null. Это уж совсем не зависит от события Connected =)
Так почему же он null? Это в Вашем же примере в Sample Console происходит! Кстати, а когда именно возникает событие Connected?
Если это мой пример, то тогда надо посмотреть в чем бага.
Событие Connected вызывается сразу после соединения с Квиком.
Под "соединением" имеется ввиду соединение через Trans2quik или подключение через DDE?
Первое.
Взглянул на пример. Оформлен неправильно. Дде стартует до того, как было произведено подключение. Вы это учитываете?
Нет, в примере, я ничего от себя не добавлял. Т.е. StartDde надо тоже "засунуть" под событие Connected?
Еще такой вопрос. Если добавлять какие-нибудь манипуляции со стаканом (Quotes), типа Max(t=t>t.Price), то иногда в этом месте возникает исключение "последовательность не содержит элементов". Пробовал поставить тест на null или Count=0, но исключение все равно появляется. Из-за чего это происходит и как этого избежать?
Из-за того, что стакан еще пуст.
Но тогда должна работать проверка на null? Еще раз проверил аналогичную ситуацию на 1.8 - там такая ошибка обычно иногда возникает при первичном запуске стакана, но раз запустившись потом никогда не появляется. В 2.0.1 она возникает периодически уже при открытом стакане. У меня GetMarketDepth изменилась логика?
Периодически - это как? По таймеру? Или пользователь что-то кликает? Или в стратегии?
Обновление стакана у меня происходит по событию GetMarketDepth(this.Security).Changed Вот во время периодического обновления иногда и выскакивает эта ошибка.
Заметил такую особенность - пока все сделки до конца не подгрузились в S#, при открытии стакана GetMarketDepth может вызывать ошибку ("последовательность не содержит элементов"). А RegisterQuotes - "последовательность не содержит соответствующего элемента".
Да, я уже писал о присутствующей ошибке в запуске ДДЕ. Это она. Квик загружен, а S# - нет. S# нажимает на кнопки и ожидает моментального появления окон. Квик же думает, и не всегда может реагировать моментально. Я бы исправил ошибку, если бы она стабильно возникала. Но дело в том, что на моем компе она не возникает практически никогда (да, я шустр!).
Да, Вам больше повезло! Хотя вроде у меня тоже комп не слабый. :) При первичном запуске стакана такая ошибка некритична. Хуже когда она возникает уже в процессе от метода 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-й?
Стоп, Вы не разделяете проблемы. Есть ошибка с запуском ДДЕ. Я уже описал симптомы. А есть по работе со стаканом. Я пока не могу понять, у меня она или у Вас.
Еще рас прочитал, что Вы писал выше. MarketDepth.Changed вызывается при любом изменении стакана. Пришла новая котировка и т.д. Тоесть, стакан может быть даже не заполнен, а событие будет выведено. По вышепреведенному коду могу сказать, что Вам нужно событие ITrader.QuotesChanged потому что Вам нужно вычислять по всему стакану (иначе, просто код бессмыслен - вычисление будет показывать ерунду по неполному стакану). Скорее всего, в этом и ошибка. И это точно не зависит от версии.
Да, я понимаю, что это уже другая проблема. Про событие QuotesChanged и MarketDepth.Changed тоже помню, но как это влияет на метод GetMarketDepth?
Что-то не так внутри метода GetMarketDepth? Как я понял, проблема с наружи - использование результатов этого метода. Что делать, если программа пытается обратиться к стакану слишком рано?
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);
Слишком рано - это когда?
Для верности решил изменить вид стакана как в инструкции - все равно BestBid - максимальная цена
Михаил, добрый день!
Если Вы здесь описывали проблему, когда робот запускает экспорт по DDE и при этом квик не успевает отреагировать быстро на нажатие всех кнопок, т.е., например, остается открытым окно настроек экспорта по DDE. У меня такая проблема возникает достаточно часто при запуске с утра. (робот сам запускается в 10-00 после автоматического подключение QUIK к серверу). Компьютер сравнительно мощный, правда на нем стоит виртуальный сервер.
Скажите, пожалуйста, фиксили ли Вы это как то в версии 2.0.1?