#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
}
}