#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