Пытаюсь работать со свечками. Рисовать на графике я их не хочу, просто хочу например выводить время закрытия законченной свечи тайм-фрейма 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
Подскажите, что я делаю не так, как сделать, чтобы видеть только одну запись раз в минуту по окончанию свечи и не грузить исторические, ну или грузить заданное их количество.
Спасибо.
コメント (10)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
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 и уже там анализировать и выводить когда мне нужно.