I have the below code, however it fails to run smoothly and causes NT8 to freeze.
What is the best practice for making this work efficiently? I have read the NinjaScript Best Practices, however I don't see if there is a better way to achieve the outcome.
I suspect most of the inefficiency is coming from Configure and DataLoaded states?
public class zUSDtrend : Indicator
{
private Series<double> GBPUSD5m;
private Series<double> GBPUSD60m;
private Series<double> EURUSD5m;
private Series<double> EURUSD60m;
private Series<double> AUDUSD5m;
private Series<double> AUDUSD60m;
private Series<double> USDJPY5m;
private Series<double> USDJPY60m;
private Series<double> USDCAD5m;
private Series<double> USDCAD60m;
private int barsAgo;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Indicator here.";
Name = "zUSDtrend";
Calculate = Calculate.OnBarClose;
BarsRequiredToPlot = 20;
IsOverlay = false;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
//Disable this property if your indicator requires custom values that cumulate with each new market data event.
//See Help Guide for additional information.
IsSuspendedWhileInactive = true;
SMA5mPeriod = 8;
SMA60mPeriod = 8;
AddPlot(new Stroke(Brushes.DarkCyan, DashStyleHelper.Dot, 1), PlotStyle.Line, "GBPUSD 5m");
AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Dot, 1), PlotStyle.Line, "GBPUSD 60m");
AddPlot(new Stroke(Brushes.DarkCyan, DashStyleHelper.Dot, 1), PlotStyle.Line, "EURUSD 5m");
AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Dot, 1), PlotStyle.Line, "EURUSD 60m");
AddPlot(new Stroke(Brushes.DarkCyan, DashStyleHelper.Dot, 1), PlotStyle.Line, "AUDUSD 5m");
AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Dot, 1), PlotStyle.Line, "AUDUSD 60m");
AddPlot(new Stroke(Brushes.DarkCyan, DashStyleHelper.Dot, 1), PlotStyle.Line, "USDJPY 5m");
AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Dot, 1), PlotStyle.Line, "USDJPY 60m");
AddPlot(new Stroke(Brushes.DarkCyan, DashStyleHelper.Dot, 1), PlotStyle.Line, "USDCAD 5m");
AddPlot(new Stroke(Brushes.Orange, DashStyleHelper.Dot, 1), PlotStyle.Line, "USDCAD 60m");
}
else if (State == State.Configure)
{
AddDataSeries("GBPUSD", Data.BarsPeriodType.Minute, 5, Data.MarketDataType.Last);
AddDataSeries("GBPUSD", Data.BarsPeriodType.Minute, 60, Data.MarketDataType.Last);
AddDataSeries("EURUSD", Data.BarsPeriodType.Minute, 5, Data.MarketDataType.Last);
AddDataSeries("EURUSD", Data.BarsPeriodType.Minute, 60, Data.MarketDataType.Last);
AddDataSeries("AUDUSD", Data.BarsPeriodType.Minute, 5, Data.MarketDataType.Last);
AddDataSeries("AUDUSD", Data.BarsPeriodType.Minute, 60, Data.MarketDataType.Last);
AddDataSeries("USDJPY", Data.BarsPeriodType.Minute, 5, Data.MarketDataType.Last);
AddDataSeries("USDJPY", Data.BarsPeriodType.Minute, 60, Data.MarketDataType.Last);
AddDataSeries("USDCAD", Data.BarsPeriodType.Minute, 5, Data.MarketDataType.Last);
AddDataSeries("USDCAD", Data.BarsPeriodType.Minute, 60, Data.MarketDataType.Last);
AddLine(Brushes.DodgerBlue, 0, "zero");
}
else if (State == State.DataLoaded)
{
GBPUSD5m = new Series<double>(this);
GBPUSD60m = new Series<double>(this);
EURUSD5m = new Series<double>(this);
EURUSD60m = new Series<double>(this);
AUDUSD5m = new Series<double>(this);
AUDUSD60m = new Series<double>(this);
USDJPY5m = new Series<double>(this);
USDJPY60m = new Series<double>(this);
USDCAD5m = new Series<double>(this);
USDCAD60m = new Series<double>(this);
}
}
protected override void OnBarUpdate()
{
//Add your custom indicator logic here.
if (CurrentBar < 60) return;
for (int barsAgo = 0; barsAgo < 2; barsAgo++)
{
Values[0][0] = -1000 * ((SMA(BarsArray[1],SMA5mPeriod)[0] - SMA(BarsArray[1],SMA5mPeriod)[1]) / SMA(BarsArray[1],SMA5mPeriod)[1]);
Values[1][0] = -1000 * ((SMA(BarsArray[2],SMA5mPeriod)[0]- SMA(BarsArray[2],SMA5mPeriod)[1]) / SMA(BarsArray[2],SMA5mPeriod)[1]);
Values[2][0] = -1000 * ((SMA(BarsArray[3],SMA60mPeriod)[0] - SMA(BarsArray[3],SMA60mPeriod)[1]) / SMA(BarsArray[3],SMA60mPeriod)[1]);
Values[3][0] = -1000 * ((SMA(BarsArray[4],SMA60mPeriod)[0]- SMA(BarsArray[4],SMA60mPeriod)[1]) / SMA(BarsArray[4],SMA60mPeriod)[1]);
Values[4][0] = -1000 * ((SMA(BarsArray[5],SMA60mPeriod)[0] - SMA(BarsArray[5],SMA60mPeriod)[1]) / SMA(BarsArray[5],SMA60mPeriod)[1]);
Values[5][0] = -1000 * ((SMA(BarsArray[6],SMA60mPeriod)[0]- SMA(BarsArray[6],SMA60mPeriod)[1]) / SMA(BarsArray[4],SMA60mPeriod)[1]);
Values[6][0] = 1000 * ((SMA(BarsArray[7],SMA60mPeriod)[0] - SMA(BarsArray[7],SMA60mPeriod)[1]) / SMA(BarsArray[7],SMA60mPeriod)[1]);
Values[7][0] = 1000 * ((SMA(BarsArray[8],SMA60mPeriod)[0]- SMA(BarsArray[8],SMA60mPeriod)[1]) / SMA(BarsArray[8],SMA60mPeriod)[1]);
Values[8][0] = 1000 * ((SMA(BarsArray[9],SMA60mPeriod)[0] - SMA(BarsArray[9],SMA60mPeriod)[1]) / SMA(BarsArray[9],SMA60mPeriod)[1]);
Values[9][0] = 1000 * ((SMA(BarsArray[10],SMA60mPeriod)[0]- SMA(BarsArray[10],SMA60mPeriod)[1]) / SMA(BarsArray[10],SMA60mPeriod)[1]);
}
}

Comment