region Using declarations
using System;
using System.Windows.Media;
using NinjaTrader.Gui.Chart;
using NinjaTrader.NinjaScript;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
namespace NinjaTrader.NinjaScript.Indicators
{
public class FirstBarHighLow : Indicator
{
private double openingHigh = double.MinValue;
private double openingLow = double.MaxValue;
private bool openingRangeIdentified = false;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Draws horizontal lines for the first 5 minutes opening range high and low.";
Name = "FirstBarHighLow";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
}
}
protected override void OnBarUpdate()
{
// If not a 5 minute chart, do not continue.
if (BarsPeriod.BarsPeriodType != NinjaTrader.Cbi.BarsPeriodType.Minute || BarsPeriod.Value != 5)
{
//Log("This indicator only works on a 5-minute chart.", LogLevel.Error);
return;
}
// Reset the opening range for a new day
if (Bars.IsFirstBarOfSession)
{
openingHigh = double.MinValue;
openingLow = double.MaxValue;
openingRangeIdentified = false;
}
// Identify the first 5-minute range from 9:30 to 9:35
TimeSpan barTime = Time[0].TimeOfDay;
if (barTime >= TimeSpan.FromHours(9.5) && barTime < TimeSpan.FromHours(9.58333333))
{
openingHigh = Math.Max(openingHigh, High[0]);
openingLow = Math.Min(openingLow, Low[0]);
openingRangeIdentified = true;
}
else if (openingRangeIdentified && barTime >= TimeSpan.FromHours(9.58333333))
{
// Draw the high line if it has not been drawn yet
if (openingHigh != double.MinValue && DrawObjects["OpeningHigh"] == null)
{
Draw.HorizontalLine(this, "OpeningHigh", openingHigh, Brushes.DodgerBlue);
}
// Draw the low line if it has not been drawn yet
if (openingLow != double.MaxValue && DrawObjects["OpeningLow"] == null)
{
Draw.HorizontalLine(this, "OpeningLow", openingLow, Brushes.DodgerBlue);
}
// Prevent further drawing
openingRangeIdentified = false;
}
}
}
}
region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private FirstBarHighLow[] cacheFirstBarHighLow;
public FirstBarHighLow FirstBarHighLow()
{
return FirstBarHighLow(Input);
}
public FirstBarHighLow FirstBarHighLow(ISeries<double> input)
{
if (cacheFirstBarHighLow != null)
for (int idx = 0; idx < cacheFirstBarHighLow.Length; idx++)
if (cacheFirstBarHighLow[idx] != null && cacheFirstBarHighLow[idx].EqualsInput(input))
return cacheFirstBarHighLow[idx];
return CacheIndicator<FirstBarHighLow>(new FirstBarHighLow(), input, ref cacheFirstBarHighLow);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.FirstBarHighLow FirstBarHighLow()
{
return indicator.FirstBarHighLow(Input);
}
public Indicators.FirstBarHighLow FirstBarHighLow(ISeries<double> input )
{
return indicator.FirstBarHighLow(input);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.FirstBarHighLow FirstBarHighLow()
{
return indicator.FirstBarHighLow(Input);
}
public Indicators.FirstBarHighLow FirstBarHighLow(ISeries<double> input )
{
return indicator.FirstBarHighLow(input);
}
}
}
#endregion
Purpose of the script is to draw a line of the opening range on the first 5 candles or 5min candle's high and low to mark the opening range.
Comment