#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 VwapProfile : Indicator
{
private const int number = 5;
private double iCumVolume = 0;
private double iCumTypicalVolume = 0;
private List<double> vwaps;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"";
Name = "VWAP Profile";
Calculate = Calculate.OnBarClose;
IsAutoScale = false;
IsOverlay = true;
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;
// SET DEFAULT VALUES
Opacity = 0.35f;
// ADD PLOTS
AddPlot(new Pen( Brushes.Cyan, 1), PlotStyle.Dot, "V0");
AddPlot(new Pen( Brushes.LightGreen, 1), PlotStyle.Dot, "V1");
AddPlot(new Pen( Brushes.Magenta, 1), PlotStyle.Dot, "V2");
AddPlot(new Pen( Brushes.Red, 1), PlotStyle.Dot, "V3");
AddPlot(new Pen( Brushes.Orange, 1), PlotStyle.Dot, "V4");
}
else if (State == State.Configure)
{
vwaps = new List<double>();
vwaps.Insert(0, 0d);
for(int i = 0; i < number; i++)
{
Brush tmp = Plots[i].Brush.Clone();
tmp.Opacity = Opacity;
tmp.Freeze();
Plots[i].Brush = tmp;
}
}
}
protected override void OnBarUpdate()
{
if(Bars.IsFirstBarOfSession)
{
// RESET CURRENT
iCumVolume = VOL()[0];
iCumTypicalVolume = VOL()[0] * Typical[0];
// ADD CURRENT
vwaps.Insert(0, iCumTypicalVolume/iCumVolume);
// REMOVE EXTRA VWAPS
if(vwaps.Count > number) vwaps.RemoveAt(vwaps.Count - 1);
}
else
{
iCumVolume = iCumVolume + VOL()[0];
iCumTypicalVolume = iCumTypicalVolume + (VOL()[0] * Typical[0]);
// UPDATE CURRENT
vwaps[0] = iCumTypicalVolume/iCumVolume;
}
if(vwaps.Count > 4)
{
V0[0] = vwaps[0];
V1[0] = vwaps[1];
V2[0] = vwaps[2];
V3[0] = vwaps[3];
V4[0] = vwaps[4];
for(int i = 0; i < number; i++)
{
string tag = string.Format("V{0}", i.ToString("N0"));
bool isAutoScale = false;
string text = string.Format( "V{0} {1}", i.ToString("N0"), vwaps[0].ToString("F"));
int barsAgo = 0;
double y = vwaps[i];
int pixelOffset = 12;
Brush textBrush = Brushes.White;
textBrush.Freeze();
NinjaTrader.Gui.Tools.SimpleFont font = new NinjaTrader.Gui.Tools.SimpleFont("Arial", 10);
Brush outlineBrush = Brushes.White;
outlineBrush.Freeze();
Brush areaBrush = Plots[i].Brush.Clone();
areaBrush.Freeze();
int areaOpacity = Convert.ToInt32( Opacity * 100 );
try
{
Text T = Draw.Text(this, tag, isAutoScale, text, barsAgo, y, pixelOffset, textBrush, font, TextAlignment.Justify, outlineBrush, areaBrush, areaOpacity);
}
catch(System.Exception e)
{
System.Windows.MessageBox.Show(e.Message);
}
}
}
}
#region Properties
[Range(0, 1)]
[NinjaScriptProperty]
[Display(Name = "Opacity", GroupName = "Parameters", Order = 0)]
public float Opacity
{
get; set;
}
[Browsable(false)]
[XmlIgnore]
public Series<double> V0
{
get { return Values[0]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> V1
{
get { return Values[1]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> V2
{
get { return Values[2]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> V3
{
get { return Values[3]; }
}
[Browsable(false)]
[XmlIgnore]
public Series<double> V4
{
get { return Values[4]; }
}
#endregion
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private VwapProfile[] cacheVwapProfile;
public VwapProfile VwapProfile(float opacity)
{
return VwapProfile(Input, opacity);
}
public VwapProfile VwapProfile(ISeries<double> input, float opacity)
{
if (cacheVwapProfile != null)
for (int idx = 0; idx < cacheVwapProfile.Length; idx++)
if (cacheVwapProfile[idx] != null && cacheVwapProfile[idx].Opacity == opacity && cacheVwapProfile[idx].EqualsInput(input))
return cacheVwapProfile[idx];
return CacheIndicator<VwapProfile>(new VwapProfile(){ Opacity = opacity }, input, ref cacheVwapProfile);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.VwapProfile VwapProfile(float opacity)
{
return indicator.VwapProfile(Input, opacity);
}
public Indicators.VwapProfile VwapProfile(ISeries<double> input , float opacity)
{
return indicator.VwapProfile(input, opacity);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.VwapProfile VwapProfile(float opacity)
{
return indicator.VwapProfile(Input, opacity);
}
public Indicators.VwapProfile VwapProfile(ISeries<double> input , float opacity)
{
return indicator.VwapProfile(input, opacity);
}
}
}
#endregion
Announcement
Collapse
No announcement yet.
Partner 728x90
Collapse
NinjaTrader
The calling thread can not access this object ...
Collapse
X
-
The calling thread can not access this object ...
I still keep getting this error with this indicator. I'm freezing all the brushes. I've narrowed the error to the Draw.Text call. Any ideas?
Code:Tags: None
-
Originally posted by GrumpyTrader View PostI still keep getting this error with this indicator. I'm freezing all the brushes. I've narrowed the error to the Draw.Text call. Any ideas?
When changing from a "ES 03-15" 4 range chart to a 3 minute chart it is fine.
When changing from a 4 range chart or 3 minute chart to a 1 minute chart - I get "Object reference not set to an instance of an object."
The message won't go away. It keeps popping up. I can navigate to other windows in Beta2 and work on them. When I try to access the chart with the indicator and go to the indicators to remove it - that chart will lock up. And the message is still there and keeps coming back.
Not connected to anything like Playback.
-
In Playback - Historical - I get:
"Indicator VWAP Profile": Error on calling 'OnRender' method on bar -1: You are accessing an index with a value that is invalid since it is out-of-range. I.E. accessing a series [barsAgo] with a value of 5 when there are only 4 bars on the chart.
I switched to Playback - Market Replay and that's spinning circle of death. The chart is incapacitated and dead, but everything else in NT is responsive.
Comment
-
You are likely facing a bug in Draw.Text itself which is fixed in Beta 3. We're working hard to get beta 3 out ASAP this week however could be pushed to next week. Trying to wrap up some last minute release items before we could release.
Sorry for the hair pulling!BrettNinjaTrader Product Management
Comment
Latest Posts
Collapse
| Topics | Statistics | Last Post | ||
|---|---|---|---|---|
|
Started by Geovanny Suaza, 02-11-2026, 06:32 PM
|
0 responses
662 views
0 likes
|
Last Post
|
||
|
Started by Geovanny Suaza, 02-11-2026, 05:51 PM
|
0 responses
376 views
1 like
|
Last Post
|
||
|
Started by Mindset, 02-09-2026, 11:44 AM
|
0 responses
110 views
0 likes
|
Last Post
by Mindset
02-09-2026, 11:44 AM
|
||
|
Started by Geovanny Suaza, 02-02-2026, 12:30 PM
|
0 responses
575 views
1 like
|
Last Post
|
||
|
Started by RFrosty, 01-28-2026, 06:49 PM
|
0 responses
580 views
1 like
|
Last Post
by RFrosty
01-28-2026, 06:49 PM
|

Comment