I coded an indicator for a Synthetic instrument. After a while it simply freezes the chart window and after that, the main Ninjatrader windows freezes up too.
I can only kill the whole process with Task Manager forcefully.
I was wondering if you could point out my error somewhere in the code.
It feels like a deadlock is happening somewhere. I tried to force it onto a single thread using an object, but that didn't work.
lock (lockObj) {
// main code here
}
So if you could help, that would be great. Thanks in advance.
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"SyntheticInstrument4";
Name = "SyntheticInstrument4";
Calculate = Calculate.OnBarClose;
IsOverlay = false;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = false;
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;
//
CalculateCurrentDayOnly = true;
SelectedBarsPeriodType = BarsPeriodType.Minute;
SelectedBarsPeriodValue = 1;
ESMultiplier = 1;
NQMultiplier = 1;
YMMultiplier = 1;
FDAXMultiplier = 1;
AddPlot(new Stroke(Brushes.Green, DashStyleHelper.Solid, 1), PlotStyle.Square, "SyntheticHigh");
AddPlot(new Stroke(Brushes.Red, DashStyleHelper.Solid, 1), PlotStyle.Square, "SyntheticLow");
AddPlot(new Stroke(Brushes.Yellow, DashStyleHelper.Solid, 1), PlotStyle.Hash, "SyntheticClose");
}
else if (State == State.Configure)
{
AddDataSeries("ES 09-20", SelectedBarsPeriodType, SelectedBarsPeriodValue);
AddDataSeries("NQ 09-20", SelectedBarsPeriodType, SelectedBarsPeriodValue);
AddDataSeries("YM 09-20", SelectedBarsPeriodType, SelectedBarsPeriodValue);
AddDataSeries("FDAX 09-20", SelectedBarsPeriodType, SelectedBarsPeriodValue);
}
}
protected override void OnBarUpdate()
{
if (CalculateCurrentDayOnly && Time[0].Date != DateTime.Now.Date) {
return;
}
if (CurrentBars[0] < 1 || CurrentBars[1] < 1 || CurrentBars[2] < 1 || CurrentBars[3] < 1 || CurrentBars[4] < 1) {
return;
}
if (BarsInProgress == 0) {
//XOpen[0] = ((Opens[1][0] * ESMultiplier) + (Opens[2][0] * NQMultiplier) + (Opens[3][0] * YMMultiplier) + (Opens[4][0] * FDAXMultiplier)) / 4;
Values[0][0] = ((Highs[1][0] * ESMultiplier) + (Highs[2][0] * NQMultiplier) + (Highs[3][0] * YMMultiplier) + (Highs[4][0] * FDAXMultiplier)) / 4;
Values[1][0] = ((Lows[1][0] * ESMultiplier) + (Lows[2][0] * NQMultiplier) + (Lows[3][0] * YMMultiplier) + (Lows[4][0] * FDAXMultiplier)) / 4;
Values[2][0] = ((Closes[1][0] * ESMultiplier) + (Closes[2][0] * NQMultiplier) + (Closes[3][0] * YMMultiplier) + (Closes[4][0] * FDAXMultiplier)) / 4;
}
}
#region Properties
[NinjaScriptProperty]
[Display(Name="CalculateCurrentDayOnly", Order=5, GroupName="Properties")]
public bool CalculateCurrentDayOnly
{ get; set; }
[NinjaScriptProperty]
[Display(Name="SelectedBarsPeriodType", Order=10, GroupName="Properties")]
public BarsPeriodType SelectedBarsPeriodType
{ get; set; }
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="SelectedBarsPeriodValue", Order=12, GroupName="Properties")]
public int SelectedBarsPeriodValue
{ get; set; }
[NinjaScriptProperty]
[Range(1, double.MaxValue)]
[Display(Name="ES Multiplier", Order=20, GroupName="Properties")]
public double ESMultiplier
{ get; set; }
[NinjaScriptProperty]
[Range(1, double.MaxValue)]
[Display(Name="NQ Multiplier", Order=21, GroupName="Properties")]
public double NQMultiplier
{ get; set; }
[NinjaScriptProperty]
[Range(1, double.MaxValue)]
[Display(Name="YM Multiplier", Order=22, GroupName="Properties")]
public double YMMultiplier
{ get; set; }
[NinjaScriptProperty]
[Range(1, double.MaxValue)]
[Display(Name="FDAX Multiplier", Order=23, GroupName="Properties")]
public double FDAXMultiplier
{ get; set; }
#endregion
}

Comment