← Назад

InvalidOperationException

Вот на этой строке получается вот такой 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. Где собака порылась?

Комментарии (8)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

IvanB
IvanB

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

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

pft_man
pft_man Автор

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

pft_man
pft_man Автор

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

IvanB
IvanB

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

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

pft_man
pft_man Автор

Да я понял уже, что при обращении к любому объекту желательно проверять, что там не 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, то всё работает, если нет, то генерится исключение.

IvanB
IvanB

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

pft_man
pft_man Автор

IvanB: pft_man

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

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

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

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

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

IvanB
IvanB

pft_man: ... При запуске для стратегии мне нужна история предыдущих свечек (в стратегии есть индикаторы), которые я и вывожу на график. Ну и чтобы постоянно апдейтить последнюю свечку, использую GetCandleBounds, который и вызывает ошибку при запуске. В общем буду наверное стараться запускать стратегию только во время работы биржи. Если реагировать на события, например на поступление свечи, использовать обработчики исключений (try-catch), и делать проверки, то система вполне может работать автономно, все дело в отладке, механизм нужно отладить. pft_man: Ещё, кстати, связанный с этим такой вопрос. Если в свойствах переподключения указано время работы биржи, как происходит переподключение утром? Ровно в 10-00, когда приходит это самое время, Trader приложения начинает переподключение, пока подключится, пока начнётся экспорт пройдёт какое-то время, которое мы упустим, так? То есть если я хочу, чтобы сразу же первая сделка пришла в стратегию с началом торгов, мне нужно поменять соответствующее свойство у трейдера? В общем, да, процесс подключения начинается, как только текущая дата-время попадает на торгуемый период в расписании.

		/// <summary>
		/// Проверить, является ли время торгуемым (началась ли сессия, не закончилась ли, нет ли клиринга).
		/// </summary>
		/// <param name="workingTime">Информация о режиме работы биржи.</param>
		/// <param name="dateTime">Передаваемое время, которое нужно проверить.</param>
		/// <returns>True, если торгуемое время, иначе, неторгуемое.</returns>
		public static bool IsTradeTime(this WorkingTime workingTime, DateTime dateTime)
		{
			var isWorkingDay = workingTime.IsTradeDate(dateTime.Date);

			if (!isWorkingDay)
				return false;

			var time = dateTime.TimeOfDay;
			var timeBounds = workingTime.Times;

			return timeBounds.IsEmpty() || timeBounds.Any(r => r.Contains(time));
		}

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

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