private void OnChartPanelSubscribeCandleElement(ChartCandleElement element, CandleSeries candleSeries) { _drawTimer.Cancel(); _elements.Add(new RefPair <IChartElement, int>(element, 0)); _drawTimer.Activate(); }
private void AddElement(IChartElement element, CandleSeries candleSeries) { if (!_isLoaded || candleSeries == null) { return; } _changedElements.Add(element); _skipElements.Add(element); _drawTimer.Activate(); }
private void ProcessCandle(CandleSeries series, Candle candle) { // возможно была задержка в получении данных и обработаны еще не все данные if (!_isStarted) { this.GuiAsync(() => IsStarted = true); } _timer.Activate(); _candlesCount++; // ограничиваем кол-во передаваемых свечек, чтобы не фризился интерфейс if (_candlesCount % 100 == 0) { System.Threading.Thread.Sleep(200); } var candleSeries = (CandleSeries)_bufferedChart.GetSource(_candleElement); if (series == candleSeries) { var values = new Dictionary <IChartElement, object>(); lock (_syncRoot) { foreach (var element in _bufferedChart.Elements.Where(e => _bufferedChart.GetSource(e) == series)) { if (_skipElements.Contains(element)) { continue; } element.DoIf <IChartElement, ChartCandleElement>(e => values.Add(e, candle)); element.DoIf <IChartElement, ChartIndicatorElement>(e => values.Add(e, CreateIndicatorValue(e, candle))); } } _bufferedChart.Draw(candle.OpenTime, values); if (series.Security is ContinuousSecurity) { // для непрерывных инструментов всегда приходят данные по одной серии // но инструмент у свечки будет равен текущему инструменту ProcessContinuousSourceElements(candle); } } else { // для индексов будут приходить отдельные свечки для каждого инструмента ProcessIndexSourceElements(candle); } }