Здравствуйте. Ситуация такая: в роботе получаю значения 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 переписывать, но не знаю поможет или нет)