CODE FOR NINJATRADER

Code presented in the article “Indicator Rules for Swing Trading Strategy, Part 2” by Sylvain Vervoort, in the June 2013 issue of Technical Analysis of Stocks & Commodities magazine.

the file “SVEHLZZperc.zip” can also be downloaded by right-clicking here and saving the file.

// NinjaTrader script
// SVEHLZZPercent is Copyright (C) 2012, Sylvain Vervoort <stocata.org>.
// stocata.org/S. Vervoort reserve the right to modify this indicator with each release.
// Release V1.0 October 2012.

#region Using declarations
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Data;
using NinjaTrader.Gui.Chart;
#endregion

// This namespace holds all indicators and is required. Do not change it.
namespace NinjaTrader.Indicator
{
    /// <summary>
    /// High-Low ZigZag indicator.
    /// </summary>
    [Description("High-Low ZigZag indicator")]
    public class SVEHLZZPercent : Indicator
    {
		// ---------------------------------------------------------------------------------
        #region Variables
		
			private double	ZZPercent		=	5;	
			private int		ATRPeriod		=	5;
			private double	ATRFactor		=	1.5;
			private Color	zigZagColor		=	Color.DodgerBlue;
		
			private int	linewidth	= 1;	
			private int	trend;			// confirmed trend of current zigzag, 1=up, -1=down
			private int	lhb;  			// last high bar count of last swing high
			private int		uplineid;		// last used up line (name) id
			private int	llb;  			// last low bar count of last swing low
			private int		downlineid;		// last used down line name
		    private double	hh;			// New Higher high
		    private double	ll;			// New lower low
			private double	HLPivot;			// The high-low pivot level switch

		#endregion

   // ----------------------------------------------------------------------------------------
	 /// <summary>
    /// Method used to configure the indicator and only called once before any data is loaded.
    /// </summary>
    protected override void Initialize()
    {
      CalculateOnBarClose	= true;		// Calculate on completed bar only
		AutoScale				= false;		// Auto scaling done by price data
      Overlay				= true;			// Overlay on price data
    }
	
	// --------------------------------------------------------------------------------
    /// <summary>
    /// Method called on each bar update event (incoming tick)
    /// </summary>
    protected override void OnBarUpdate()
    {		
	if (CurrentBar < 1)	// minimum 2 bars required
		{
		ll = Low[0];	
		hh = High[0];
		llb = lhb = 0;
		uplineid = downlineid = CurrentBar;
		trend = 1;		// just assume trend is up at start
		return;
		}
	
	// ATR factor = 0, only use percent setting
	if (ATRFactor == 0) HLPivot = (ZZPercent*0.01);
	// Zigzag percent = 0, only use ATR
	else if (ZZPercent == 0) HLPivot = ATR(ATRPeriod)[0]/Close[0]*ATRFactor;
	// Use both influences
	else HLPivot = ZZPercent*0.01 + ATR(ATRPeriod)[0]/Close[0]*ATRFactor;
	
	// --------------------------------------------------------------------------------
	// look for swing points and draw lines
	// trend is up, look for new swing low
	if (trend > 0)		
		{
		if (High[0] >= hh)
			{	
				// new higher high detected
				hh = High[0];
				lhb = CurrentBar;
				// RemoveDrawObject("uplineid.ToString");
				// Not required, handled by drawing line with the same name id
				DrawLine(uplineid.ToString(), AutoScale, CurrentBar-llb, ll,
				CurrentBar-lhb, hh, zigZagColor, DashStyle.Solid, linewidth);
			}
		else if (Low[0] < hh - hh*HLPivot)
			{	
				// found a swing low
				ll = Low[0];
				llb = CurrentBar;
				downlineid = CurrentBar;
				trend = -1;
				DrawLine(downlineid.ToString(), AutoScale, CurrentBar-lhb, hh,
				CurrentBar-llb, ll, zigZagColor, DashStyle.Solid, linewidth);
			}
		}
	
	// else trend is down, look for new swing high
	else
	{
	if (Low[0] <= ll) 
		{
			// new lower low detected
			ll = Low[0];
			llb = CurrentBar;
			// RemoveDrawObject("downlineid.ToString");
			// Not required, handled by drawing line with the same name id
			DrawLine(downlineid.ToString(), AutoScale, CurrentBar-lhb, hh,
			CurrentBar-llb, ll, zigZagColor, DashStyle.Solid, linewidth);
		}
	else if (High[0] > ll + ll*HLPivot) 
	  {
		// found a swing high
		hh = High[0];
		lhb = CurrentBar;
		uplineid = CurrentBar;
		trend = 1;
		DrawLine(uplineid.ToString(), AutoScale, CurrentBar-llb, ll,
		CurrentBar-lhb, hh, zigZagColor, DashStyle.Solid, linewidth);
	  }
	}
  }	
 
// -----------------------------------------------------------------------------
        #region Properties

        [Description("ZigZag percent influence DEF = 5%, 0 = NO influence")]
        [Category("Parameters")]
        public double __ZigZag__Percentage
        {
            get { return ZZPercent; }
            set { ZZPercent = Math.Max(0, value); }
        }
		
		[Description("ATR Look back Period DEFAULT = 5")]
        [Category("Parameters")]
        public int _ATR__Period
        {
            get { return ATRPeriod; }
            set { ATRPeriod = Math.Max(1, value); }
        }
		
		[Description("ZigZag ATR factor DEF = 1.5, 0 means NO influence")]
        [Category("Parameters")]
        public double _ATR_Factor
        {
            get { return ATRFactor; }
            set { ATRFactor = Math.Max(0, value); }
        }
		
		[Description("Color of the individual zigzag lines DEFAULT = DodgerBlue")]
		[Category("Parameters")]
		public Color ZigZag_Color
		{
			get { return zigZagColor; }
			set { zigZagColor = value; }
		}
		
		[Browsable(false)]
		public string PainttrendcolorSerialize
		{
    		get { return NinjaTrader.Gui.Design.SerializableColor.ToString(zigZagColor); }
    		set { zigZagColor = NinjaTrader.Gui.Design.SerializableColor.FromString(value); }
		}

        #endregion
 }
}