IvanB
|
Дата: 08.08.2013
pft_man Вот на этой строке получается вот такой exception. ... Проблема возникла, после того, как при обращении к предыдущей свечке в начале торгов выпадало null exception. После чего я пришёл к мысли, что со строками для тестовых торгов он тогда на часовках в 10-ть утра обращается к 9-ти часовой свечке, которой естественно нет. Когда убрал эти строки для тестовых торгов, стал выпадать Invalid OperationException. Где собака порылась? Нужно просмотреть содержимое поля StackTrace в свойствах исключения (2й скрин предыдущего сообщения).
|
|
Спасибо:
|
|
|
|
|
pft_man
|
Дата: 10.08.2013
Какая-то мистика, открыл проект, хотел посмотреть StackTrace этой ошибки, а она больше не возникает. Посмотрим, что будет дальше.
|
|
Спасибо:
|
|
|
|
|
pft_man
|
Дата: 15.08.2013
В общем, ошибка всё ещё есть. Она появляется, когда я запускаю проект в нерабочее время биржи. Но ведь я не могу расширить это время, поскольку тогда свечки тоже будут браться в нерабочее время! В чём может быть проблема?
|
|
Спасибо:
|
|
|
|
|
IvanB
|
Дата: 15.08.2013
pft_man В общем, ошибка всё ещё есть. Она появляется, когда я запускаю проект в нерабочее время биржи. Но ведь я не могу расширить это время, поскольку тогда свечки тоже будут браться в нерабочее время! В чём может быть проблема? Нужно проверять наличие доступных свечей и других объектов, при попытке работать с ними, сам API этого не делает в большинстве случаев.
|
|
Спасибо:
|
|
|
|
|
pft_man
|
Дата: 16.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, то всё работает, если нет, то генерится исключение.
|
|
Спасибо:
|
|
|
|
|
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 приложения начинает переподключение, пока подключится, пока начнётся экспорт пройдёт какое-то время, которое мы упустим, так? То есть если я хочу, чтобы сразу же первая сделка пришла в стратегию с началом торгов, мне нужно поменять соответствующее свойство у трейдера?
В общем, да, процесс подключения начинается, как только текущая дата-время попадает на торгуемый период в расписании. Код
/// <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 Спасибо, что копаетесь в моих проектах )
Пожалуйста, обращайтесь.
|
|
Спасибо:
|
|
|
|