private void TicksToCandles(string data) { var ticks = ((List <Tick>) new XmlSerializer(typeof(List <Tick>), new XmlRootAttribute("ticks")).Deserialize( new StringReader(data))).Where(item => item.Board == _board && item.Seccode == _seccode) .ToList(); if (_ticks == null) { _ticks = ticks; } else { _ticks.AddRange(ticks); } var interval = new TimeSpan(0, _timeframe, 0); var temp = (from t in _ticks group t by DateTime.Parse(t.Tradetime).Ticks / interval.Ticks into g select new Candle { High = (from t2 in g select t2.Price).Max(), Low = (from t2 in g select t2.Price).Min(), Open = g.First().Price, Close = g.Last().Price, Volume = g.Count(), Time = g.First().Tradetime }).ToList(); foreach (var candle in temp) { if (candle.Open < candle.Close) { candle.StickColor = System.Windows.Media.Brushes.Green; } else { candle.StickColor = System.Windows.Media.Brushes.Red; } } if (Candles.Count == _historyCount) { var realtime = Candles.ToList(); realtime.AddRange(temp); Candles = new ObservableCollection <Candle>(realtime); return; } //todo : create value if u use some math or other operatin which dublicated var qqqqq = temp.Count + _historyCount; if (qqqqq == Candles.Count) { _dispatcher.Invoke(() => Candles[Candles.Count - 1] = temp.Last()); } else if (qqqqq == Candles.Count + 1) { _dispatcher.Invoke(() => Candles.Add(temp.Last())); } else { Candles = new ObservableCollection <Candle>(temp); } }