#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
{
///
///
///
/// *** You may freely distribute this script, but if you make changes please add your comments below
///
/// Revision Author Date Comments
/// ________ ______ ____ ________
/// 1.0 Khoi(Cory) Nguyen 4/17/2010
///
[Description("Fifty percent level spans many days ")]
public class BalanceLine : Indicator
{
#region Variables
// Wizard generated variables
// User defined variables (add any user defined variables below)
private DateTime currentDate = Cbi.Globals.MinDate;
private DateTime now;
private DateTime prevDay;
private DateTime prev2Day;
private DateTime prev3Day;
private DateTime startDay;
private int beginTime = 161400;
private int endTime = 093000;
private DateTime startDateTime;
private DateTime endDateTime;
private double highestHigh = 0.00;
private double lowestLow = 0.00;
double mid = 0.00;
private bool gapUp = false;
private bool gapDn = false;
private Color rangeColorDn = Color.DarkGoldenrod;
private int rangeColorOpacity = 2;
private Color rangeColorUp = Color.DodgerBlue;
private int barWidth =3;
private System.Drawing.Font textFont = new Font("Arial", 9);
private Color barColorUp = Color.DarkCyan;
private Color barColorDown = Color.IndianRed;
private Color barColorNeutral = Color.Gray;
private Color barColor = Color.Gray;
private int hBar =0;
private int lBar =0;
int daysBack = 2;
bool firstTime = true;
private Color rangeColor = Color.DarkGoldenrod;
int lw = 5;
private DashStyle ls = DashStyle.DashDotDot;
#endregion
///
/// This method is used to configure the indicator and is called once before any bar data is loaded.
///
protected override void Initialize()
{
CalculateOnBarClose = true;
Overlay = true;
PriceTypeSupported = false;
now = DateTime.Today; // today date
prevDay = now.AddDays(-1); // yesterday date
prev2Day = now.AddDays(-2);
prev3Day = now.AddDays(-3);
startDay = now.AddDays(-daysBack); // days back
}
///
/// Called on each bar update event (incoming tick)
///
protected override void OnBarUpdate()
{
if (Bars == null)
return;
//Only allowed on Intraday charts.
if (!Data.BarsType.GetInstance(Bars.Period.Id).IsIntraday)
{
DrawTextFixed("error msg", "Indicator only works on intraday intervals", TextPosition.BottomRight);
return;
}
int sessionsBarsAgo = 0;
DateTime bar = new DateTime(Bars.GetSessionBar(sessionsBarsAgo).Time.Year, Bars.GetSessionBar(sessionsBarsAgo).Time.Month, Bars.GetSessionBar(sessionsBarsAgo).Time.Day, Bars.SessionBegin.Hour, Bars.SessionBegin.Minute, Bars.SessionBegin.Second);
string format = "MM/dd/yyyy";
// get the session break bar position
int result = (DateTime.Compare(bar, startDay));
if (result < 0)
return;
// draw balance line if today start
if (bar.ToString(format) == now.ToString(format))
{ DrawText("days", true, " days back: "+daysBack, 5, mid, 10, Color.Black, textFont,
StringAlignment.Center, Color.Empty, Color.Empty, 100) ;
}
else {
if (firstTime)
{
highestHigh = High[0];
lowestLow = (Low[0]);
firstTime = false;
}
// Print(Time[0] +" bar "+CurrentBar+" lowest "+lowestLow+ " low "+Low[0] );
if (High[0] > highestHigh)
{
highestHigh =High[0];
hBar = CurrentBar;
DrawTriangleDown("Stop High" , 0, High[0] + TickSize, Color.Red);
}
if (Low[0] < lowestLow)
{
lowestLow = Low[0];
lBar = CurrentBar;
DrawTriangleUp("Stop Low" , 0, Low[0] - TickSize, Color.Blue);
}
mid = (highestHigh + lowestLow)/2;
if (lBar < hBar)
DrawRay("ray", CurrentBar-lBar, mid, 0, mid,rangeColor,ls,lw);
else
DrawRay("ray", CurrentBar-hBar, mid, 0, mid, rangeColor,ls,lw);
DrawText("days", true, " days back: "+daysBack, 5, mid, 10, Color.Black, textFont,
StringAlignment.Center, Color.Empty, Color.Empty, 100) ;
} // end of getting H/L value
} // end on bar update
#region Properties
[Description("Number of Days Back")]
[Category("Parameters")]
[Gui.Design.DisplayName("Days to calculate H+L/2")]
public int DayBack
{
get { return daysBack; }
set { daysBack = Math.Max(value, 0); }
}
[XmlIgnore()]
[Description("Line Color")]
[Category("Visual")]
[Gui.Design.DisplayName("Line Color")]
public Color LineColor
{
get { return rangeColor; }
set { rangeColor = value; }
}
[Description("Line Width")]
[Category("Visual")]
public int LineWidth
{
get { return lw; }
set { lw = Math.Max(1, value); }
}
[XmlIgnore()]
[Description("Line Style")]
[Category("Visual")]
public DashStyle LineStyle
{
get { return ls; }
set { ls = value; }
}
[Browsable(false)]
public string RangeColorSerialize
{
get { return NinjaTrader.Gui.Design.SerializableColor.ToString(rangeColor); }
set { rangeColor = NinjaTrader.Gui.Design.SerializableColor.FromString(value); }
}
#endregion
}
}
#region NinjaScript generated code. Neither change nor remove.
// This namespace holds all indicators and is required. Do not change it.
namespace NinjaTrader.Indicator
{
public partial class Indicator : IndicatorBase
{
private BalanceLine[] cacheBalanceLine = null;
private static BalanceLine checkBalanceLine = new BalanceLine();
///
/// Fifty percent level spans many days
///
///
public BalanceLine BalanceLine(int dayBack)
{
return BalanceLine(Input, dayBack);
}
///
/// Fifty percent level spans many days
///
///
public BalanceLine BalanceLine(Data.IDataSeries input, int dayBack)
{
checkBalanceLine.DayBack = dayBack;
dayBack = checkBalanceLine.DayBack;
if (cacheBalanceLine != null)
for (int idx = 0; idx < cacheBalanceLine.Length; idx++)
if (cacheBalanceLine[idx].DayBack == dayBack && cacheBalanceLine[idx].EqualsInput(input))
return cacheBalanceLine[idx];
BalanceLine indicator = new BalanceLine();
indicator.BarsRequired = BarsRequired;
indicator.CalculateOnBarClose = CalculateOnBarClose;
indicator.Input = input;
indicator.DayBack = dayBack;
indicator.SetUp();
BalanceLine[] tmp = new BalanceLine[cacheBalanceLine == null ? 1 : cacheBalanceLine.Length + 1];
if (cacheBalanceLine != null)
cacheBalanceLine.CopyTo(tmp, 0);
tmp[tmp.Length - 1] = indicator;
cacheBalanceLine = tmp;
Indicators.Add(indicator);
return indicator;
}
}
}
// This namespace holds all market analyzer column definitions and is required. Do not change it.
namespace NinjaTrader.MarketAnalyzer
{
public partial class Column : ColumnBase
{
///
/// Fifty percent level spans many days
///
///
[Gui.Design.WizardCondition("Indicator")]
public Indicator.BalanceLine BalanceLine(int dayBack)
{
return _indicator.BalanceLine(Input, dayBack);
}
///
/// Fifty percent level spans many days
///
///
public Indicator.BalanceLine BalanceLine(Data.IDataSeries input, int dayBack)
{
return _indicator.BalanceLine(input, dayBack);
}
}
}
// This namespace holds all strategies and is required. Do not change it.
namespace NinjaTrader.Strategy
{
public partial class Strategy : StrategyBase
{
///
/// Fifty percent level spans many days
///
///
[Gui.Design.WizardCondition("Indicator")]
public Indicator.BalanceLine BalanceLine(int dayBack)
{
return _indicator.BalanceLine(Input, dayBack);
}
///
/// Fifty percent level spans many days
///
///
public Indicator.BalanceLine BalanceLine(Data.IDataSeries input, int dayBack)
{
if (InInitialize && input == null)
throw new ArgumentException("You only can access an indicator with the default input/bar series from within the 'Initialize()' method");
return _indicator.BalanceLine(input, dayBack);
}
}
}
#endregion