This rare exception happened and thought I should pass it on as it looks unrelated to my code. Looks like a lock is missing on some collection within get_PanelWidthPixels().
Exception: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException( ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveN extRare()
at System.Linq.Enumerable.WhereSelectEnumerableIterat or`2.MoveNext()
at System.Linq.Enumerable.Max(IEnumerable`1 source)
at NinjaTrader.Gui.Chart.ChartControl.get_PanelWidthPixels()
at NinjaTrader.Gui.Chart.ChartControl.get_CanvasRight ()
at NinjaTrader.Gui.Chart.ChartControl.GetXBySlotIndex (Double slotIndex)
at NinjaTrader.Gui.Chart.ChartControl.GetXByBarIndex( ChartBars chartBars, Int32 barIndex)
at NinjaTrader.NinjaScript.DrawingTools.DrawingTool.C reateChartAnchor(NinjaScriptBase ownerNinjaScript, Int32 barsAgo, DateTime time, Double y)
at NinjaTrader.NinjaScript.DrawingTools.Draw.DrawLine TypeCore[T](NinjaScriptBase owner, Boolean isAutoScale, String tag, Int32 startBarsAgo, DateTime startTime, Double startY, Int32 endBarsAgo, DateTime endTime, Double endY, Brush brush, DashStyleHelper dashStyle, Int32 width, Boolean isGlobal, String templateName) in d:\Documents\NinjaTrader 8\bin\Custom\DrawingTools\@Lines.cs:line 730
at NinjaTrader.NinjaScript.DrawingTools.Draw.Line(Nin jaScriptBase owner, Boolean isAutoScale, String tag, Int32 startBarsAgo, DateTime startTime, Double startY, Int32 endBarsAgo, DateTime endTime, Double endY, Brush brush, DashStyleHelper dashStyle, Int32 width) in d:\Documents\NinjaTrader 8\bin\Custom\DrawingTools\@Lines.cs:line 1257
at NinjaTrader.NinjaScript.DrawingTools.Draw.Line(Nin jaScriptBase owner, String tag, Boolean isAutoScale, Int32 startBarsAgo, Double startY, Int32 endBarsAgo, Double endY, Brush brush, DashStyleHelper dashStyle, Int32 width) in d:\Documents\NinjaTrader 8\bin\Custom\DrawingTools\@Lines.cs:line 1293
at NinjaTrader.NinjaScript.Indicators.Crokusek.Crokus ekIndicatorBase.DrawLine(String tag, Boolean isAutoScale, Int32 startBarsAgo, Double startY, Int32 endBarsAgo, Double endY, Color color, Int32 width, DashStyleHelper dashStyle) in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\CrokusekIndicator Base.cs:line 45
at NinjaTrader.NinjaScript.Indicators.Crokusek.LomoHi mo.DrawPricePanelStackedMids(Int32 agoOffset) in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\LomoHimo.cs:line 642
at NinjaTrader.NinjaScript.Indicators.Crokusek.LomoHi mo.DrawPricePanelSignals() in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\LomoHimo.cs:line 438
at NinjaTrader.NinjaScript.Indicators.Crokusek.LomoHi mo.CalculateCurrentExpectedValue() in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\LomoHimo.cs:line 396
at NinjaTrader.NinjaScript.Indicators.Crokusek.LomoHi mo.OnBarUpdateInternal() in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\LomoHimo.cs:line 219
at NinjaTrader.NinjaScript.Indicators.Crokusek.Crokus ekIndicatorBase.OnBarUpdate() in d:\Documents\NinjaTrader 8\bin\Custom\Indicators\Crokusek\CrokusekIndicator Base.cs:line 79
Please don't request workspace/trace as it is mostly custom and I think the exception is unrelated. Here is basically how it was triggered though:
Within OnBarUpdate(), using this pattern to update existing line:
ChartShape prevShape; if (_shapes.TryGet(prevTag, out prevShape)) { DrawingTools.Line prevLine = prevShape.Shape as DrawingTools.Line; prevShape.Update(DrawLine(prevShape.OrgTag, false, prevLine.StartAnchor.BarsAgo + 1, prevLine.StartAnchor.Price, agoOffset, atY, color, 3), tag); } else _shapes.Add(DrawLine(tag, false, 1 + agoOffset, atY, agoOffset, atY, color, 4, DashStyleHelper.Dash));
Chris
Comment