#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 { /// /// The Mogalef Bands indicator is a technical analysis tool used to identify potential /// price reversals and trends in financial markets. /// The bands expand and contract based on market volatility, providing visual cues for traders. /// public class MogalefBands : Indicator { private Series cp; private LinReg f; private StdDev e; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Mogalef Bands indicator @byFercho"; Name = "MogalefBands"; Calculate = Calculate.OnEachTick; IsOverlay = true; IsSuspendedWhileInactive = true; ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right; LinP = 3; StdP = 7; AddPlot(Brushes.Blue, "BandHigh"); AddPlot(Brushes.DarkGray, "BandMedHigh"); AddPlot(Brushes.Green, "Median"); AddPlot(Brushes.DarkGray, "BandMedLow"); AddPlot(Brushes.Red, "BandLow"); } else if (State == State.DataLoaded) { cp = new Series(this); f = LinReg(cp, LinP); e = StdDev(f , StdP); } } protected override void OnBarUpdate() { cp[0] = (Open[0] + High[0] + Low[0] + 2*Close[0])/5; if (CurrentBar < StdP - 1) return; if (f[0] < BandHigh[1] && f[0] > BandLow[1]) { BandHigh[0] = f[1] + 2*e[1]; BandMedHigh[0] = f[1] + e[1]; BandMedLow[0] = f[1] - e[1]; BandLow[0] = f[1] - 2*e[1]; } else { BandHigh[0] = f[0] + 2*e[0]; BandMedHigh[0] = f[0] + e[0]; BandMedLow[0] = f[0] - e[0]; BandLow[0] = f[0] - 2*e[0]; } Median[0] = (BandHigh[0] + BandLow[0])/2; } #region Properties [Browsable(false)] [XmlIgnore()] public Series BandHigh { get { return Values[0]; } } [Browsable(false)] [XmlIgnore()] public Series BandMedHigh { get { return Values[1]; } } [Browsable(false)] [XmlIgnore()] public Series Median { get { return Values[2]; } } [Browsable(false)] [XmlIgnore()] public Series BandMedLow { get { return Values[3]; } } [Browsable(false)] [XmlIgnore()] public Series BandLow { get { return Values[4]; } } [Range(1, int.MaxValue), NinjaScriptProperty] [Display(ResourceType = typeof(Custom.Resource), Name = "LinReg Period", GroupName = "NinjaScriptParameters", Order = 0)] public int LinP { get; set; } [Range(1, int.MaxValue), NinjaScriptProperty] [Display(ResourceType = typeof(Custom.Resource), Name = "StdDev Period", GroupName = "NinjaScriptParameters", Order = 1)] public int StdP { get; set; } #endregion } }