← 返回

Работа с candleManager

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

登录创建账户, 登录或注册以发表评论

Mikhail Sukhov
Mikhail Sukhov

Так делать нельзя. Свечки формируются в параллельном потоке. Когда Вы вызываете RegisterTimeFrameCandles, запускается данный процесс. Необходимо время для окончания формирования (+ еще особенность ДДЕ Квика посылать данные не упорядоченно). Именно для этого я и сделал события СandleChanged.

Старайтесь делать следующим образом. Запускать экспорт и формирование свечек в самом старте работы. Затем, предоставлять время роботу подумать. Как вариант, не сразу запускать процесс торговли, а делать кнопку старт, которую нажимает пользователь. Человек в состоянии понять, что загружка проца упала, и что все данные перелиты. В дальнейшем, уже работать со свечками в стиле: пришло событие NewCandles, значит все свечки до только что созданных (именно что только что созданных, а не окончательно сформированных) сформировались.

AndreiFX
AndreiFX 作者

Я делаю так: есть кнопка connect, dde и start При нажатии на коннект создаем экземпляр CandleManager, далее делаем дде вывод и при нажатии на start вот что прописываю:

_candleManager.RegisterTimeFrameCandles(secur, (TimeSpan)arg.Value);

           _candleManager.CandlesChanged += delegate
            {
                candles =

_candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 20); };

А далее по коду вызываю значения этих свечек, однако все равно данные не корректные.....

Mikhail Sukhov
Mikhail Sukhov

Будут не корректны. Потому что вот что получается. Вы в событие об изменении одних свечек, получаете данные по другим свечкам. Которые могут быть еще не сформированны.

AndreiFX
AndreiFX 作者

А есть выход? Т.е. мне нужно в любой момент времени иметь данные о 20и последних свечках, м.б. подскажите как сделать?

Mikhail Sukhov
Mikhail Sukhov

Есть. Вы запускаете RegisterTimeFrameCandles в момент X. Сохраните это время. Ждите, пока не появилось NewCandles для времени X + TimeFrame.

Если следовать Вашему кода, то возникает ситуация. CandlesChanges вызвалось для свечек с самого начала сессии (фактически для первых сделок). А Вы еще пытаетесь и -20 свечек взять. Влезать в вечерку пред. сессиии S# не позволяет =)

AndreiFX
AndreiFX 作者

)) спасибо, попробую

AndreiFX
AndreiFX 作者

Сделал вот так

_candleManager.CandlesChanged += delegate { if (ВремяНажатияПуск.AddMinutes(TimeFrame)>DateTime.Now) candles = _candleManager.GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), 20); };

Все заработало нормально, но один ньюанс появился. Самая последняя свечка(candles[19]) представляет собой не последнюю свечку на чарте, а предпоследнюю,т.е. текущую свечку получить не получается...

Mikhail Sukhov
Mikhail Sukhov

Получить можно:

_candleManager.GetTimeFrameCandles(trader.GetCandleBounds().Min)

AndreiFX
AndreiFX 作者

А подскажите пожалуйста, как можно пользоваться перегрузкой GetTimeFrameCandles(Security, TimeSpan, Range((DateTime))) Т.е. я к сожалению не смог нигде найти где и как можно задать Range<DateTime> timeRange , м.б. есть какой нибудь пример?

Вообще мне это надо для того, чтобы получить все доступные свечки заданного тайм фрейма. Я так понял тут мы задаем диапазон времени и получаем все свечи из этого диапазона, так?

Mikhail Sukhov
Mikhail Sukhov

new GetTimeFrameCandles(secur, TimeSpan.FromMinutes(TimeFrame), new Range(minDate, maxDate));

AndreiFX
AndreiFX 作者

Опять непонятный косяк возник. Код, по нажатию на кнопку(нажимаем ее когда прошло уже как минимум 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 переписывать, но не знаю поможет или нет)