InvalidOperationException
Atom Ответить
07.08.2013


Вот на этой строке получается вот такой 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. Где собака порылась?
error.jpg 17,6KB (0) error1.jpg 58,4KB (0)

Теги:


Спасибо:




8 Ответов
IvanB

Фотография
Дата: 08.08.2013
Ответить


pft_man Перейти
Вот на этой строке получается вот такой exception.
...
Проблема возникла, после того, как при обращении к предыдущей свечке в начале торгов выпадало null exception. После чего я пришёл к мысли, что со строками для тестовых торгов он тогда на часовках в 10-ть утра обращается к 9-ти часовой свечке, которой естественно нет. Когда убрал эти строки для тестовых торгов, стал выпадать Invalid OperationException. Где собака порылась?


Нужно просмотреть содержимое поля StackTrace в свойствах исключения (2й скрин предыдущего сообщения).
Спасибо:

pft_man

Фотография
Курсы
Дата: 10.08.2013
Ответить


Какая-то мистика, открыл проект, хотел посмотреть StackTrace этой ошибки, а она больше не возникает. Посмотрим, что будет дальше.
Автор топика
Спасибо:

pft_man

Фотография
Курсы
Дата: 14.08.2013
Ответить


В общем, ошибка всё ещё есть. Она появляется, когда я запускаю проект в нерабочее время биржи. Но ведь я не могу расширить это время, поскольку тогда свечки тоже будут браться в нерабочее время! В чём может быть проблема?
error.jpg 142,4KB (0)
Автор топика
Спасибо:

IvanB

Фотография
Дата: 15.08.2013
Ответить


pft_man Перейти
В общем, ошибка всё ещё есть. Она появляется, когда я запускаю проект в нерабочее время биржи. Но ведь я не могу расширить это время, поскольку тогда свечки тоже будут браться в нерабочее время! В чём может быть проблема?


Нужно проверять наличие доступных свечей и других объектов, при попытке работать с ними, сам API этого не делает в большинстве случаев.
Спасибо:

pft_man

Фотография
Курсы
Дата: 15.08.2013
Ответить


Да я понял уже, что при обращении к любому объекту желательно проверять, что там не null, но здесь-то ошибка явно в другом. Используется только один объект candle, который корректно передаётся и он не null. Там первая свеча дня, со всеми значениями high, low и тд, я проверял, почему тогда метод GetCandleBounds генерит исключение Sequence contains no matching element? Какой ряд, какой элемент, чему соответствие...

Код

private void siDraw(Candle candle)
{
     // временные рамки свечи
     var candleBounds = ((TimeSpan)candle.Arg).GetCandleBounds(candle.Security);

     if (candle.State == CandleStates.Finished || candle.OpenTime >= candleBounds.Min)
     {
          // что-то делаем
     }
}


p.s. мучился, мучился, в итоге пришёл к выводу, что нужно смотреть, как устроен timeFrame.GetCandleBounds в Ecng.ComponentModel, но к сожалению на codeplex открытых кодов для компонентов Ecng я не нашёл.

p.s.s. коротко об ошибке - если у candle.Security время запуска проекта приходится на working time у этой Security, то всё работает, если нет, то генерится исключение.
error.jpg 343,8KB (0)
Автор топика
Спасибо:

IvanB

Фотография
Дата: 16.08.2013
Ответить


pft_man
Воспроизвести ошибку не получилось. запускал до 10-00 по Москве.
Ошибка генерируется в методе GetCandleBounds, Вы правильно заметили.
Вообще, конечно, логично, что этот метод не должен работать вне торгового периода, но, конечно оповещать об этом, следовало специальным исключением.
В данном случае нужно, либо проверять торговое время биржи, и если мы не в нем, то не выполнять код, либо поставить обработчик исключений try-catch, и при возникновении исключения, не выполнять дальнейший код (return).

Спасибо:

pft_man

Фотография
Курсы
Дата: 16.08.2013
Ответить


IvanB Перейти
pft_man

Вообще, конечно, логично, что этот метод не должен работать вне торгового периода, но, конечно оповещать об этом, следовало специальным исключением.
(return).



Только моя стратегия работает на часовиках и запускать я её хочу в любое время, хоть ночью. Я хочу иметь возможность ночью / в выходные выключить приложение, посмотреть результаты торгов, посмотреть, что всё корректно отторговалось (входы и выходы были как в тестах в wealthlab), а потом, не дожидаясь новых торгов, снова запустить стратегию.

При запуске для стратегии мне нужна история предыдущих свечек (в стратегии есть индикаторы), которые я и вывожу на график. Ну и чтобы постоянно апдейтить последнюю свечку, использую GetCandleBounds, который и вызывает ошибку при запуске. В общем буду наверное стараться запускать стратегию только во время работы биржи.

Ещё, кстати, связанный с этим такой вопрос. Если в свойствах переподключения указано время работы биржи, как происходит переподключение утром? Ровно в 10-00, когда приходит это самое время, Trader приложения начинает переподключение, пока подключится, пока начнётся экспорт пройдёт какое-то время, которое мы упустим, так? То есть если я хочу, чтобы сразу же первая сделка пришла в стратегию с началом торгов, мне нужно поменять соответствующее свойство у трейдера?

Спасибо, что копаетесь в моих проектах )
Автор топика
Спасибо:

IvanB

Фотография
Дата: 16.08.2013
Ответить


pft_man Перейти

...
При запуске для стратегии мне нужна история предыдущих свечек (в стратегии есть индикаторы), которые я и вывожу на график. Ну и чтобы постоянно апдейтить последнюю свечку, использую GetCandleBounds, который и вызывает ошибку при запуске. В общем буду наверное стараться запускать стратегию только во время работы биржи.

Если реагировать на события, например на поступление свечи, использовать обработчики исключений (try-catch), и делать проверки, то система вполне может работать автономно, все дело в отладке, механизм нужно отладить.
pft_man Перейти

Ещё, кстати, связанный с этим такой вопрос. Если в свойствах переподключения указано время работы биржи, как происходит переподключение утром? Ровно в 10-00, когда приходит это самое время, Trader приложения начинает переподключение, пока подключится, пока начнётся экспорт пройдёт какое-то время, которое мы упустим, так? То есть если я хочу, чтобы сразу же первая сделка пришла в стратегию с началом торгов, мне нужно поменять соответствующее свойство у трейдера?

В общем, да, процесс подключения начинается, как только текущая дата-время попадает на торгуемый период в расписании.


pft_man Перейти

Спасибо, что копаетесь в моих проектах )


Пожалуйста, обращайтесь.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy