Работа с candleManager


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


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

Thanks:
1 2  >

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

loading
clippy