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.Gui.Tools;
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 UDIndicator : Indicator
{
private int fontSize = 9; // Default setting for FontSize
private DateTime beginTime, endTime;
private int UpCounter, DownCounter;
private int TotalUpCounter, TotalDownCounter;
private DateTime triggerDate;
private int DownCycleBar, UpCycleBar;
private SimpleFont vFont;
private Brush iVerticalLinesColor = Brushes.Blue;
private bool SessionEnded = false;
private Series<double> textValues;
private SessionIterator sessionIterator;
region Properties
region Font Settings
[XmlIgnore()]
[Display(Name = "Font Color", Order = 1, GroupName = "Font Settings")]
public Brush FontColor
{
get; set;
}
[Browsable(false)]
public string FontColorSerialize
{
get { return Serialize.BrushToString(FontColor); }
set { FontColor = Serialize.StringToBrush(value); }
}
[XmlIgnore()]
[Display(Name = "Outline Color", Order = 2, GroupName = "Font Settings")]
public Brush OutLineColor
{
get; set;
}
[Browsable(false)]
public string OutLineColorSerialize
{
get { return Serialize.BrushToString(OutLineColor); }
set { OutLineColor = Serialize.StringToBrush(value); }
}
[Range(1, Int32.MaxValue)]
[Display(Name = "Font Size", Order = 3, GroupName = "Font Settings")]
public int FontSize
{
get; set;
}
[Display(Name = "ShowTotalsEndofSession", Order = 4, GroupName = "Font Settings")]
public bool ShowTotalsEndofSession
{
get; set;
}
[Display(Name = "ShowTotalsEachChange", Order = 5, GroupName = "Font Settings")]
public bool ShowTotalsEachChange
{
get; set;
}
[Range(1, Int32.MaxValue)]
[Display(Name = "Text Shift", Order = 6, GroupName = "Font Settings")]
public int TextShift
{
get; set;
}
#endregion
region Vertical Line Style
[Display(Name = "Vertical Line Style", Order = 1, GroupName = "Vertical Line Style")]
public DashStyleHelper VerticalLineStyle
{
get; set;
}
[Display(Name = "ShowVerticalLines", Order = 2, GroupName = "Vertical Line Style")]
public bool ShowVerticalLines
{
get; set;
}
[Display(Name = "VerticalLineWidth", Order = 3, GroupName = "Vertical Line Style")]
public int VerticalLineWidth
{
get; set;
}
[XmlIgnore()]
[Display(Name = "Vertical Lines Color", Order = 4, GroupName = "Vertical Line Style")]
public Brush VerticalLinesColor
{
get; set;
}
// Serialize our Color object
[Browsable(false)]
public string VerticalLinesColor_Serialize
{
get { return Serialize.BrushToString(VerticalLinesColor); }
set { VerticalLinesColor = Serialize.StringToBrush(value); }
}
#endregion
region Time Parameters
[Display(Name = "BarsPeriod", Order = 0, GroupName = "Time Parameters")]
public BarsPeriod BarsPeriodToUse
{
get; set;
}
[Display(Name = "ResetType", Order = 0, GroupName = "Time Parameters")]
public NinjaTrader.NinjaScript.Indicators.UDIndicator.Res etType MyResetType
{
get; set;
}
[Display(Name = "UseTimeRange", Order = 1, GroupName = "Time Parameters")]
public bool UseTimeRange
{
get; set;
}
private string tradingStartTime = @"16:00:01";
private string tradingStopTime = @"16:00:00";
[Display(Name = "Begin Time", Order = 2, GroupName = "Time Parameters")]
public string BeginTime
{
get { return tradingStartTime; }
set { tradingStartTime = value; }
}
[Display(Name = "End Time", Order = 3, GroupName = "Time Parameters")]
public string EndTime
{
get { return tradingStopTime; }
set { tradingStopTime = value; }
}
#endregion
[Display(Name = "MinimumVolumeThreshold", Order = 20, GroupName = "Parameters")]
public int MinimumVolumeThreshold
{
get; set;
}
[Display(Name = "ShowAbbreviatedFormat", Order = 21, GroupName = "Parameters")]
public bool ShowAbbreviatedFormat
{
get; set;
}
#endregion
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"";
Name = "UDIndicator";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
DisplayInDataBox = true;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
IsSuspendedWhileInactive = true;
FontColor = Brushes.Blue;
FontSize = 12;
TextShift = 10;
BarsPeriodToUse = new BarsPeriod() { BarsPeriodType = BarsPeriodType.Minute, Value = 1 };
MyResetType = ResetType.Daily;
MinimumVolumeThreshold = 2000;
UseTimeRange = false;
VerticalLineStyle = DashStyleHelper.Solid;
VerticalLineWidth = 2;
VerticalLinesColor = Brushes.Blue;
OutLineColor = Brushes.Transparent;
}
else if (State == State.Configure)
{
AddDataSeries(BarsPeriodToUse);
}
else if (State == State.DataLoaded)
{
sessionIterator = new SessionIterator(BarsArray[1]);
DateTime.TryParse(tradingStartTime, out beginTime);
DateTime.TryParse(tradingStopTime, out endTime);
vFont = new SimpleFont("Arial", FontSize);
textValues = new Series<double>(this, MaximumBarsLookBack.Infinite);
}
}
protected override void OnBarUpdate()
{
for (int x = 0; x < BarsArray.Length; x++)
if (CurrentBars[x] < 1)
return;
if (BarsInProgress == 1)
{
int index = BarsInProgress;
if (UseTimeRange && sessionIterator.IsInSession(BarsArray[index].GetTime(CurrentBar)))
{
if (MyResetType == ResetType.Daily && BarsInProgress == 1 && CurrentBar > 0)
{
if (BarsArray[1].IsFirstBarOfSession)
{
if (TotalUpCounter != 0 || TotalDownCounter != 0)
{
ShowTotalsEndofSession = true;
SessionEnded = true;
}
else
SessionEnded = false;
}
else
{
SessionEnded = false;
}
}
if (CurrentBar == 0)
{
triggerDate = BarsArray[index].GetTime(CurrentBar);
if (beginTime <= triggerDate && triggerDate <= endTime)
{
Draw.Line(this, "SessionStartTimeLine", false, triggerDate, High[0] + TickSize, triggerDate, Low[0] - TickSize, VerticalLinesColor, VerticalLineStyle, VerticalLineWidth);
}
}
else if (CurrentBar == BarsArray[index].Count - 1)
{
triggerDate = BarsArray[index].GetTime(CurrentBar);
if (beginTime <= triggerDate && triggerDate <= endTime)
{
Draw.Line(this, "SessionEndTimeLine", false, triggerDate, High[0] + TickSize, triggerDate, Low[0] - TickSize, VerticalLinesColor, VerticalLineStyle, VerticalLineWidth);
}
}
else
{
triggerDate = BarsArray[index].GetTime(CurrentBar);
if (beginTime <= triggerDate && triggerDate <= endTime)
{
Draw.Line(this, "SessionLine", false, triggerDate, High[0] + TickSize, triggerDate, Low[0] - TickSize, VerticalLinesColor, VerticalLineStyle, VerticalLineWidth);
}
}
}

Comment