// // Copyright (C) 2006, NinjaTrader LLC . // #region Using declarations using System; using System.Collections; using System.Text; #endregion // This namespace holds all bars types. Do not change it. namespace NinjaTrader.Data { /// /// public class IndecisionBarsType : BarsType { private static bool registered = Data.BarsType.Register(new IndecisionBarsType()); /// /// /// /// /// /// /// /// /// /// public override void Add(Data.Bars bars, double open, double high, double low, double close, DateTime time, int volume, bool isRealtime) { if (bars.Count == 0) AddBar(bars, open, high, low, close, time, volume); else { Data.Bar bar = (Bar) bars.Get(bars.Count - 1); double tickSize = bars.Instrument.MasterInstrument.TickSize; double rangeValue = Math.Floor(10000000.0 * (double) bars.Period.Value * tickSize) / 10000000.0; if (bars.Instrument.MasterInstrument.Compare(close > open ? close:open, bar.Open + rangeValue*2) >= 0) { bool isFirstNewBar = true; double newClose = bar.Open + rangeValue; // every bar closes either with high or low UpdateBar(bars, open, bar.Open, low, newClose, time, 0); if ( bar.Open == newClose && bars.Instrument.MasterInstrument.Compare(close, bar.Open + rangeValue*2) > 0 ) return; AddBar(bars, newClose, high, newClose, high, time, volume); // new bar is started outside the // // if still gap, fill with phantom bars // double newBarOpen = newClose; // while (bars.Instrument.MasterInstrument.Compare(close, newClose) > 0) // { // newClose = Math.Min(close, newBarOpen + rangeValue); // AddBar(bars, newBarOpen, newClose, newBarOpen, newClose, time, isFirstNewBar ? volume : 0); // newBarOpen = newClose; // isFirstNewBar = false; // } } else if (bars.Instrument.MasterInstrument.Compare(bar.Open - rangeValue*2, close < open ? close: open) >= 0) { bool isFirstNewBar = true; double newClose = bar.Open - rangeValue; // every bar closes either with high or low UpdateBar(bars, bar.Close, high, low, newClose, time, 0); if ( bar.Open == newClose && bars.Instrument.MasterInstrument.Compare( bar.Open - rangeValue*2, close) > 0 ) return; AddBar(bars, bar.Close, high, newClose, newClose, time, volume); // new bar is started outside the // // if still gap, fill with phantom bars // double newBarOpen = newClose; // while (bars.Instrument.MasterInstrument.Compare(newClose, close) > 0) // { // newClose = Math.Max(close, newBarOpen - rangeValue); // AddBar(bars, newBarOpen, newBarOpen, newClose, newClose, time, isFirstNewBar ? volume : 0); // newBarOpen = newClose; // isFirstNewBar = false; // } } else UpdateBar(bars, open, high, low, close, time, volume); } } /// /// public override PeriodType BuiltFrom { get { return PeriodType.Tick; } } /// /// /// /// public override string ChartDataBoxDate(DateTime time) { return time.ToString(Cbi.Globals.CurrentCulture.DateTimeFormat.ShortDatePattern); } /// /// /// /// /// public override string ChartLabel(NinjaTrader.Gui.Chart.ChartControl chartControl, DateTime time) { return time.ToString(chartControl.LabelFormatTick, Cbi.Globals.CurrentCulture); } /// /// /// public override object Clone() { return new IndecisionBarsType(); } /// /// public override int DaysBack { get { return Gui.Chart.ChartData.DaysBackTick; } } /// /// public override int DefaultValue { get { return 4; } } /// /// public override string DisplayName { // get { return PeriodType.ToString(); } get { return "Indecision"; } } /// /// public override bool IsIntraday { get { return true; } } /// /// public override bool IsTimeBased { get { return false; } } /// /// public override int MaxLookBackDays { get { return 10;} } /// /// public override int MaxValue { get { return -1; } } /// /// public override double GetPercentComplete(Data.Bars bars, DateTime now) { throw new ApplicationException("GetPercentComplete not supported in " + DisplayName); } /// /// public IndecisionBarsType() : base(PeriodType.Renko) { } /// /// public override int SortOrder { get { return 13000; } } /// /// /// /// public override string ToString(Period period) { return "Indecision " + period.Value.ToString() + " Ticks"; } } }