#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.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
//This namespace holds Indicators in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Indicators
{
public class Zombie3SMI : Indicator
{
private const string SystemVersion = "v1.001";
private const string SystemName = "Zombie3SMI";
private const string FullSystemName = SystemName + " - " + SystemVersion;
private int range = 13;
private int emaperiod1 = 25;
private int emaperiod2 = 2;
private int smiemaperiod= 5;
private Series<double> sms;
private Series<double> hls;
private Series<double> smis;
Brush smiChangeColor = Brushes.Transparent;
Brush smiBullishColor = Brushes.Transparent;
Brush smiBearishColor = Brushes.Transparent;
const int SMIChangePlotIndex = 0;
const int SMIBullishPlotIndex = 1;
const int SMIBearishPlotIndex = 2;
public override string DisplayName
{
get { return FullSystemName; }
}
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = SystemName;
Description = FullSystemName;
Calculate = Calculate.OnPriceChange;
IsOverlay = false;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = false;
DrawVerticalGridLines = false;
PaintPriceMarkers = false;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
IsSuspendedWhileInactive = true;
AddPlot(new Stroke(Brushes.DimGray, 3), PlotStyle.Line, "SMIChange");
AddPlot(new Stroke(Brushes.RoyalBlue, 3), PlotStyle.Line, "SMIBullish");
AddPlot(new Stroke(Brushes.DarkOrange, 3), PlotStyle.Line, "SMIBearish");
AddPlot(new Stroke(Brushes.DimGray, 1), PlotStyle.Line, "SMIEMA");
AddLine(new Stroke(Brushes.DimGray, DashStyleHelper.Dash, 1), 0, "ZeroLine");
AddLine(new Stroke(Brushes.DimGray, DashStyleHelper.Dash, 1), 40, "OBLine");
AddLine(new Stroke(Brushes.DimGray, DashStyleHelper.Dash, 1), -40, "OSLine");
}
else if (State == State.Configure)
{
//stochastic momentums
sms = new Series<double>(this);
//high low diffs
hls = new Series<double>(this);
//stochastic momentum indexes
smis = new Series<double>(this);
}
else if (State == State.DataLoaded)
{
smiChangeColor = Plots[SMIChangePlotIndex].Brush;
smiBullishColor = Plots[SMIBullishPlotIndex].Brush;
smiBearishColor = Plots[SMIBearishPlotIndex].Brush;
}
}
protected override void OnBarUpdate()
{
if (( CurrentBar < emaperiod2) || ( CurrentBar < emaperiod1))
{
return;
}
//Stochastic Momentum = SM {distance of close - midpoint}
sms[0] = (Close[0] - 0.5 * ((MAX(High, range)[0] + MIN(Low, range)[0])));
//High low diffs
hls[0] = (MAX(High, range)[0] - MIN(Low, range)[0]);
//Stochastic Momentum Index = SMI
double denom = 0.5*EMA(EMA(hls,emaperiod1),emaperiod2)[0];
smis[0] = (100*(EMA(EMA(sms,emaperiod1),emaperiod2))[0] / (denom ==0 ? 1 : denom ));
//Set the current SMI line value
SMIChange[0] = (smis[0]);
double currentSMIValue = SMIChange[0];
double previousSMIValue = SMIChange[1];
bool smiSlopeBullish = (currentSMIValue >= previousSMIValue);
//EMA1Change[0] = currentEMA1Value;
if (smiSlopeBullish)
{
PlotBrushes[SMIChangePlotIndex][0] = smiBullishColor;
}
else
{
PlotBrushes[SMIChangePlotIndex][0] = smiBearishColor;
}
//Set the line value for the SMIEMA by taking the EMA of the SMI
SMIEMA[0] = (EMA(smis, smiemaperiod)[0]);
}
#region Properties
[NinjaScriptProperty]
[Display(Name = "IndicatorName", GroupName = "0) Indicator Information", Order = 0)]
public string IndicatorName
{
get { return FullSystemName; }
set { }
}
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="EMAPeriod1", Description="1st ema smothing period. ( R )", Order=1, GroupName="Parameters")]
public int EMAPeriod1
{
get { return emaperiod1; }
set { emaperiod1 = value; }
}
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="EMAPeriod2", Description="2nd ema smoothing period. ( S )", Order=2, GroupName="Parameters")]
public int EMAPeriod2
{
get { return emaperiod2; }
set { emaperiod2 = value; }
}
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Range", Description="Range for momentum Calculation ( Q )", Order=3, GroupName="Parameters")]
public int Range
{
get { return range; }
set { range = value ; }
}
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="SMIEMAPeriod", Description="SMI EMA smoothing period", Order=4, GroupName="Parameters")]
public int SMIEMAPeriod
{
get { return smiemaperiod; }
set { smiemaperiod = value; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SMIChange
{
get { return Values[0]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> SMIBullish
{
get { return Values[1]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> SMIBearish
{
get { return Values[2]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> SMIEMA
{
get { return Values[3]; }
}
#endregion
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private Zombie3SMI[] cacheZombie3SMI;
public Zombie3SMI Zombie3SMI(string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
return Zombie3SMI(Input, indicatorName, eMAPeriod1, eMAPeriod2, range, sMIEMAPeriod);
}
public Zombie3SMI Zombie3SMI(ISeries<double> input, string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
if (cacheZombie3SMI != null)
for (int idx = 0; idx < cacheZombie3SMI.Length; idx++)
if (cacheZombie3SMI[idx] != null && cacheZombie3SMI[idx].IndicatorName == indicatorName && cacheZombie3SMI[idx].EMAPeriod1 == eMAPeriod1 && cacheZombie3SMI[idx].EMAPeriod2 == eMAPeriod2 && cacheZombie3SMI[idx].Range == range && cacheZombie3SMI[idx].SMIEMAPeriod == sMIEMAPeriod && cacheZombie3SMI[idx].EqualsInput(input))
return cacheZombie3SMI[idx];
return CacheIndicator<Zombie3SMI>(new Zombie3SMI(){ IndicatorName = indicatorName, EMAPeriod1 = eMAPeriod1, EMAPeriod2 = eMAPeriod2, Range = range, SMIEMAPeriod = sMIEMAPeriod }, input, ref cacheZombie3SMI);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.Zombie3SMI Zombie3SMI(string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
return indicator.Zombie3SMI(Input, indicatorName, eMAPeriod1, eMAPeriod2, range, sMIEMAPeriod);
}
public Indicators.Zombie3SMI Zombie3SMI(ISeries<double> input , string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
return indicator.Zombie3SMI(input, indicatorName, eMAPeriod1, eMAPeriod2, range, sMIEMAPeriod);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.Zombie3SMI Zombie3SMI(string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
return indicator.Zombie3SMI(Input, indicatorName, eMAPeriod1, eMAPeriod2, range, sMIEMAPeriod);
}
public Indicators.Zombie3SMI Zombie3SMI(ISeries<double> input , string indicatorName, int eMAPeriod1, int eMAPeriod2, int range, int sMIEMAPeriod)
{
return indicator.Zombie3SMI(input, indicatorName, eMAPeriod1, eMAPeriod2, range, sMIEMAPeriod);
}
}
}
#endregion
|