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