private void PlotViewModel_KeyDown(object sender, OxyKeyEventArgs e)
 {
     if (e.Key == OxyKey.R && e.ModifierKeys == OxyModifierKeys.None)
     {
         AdjustYAxisZoom();
         PlotViewModel.InvalidatePlot(false);
     }
 }
        public void UpdateChart()
        {
            if (Thread.CurrentThread != Dispatcher.Thread)
            {
                Dispatcher.BeginInvoke(new Action(UpdateChart));
                return;
            }

            //--- remove all series
            PlotViewModel.Series.Clear();
            while (Drawer.Candles.MoveNext())
            {
                this.Candles.Items.Add(new ChartBar(Drawer.Candles.Current));
                this.Volumes.Items.Add(new ChartBarVol(Drawer.Candles.Current)
                {
                });
            }

            //create exes
            CreateAxes();

            //---
            if (Candles.Items.Count > 0)
            {
                PlotViewModel.Series.Add(Candles);
                PlotViewModel.Series.Add(Volumes);
                //draw volumes
                //PlotViewModel.Series.Add(Volumes);
            }

            //-----------------  HORIZONTAL LINES --------------
            var levels = new List <double>(Drawer.HorizontalLines);

            levels.Sort();
            for (int l = 1; l < levels.Count; l++)
            {
                if (levels[l] - levels[l - 1] < 0.00001)
                {
                    levels[l] = levels[l - 1] + 0.00001;
                }
            }

            foreach (var level in levels)
            {
                //if (level < range.High + range.Length && level > range.Low - range.Length)
                {
                    LineSeriesEx line = new LineSeriesEx(false)
                    {
                        MarkerStrokeThickness = 1,
                        LineStyle             = LineStyle.Solid,
                        Color           = OxyColor.FromArgb(200, 1, 1, 200),
                        StrokeThickness = 0.5f,
                    };

                    line.Points.Add(new DataPoint(0, level));
                    line.Points.Add(new DataPoint(PlotViewModel.Axes[0].Maximum - 1, level));
                    PlotViewModel.Series.Add(line);
                }
            }

            //----------------- lines ----------------------
            this.Lines.Clear();
            foreach (var line in Drawer.Lines.Concat(Drawer.VerticalLines))
            {
                var          ingnoreZoom = Drawer.VerticalLines.Contains(line);
                LineSeriesEx lineserie   = new LineSeriesEx(ingnoreZoom)
                {
                    MarkerStrokeThickness = 2,
                    LineStyle             = LineStyle.Solid,
                    Color           = OxyColor.FromArgb(line.Color.A, line.Color.R, line.Color.G, line.Color.B),
                    StrokeThickness = 3f,
                    YAxisKey        = line.AxisId ?? this.Candles_Yaxis.Key
                };

                lineserie.Points.AddRange(
                    line.Points.Select(dot => new DataPoint(dot.X.ToAxisDouble(), dot.Y)));
                PlotViewModel.Series.Add(lineserie);
                this.Lines.Add(lineserie);
            }

            //-------plot points ---------------
            var pointsSerie = new OxyPlot.Series.ScatterSeries()
            {
                MarkerSize = 15, MarkerType = MarkerType.Circle
            };

            for (int p = 0; p < Drawer.Points.Count; p++)
            {
                pointsSerie.Points.Add(
                    new ScatterPoint(Drawer.Points[p].Time.ToAxisDouble(), Drawer.Points[p].Value, 5));
            }
            PlotViewModel.Series.Add(pointsSerie);

            //---------- ADJUST X to show 100 candles

            PlotViewModel.Axes[0].Minimum = Drawer.InitialView.start.ToAxisDouble();
            PlotViewModel.Axes[0].Maximum = Drawer.InitialView.end.ToAxisDouble();
            PlotViewModel.Axes[0].Reset();


            //--------- ADJUST Y
            AdjustYAxisZoom();
            PlotViewModel.InvalidatePlot(true);
            return;
        }