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


Теги:


Спасибо:




11 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

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

Спасибо:

AndreiFX

Фотография
Дата: 12.03.2010
Ответить


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

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

_candleManager.CandlesChanged += delegate
{
candles =
_candleManager.GetTimeFrameCandles(secur,
TimeSpan.FromMinutes(TimeFrame), 20);
};

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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

Спасибо:

AndreiFX

Фотография
Дата: 12.03.2010
Ответить


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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 12.03.2010
Ответить


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

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

Спасибо:

AndreiFX

Фотография
Дата: 12.03.2010
Ответить


))
спасибо, попробую
Автор топика
Спасибо:

AndreiFX

Фотография
Дата: 15.03.2010
Ответить


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

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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 15.03.2010
Ответить


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

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

Спасибо:

AndreiFX

Фотография
Дата: 17.03.2010
Ответить


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.03.2010
Ответить


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

Спасибо:

AndreiFX

Фотография
Дата: 14.04.2010
Ответить


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


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy