/// <summary>
        /// #ENS#
        /// </summary>
        /// <param name="chartControl"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        public override void GetMinMaxValues(Gui.Chart.ChartControl chartControl, ref double min, ref double max)
        {
            if (BarsArray[0] == null || ChartControl == null)
            {
                return;
            }

            for (int seriesCount = 0; seriesCount < Values.Length; seriesCount++)
            {
                for (int idx = this.FirstBarIndexPainted; idx <= this.LastBarIndexPainted; idx++)
                {
                    if (zigZagHighZigZags.IsValidPlot(idx) && zigZagHighZigZags.Get(idx) != 0)
                    {
                        max = Math.Max(max, zigZagHighZigZags.Get(idx));
                    }
                    if (zigZagLowZigZags.IsValidPlot(idx) && zigZagLowZigZags.Get(idx) != 0)
                    {
                        min = Math.Min(min, zigZagLowZigZags.Get(idx));
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// </summary>
        /// <param name="chartControl"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public override string ChartLabel(Gui.Chart.ChartControl chartControl, DateTime time)
        {
            switch (Period.BasePeriodType)
            {
            case PeriodType.Day: return(time.ToString(chartControl.LabelFormatDay, Cbi.Globals.CurrentCulture));

            case PeriodType.Minute: return(time.ToString(chartControl.LabelFormatMinute, Cbi.Globals.CurrentCulture));

            case PeriodType.Month: return(time.ToString(chartControl.LabelFormatMonth, Cbi.Globals.CurrentCulture));

            case PeriodType.Second: return(time.ToString(chartControl.LabelFormatSecond, Cbi.Globals.CurrentCulture));

            case PeriodType.Tick: return(time.ToString(chartControl.LabelFormatTick, Cbi.Globals.CurrentCulture));

            case PeriodType.Volume: return(time.ToString(chartControl.LabelFormatTick, Cbi.Globals.CurrentCulture));

            case PeriodType.Week: return(time.ToString(chartControl.LabelFormatDay, Cbi.Globals.CurrentCulture));

            case PeriodType.Year: return(time.ToString(chartControl.LabelFormatYear, Cbi.Globals.CurrentCulture));

            default: return(time.ToString(chartControl.LabelFormatDay, Cbi.Globals.CurrentCulture));
            }
        }
Example #3
0
        protected override void OnRender(Gui.Chart.ChartControl chartControl, Gui.Chart.ChartScale chartScale)
        {
            if (Bars == null || chartControl == null || startIndex == int.MinValue)
            {
                return;
            }

            IsValidDataPointAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0));             // Make sure indicator is calculated until last (existing) bar
            int preDiff = 1;

            for (int i = ChartBars.FromIndex - 1; i >= 0; i--)
            {
                if (i - Displacement < startIndex || i - Displacement > Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0))
                {
                    break;
                }

                bool isHigh = zigZagHighZigZags.IsValidDataPointAt(i - Displacement);
                bool isLow  = zigZagLowZigZags.IsValidDataPointAt(i - Displacement);

                if (isHigh || isLow)
                {
                    break;
                }

                preDiff++;
            }

            preDiff -= (Displacement < 0 ? Displacement : 0 - Displacement);

            int postDiff = 0;

            for (int i = ChartBars.ToIndex; i <= zigZagHighZigZags.Count; i++)
            {
                if (i - Displacement < startIndex || i - Displacement > Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0))
                {
                    break;
                }

                bool isHigh = zigZagHighZigZags.IsValidDataPointAt(i - Displacement);
                bool isLow  = zigZagLowZigZags.IsValidDataPointAt(i - Displacement);

                if (isHigh || isLow)
                {
                    break;
                }

                postDiff++;
            }

            postDiff += (Displacement < 0 ? 0 - Displacement : Displacement);

            int    lastIdx   = -1;
            double lastValue = -1;

            SharpDX.Direct2D1.PathGeometry g    = null;
            SharpDX.Direct2D1.GeometrySink sink = null;

            for (int idx = ChartBars.FromIndex - preDiff; idx <= ChartBars.ToIndex + postDiff; idx++)
            {
                if (idx < startIndex || idx > Bars.Count - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 2 : 1) || idx < Math.Max(BarsRequiredToPlot - Displacement, Displacement))
                {
                    continue;
                }

                bool isHigh = zigZagHighZigZags.IsValidDataPointAt(idx);
                bool isLow  = zigZagLowZigZags.IsValidDataPointAt(idx);

                if (!isHigh && !isLow)
                {
                    continue;
                }

                double value = isHigh ? zigZagHighZigZags.GetValueAt(idx) : zigZagLowZigZags.GetValueAt(idx);

                if (lastIdx >= startIndex)
                {
                    float x1 = (chartControl.BarSpacingType == BarSpacingType.TimeBased || chartControl.BarSpacingType == BarSpacingType.EquidistantMulti && idx + Displacement >= ChartBars.Count
                                                ? chartControl.GetXByTime(ChartBars.GetTimeByBarIdx(chartControl, idx + Displacement))
                                                : chartControl.GetXByBarIndex(ChartBars, idx + Displacement));
                    float y1 = chartScale.GetYByValue(value);

                    if (sink == null)
                    {
                        float x0 = (chartControl.BarSpacingType == BarSpacingType.TimeBased || chartControl.BarSpacingType == BarSpacingType.EquidistantMulti && lastIdx + Displacement >= ChartBars.Count
                                                ? chartControl.GetXByTime(ChartBars.GetTimeByBarIdx(chartControl, lastIdx + Displacement))
                                                : chartControl.GetXByBarIndex(ChartBars, lastIdx + Displacement));
                        float y0 = chartScale.GetYByValue(lastValue);
                        g    = new SharpDX.Direct2D1.PathGeometry(Core.Globals.D2DFactory);
                        sink = g.Open();
                        sink.BeginFigure(new SharpDX.Vector2(x0, y0), SharpDX.Direct2D1.FigureBegin.Hollow);
                    }
                    sink.AddLine(new SharpDX.Vector2(x1, y1));
                }

                // Save as previous point
                lastIdx   = idx;
                lastValue = value;
            }

            if (sink != null)
            {
                sink.EndFigure(SharpDX.Direct2D1.FigureEnd.Open);
                sink.Close();
            }

            if (g != null)
            {
                var oldAntiAliasMode = RenderTarget.AntialiasMode;
                RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive;
                RenderTarget.DrawGeometry(g, Plots[0].BrushDX, Plots[0].Width, Plots[0].StrokeStyle);
                RenderTarget.AntialiasMode = oldAntiAliasMode;
                g.Dispose();
                RemoveDrawObject("NinjaScriptInfo");
            }
            else
            {
                Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.ZigZagDeviationValueError, TextPosition.BottomRight);
            }
        }
 /// <summary>
 /// </summary>
 /// <param name="chartControl"></param>
 /// <param name="time"></param>
 /// <returns></returns>
 public override string ChartLabel(Gui.Chart.ChartControl chartControl, DateTime time)
 {
     return(time.ToString(chartControl.LabelFormatTick, Cbi.Globals.CurrentCulture));
 }