code:
amespace NinjaTrader.NinjaScript.Indicators
{
public class TmaZones : Indicator
{
private Series<double> trendBreak;
private Series<double> upperBandOffset;
private Series<double> lowerBandOffset;
private bool stackedDown, stackedUp;
private bool CrossLower = false;
private bool CrossHigher = false;
private double sumC = 0.0;
private double sumW = 0.0;
private double rngV = 0.0;
private bool previousClosesAbove;
private bool previousClosesBelow;
protected override void OnStateChange()
{
if(State == State.SetDefaults)
{
Description = @"";
Name = "TmaZones";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = false;
DrawVerticalGridLines = false;
PaintPriceMarkers = false;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
IsSuspendedWhileInactive = true;
atrPeriod = 100;
atrFactor = 2.618;
halfLength = 20;
AddPlot(new Stroke(Brushes.Sienna, 2), PlotStyle.Line, "UpperBand"); //Sienna
AddPlot(new Stroke(Brushes.Gray, 1), PlotStyle.Line, "MiddlBand");
AddPlot(new Stroke(Brushes.MediumSeaGreen, 2), PlotStyle.Line, "LowerBand"); //Medium Sea Green
}
else if(State == State.Configure)
{
if(ChartBars != null)
{
ZOrder = ChartBars.ZOrder - 1;
}
lowerBandOffset = new Series<double>(this);
upperBandOffset = new Series<double>(this);
CrossLower = false;
CrossHigher = false;
}
else if (State == State.DataLoaded)
{
trendBreak = new Series<double>(this);
}
}
protected override void OnBarUpdate()
{
if(CurrentBar < halfLength + 1) return;
if(State != State.Realtime && !IsFirstTickOfBar) return;
for(int i=halfLength; i>=0; i--)
{
sumC = (halfLength+1) * Close[i];
sumW = (halfLength+1);
int k = halfLength;
for(int j=1; j<=halfLength; j++)
{
if(i+j > CurrentBar) break;
sumC += k * Close[i+j];
sumW += k;
if(j<=i)
{
sumC += k * Close[i-j];
sumW += k;
}
k--;
}
rngV = ATR(atrPeriod)[i] * atrFactor;
MiddlBand[i] = sumC / sumW;
UpperBand[i] = MiddlBand[i] + rngV;
LowerBand[i] = MiddlBand[i] - rngV;
LowerBandOffset[i] = (LowerBand[i] + (5 * TickSize));
UpperBandOffset[i] = (UpperBand[i] - (5 * TickSize));
}
if (CrossBelow(Low, LowerBand, 2) && (CrossAbove(Low, LowerBand, 1)))
{
ctrendBreak[0] = 1;
}
if (CrossAbove(High, UpperBand, 2) && (CrossBelow(High, UpperBand, 1)))
{
trendBreak[0] = -1;
}
}
Comment