Пытаюсь работать со свечками. Рисовать на графике я их не хочу, просто хочу например выводить время закрытия законченной свечи тайм-фрейма 1 мин в ListBox, то есть например чтобы раз в минуту появлялась запись о сформировавшейся свече. Для этого я делаю _candleManager.Processing += PrintCandle;
И в процедуре PrintCandle у меня только это:
if (candle.State == CandleStates.Finished) { this.GuiAsync(() => MyList.Items.Add(candle.CloseTime + " " + candle.ClosePrice)); }
При этом в ListBox валятся свечки, во первых исторические (так как они подпадают под условие законченности), а также текущая свеча выводится многократно с предыдущей, типа такого:
14.11.2013 18:31:00 143520 14.11.2013 18:32:00 143460 14.11.2013 18:31:00 143520 14.11.2013 18:32:00 143460 14.11.2013 18:31:00 143520 14.11.2013 18:32:00 143460 14.11.2013 18:31:00 143520 14.11.2013 18:32:00 143460
Подскажите, что я делаю не так, как сделать, чтобы видеть только одну запись раз в минуту по окончанию свечи и не грузить исторические, ну или грузить заданное их количество.
Спасибо.
Kommentare (10)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Ok, спрошу по другому. PrintCandle как я понял вызывается несколько раз в секунду конструкцией _candleManager.Processing += PrintCandle;
Соответственно туда передаются все полученные свечки, как я понял и новые и исторические.
Мне нужно как то в MyList выводить только уникальную новую свечку после ее формирования, то есть один раз в TimeFrame.
Коннектор SmartCom если что.
Как то сложно, а syncToken откуда берется?
А если вам не сложно, можете пояснить физику процесса, что происходит при вызове _candleManager.Processing += PrintCandle; ?
Из мануалов - это подписывание на событие появления нового элемента для обработки, который мы передаем в процедуру PrintCandle, где и обрабатываем. А что туда фактически передается и когда во времени? Правильно ли я понимаю, что любое изменение состояния свечи (по сути любая сделка) вызывает это событие? Если так, то как мне в процедуре обработку написать так, чтобы я видел скажем Close последних N полных завершенных свечей, а текущую - не видел, чтобы она появлялась только в момент своего завершения.
На 100% не уверен, но с 4.2 скорее всего этот метод более не нужен. Причина - события ITrader вызываются из одного потока по умолчанию. Если это не менять, то и синхронизация не нужна.
Дюшес, спасибо за разъяснения!
Но тогда, как понимать то, что я описал в начале этой темы? Почему, когда с каждым тиком, когда вызывается processing и передает моему обработчику candle, т.е. текущую свечу, я по конструкции if (candle.State == CandleStates.Finished) { this.GuiAsync(() => MyList.Items.Add(candle.CloseTime + " " + candle.ClosePrice)); }
вижу чередование текущей и предыдущей?
Вот, код тестовый минимальный, коннект, подписка и вывод. Для версии API 4.1.19, в последней что то пока не разобрался в изменениях, свечки вообще не появляются. Код внутри обработки события OnClick кнопки. На форме только одна эта кнопка и лист-бокс MyList в который все выводится.
Спасибо, я вроде более менее подразобрался. У меня не то чтобы не работало, более теоретический был вопрос, что валится после вызова обработчика _candleManager.Processing += PrintCandle. Просто если не указывать в _candleManager.Start(_series) временные рамки, то валится кроме текущих свечей еще ряд исторических свечей заданного таймфрема в обработчик. Вот это меня и смущало - валилось куча свечек разных. Но во-первых можно указать временные рамки, во вторых я научился их запихивать в List и уже там анализировать и выводить когда мне нужно.