Здравствуйте. Ситуация такая: в роботе получаю значения 20и последних свечек таким образом
arg.Value = TimeSpan.FromMinutes(TimeFrame); secur = Securities.FirstOrDefault(secc => secc.Code == this.sec.Text); _candleManager.RegisterTimeFrameCandles(secur, (TimeSpan)arg.Value); var candles = _candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 20);
Сначала они считались грамотно и верно, однако сегодня какая то неожиданная ошибка: последние 3 свечки не соответствуют действительности, т.е. там цена какая то не та и время свечи указано которого на текущий момент еще не было. Из за чего такое может быть?
Комментарии (11)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Так делать нельзя. Свечки формируются в параллельном потоке. Когда Вы вызываете RegisterTimeFrameCandles, запускается данный процесс. Необходимо время для окончания формирования (+ еще особенность ДДЕ Квика посылать данные не упорядоченно). Именно для этого я и сделал события СandleChanged.
Старайтесь делать следующим образом. Запускать экспорт и формирование свечек в самом старте работы. Затем, предоставлять время роботу подумать. Как вариант, не сразу запускать процесс торговли, а делать кнопку старт, которую нажимает пользователь. Человек в состоянии понять, что загружка проца упала, и что все данные перелиты. В дальнейшем, уже работать со свечками в стиле: пришло событие NewCandles, значит все свечки до только что созданных (именно что только что созданных, а не окончательно сформированных) сформировались.
Я делаю так: есть кнопка connect, dde и start При нажатии на коннект создаем экземпляр CandleManager, далее делаем дде вывод и при нажатии на start вот что прописываю:
_candleManager.RegisterTimeFrameCandles(secur, (TimeSpan)arg.Value);
_candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 20); };
А далее по коду вызываю значения этих свечек, однако все равно данные не корректные.....
Будут не корректны. Потому что вот что получается. Вы в событие об изменении одних свечек, получаете данные по другим свечкам. Которые могут быть еще не сформированны.
А есть выход? Т.е. мне нужно в любой момент времени иметь данные о 20и последних свечках, м.б. подскажите как сделать?
Есть. Вы запускаете RegisterTimeFrameCandles в момент X. Сохраните это время. Ждите, пока не появилось NewCandles для времени X + TimeFrame.
Если следовать Вашему кода, то возникает ситуация. CandlesChanges вызвалось для свечек с самого начала сессии (фактически для первых сделок). А Вы еще пытаетесь и -20 свечек взять. Влезать в вечерку пред. сессиии S# не позволяет =)
)) спасибо, попробую
Сделал вот так
_candleManager.CandlesChanged += delegate { if (ВремяНажатияПуск.AddMinutes(TimeFrame)>DateTime.Now) candles = _candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 20); };
Все заработало нормально, но один ньюанс появился. Самая последняя свечка(candles[19]) представляет собой не последнюю свечку на чарте, а предпоследнюю,т.е. текущую свечку получить не получается...
Получить можно:
_candleManager.GetTimeFrameCandles(trader.GetCandleBounds().Min)
А подскажите пожалуйста, как можно пользоваться перегрузкой GetTimeFrameCandles(Security, TimeSpan, Range((DateTime))) Т.е. я к сожалению не смог нигде найти где и как можно задать Range<DateTime> timeRange , м.б. есть какой нибудь пример?
Вообще мне это надо для того, чтобы получить все доступные свечки заданного тайм фрейма. Я так понял тут мы задаем диапазон времени и получаем все свечи из этого диапазона, так?
new GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), new Range(minDate, maxDate));
Опять непонятный косяк возник. Код, по нажатию на кнопку(нажимаем ее когда прошло уже как минимум 10 свечей с момента открытия):
ВремяНажатия=DateTime.Now; var arg = new CandleArg(); arg.Value = TimeSpan.FromMinutes(TimeFrame); _candleManager.RegisterTimeFrameCandles(secur, (TimeSpan)arg.Value);
_candleManager.NewCandles += delegate { if (ВремяНажатияПуск.AddSeconds(milsec) > DateTime.Now) return; candles = _candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 8); };
И в итоге candles выдает непонятно что... Аналогично получается если свечи получаю таким образом(когда просматриваю свечи, то получаю нормальный набор свечей,начиная с начала сессии до какого то времени(не до текущего), дальше пусто):
candles = _candleManager.GetTimeFrameCandles(secur,
TimeSpan.FromMinutes(TimeFrame),
new Range<DateTime>(secur.LastTrade.Time.Date + begin, secur.LastTrade.Time));
Причем на одном компе работает как часы, а на другом непонятно что показывает(и опять же не всегда, а к концу сессии) Версия s# 1.6(сейчас буду на 1.8 переписывать, но не знаю поможет или нет)