Вот на этой строке получается вот такой exception.
var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(candle.Security);
Интересно то, что если добавить
siCandleSeries.WorkingTime.Times[0].Min = TimeSpan.FromHours(0); // для тестовых торгов
siCandleSeries.WorkingTime.Times[0].Max = TimeSpan.FromHours(24); // для тестовых торгов
то всё работает. Более того, запуская в 1:30 ночи и поставив Min FromHours(2), exception снова выскакивает. Запускаю на рабочем (не тестовом) квике. Ещё интересно то, что на фьючерсах SBER и LKOH такого не наблюдается, только на Si.
Проблема возникла, после того, как при обращении к предыдущей свечке в начале торгов выпадало null exception. После чего я пришёл к мысли, что со строками для тестовых торгов он тогда на часовках в 10-ть утра обращается к 9-ти часовой свечке, которой естественно нет. Когда убрал эти строки для тестовых торгов, стал выпадать Invalid OperationException. Где собака порылась?
Comments (8)
Login or Create account, Log in or register to leave a comment
Нужно просмотреть содержимое поля StackTrace в свойствах исключения (2й скрин предыдущего сообщения).
Какая-то мистика, открыл проект, хотел посмотреть StackTrace этой ошибки, а она больше не возникает. Посмотрим, что будет дальше.
В общем, ошибка всё ещё есть. Она появляется, когда я запускаю проект в нерабочее время биржи. Но ведь я не могу расширить это время, поскольку тогда свечки тоже будут браться в нерабочее время! В чём может быть проблема?
Нужно проверять наличие доступных свечей и других объектов, при попытке работать с ними, сам API этого не делает в большинстве случаев.
Да я понял уже, что при обращении к любому объекту желательно проверять, что там не null, но здесь-то ошибка явно в другом. Используется только один объект candle, который корректно передаётся и он не null. Там первая свеча дня, со всеми значениями high, low и тд, я проверял, почему тогда метод GetCandleBounds генерит исключение Sequence contains no matching element? Какой ряд, какой элемент, чему соответствие...
p.s. мучился, мучился, в итоге пришёл к выводу, что нужно смотреть, как устроен timeFrame.GetCandleBounds в Ecng.ComponentModel, но к сожалению на codeplex открытых кодов для компонентов Ecng я не нашёл.
p.s.s. коротко об ошибке - если у candle.Security время запуска проекта приходится на working time у этой Security, то всё работает, если нет, то генерится исключение.
pft_man Воспроизвести ошибку не получилось. запускал до 10-00 по Москве. Ошибка генерируется в методе GetCandleBounds, Вы правильно заметили. Вообще, конечно, логично, что этот метод не должен работать вне торгового периода, но, конечно оповещать об этом, следовало специальным исключением. В данном случае нужно, либо проверять торговое время биржи, и если мы не в нем, то не выполнять код, либо поставить обработчик исключений try-catch, и при возникновении исключения, не выполнять дальнейший код (return).
Только моя стратегия работает на часовиках и запускать я её хочу в любое время, хоть ночью. Я хочу иметь возможность ночью / в выходные выключить приложение, посмотреть результаты торгов, посмотреть, что всё корректно отторговалось (входы и выходы были как в тестах в wealthlab), а потом, не дожидаясь новых торгов, снова запустить стратегию.
При запуске для стратегии мне нужна история предыдущих свечек (в стратегии есть индикаторы), которые я и вывожу на график. Ну и чтобы постоянно апдейтить последнюю свечку, использую GetCandleBounds, который и вызывает ошибку при запуске. В общем буду наверное стараться запускать стратегию только во время работы биржи.
Ещё, кстати, связанный с этим такой вопрос. Если в свойствах переподключения указано время работы биржи, как происходит переподключение утром? Ровно в 10-00, когда приходит это самое время, Trader приложения начинает переподключение, пока подключится, пока начнётся экспорт пройдёт какое-то время, которое мы упустим, так? То есть если я хочу, чтобы сразу же первая сделка пришла в стратегию с началом торгов, мне нужно поменять соответствующее свойство у трейдера?
Спасибо, что копаетесь в моих проектах )
Пожалуйста, обращайтесь.