while it's late and my eyes hurt. gnite ya'll
#region Using declarations
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Data;
using NinjaTrader.Gui.Chart;
#endregion
// This namespace holds all indicators and is required. Do not change it.
namespace NinjaTrader.Indicator
{
/// <summary>
/// Better Volume indicator from emini-watch.com/free-stuff/volume-indicator/ using true range instead of range in calculations.
/// </summary>
[Description("Better Volume indicator from emini-watch.com/free-stuff/volume-indicator/ using true range instead of range in calculations.")]
public class BetterVolumeUPDOWN : Indicator
{
#region Variables
// Wizard generated variables
private int lookback = 20; // Default setting for Lookback
private bool paintbars = true; // Default setting for Paintbars
private bool useTrueRange = true; // Default setting for UseTrueRange
// User defined variables (add any user defined variables below)
private int barwidth = 2;
private DataSeries vxr, vdr;
private double vwt;
#endregion
/// <summary>
/// This method is used to configure the indicator and is called once before any bar data is loaded.
/// </summary>
protected override void Initialize()
{
int hilight=barwidth+1;
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Silver), barwidth), PlotStyle.Bar, "VBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Grey), barwidth), PlotStyle.Bar, "VBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Goldenrod), hilight), PlotStyle.Bar, "LowBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Yellow), hilight), PlotStyle.Bar, "LowBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Lime), hilight), PlotStyle.Bar, "ClimaxBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Tomato), hilight), PlotStyle.Bar, "ClimaxBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Green), hilight), PlotStyle.Bar, "ChurnBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Red), hilight), PlotStyle.Bar, "ChurnBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Magenta), hilight), PlotStyle.Bar, "ClimaxChurnBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Purple), hilight), PlotStyle.Bar, "ClimaxChurnBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Black), hilight), PlotStyle.Bar, "LowChurnBarUP"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.White), hilight), PlotStyle.Bar, "LowChurnBarDOWN"));
Add(new Plot(new Pen(Color.FromKnownColor(KnownColor.Grey), 1), PlotStyle.Line, "VolEMA"));
CalculateOnBarClose = true;
Overlay = false;
PriceTypeSupported = false;
vxr = new DataSeries(this);
vdr = new DataSeries(this);
vwt = 2.0 / (10.0 * lookback + 1.0); // bar average period is 10*lookback
}
/// <summary>
/// Called on each bar update event (incoming tick)
/// Need to find out the logic for up and down bars/ticks
/// </summary>
protected override void OnBarUpdate()
{
{
if (Close[0] > Open[0])
Values[0].Set(Volume[0]);
else
Values[1].Set(Volume[0]);
}
{
double range, v = Volume[0];
if ( CurrentBar < 1) {
range = High[0] - Low[0];
VolEMA.Set(v);
return;
}
range = useTrueRange ?
Math.Max(High[0], Close[1]) - Math.Min(Low[0], Close[1]) // use true range
: High[0] - Low[0]; // use normal range
VolEMA.Set(vwt * (v - VolEMA[1]) + VolEMA[1]); // faster than SMA
int cc = 0; // climax churn detection
int bc = 0; // bar color, default 0 (normal volume bar)
vxr.Set(v * range);
vdr.Set((range != 0.0) ? v / range : 0.0);
if (v == MIN(Volume, lookback)[0]); //LowBar
if (Close[0] > Open[0])
Values[bc = 2].Set(Volume[0]);
else
Values[bc = 3].Set(Volume[0]);
if (vxr[0] == MAX(vxr, lookback)[0]); //ClimaxBar
if (Close[0] > Open[0])
Values[{ bc = 4; ++cc; >}]<.Set(Volume[0])>;< **statement expected between ><**
else
Values[{ bc = 5; ++cc; >}]<.Set(Volume[0]); **statement expected ><**
if (vdr[0] == MAX(vdr, lookback)[0]); //ChurnBar
if (Close[0] > Open[0])
Values[{ bc = 6; ++cc; >}]<.Set(Volume[0])>;< **statement expected ><**
else
Values[{ bc = 7; ++cc; >}]<.Set(Volume[0]); **statement expected ><**
if (cc == 2); //ClimaxChurnBar
if (Close[0] > Open[0])
Values[bc = 8].Set(Volume[0]);
else
Values[bc = 9].Set(Volume[0]);
if (vdr[0] == MIN(vdr, lookback)[0]); //LowChurnBar
if (Close[0] > Open[0])
Values[bc = 10].Set(Volume[0]);
else
Values[bc = 11].Set(Volume[0]);
Values[bc].Set(v); //plot whatever we found
if (paintbars && bc > 0) BarColor = Plots[bc].Pen.Color;
}
}
Comment