#region Using declarations using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Gui; using NinjaTrader.Gui.Chart; using NinjaTrader.Gui.SuperDom; using NinjaTrader.Gui.Tools; using NinjaTrader.Data; using NinjaTrader.NinjaScript; using NinjaTrader.Core.FloatingPoint; using NinjaTrader.NinjaScript.DrawingTools; #endregion namespace NinjaTrader.NinjaScript.Indicators { /// ////This indicator created by Price Headley is described in his book “Big Trends in Trading“. ////It acts as a enveloppe bands indicator. It can be used in any timeframe on typical 20 and 80 periods. ////It is more effective on stocks trading. ////The wider the bands are, greater is the volatility and you should expect trend continuation. ////Buy signals are taken while the price make consecutive upper bands piercing. /// public class HeadleyBands : Indicator { private Series upper; private Series lower; private int period; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Price Headley Bands"; Name = "HeadleyBands"; IsOverlay = true; IsSuspendedWhileInactive = true; Period = 20; AddPlot(Brushes.Crimson, "BUP"); AddPlot(Brushes.Crimson, "BDOWN"); } if (State == State.DataLoaded) { upper = new Series(this); lower = new Series(this); } } protected override void OnBarUpdate() { upper[0] = (High[0]*(1+2*(((High[0]-Low[0])/((High[0]+Low[0])/2))*1000)*0.001)); BUP[0] = SMA(upper,Period)[0]; lower[0] = (Low[0]*(1-2*(((High[0]-Low[0])/((High[0]+Low[0])/2))*1000)*0.001)); BDOWN[0] = SMA(lower,Period)[0]; } #region Properties [Range(1, int.MaxValue), NinjaScriptProperty] [Display(ResourceType = typeof(Custom.Resource), Name = "Period", GroupName = "NinjaScriptParameters", Order = 0)] public int Period { get; set; } [Browsable(false)] [XmlIgnore()] public Series BUP { get { return Values[1]; } } [Browsable(false)] [XmlIgnore()] public Series BDOWN { get { return Values[0]; } } #endregion } } #region NinjaScript generated code. Neither change nor remove. namespace NinjaTrader.NinjaScript.Indicators { public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase { private HeadleyBands[] cacheHeadleyBands; public HeadleyBands HeadleyBands(int period) { return HeadleyBands(Input, period); } public HeadleyBands HeadleyBands(ISeries input, int period) { if (cacheHeadleyBands != null) for (int idx = 0; idx < cacheHeadleyBands.Length; idx++) if (cacheHeadleyBands[idx] != null && cacheHeadleyBands[idx].Period == period && cacheHeadleyBands[idx].EqualsInput(input)) return cacheHeadleyBands[idx]; return CacheIndicator(new HeadleyBands(){ Period = period }, input, ref cacheHeadleyBands); } } } namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns { public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase { public Indicators.HeadleyBands HeadleyBands(int period) { return indicator.HeadleyBands(Input, period); } public Indicators.HeadleyBands HeadleyBands(ISeries input , int period) { return indicator.HeadleyBands(input, period); } } } namespace NinjaTrader.NinjaScript.Strategies { public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase { public Indicators.HeadleyBands HeadleyBands(int period) { return indicator.HeadleyBands(Input, period); } public Indicators.HeadleyBands HeadleyBands(ISeries input , int period) { return indicator.HeadleyBands(input, period); } } } #endregion