
NT8 > New > NinjaScript Editor > New Indicator > Next > Name: "MogalefBands" > Generate
Ctrl+E en el archivo de texto adjunto, Ctrl+A y luego Ctrl+V en NT8, y luego F5 para compilar.
Saludos!
Código: Seleccionar todo
#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
{
/// <summary>
/// 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.
/// </summary>
public class MogalefBands : Indicator
{
private Series<double> cp;
private LinReg lrg;
private StdDev dev;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Mogalef Bands indicator @byFercho v.may25";
Name = "MogalefBands";
Calculate = Calculate.OnEachTick;
IsOverlay = true;
IsSuspendedWhileInactive = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
BarsRequiredToPlot = 1;
Period = 3;
NumDev = 7;
AddPlot(Brushes.Blue, "Highest band");
AddPlot(Brushes.DodgerBlue, "Higher band");
AddPlot(Brushes.White, "Median line");
AddPlot(Brushes.IndianRed, "Lower band");
AddPlot(Brushes.Red, "Lowest band");
}
else if (State == State.DataLoaded)
{
cp = new Series<double>(this);
lrg = LinReg(cp, Period);
dev = StdDev(lrg , NumDev);
}
}
protected override void OnBarUpdate()
{
cp[0] = (Open[0] + Typical[0] + Close[0])/3;
if (CurrentBar < NumDev - 1)
return;
double lr = lrg[0], dv, lrx;
if (lr > BandLowest[1] && lr < BandHighest[1])
{
lrx = lrg[1];
dv = dev[1];
}
else
{
lrx = lr;
dv = dev[0];
}
BandHighest[0] = lrx + 2*dv;
BandHigher[0] = lrx + dv;
BandLower[0] = lrx - dv;
BandLowest[0] = lrx - 2*dv;
Median[0] = (BandHighest[0] + BandLowest[0])/2;
}
public override string FormatPriceMarker(double price)
{
return price.ToString("N3");
}
#region Properties
[Browsable(false)]
[XmlIgnore()]
public Series<double> BandHighest
{
get { return Values[0]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> BandHigher
{
get { return Values[1]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> Median
{
get { return Values[2]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> BandLower
{
get { return Values[3]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> BandLowest
{
get { return Values[4]; }
}
[Range(2, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "LinReg Period", GroupName = "NinjaScriptParameters", Order = 0)]
public int Period
{ get; set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "NumDev Period", GroupName = "NinjaScriptParameters", Order = 1)]
public int NumDev
{ get; set; }
#endregion
}
}