Работа с candleManager

Работа с candleManager
Atom
3/12/2010
AndreiFX


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


Tags:


Thanks:


1 2  >
Mikhail Sukhov

Avatar
Date: 3/12/2010
Reply


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

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

Thanks:

AndreiFX

Avatar
Date: 3/12/2010
Reply


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

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

           _candleManager.CandlesChanged += delegate
            {
                candles =

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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 3/12/2010
Reply


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

Thanks:

AndreiFX

Avatar
Date: 3/12/2010
Reply


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

Thanks:

Mikhail Sukhov

Avatar
Date: 3/12/2010
Reply


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

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

Thanks:

AndreiFX

Avatar
Date: 3/12/2010
Reply


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

Thanks:

AndreiFX

Avatar
Date: 3/15/2010
Reply


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

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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 3/15/2010
Reply


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

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

Thanks:

AndreiFX

Avatar
Date: 3/17/2010
Reply


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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 3/17/2010
Reply


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

Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy