private void button8_Click(object sender, EventArgs e)
        {
            var obj = new ChartEllipse(chart1, new DPoint(1, 1), new DSize(7, 4));

            obj.Text      = "ddd";
            obj.Font      = new Font("Courier New", 14);
            obj.TextBrush = new SolidBrush(Color.Red);
            obj.IsFilled  = true;
            obj.FillBrush = new SolidBrush(Color.Blue);
            chart1.PinMovableObjectAndAdd(obj);
        }
        /// <summary>
        /// Получить описывающий
        /// </summary>
        /// <param name="candles"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private ChartEllipse BuildInclusiveEllipse(StockSeriesData candles, int start, int end)
        {
            if (start == end)
            {
                return(null);
            }
            float startvalue, endvalue;

            if (candles[start].high > candles[end].high)
            {
                startvalue = candles[start].high;
                endvalue   = candles[end].low;
            }
            else
            {
                startvalue = candles[start].low;
                endvalue   = candles[end].high;
            }
            var A = new PointD(start, Convert.ToDouble(startvalue));
            var B = new PointD(end, Convert.ToDouble(endvalue));
            var C = new PointD();

            double angle;
            float  cx, cy, a, b;
            var    S = float.NaN;
            bool   correctEllipse = false;

            // поиск охватывающего эллипса
            for (var i = start; i <= end; i++)
            {
                var d = new PointD(i, Convert.ToDouble(candles[i].high));
                correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy);
                if (float.IsNaN(S) || (correctEllipse && S < b))
                {
                    S = b;
                    C = d;
                }

                d = new PointD(i, Convert.ToDouble(candles[i].low));
                correctEllipse = Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), d.ToPointF(), out angle, out a, out b, out cx, out cy);
                if (float.IsNaN(S) || (correctEllipse && S < b))
                {
                    S = b;
                    C = d;
                }
            }

            correctEllipse = // пересчитываем параметры эллипса
                             Geometry.GetEllipseParams(A.ToPointF(), B.ToPointF(), C.ToPointF(), out angle, out a, out b, out cx, out cy);
            if (correctEllipse)
            {   // можно построить эллипс - рисуем его
                var newEllipse = new ChartEllipse {
                    BuildTangent = true, angle = angle, a = a, b = b, cx = cx, cy = cy
                };

                newEllipse.AddPoint((float)A.X, (float)A.Y);
                newEllipse.AddPoint((float)B.X, (float)B.Y);
                newEllipse.AddPoint((float)C.X, (float)C.Y);

                var minIndex = newEllipse.points.Min(p => p.X);
                newEllipse.DateStart = owner.StockSeries.GetCandleOpenTimeByIndex((int)minIndex);
                return(newEllipse);
            }
            return(null);
        }