public override IChartInteractiveObject LoadObject(XmlElement objectNode, CandleChartControl owner, bool trimObjectsOutOfHistory = false)
        {
            var obj = new ProjectionPair();

            obj.LoadFromXML(objectNode, owner);
            obj.Owner = this;
            data.Add(obj);
            return(obj);
        }
        /// <summary>
        /// от двух пар последних точек ЗЗ построить проекции
        /// </summary>
        public void BuildSeries(ChartControl chart)
        {
            spans.data.Clear();
            //spans.ExtendYAxis = ExtendChartBounds;
            // получить точки Зиг-Зага
            var pivots = ZigZag.GetPivots(chart.StockSeries.Data.Candles, ThresholdPercent, ZigZagSourceType);
            if (pivots.Count < 3) return;
            // построить проекции
            var pointA = pivots[pivots.Count - 3];
            var pointB = pivots[pivots.Count - 2];
            var pointC = pivots[pivots.Count - 1];

            var spanA = new ProjectionPair(pointA.a, pointA.b)
                            {
                                HideFarParts = false,
                                Color = pointB.b > pointA.b ? ColorLineLower : ColorLineUpper,
                                ProjectionLength = ProjectionBars,
                                LevelsProj = LevelsProj,
                                Markers = Markers
                            };

            spanA.AddPoint(pointB.a, pointB.b);
            var spanB = new ProjectionPair(pointB.a, pointB.b)
                            {
                                HideFarParts = false,
                                Color = pointB.b < pointA.b ? ColorLineLower : ColorLineUpper,
                                ProjectionLength = ProjectionBars,
                                LevelsProj = LevelsProj,
                                Markers = Markers
                            };
            spanB.AddPoint(pointC.a, pointC.b);
            spans.data.Add(spanA);
            spans.data.Add(spanB);
            // коррекции?
            if (!CorrectionEnabled) return;
            if (correctionBcLength > 0)
            {
                var spanC = new ProjectionPair(pointB.a, pointB.b)
                                {
                                    HideFarParts = false,
                                    Color = pointB.b < pointA.b ? ColorLineLower : ColorLineUpper,
                                    ProjectionLength = CorrectionBcLength,
                                    LevelsCorr = LevelsCorr,
                                    IsExtension = false,
                                    IsCorrection = true,
                                    Markers = Markers
                                };
                spanC.AddPoint(pointC.a, pointC.b);
                spans.data.Add(spanC);
            }
            if (correctionAbLength > 0)
            {
                var spanC = new ProjectionPair(pointA.a, pointA.b)
                {
                    HideFarParts = false,
                    Color = pointB.b < pointA.b ? ColorLineLower : ColorLineUpper,
                    ProjectionLength = CorrectionAbLength,
                    LevelsCorr = LevelsCorr,
                    IsExtension = false,
                    IsCorrection = true,
                    Markers = Markers
                };
                spanC.AddPoint(pointB.a, pointB.b);
                spans.data.Add(spanC);
            }
        }
        /// <summary>
        /// добавить точку в пару, определяющую проекцию
        /// либо создать новую пару
        /// либо удалить точку (или всю пару)
        /// </summary>
        protected override void OnMouseDown(List<SeriesEditParameter> parameters,
            MouseEventArgs e, Keys modifierKeys, out IChartInteractiveObject objectToEdit)
        {
            objectToEdit = null;
            if (e.Button != MouseButtons.Left) return;
            // получить индекс свечки, в которую было попадание
            var point = GetCandlePoint(e);
            if (!point.HasValue) return;

            // перебрать все пары
            // при попадании в точку пары удалить ее
            for (var i = 0; i < data.Count; i++)
            {
                var p = data[i];
                if (p.IsInPoint(point.Value.a, point.Value.b))
                {
                    data.RemoveAt(i);
                    return;
                }
            }

            var defaultCorrectionObj = SeriesEditParameter.TryGetParamValue(parameters, "Correction");
            var defaultCorrection = defaultCorrectionObj == null ? false : (bool)defaultCorrectionObj;

            var defaultHideErrorsObj = SeriesEditParameter.TryGetParamValue(parameters, "HideMisses");
            var defaultHideErrors = defaultHideErrorsObj == null ? true : (bool)defaultHideErrorsObj;
            var defaultMarkersObj = SeriesEditParameter.TryGetParamValue(parameters, "Labels");
            var defaultMarkers = defaultMarkersObj != null ? (ProjectionPair.MarkerPlacement) defaultMarkersObj :
                ProjectionPair.MarkerPlacement.Слева;
            var levelsProjStr = SeriesEditParameter.TryGetParamValue(parameters, "ExpansionLevels", "0.618 1 1.618");
            var levelsCorrStr = SeriesEditParameter.TryGetParamValue(parameters, "CorrectionLevels", "0.236 0.382 0.618");
            var correctWithProj = SeriesEditParameter.TryGetParamValue(parameters, "CorrectionPlusProjections", false);
            var barsLength = SeriesEditParameter.TryGetParamValue(parameters, "LengthInBars", 60);

            // добавить новую пару
            var shiftPressed = ((modifierKeys & Keys.Shift) == Keys.Shift);

            var pair = new ProjectionPair(point.Value.a, point.Value.b)
                            {
                                IsCorrection = defaultCorrection ^ shiftPressed,
                                HideFarParts = defaultHideErrors ^ shiftPressed,
                                IsExtension = defaultCorrection ^ !shiftPressed,
                                Color = fiboProjectionColors[fiboProjectionColorsIndex++],
                                Markers = defaultMarkers,
                                Owner = this,
                                LevelsProj = levelsProjStr,
                                LevelsCorr = levelsCorrStr,
                                HideLine = false,
                                IsBeingCreated = true
                            };
            pair.points.Add(new Cortege2<int, float>(point.Value.a, point.Value.b));
            if (Owner.Owner.Owner.AdjustObjectColorsOnCreation)
                pair.AjustColorScheme(Owner.Owner.Owner);
            if (correctWithProj)
            {
                pair.IsCorrection = true;
                pair.IsExtension = true;
            }
            if (barsLength > 0)
                pair.ProjectionLength = barsLength;
            data.Add(pair);
            if (fiboProjectionColorsIndex >= fiboProjectionColors.Length) fiboProjectionColorsIndex = 0;
        }
 public override IChartInteractiveObject LoadObject(XmlElement objectNode, CandleChartControl owner, bool trimObjectsOutOfHistory = false)
 {
     var obj = new ProjectionPair();
     obj.LoadFromXML(objectNode, owner);
     obj.Owner = this;
     data.Add(obj);
     return obj;
 }
        /// <summary>
        /// добавить точку в пару, определяющую проекцию
        /// либо создать новую пару
        /// либо удалить точку (или всю пару)
        /// </summary>
        protected override void OnMouseDown(List <SeriesEditParameter> parameters,
                                            MouseEventArgs e, Keys modifierKeys, out IChartInteractiveObject objectToEdit)
        {
            objectToEdit = null;
            if (e.Button != MouseButtons.Left)
            {
                return;
            }
            // получить индекс свечки, в которую было попадание
            var point = GetCandlePoint(e);

            if (!point.HasValue)
            {
                return;
            }

            // перебрать все пары
            // при попадании в точку пары удалить ее
            for (var i = 0; i < data.Count; i++)
            {
                var p = data[i];
                if (p.IsInPoint(point.Value.a, point.Value.b))
                {
                    data.RemoveAt(i);
                    return;
                }
            }

            var defaultCorrectionObj = SeriesEditParameter.TryGetParamValue(parameters, "Correction");
            var defaultCorrection    = defaultCorrectionObj == null ? false : (bool)defaultCorrectionObj;

            var defaultHideErrorsObj = SeriesEditParameter.TryGetParamValue(parameters, "HideMisses");
            var defaultHideErrors    = defaultHideErrorsObj == null ? true : (bool)defaultHideErrorsObj;
            var defaultMarkersObj    = SeriesEditParameter.TryGetParamValue(parameters, "Labels");
            var defaultMarkers       = defaultMarkersObj != null ? (ProjectionPair.MarkerPlacement)defaultMarkersObj :
                                       ProjectionPair.MarkerPlacement.Слева;
            var levelsProjStr   = SeriesEditParameter.TryGetParamValue(parameters, "ExpansionLevels", "0.618 1 1.618");
            var levelsCorrStr   = SeriesEditParameter.TryGetParamValue(parameters, "CorrectionLevels", "0.236 0.382 0.618");
            var correctWithProj = SeriesEditParameter.TryGetParamValue(parameters, "CorrectionPlusProjections", false);
            var barsLength      = SeriesEditParameter.TryGetParamValue(parameters, "LengthInBars", 60);

            // добавить новую пару
            var shiftPressed = ((modifierKeys & Keys.Shift) == Keys.Shift);

            var pair = new ProjectionPair(point.Value.a, point.Value.b)
            {
                IsCorrection   = defaultCorrection ^ shiftPressed,
                HideFarParts   = defaultHideErrors ^ shiftPressed,
                IsExtension    = defaultCorrection ^ !shiftPressed,
                Color          = fiboProjectionColors[fiboProjectionColorsIndex++],
                Markers        = defaultMarkers,
                Owner          = this,
                LevelsProj     = levelsProjStr,
                LevelsCorr     = levelsCorrStr,
                HideLine       = false,
                IsBeingCreated = true
            };

            pair.points.Add(new Cortege2 <int, float>(point.Value.a, point.Value.b));
            if (Owner.Owner.Owner.AdjustObjectColorsOnCreation)
            {
                pair.AjustColorScheme(Owner.Owner.Owner);
            }
            if (correctWithProj)
            {
                pair.IsCorrection = true;
                pair.IsExtension  = true;
            }
            if (barsLength > 0)
            {
                pair.ProjectionLength = barsLength;
            }
            data.Add(pair);
            if (fiboProjectionColorsIndex >= fiboProjectionColors.Length)
            {
                fiboProjectionColorsIndex = 0;
            }
        }