/// <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)); } } } }
/// <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)); } }
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)); }