RenkoTrader v1.6 Ninjatrader

https://ninjatraderecosystem.com/user-app-share-download/renko-trader-bot-semi-automatic-with-interface-and-higher-time-frame-filter/
 avatar
unknown
csharp
9 months ago
121 kB
76
No Index
#region Using declarations
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;
using System.Windows.Controls;
using System.Windows.Documents;
using NinjaTrader.Gui.NinjaScript.AtmStrategy;
using System.Runtime.CompilerServices;
using System.Collections;
#endregion


namespace NinjaTrader.NinjaScript.Indicators
{
    [Gui.CategoryOrder("Parameters", 10)]
    [Gui.CategoryOrder("Ichimoku Parameters", 20)]
    [Gui.CategoryOrder("TimeFilters", 30)]
    [Gui.CategoryOrder("TF1 Parameters", 40)]
    [Gui.CategoryOrder("TF2 Parameters", 50)]
    [Gui.CategoryOrder("TF3 Parameters", 60)]
    [Gui.CategoryOrder("TF4 Parameters", 70)]
    [Gui.CategoryOrder("Trend Parameters", 80)]
    [TypeConverter("NinjaTrader.NinjaScript.Indicators.RenkoTrader_Converter")]
    public class RenkoTrader : Indicator
	{

        #region Variables
        
        string tabId;

        private NinjaTrader.Gui.Tools.AccountSelector accountSelector;
        private System.Windows.Controls.Grid chartTraderGrid;
        private System.Windows.Controls.Button CloseButton;
        private System.Windows.Controls.Button BuyButton;
        private System.Windows.Controls.Button SellButton;
        private System.Windows.Controls.Button IchimokuButton;
        private System.Windows.Controls.Button RenkoButton;
        private System.Windows.Controls.Button DTDBButton;
        private System.Windows.Controls.Button StrategyEnabledButton;
        private TextBox EntryTicksQUD;
        private AtmStrategy selectedAtmStrategy;
        private Account selectedAccount;
        private NinjaTrader.Gui.Chart.ChartTab chartTab;
        private Gui.Chart.ChartTrader chartTrader;
        private int chartTraderStartColumn;
        private NinjaTrader.Gui.Chart.Chart chartWindow;
        private bool panelActive;
        private System.Windows.Controls.TabItem tabItem;
        private System.Windows.Controls.Grid chartGrid, commonGrid;
        private System.Windows.Controls.RowDefinition addedRow;

        private NinjaTrader.Gui.Tools.QuantityUpDown qudQuantity;
        private TifSelector tifSelector;
        private AtmStrategySelector atmStrategySelector;

        private System.Windows.Controls.Button TrendSenseButton;

        private System.Windows.Controls.Button TF1Button;
        private System.Windows.Controls.Button TF2Button;
        private System.Windows.Controls.Button TF3Button;
        private System.Windows.Controls.Button TF4Button;

        private System.Windows.Controls.CheckBox TF1CheckBox;
        private System.Windows.Controls.CheckBox TF2CheckBox;
        private System.Windows.Controls.CheckBox TF3CheckBox;
        private System.Windows.Controls.CheckBox TF4CheckBox;

        IvHelpers.FirstTick bar0FT;

        int bottomCount;
        int peakCount;

        int quantity;
        TimeInForce timeInForce;
        double entryPrice;
        int entryDir = 0;
        bool placeLong = false;
        bool placeShort = false;
        int entryBar = 0;

        double priorPrice;

        bool positionPlaced;

        List<int> upTrendBars= new List<int>();
        List<int> dnTrendBars= new List<int>();

        IchimokuCloud ichimoku;

        List<TimeFilter> timeFilters = new List<TimeFilter>();

		SMA trend1;
		SMA trend2;
		SMA trend3;
		SMA trend4;
		
		private Dictionary<string, int> TF_Keys = new Dictionary<string, int>();

        private List<_Row> rows = new List<_Row>();

        SimpleFont textFont = new SimpleFont("Arial", 12);


        float tfWidth = 0;
        float labelWidth = 0;
        float trendWidth = 50f;
        float rowHeight = 0f;
        float rectOffset = 5f;
        float tableMargin = 30f;

        int tf1Idx;
        int tf2Idx;
        int tf3Idx;
        int tf4Idx;


        #endregion

        #region Properties

        #region Parameters

        [NinjaScriptProperty]
        [Display(Name = "Strategy Enabled", Order = 1, GroupName = "Parameters")]
        public bool StrategyEnabled
        { get; set; }

        [NinjaScriptProperty]
        [Display(Name = "Trade Longs", Order = 2, GroupName = "Parameters")]
        public bool TradeLongs
        { get; set; }
		
		[NinjaScriptProperty]
        [Display(Name = "Trade Shorts", Order = 3, GroupName = "Parameters")]
        public bool TradeShorts
        { get; set; }
		
		[NinjaScriptProperty]
        [Display(Name = "Renko Filter", Order = 4, GroupName = "Parameters")]
        public bool RenkoFilter
        { get; set; }
		
		[NinjaScriptProperty]
        [Display(Name = "Ichimoku Filter", Order = 5, GroupName = "Parameters")]
        public bool IchimokuFilter
        { get; set; }
		
		[NinjaScriptProperty]
        [Display(Name = "DT DB Filter", Order = 6, GroupName = "Parameters")]
        public bool DTDBFilter
        { get; set; }

        [NinjaScriptProperty]
        [Display(Name = "Entry Offset", Order = 7, GroupName = "Parameters")]
        public int EntryOffset
        { get; set; }

        [NinjaScriptProperty]
        [Range(0, Int32.MaxValue)]
        [Display(Name = "Cancel Entry After X bars", Order = 8, GroupName = "Parameters")]
        public int CancelEntryBars
        { get; set; }

        [NinjaScriptProperty]
        [Display(Name = "Trend Filter", Order = 9, GroupName = "Parameters")]
        public bool TrendFilter
        { get; set; }

//        [NinjaScriptProperty]
//        [Display(Name = "TF1 Aggressive", Order = 10, GroupName = "Parameters")]
//        public bool TF1Aggressive
//        { get; set; }

//        [NinjaScriptProperty]
//        [Display(Name = "TF2 Aggressive", Order = 11, GroupName = "Parameters")]
//        public bool TF2Aggressive
//        { get; set; }

//        [NinjaScriptProperty]
//        [Display(Name = "TF3 Aggressive", Order = 12, GroupName = "Parameters")]
//        public bool TF3Aggressive
//        { get; set; }

//        [NinjaScriptProperty]
//        [Display(Name = "TF4 Aggressive", Order = 13, GroupName = "Parameters")]
//        public bool TF4Aggressive
//        { get; set; }

        #endregion

        #region Ichimoku Parameters

        [NinjaScriptProperty]
        [Range(1, int.MaxValue)]
        [Display(Name = "PeriodFast", Order = 3, GroupName = "Ichimoku Parameters")]
        public int PeriodFast
        { get; set; }

        [NinjaScriptProperty]
        [Range(1, int.MaxValue)]
        [Display(Name = "PeriodMedium", Order = 4, GroupName = "Ichimoku Parameters")]
        public int PeriodMedium
        { get; set; }

        [NinjaScriptProperty]
        [Range(1, int.MaxValue)]
        [Display(Name = "PeriodSlow",  Order = 5, GroupName = "Ichimoku Parameters")]
        public int PeriodSlow
        { get; set; }

        [NinjaScriptProperty]
        [Range(0, int.MaxValue)]
        [Display(Name = "Cloud Displacement", Order = 8, GroupName = "Ichimoku Parameters")]
        public int CloudDisplacement
        { get; set; }

        #endregion
		
        #region TimeFilters

        [NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TimeFilterEnabled", Order = 1, GroupName = "TimeFilters")]
        public bool TimeFilterEnabled
        {
            get; set;
        }

        [NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TimeFiltersNumber", Order = 2, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled", "True")]
        public RenkoTraderEnums.TimeFiltersNumberEnum TimeFiltersNumber
        {
            get; set;
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "StartTime1", Order = 3, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_1/_2/_3/_4")]
        public TimeSpan StartTime1
        {
            get; set;
        }

        [Browsable(false)]
        public string StartTime1Serialize
        {
            get { return StartTime1.ToString(); }
            set { StartTime1 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "EndTime1", Order = 4, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_1/_2/_3/_4")]
        public TimeSpan EndTime1
        {
            get; set;
        }

        [Browsable(false)]
        public string EndTime1Serialize
        {
            get { return EndTime1.ToString(); }
            set { EndTime1 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "StartTime2", Order = 5, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_2/_3/_4")]
        public TimeSpan StartTime2
        {
            get; set;
        }
        [Browsable(false)]
        public string StartTime2Serialize
        {
            get { return StartTime2.ToString(); }
            set { StartTime2 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "EndTime2", Order = 6, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_2/_3/_4")]
        public TimeSpan EndTime2
        {
            get; set;
        }
        [Browsable(false)]
        public string EndTime2Serialize
        {
            get { return EndTime2.ToString(); }
            set { EndTime2 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "StartTime3", Order = 7, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_3/_4")]
        public TimeSpan StartTime3
        {
            get; set;
        }
        [Browsable(false)]
        public string StartTime3Serialize
        {
            get { return StartTime3.ToString(); }
            set { StartTime3 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "EndTime3", Order = 8, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_3/_4")]
        public TimeSpan EndTime3
        {
            get; set;
        }
        [Browsable(false)]
        public string EndTime3Serialize
        {
            get { return EndTime3.ToString(); }
            set { EndTime3 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "StartTime4", Order = 9, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_4")]
        public TimeSpan StartTime4
        {
            get; set;
        }
        [Browsable(false)]
        public string StartTime4Serialize
        {
            get { return StartTime4.ToString(); }
            set { StartTime4 = TimeSpan.Parse(value); }
        }

        [XmlIgnore()]
        [NinjaScriptProperty]
        [Display(Name = "EndTime4", Order = 10, GroupName = "TimeFilters")]
        [IvAttributes.IvShowHideAttribute("TimeFilterEnabled|TimeFiltersNumber", "True|_4")]
        public TimeSpan EndTime4
        {
            get; set;
        }
        [Browsable(false)]
        public string EndTime4Serialize
        {
            get { return EndTime4.ToString(); }
            set { EndTime4 = TimeSpan.Parse(value); }
        }



        #endregion

		#region Trend Timeframes
		
		#region TF1
		
		[NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TF1 Enabled", Order = 1, GroupName = "TF1 Parameters")]
        public bool TF1Enabled
        {
            get; set;
        }

        [RefreshProperties(RefreshProperties.All)]
        [IvAttributes.IvShowHideAttribute("TF1Enabled", "True")]
        [TypeConverter(typeof(TF_Converter))]
        [Display(Name = "SignalTF1", Order = 3, GroupName = "TF1 Parameters")]
        public string SignalTF1
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Line Break|True")]
        [Display(Name = "SignalTF1LineBreakCount", Order = 4, GroupName = "TF1 Parameters")]
        public int SignalTF1LineBreakCount
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Kagi|True")]
        [Display(Name = "SignalTF1KagiReversal", Order = 5, GroupName = "TF1 Parameters")]
        public int SignalTF1KagiReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF1PFBoxSize", Order = 6, GroupName = "TF1 Parameters")]
        public int SignalTF1PFBoxSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Kagi!Point and Figure!Heiken Ashi!Line Break!UniRenko!ninZaRenko|True")]
        [Display(Name = "SignalTF1Period", Order = 7, GroupName = "TF1 Parameters")]
        public int SignalTF1Period
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF1BaseBarsPeriodType", Order = 8, GroupName = "TF1 Parameters")]
        public BarsPeriodType SignalTF1BaseBarsPeriodType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF1BaseBarsPeriodTypeValue", Order = 9, GroupName = "TF1 Parameters")]
        public int SignalTF1BaseBarsPeriodTypeValue
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Kagi|True")]
        [Display(Name = "SignalTF1KagiReversalType", Order = 10, GroupName = "TF1 Parameters")]
        public ReversalType SignalTF1KagiReversalType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF1PFReversal", Order = 11, GroupName = "TF1 Parameters")]
        public int SignalTF1PFReversal
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF1PFPriceType", Order = 12, GroupName = "TF1 Parameters")]
        public PointAndFigurePriceType SignalTF1PFPriceType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF1UniTickTrend", Order = 13, GroupName = "TF1 Parameters")]
        public int SignalTF1UniTickTrend
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF1UniOpenOffset", Order = 14, GroupName = "TF1 Parameters")]
        public int SignalTF1UniOpenOffset
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF1UniTickReversal", Order = 15, GroupName = "TF1 Parameters")]
        public int SignalTF1UniTickReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF1BrickSize", Order = 16, GroupName = "TF1 Parameters")]
        public int SignalTF1BrickSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF1|TF1Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF1TrendTreshold", Order = 17, GroupName = "TF1 Parameters")]
        public int SignalTF1TrendTreshold
        { get; set; }
		
		#endregion
		
		#region TF2
		
		[NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TF2 Enabled", Order = 1, GroupName = "TF2 Parameters")]
        public bool TF2Enabled
        {
            get; set;
        }
		
        [RefreshProperties(RefreshProperties.All)]
        [IvAttributes.IvShowHideAttribute("TF2Enabled", "True")]
        [TypeConverter(typeof(TF_Converter))]
        [Display(Name = "SignalTF2", Order = 3, GroupName = "TF2 Parameters")]
        public string SignalTF2
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Line Break|True")]
        [Display(Name = "SignalTF2LineBreakCount", Order = 4, GroupName = "TF2 Parameters")]
        public int SignalTF2LineBreakCount
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Kagi|True")]
        [Display(Name = "SignalTF2KagiReversal", Order = 5, GroupName = "TF2 Parameters")]
        public int SignalTF2KagiReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF2PFBoxSize", Order = 6, GroupName = "TF2 Parameters")]
        public int SignalTF2PFBoxSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Kagi!Point and Figure!Heiken Ashi!Line Break!UniRenko!ninZaRenko|True")]
        [Display(Name = "SignalTF2Period", Order = 7, GroupName = "TF2 Parameters")]
        public int SignalTF2Period
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF2BaseBarsPeriodType", Order = 8, GroupName = "TF2 Parameters")]
        public BarsPeriodType SignalTF2BaseBarsPeriodType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF2BaseBarsPeriodTypeValue", Order = 9, GroupName = "TF2 Parameters")]
        public int SignalTF2BaseBarsPeriodTypeValue
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Kagi|True")]
        [Display(Name = "SignalTF2KagiReversalType", Order = 10, GroupName = "TF2 Parameters")]
        public ReversalType SignalTF2KagiReversalType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF2PFReversal", Order = 11, GroupName = "TF2 Parameters")]
        public int SignalTF2PFReversal
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF2PFPriceType", Order = 12, GroupName = "TF2 Parameters")]
        public PointAndFigurePriceType SignalTF2PFPriceType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF2UniTickTrend", Order = 13, GroupName = "TF2 Parameters")]
        public int SignalTF2UniTickTrend
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF2UniOpenOffset", Order = 14, GroupName = "TF2 Parameters")]
        public int SignalTF2UniOpenOffset
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF2UniTickReversal", Order = 15, GroupName = "TF2 Parameters")]
        public int SignalTF2UniTickReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF2BrickSize", Order = 16, GroupName = "TF2 Parameters")]
        public int SignalTF2BrickSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF2|TF2Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF2TrendTreshold", Order = 17, GroupName = "TF2 Parameters")]
        public int SignalTF2TrendTreshold
        { get; set; }
		
		#endregion
		
		#region TF3
		
		[NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TF3 Enabled", Order = 1, GroupName = "TF3 Parameters")]
        public bool TF3Enabled
        {
            get; set;
        }

        [RefreshProperties(RefreshProperties.All)]
        [IvAttributes.IvShowHideAttribute("TF3Enabled", "True")]
        [TypeConverter(typeof(TF_Converter))]
        [Display(Name = "SignalTF3", Order = 3, GroupName = "TF3 Parameters")]
        public string SignalTF3
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Line Break|True")]
        [Display(Name = "SignalTF3LineBreakCount", Order = 4, GroupName = "TF3 Parameters")]
        public int SignalTF3LineBreakCount
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Kagi|True")]
        [Display(Name = "SignalTF3KagiReversal", Order = 5, GroupName = "TF3 Parameters")]
        public int SignalTF3KagiReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF3PFBoxSize", Order = 6, GroupName = "TF3 Parameters")]
        public int SignalTF3PFBoxSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Kagi!Point and Figure!Heiken Ashi!Line Break!UniRenko!ninZaRenko|True")]
        [Display(Name = "SignalTF3Period", Order = 7, GroupName = "TF3 Parameters")]
        public int SignalTF3Period
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF3BaseBarsPeriodType", Order = 8, GroupName = "TF3 Parameters")]
        public BarsPeriodType SignalTF3BaseBarsPeriodType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF3BaseBarsPeriodTypeValue", Order = 9, GroupName = "TF3 Parameters")]
        public int SignalTF3BaseBarsPeriodTypeValue
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Kagi|True")]
        [Display(Name = "SignalTF3KagiReversalType", Order = 10, GroupName = "TF3 Parameters")]
        public ReversalType SignalTF3KagiReversalType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF3PFReversal", Order = 11, GroupName = "TF3 Parameters")]
        public int SignalTF3PFReversal
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF3PFPriceType", Order = 12, GroupName = "TF3 Parameters")]
        public PointAndFigurePriceType SignalTF3PFPriceType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF3UniTickTrend", Order = 13, GroupName = "TF3 Parameters")]
        public int SignalTF3UniTickTrend
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF3UniOpenOffset", Order = 14, GroupName = "TF3 Parameters")]
        public int SignalTF3UniOpenOffset
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF3UniTickReversal", Order = 15, GroupName = "TF3 Parameters")]
        public int SignalTF3UniTickReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF3BrickSize", Order = 16, GroupName = "TF3 Parameters")]
        public int SignalTF3BrickSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF3|TF3Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF3TrendTreshold", Order = 17, GroupName = "TF3 Parameters")]
        public int SignalTF3TrendTreshold
        { get; set; }
		
		#endregion
		
		#region TF4
		
		[NinjaScriptProperty]
        [RefreshProperties(RefreshProperties.All)]
        [Display(Name = "TF4 Enabled", Order = 1, GroupName = "TF4 Parameters")]
        public bool TF4Enabled
        {
            get; set;
        }

        [RefreshProperties(RefreshProperties.All)]
        [IvAttributes.IvShowHideAttribute("TF4Enabled", "True")]
        [TypeConverter(typeof(TF_Converter))]
        [Display(Name = "SignalTF4", Order = 3, GroupName = "TF4 Parameters")]
        public string SignalTF4
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Line Break|True")]
        [Display(Name = "SignalTF4LineBreakCount", Order = 4, GroupName = "TF4 Parameters")]
        public int SignalTF4LineBreakCount
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Kagi|True")]
        [Display(Name = "SignalTF4KagiReversal", Order = 5, GroupName = "TF4 Parameters")]
        public int SignalTF4KagiReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF4PFBoxSize", Order = 6, GroupName = "TF4 Parameters")]
        public int SignalTF4PFBoxSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Kagi!Point and Figure!Heiken Ashi!Line Break!UniRenko!ninZaRenko|True")]
        [Display(Name = "SignalTF4Period", Order = 7, GroupName = "TF4 Parameters")]
        public int SignalTF4Period
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF4BaseBarsPeriodType", Order = 8, GroupName = "TF4 Parameters")]
        public BarsPeriodType SignalTF4BaseBarsPeriodType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Kagi/Point and Figure/Heiken Ashi/Line Break|True")]
        [Display(Name = "SignalTF4BaseBarsPeriodTypeValue", Order = 9, GroupName = "TF4 Parameters")]
        public int SignalTF4BaseBarsPeriodTypeValue
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Kagi|True")]
        [Display(Name = "SignalTF4KagiReversalType", Order = 10, GroupName = "TF4 Parameters")]
        public ReversalType SignalTF4KagiReversalType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF4PFReversal", Order = 11, GroupName = "TF4 Parameters")]
        public int SignalTF4PFReversal
        { get; set; }

        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "Point and Figure|True")]
        [Display(Name = "SignalTF4PFPriceType", Order = 12, GroupName = "TF4 Parameters")]
        public PointAndFigurePriceType SignalTF4PFPriceType
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF4UniTickTrend", Order = 13, GroupName = "TF4 Parameters")]
        public int SignalTF4UniTickTrend
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF4UniOpenOffset", Order = 14, GroupName = "TF4 Parameters")]
        public int SignalTF4UniOpenOffset
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "UniRenko|True")]
        [Display(Name = "SignalTF4UniTickReversal", Order = 15, GroupName = "TF4 Parameters")]
        public int SignalTF4UniTickReversal
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF4BrickSize", Order = 16, GroupName = "TF4 Parameters")]
        public int SignalTF4BrickSize
        { get; set; }

        [Range(1, int.MaxValue)]
        [IvAttributes.IvShowHideAttribute("SignalTF4|TF4Enabled", "ninZaRenko|True")]
        [Display(Name = "SignalTF4TrendTreshold", Order = 17, GroupName = "TF4 Parameters")]
        public int SignalTF4TrendTreshold
        { get; set; }
		
		
		#endregion
		
		#endregion
		
		#region Trend Parameters
		
		[NinjaScriptProperty]
		[Range(1, Int32.MaxValue)]
		[Display(Name="MA Period", Order=1, GroupName="Trend Parameters")]
		public int MAPeriod
		{ get; set; }
		
		#endregion
		
        #endregion

        public override string DisplayName
        {
            get { return State == State.SetDefaults ? "RenkoTrader v1.6" : Name; }
        }
		
		protected override void OnStateChange()
		{
			if (State == State.SetDefaults)
			{
				Name										= "RenkoTrader v1.6";
				Calculate									= Calculate.OnBarClose;
				IsOverlay									= true;
				DisplayInDataBox							= true;
				DrawOnPricePanel							= true;
				DrawHorizontalGridLines						= true;
				DrawVerticalGridLines						= true;
				PaintPriceMarkers							= true;
				ScaleJustification							= NinjaTrader.Gui.Chart.ScaleJustification.Right;
				IsSuspendedWhileInactive					= false;
				
				TradeLongs = true;
				TradeShorts = true;
				RenkoFilter = true;
				IchimokuFilter = true;
				DTDBFilter = true;

                EntryOffset = 2;
                StrategyEnabled = false;

                CancelEntryBars = 1;

                PeriodFast = 9;
                PeriodMedium = 26;
                PeriodSlow = 52;
                CloudDisplacement = 26;
				
				//Trend Parameters
				MAPeriod = 55;
				
				TF1Enabled = true;
                SignalTF1 = "Minute";
                SignalTF1Period = 1;
                SignalTF1KagiReversal = 2;
                SignalTF1BaseBarsPeriodType = BarsPeriodType.Minute;
                SignalTF1BaseBarsPeriodTypeValue = 1;
                SignalTF1KagiReversalType = ReversalType.Tick;
                SignalTF1PFBoxSize = 2;
                SignalTF1PFReversal = 3;
                SignalTF1PFPriceType = PointAndFigurePriceType.Close;
                SignalTF1LineBreakCount = 3;
                SignalTF1UniTickTrend = 2;
                SignalTF1UniOpenOffset = 4;
                SignalTF1UniTickReversal = 2;
                SignalTF1BrickSize = 40;
                SignalTF1TrendTreshold = 8;
				
				TF2Enabled = true;
                SignalTF2 = "Minute";
                SignalTF2Period = 3;
                SignalTF2KagiReversal = 2;
                SignalTF2BaseBarsPeriodType = BarsPeriodType.Minute;
                SignalTF2BaseBarsPeriodTypeValue = 1;
                SignalTF2KagiReversalType = ReversalType.Tick;
                SignalTF2PFBoxSize = 2;
                SignalTF2PFReversal = 3;
                SignalTF2PFPriceType = PointAndFigurePriceType.Close;
                SignalTF2LineBreakCount = 3;
                SignalTF2UniTickTrend = 2;
                SignalTF2UniOpenOffset = 4;
                SignalTF2UniTickReversal = 2;
                SignalTF2BrickSize = 40;
                SignalTF2TrendTreshold = 8;
				
				TF3Enabled = true;
                SignalTF3 = "Minute";
                SignalTF3Period = 10;
                SignalTF3KagiReversal = 2;
                SignalTF3BaseBarsPeriodType = BarsPeriodType.Minute;
                SignalTF3BaseBarsPeriodTypeValue = 1;
                SignalTF3KagiReversalType = ReversalType.Tick;
                SignalTF3PFBoxSize = 2;
                SignalTF3PFReversal = 3;
                SignalTF3PFPriceType = PointAndFigurePriceType.Close;
                SignalTF3LineBreakCount = 3;
                SignalTF3UniTickTrend = 2;
                SignalTF3UniOpenOffset = 4;
                SignalTF3UniTickReversal = 2;
                SignalTF3BrickSize = 40;
                SignalTF3TrendTreshold = 8;
				
				TF4Enabled = true;
                SignalTF4 = "Minute";
                SignalTF4Period = 30;
                SignalTF4KagiReversal = 2;
                SignalTF4BaseBarsPeriodType = BarsPeriodType.Minute;
                SignalTF4BaseBarsPeriodTypeValue = 1;
                SignalTF4KagiReversalType = ReversalType.Tick;
                SignalTF4PFBoxSize = 2;
                SignalTF4PFReversal = 3;
                SignalTF4PFPriceType = PointAndFigurePriceType.Close;
                SignalTF4LineBreakCount = 3;
                SignalTF4UniTickTrend = 2;
                SignalTF4UniOpenOffset = 4;
                SignalTF4UniTickReversal = 2;
                SignalTF4BrickSize = 40;
                SignalTF4TrendTreshold = 8;
				
            }
			else if (State == State.Configure)
			{
				
				#region TF1
				
				//if (TF1Enabled)
    //            {
                    TF_Keys = Get_TF_Keys();

                    if (SignalTF1 == "Renko")
                    {
                        AddRenko(Instruments[0].FullName, SignalTF1Period, MarketDataType.Last);
                    }
                    else if (SignalTF1 == "Kagi")
                    {
                        AddKagi(Instruments[0].FullName, SignalTF1BaseBarsPeriodType, SignalTF1BaseBarsPeriodTypeValue, SignalTF1KagiReversal, SignalTF1KagiReversalType, MarketDataType.Last);
                    }
                    else if (SignalTF1 == "Heiken Ashi")
                    {
                        AddHeikenAshi(Instruments[0].FullName, SignalTF1BaseBarsPeriodType, SignalTF1BaseBarsPeriodTypeValue, MarketDataType.Last);
                    }
                    else if (SignalTF1 == "Line Break")
                    {
                        AddLineBreak(Instruments[0].FullName, SignalTF1BaseBarsPeriodType, SignalTF1BaseBarsPeriodTypeValue, SignalTF1LineBreakCount, MarketDataType.Last);
                    }
                    else if (SignalTF1.Contains("UniRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF1], Value = SignalTF1UniTickTrend, BaseBarsPeriodValue = SignalTF1UniOpenOffset, Value2 = SignalTF1UniTickReversal });
                    }
                    else if (SignalTF1.Contains("ninZaRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF1], Value = SignalTF1BrickSize, Value2 = SignalTF1TrendTreshold });
                    }
                    else
                    {
                        AddDataSeries(Instruments[0].FullName, (BarsPeriodType)TF_Keys[SignalTF1], SignalTF1Period);
                        
                    }
                //}
				
				#endregion
				
				#region TF2
				
				//if (TF2Enabled)
    //            {
                    TF_Keys = Get_TF_Keys();

                    if (SignalTF2 == "Renko")
                    {
                        AddRenko(Instruments[0].FullName, SignalTF2Period, MarketDataType.Last);
                    }
                    else if (SignalTF2 == "Kagi")
                    {
                        AddKagi(Instruments[0].FullName, SignalTF2BaseBarsPeriodType, SignalTF2BaseBarsPeriodTypeValue, SignalTF2KagiReversal, SignalTF2KagiReversalType, MarketDataType.Last);
                    }
                    else if (SignalTF2 == "Heiken Ashi")
                    {
                        AddHeikenAshi(Instruments[0].FullName, SignalTF2BaseBarsPeriodType, SignalTF2BaseBarsPeriodTypeValue, MarketDataType.Last);
                    }
                    else if (SignalTF2 == "Line Break")
                    {
                        AddLineBreak(Instruments[0].FullName, SignalTF2BaseBarsPeriodType, SignalTF2BaseBarsPeriodTypeValue, SignalTF2LineBreakCount, MarketDataType.Last);
                    }
                    else if (SignalTF2.Contains("UniRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF2], Value = SignalTF2UniTickTrend, BaseBarsPeriodValue = SignalTF2UniOpenOffset, Value2 = SignalTF2UniTickReversal });
                    }
                    else if (SignalTF2.Contains("ninZaRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF2], Value = SignalTF2BrickSize, Value2 = SignalTF2TrendTreshold });
                    }
                    else
                    {
                        AddDataSeries(Instruments[0].FullName, (BarsPeriodType)TF_Keys[SignalTF2], SignalTF2Period);
                        
                    }
                //}
				
				#endregion
				
				#region TF3
				
				//if (TF3Enabled)
    //            {
                    TF_Keys = Get_TF_Keys();

                    if (SignalTF3 == "Renko")
                    {
                        AddRenko(Instruments[0].FullName, SignalTF3Period, MarketDataType.Last);
                    }
                    else if (SignalTF3 == "Kagi")
                    {
                        AddKagi(Instruments[0].FullName, SignalTF3BaseBarsPeriodType, SignalTF3BaseBarsPeriodTypeValue, SignalTF3KagiReversal, SignalTF3KagiReversalType, MarketDataType.Last);
                    }
                    else if (SignalTF3 == "Heiken Ashi")
                    {
                        AddHeikenAshi(Instruments[0].FullName, SignalTF3BaseBarsPeriodType, SignalTF3BaseBarsPeriodTypeValue, MarketDataType.Last);
                    }
                    else if (SignalTF3 == "Line Break")
                    {
                        AddLineBreak(Instruments[0].FullName, SignalTF3BaseBarsPeriodType, SignalTF3BaseBarsPeriodTypeValue, SignalTF3LineBreakCount, MarketDataType.Last);
                    }
                    else if (SignalTF3.Contains("UniRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF3], Value = SignalTF3UniTickTrend, BaseBarsPeriodValue = SignalTF3UniOpenOffset, Value2 = SignalTF3UniTickReversal });
                    }
                    else if (SignalTF3.Contains("ninZaRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF3], Value = SignalTF3BrickSize, Value2 = SignalTF3TrendTreshold });
                    }
                    else
                    {
                        AddDataSeries(Instruments[0].FullName, (BarsPeriodType)TF_Keys[SignalTF3], SignalTF3Period);
                        
                    }
                //}
				
				#endregion
				
				#region TF4
				
				//if (TF4Enabled)
    //            {
                    TF_Keys = Get_TF_Keys();

                    if (SignalTF4 == "Renko")
                    {
                        AddRenko(Instruments[0].FullName, SignalTF4Period, MarketDataType.Last);
                    }
                    else if (SignalTF4 == "Kagi")
                    {
                        AddKagi(Instruments[0].FullName, SignalTF4BaseBarsPeriodType, SignalTF4BaseBarsPeriodTypeValue, SignalTF4KagiReversal, SignalTF4KagiReversalType, MarketDataType.Last);
                    }
                    else if (SignalTF4 == "Heiken Ashi")
                    {
                        AddHeikenAshi(Instruments[0].FullName, SignalTF4BaseBarsPeriodType, SignalTF4BaseBarsPeriodTypeValue, MarketDataType.Last);
                    }
                    else if (SignalTF4 == "Line Break")
                    {
                        AddLineBreak(Instruments[0].FullName, SignalTF4BaseBarsPeriodType, SignalTF4BaseBarsPeriodTypeValue, SignalTF4LineBreakCount, MarketDataType.Last);
                    }
                    else if (SignalTF4.Contains("UniRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF4], Value = SignalTF4UniTickTrend, BaseBarsPeriodValue = SignalTF4UniOpenOffset, Value2 = SignalTF4UniTickReversal });
                    }
                    else if (SignalTF4.Contains("ninZaRenko"))
                    {
                        AddDataSeries(Instruments[0].FullName, new BarsPeriod { BarsPeriodType = (BarsPeriodType)TF_Keys[SignalTF4], Value = SignalTF4BrickSize, Value2 = SignalTF4TrendTreshold });
                    }
                    else
                    {
                        AddDataSeries(Instruments[0].FullName, (BarsPeriodType)TF_Keys[SignalTF4], SignalTF4Period);
                    }
                //}
				
				#endregion
				
			}
            else if (State == State.DataLoaded)
            {
                bar0FT = new IvHelpers.FirstTick(CurrentBars[0]);

                ichimoku = IchimokuCloud(true, false, PeriodFast, PeriodMedium, PeriodSlow,
                    40, Brushes.Green, Brushes.Red, CloudDisplacement);


                timeFilters.Add(new TimeFilter(StartTime1, EndTime1, TimeFilterEnabled && (TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._1 || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._2
                                                                                        || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._3 || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._4)));
                timeFilters.Add(new TimeFilter(StartTime2, EndTime2, TimeFilterEnabled && (TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._2 || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._3 || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._4)));
                timeFilters.Add(new TimeFilter(StartTime3, EndTime3, TimeFilterEnabled && (TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._3 || TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._4)));
                timeFilters.Add(new TimeFilter(StartTime4, EndTime4, TimeFilterEnabled && TimeFiltersNumber == RenkoTraderEnums.TimeFiltersNumberEnum._4));


                int barsIdx = 0;

                //if (TF1Enabled)
                //{
                    tf1Idx = barsIdx;
                    barsIdx++;
                    trend1 = SMA(BarsArray[barsIdx], MAPeriod);

                    rows.Add(new _Row(barsIdx, trend1));
                //}
				
				//if(TF2Enabled)
    //            {
                    tf2Idx = barsIdx;
                    barsIdx++;
                    trend2 = SMA(BarsArray[barsIdx], MAPeriod);
                    rows.Add(new _Row(barsIdx, trend2));
                //}

                //if (TF3Enabled)
                //{
                    tf3Idx = barsIdx;
                    barsIdx++;
                    trend3	 = SMA(BarsArray[barsIdx], MAPeriod);
                    rows.Add(new _Row(barsIdx, trend3));
                //}

                //if (TF4Enabled)
                //{
                    tf4Idx = barsIdx;
                    barsIdx++;
                    trend4	 = SMA(BarsArray[barsIdx], MAPeriod);
                    rows.Add(new _Row(barsIdx, trend4));
                //}



            }
            else if (State == State.Historical)
            {
                if (ChartControl != null)
                {
                    ChartControl.Dispatcher.InvokeAsync((Action)(() =>
                    {

                        CreateWPFControls();
                    }));
                }
            }
            else if (State == State.Terminated)
            {
                if (ChartControl != null)
                {
                    ChartControl.Dispatcher.InvokeAsync((Action)(() =>
                    {
                        DisposeWPFControls();
                    }));
                }

                
            }
        }

		protected override void OnBarUpdate()
		{
			
            bar0FT.Update(CurrentBars[0]);

            int idx = State == State.Historical || Calculate == Calculate.OnBarClose ? 0 : 1;

            if (CurrentBars[0] < CloudDisplacement + 1)
                return;

            
            foreach (_Row row in rows)
            {
                if (CurrentBars[row.BarsIndex] > 0 && BarsInProgress == row.BarsIndex)
                {
                    row.Trend.Update(CurrentBars[row.BarsIndex], row.BarsIndex);
                    row.UpdateTrend(CurrentBars[row.BarsIndex], Closes[row.BarsIndex].GetValueAt(CurrentBars[row.BarsIndex]));
                }
                
            }

            
            if(BarsInProgress != 0)
				return;  

            ichimoku.Update(CurrentBars[0], 0);

            UpdatePeaksBottoms(idx);

            if (State == State.Historical || CurrentBars[0] < 3)
                return;

            
            PlaceVirtualPending(idx);
            CancelVirtualPending(idx);

            //Print(ichimoku.SenkouSpanA[26] + " " + ichimoku.SenkouSpanB[26]);
            
		}

        protected override void OnMarketData(MarketDataEventArgs marketDataUpdate)
        {
            if(marketDataUpdate.MarketDataType == MarketDataType.Last)
            {
                double price = marketDataUpdate.Last;

                if((placeLong || placeShort) && 
                    ((priorPrice < entryPrice && price >= entryPrice) ||
                    (priorPrice > entryPrice && price <= entryPrice)))
                {
                    PlaceEntry(placeLong);
                    placeLong = false;
                    placeShort = false;
                    entryDir = 0;
                }

                priorPrice = price;
            }
        }

        protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
        {
            base.OnRender(chartControl, chartScale);

            //return;

            var tf = textFont.ToDirectWriteTextFormat();
            SharpDX.Direct2D1.Brush upBrush = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Green);
            SharpDX.Direct2D1.Brush dnBrush = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Red);
            SharpDX.Direct2D1.Brush backBrush = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Black);
            SharpDX.Direct2D1.Brush textBrush = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.White);
            SharpDX.Direct2D1.Brush outBrush = new SharpDX.Direct2D1.SolidColorBrush(RenderTarget, SharpDX.Color.Gray);


            GetText(tf);

            DrawRows(chartControl, chartScale, backBrush, outBrush, textBrush, upBrush, dnBrush);

            upBrush.Dispose();
            dnBrush.Dispose();
            backBrush.Dispose();
            textBrush.Dispose();
            outBrush.Dispose();
            tf.Dispose();



        }

        private void GetText(SharpDX.DirectWrite.TextFormat tf)
        {

            rowHeight = 0f;

            for (int i = 0; i < rows.Count; i++)
            {

                rows[i].UpdateTrend(CurrentBars[rows[i].BarsIndex], Closes[rows[i].BarsIndex].GetValueAt(CurrentBars[rows[i].BarsIndex]));

                rows[i].tfTL = new SharpDX.DirectWrite.TextLayout(NinjaTrader.Core.Globals.DirectWriteFactory, BarsArray[rows[i].BarsIndex].BarsPeriod.ToString(),
                    tf, ChartPanel.W, ChartPanel.H);
                rows[i].labelTL = new SharpDX.DirectWrite.TextLayout(NinjaTrader.Core.Globals.DirectWriteFactory, rows[i].Label(CurrentBars[rows[i].BarsIndex], Closes[rows[i].BarsIndex][0]),
                    tf, ChartPanel.W, ChartPanel.H);


                tfWidth = Math.Max(rows[i].tfTL.Metrics.Width, tfWidth);
                labelWidth = Math.Max(rows[i].labelTL.Metrics.Width, labelWidth);
                rowHeight = Math.Max(rows[i].tfTL.Metrics.Height, rowHeight);


            }
        }

        private void DrawRows(ChartControl chartControl, ChartScale chartScale,
            SharpDX.Direct2D1.Brush backBrush, SharpDX.Direct2D1.Brush outlineBrush, SharpDX.Direct2D1.Brush textBrush
            , SharpDX.Direct2D1.Brush upBrush, SharpDX.Direct2D1.Brush dnBrush)
        {

            rowHeight += rectOffset * 2;

            for(int i = 0; i < rows.Count; i++)
            {
                float x = ChartPanel.X + tableMargin;
                DrawCell(chartControl, chartScale, rows[i].tfTL, new SharpDX.Vector2(x, ChartPanel.Y + tableMargin + rowHeight * i),
                    tfWidth + rectOffset * 2, rowHeight, backBrush, outlineBrush, textBrush, upBrush, dnBrush, false, (int)rows[i].TrendType);

                x += tfWidth + rectOffset * 2;
                //if(rows[i].trendTL != null)
                DrawCell(chartControl, chartScale, rows[i].trendTL, new SharpDX.Vector2(x, ChartPanel.Y + tableMargin + rowHeight * i),
                    trendWidth + rectOffset * 2, rowHeight, backBrush, outlineBrush, textBrush, upBrush, dnBrush, true, (int)rows[i].TrendType);

                x += trendWidth + rectOffset * 2;
                DrawCell(chartControl, chartScale, rows[i].labelTL, new SharpDX.Vector2(x, ChartPanel.Y + tableMargin + rowHeight * i),
                    labelWidth + rectOffset * 2, rowHeight, backBrush, outlineBrush, textBrush, upBrush, dnBrush, false, (int)rows[i].TrendType);
            }


        }

        private void DrawCell(ChartControl chartControl, ChartScale chartScale, SharpDX.DirectWrite.TextLayout tl, 
            SharpDX.Vector2 start, float width, float height, SharpDX.Direct2D1.Brush backBrush, SharpDX.Direct2D1.Brush outlineBrush,
            SharpDX.Direct2D1.Brush textBrush, SharpDX.Direct2D1.Brush buyBrush, SharpDX.Direct2D1.Brush sellBrush,
             bool DrawRect, int TrendState)
        {
            var rect = new SharpDX.RectangleF(start.X - rectOffset, start.Y - rectOffset, width, height);

            RenderTarget.FillRectangle(rect, backBrush);
            RenderTarget.DrawRectangle(rect, outlineBrush);

            if(DrawRect)
            {
                bool buy = TrendState == 0;

                var rect2 = new SharpDX.RectangleF(start.X - rectOffset, start.Y - rectOffset,  width, height);

                RenderTarget.FillRectangle(rect2, buy ? buyBrush : sellBrush);

            }

            if(tl != null)
                RenderTarget.DrawTextLayout(start, tl, textBrush);

        }

        private class _Row
        {

            public int CurrentTrend { get; set; }
            public Indicator Trend { get; set; }
            public int BarsIndex { get; set; }
            public int TrendIdx { get; set; }

            public SharpDX.DirectWrite.TextLayout tfTL { get; set; }
            public SharpDX.DirectWrite.TextLayout trendTL { get; set; }
            public SharpDX.DirectWrite.TextLayout labelTL { get; set; }

            public enum TrendTypeEnum { Bullish, Bearish};

            public TrendTypeEnum TrendType { get; set; }

            private int cb;

            private double macd;
            private double bb_lower;
            private double bb_mid;
            private double bb_upper;
            //public bool

            public _Row(int BarsIndex, Indicator trend)
            {
                this.BarsIndex = BarsIndex;
                Trend = trend;
            }

            public void Update(double macd, double bb_lower, double bb_mid, double bb_upper)
            {
                this.macd = macd;
                this.bb_lower = bb_lower;
                this.bb_mid = bb_mid;
                this.bb_upper = bb_upper;
                
            }

            public bool IsBullish(int bar, double close)
            {
                return cb >= 0 && close > Trend.Values[0].GetValueAt(bar);
            }

            public bool IsBearish(int bar, double close)
            {
                return cb >= 0 && close < Trend.Values[0].GetValueAt(bar);
            }

            public string Label(int bar, double close)
            {

                //return CurrentTrend == 2 && Trend.Values[0].GetValueAt(bar) > Trend.Values[4].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) < 0 ? "Rising" :
                //        CurrentTrend == 2 && Trend.Values[0].GetValueAt(bar) > Trend.Values[4].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) > 0 ? "Bullish" :
                //        CurrentTrend == 1 && Trend.Values[0].GetValueAt(bar) < Trend.Values[3].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) > 0 ? "Falling" :
                //        CurrentTrend == 1 && Trend.Values[0].GetValueAt(bar) < Trend.Values[3].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) < 0 ? "Bearish" : "None";

                if (cb < 0)
                    return "None";

                
                return close > Trend.Values[0].GetValueAt(bar) ? "Bullish" : "Bearish";
//					macd <= upper && macd >= lower ?
//                        (CurrentTrend == 2 && Trend.Values[0].GetValueAt(bar) > Trend.Values[4].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) < 0 ? "Rising" :
//                            CurrentTrend == 2 && Trend.Values[0].GetValueAt(bar) > Trend.Values[4].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) > 0 ? "Bullish" :
//                            CurrentTrend == 1 && Trend.Values[0].GetValueAt(bar) < Trend.Values[3].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) > 0 ? "Falling" :
//                            CurrentTrend == 1 && Trend.Values[0].GetValueAt(bar) < Trend.Values[3].GetValueAt(bar) && Trend.Values[0].GetValueAt(bar) < 0 ? "Bearish" : "None") :
//                            macd > lower && macd < 0 ? "Rising" :
//                            macd > lower && macd > 0 ? "Bullish" :
//                            macd < upper && macd > 0 ? "Falling" :
//                            macd < upper && macd < 0 ? "Bearish" : "None";


            }

            public void UpdateTrend(int bar,double close)
            {

                cb = bar;

                if (IsBullish(bar, close))
                    CurrentTrend = 1;
                else if (IsBearish(bar, close))
                    CurrentTrend = 2;

                TrendType = IsBullish(bar, close) ? TrendTypeEnum.Bullish : TrendTypeEnum.Bearish;
            }

            //public bool AreNotEnoughBars()
            //{
            //    Trend.Print(Trend.BarsArray[0].BarsPeriod.ToString()+ " " + Trend.CurrentBar);
            //    return Trend.CurrentBar < 3;
            //}

            //public string TrendString(int bar)
            //{
            //    return 
            //}

        }

        private void PlaceVirtualPending(int idx)
        {
            if (bar0FT.IsFirstTick && StrategyEnabled)
            {
                
                if (IsEntry(true, idx) && TradeLongs)
                {

                    //Print(Times[0][0] + " Place Long");
                    entryPrice = Closes[0][idx] + EntryOffset * TickSize;
                    entryDir = 1;
                    placeLong = true;
                    entryBar = CurrentBars[0] - idx;

                    //Print(Times[0][idx]+" Place Long Pending "+entryPrice+" "+positionPlaced);
                }

                if (IsEntry(false, idx) && TradeShorts)
                {
                    //Print(Times[0][0] + " Place Short");
                    entryPrice = Closes[0][idx] - EntryOffset * TickSize;
                    entryDir = 2;
                    placeShort = true;
                    entryBar = CurrentBars[0] - idx;

                    //Print(Times[0][idx] + " Place Short Pending " + entryPrice + " " + positionPlaced);
                }
            }


        }

        private void CancelVirtualPending(int idx)
        {
            if (bar0FT.IsFirstTick)
            {
                if (CurrentBars[0] - idx > entryBar)
                {
                    placeLong = false;
                    placeShort = false;
                    entryDir = 0;

                }
            }
        }

        AtmStrategy atm;

        private void PlaceEntry(bool buy)
        {

            if(selectedAccount != null)
            {
                if(selectedAtmStrategy != null && (atm == null || atm.State == State.Finalized || atm.Position.MarketPosition == MarketPosition.Flat) )
                {
                    var entry = selectedAccount.CreateOrder(Instrument,
                        buy ? OrderAction.Buy : OrderAction.Sell, 
                        OrderType.Market, 
                        timeInForce,
                        quantity, 0, 0, "", "Entry", null);

                    atm = AtmStrategy.StartAtmStrategy(selectedAtmStrategy, entry);

                }
            }
        }

        private bool IsEntry(bool isLong, int idx)
        {
            if (IsRenkoEntry(isLong, idx) && IsIchimokuFilter(isLong, idx) && IsValidTime(Times[0][idx]) && IsTrendFilter(isLong, idx))
                return true;
            else if(IsIchimokuEntry(isLong, idx) && !RenkoFilter && !DTDBFilter && IsValidTime(Times[0][idx]) && IsTrendFilter(isLong, idx))
            {
                return true;
            }

            return false;
        }

        private bool IsRenkoEntry(bool isLong, int idx)
        {
            return RenkoFilter && 
                bar0FT.IsFirstTick && 
                ((isLong && Closes[0][idx + 1] < Opens[0][idx + 1] && Closes[0][idx] > Opens[0][idx] && IsDoubleBotTop(true)) ||
                (!isLong && Closes[0][idx + 1] > Opens[0][idx + 1] && Closes[0][idx] < Opens[0][idx] && IsDoubleBotTop(false)));
        }

        private bool IsDoubleBotTop(bool isLong)
        {
            //if (dnTrendBars.Count > 1)
            //    Print(Times[0][0] + " " + dnTrendBars[dnTrendBars.Count - 1] + " " + dnTrendBars[dnTrendBars.Count - 2]+ " " + 
            //        DTDBFilter +" "+ upTrendBars[upTrendBars.Count - 1]+" "+upTrendBars[upTrendBars.Count - 2]);

            return !DTDBFilter || ((isLong && dnTrendBars.Count > 1 && dnTrendBars[dnTrendBars.Count - 2] >= 3 && dnTrendBars[dnTrendBars.Count - 1] >= 3) || 
                                    (!isLong && upTrendBars[upTrendBars.Count - 2] >= 3 && upTrendBars[upTrendBars.Count - 1] >= 3));
        }

        private bool IsIchimokuFilter(bool isLong, int idx)
        {
            return !IchimokuFilter || ((isLong && Closes[0][idx] > Math.Max(ichimoku.SenkouSpanA[CloudDisplacement + idx], ichimoku.SenkouSpanB[CloudDisplacement + idx])) ||
                                        (!isLong && Closes[0][idx] < Math.Min(ichimoku.SenkouSpanA[CloudDisplacement + idx], ichimoku.SenkouSpanB[CloudDisplacement + idx])));
        }

        private bool IsIchimokuEntry(bool isLong, int idx)
        {
            double top0 = Math.Max(ichimoku.SenkouSpanA[CloudDisplacement + idx], ichimoku.SenkouSpanB[CloudDisplacement + idx]);
            double bot0 = Math.Min(ichimoku.SenkouSpanA[CloudDisplacement + idx], ichimoku.SenkouSpanB[CloudDisplacement + idx]);
            double top1 = Math.Max(ichimoku.SenkouSpanA[CloudDisplacement + idx + 1], ichimoku.SenkouSpanB[CloudDisplacement + idx + 1]);
            double bot1 = Math.Min(ichimoku.SenkouSpanA[CloudDisplacement + idx + 1], ichimoku.SenkouSpanB[CloudDisplacement + idx + 1]);

            return IchimokuFilter && ((isLong && Closes[0][idx] > top0 && Closes[0][idx + 1] <= top1) ||
                                        (!isLong && Closes[0][idx] < bot0 && Closes[0][idx + 1] >= bot1));
        }

        private void UpdatePeaksBottoms(int idx)
        {
            if(bar0FT.IsFirstTick)
            {
                if(Closes[0][idx + 1] < Opens[0][idx + 1] && Closes[0][idx] > Opens[0][idx])
                {
                    upTrendBars.Add(1);
                }
                else if (Closes[0][idx + 1] > Opens[0][idx + 1] && Closes[0][idx] < Opens[0][idx])
                {
                    dnTrendBars.Add(1);
                }
                else if(Closes[0][idx] > Opens[0][idx])
                {
                    if(upTrendBars.Count > 0)
                        upTrendBars[upTrendBars.Count - 1]++;
                }
                else if (Closes[0][idx] < Opens[0][idx])
                {
                    if (dnTrendBars.Count > 0)
                        dnTrendBars[dnTrendBars.Count - 1]++;
                }
            }
        }

        private bool IsTrendFilter(bool isLong, int idx)
        {
            return
                !TrendFilter ||
                (TrendFilter && ((!TF1Enabled || IsValidTF(isLong, tf1Idx, idx)) &&
                                (!TF2Enabled || IsValidTF(isLong, tf2Idx, idx)) &&
                                (!TF3Enabled || IsValidTF(isLong, tf3Idx, idx)) &&
                                (!TF4Enabled || IsValidTF(isLong, tf4Idx, idx))));
                
        }

        private bool IsValidTF(bool isLong, int tfIdx, int idx)
        {
            return (
                
                            (isLong && ((rows[tfIdx].IsBullish(CurrentBars[rows[tfIdx].BarsIndex], Closes[rows[tfIdx].BarsIndex][idx]))))

                        || (!isLong && ((rows[tfIdx].IsBearish(CurrentBars[rows[tfIdx].BarsIndex], Closes[rows[tfIdx].BarsIndex][idx]))))
                                    
                                    );
        }

        #region Position Update

        private void SelectedAccountOnPositionUpdate(object sender, PositionEventArgs e)
        {
            if (e.Position == null || e.Position.MarketPosition == MarketPosition.Flat)
            {
                positionPlaced = false;
            }
            else
            {
                
            }

        }

        #endregion

        #region InfoPanel

        int sidePanelWidth = 200;

        #region CreateWPFControls

        protected void CreateWPFControls()
        {
            try
            {

                chartWindow = System.Windows.Window.GetWindow(ChartControl.Parent) as Chart;

                chartWindow.Dispatcher.Invoke((Action)(() =>
                {
                    {
                        TabItem t = chartWindow.MainTabControl.SelectedItem as TabItem;
                        ChartTab TabMe = t.Content as ChartTab;
                        tabId = TabMe.PersistenceId;
                    }
                }));

                chartGrid = chartWindow.MainTabControl.Parent as System.Windows.Controls.Grid;
                chartTrader = chartWindow.FindFirst("ChartWindowChartTraderControl") as Gui.Chart.ChartTrader;
                chartTraderGrid = (chartWindow.FindFirst("ChartWindowChartTraderControl") as Gui.Chart.ChartTrader).Content as System.Windows.Controls.Grid;
                accountSelector = (Window.GetWindow(ChartControl.Parent).FindFirst("ChartTraderControlAccountSelector") as NinjaTrader.Gui.Tools.AccountSelector);
                qudQuantity = LogicalTreeHelper.FindLogicalNode(chartWindow, "qudQuantity") as NinjaTrader.Gui.Tools.QuantityUpDown;

                if (qudQuantity != null)
                {
                    qudQuantity.ValueChanged += qudQuantity_ValueChanged;
                    quantity = qudQuantity.Value;
                }

                tifSelector = LogicalTreeHelper.FindLogicalNode(chartWindow, "tifSelector") as TifSelector;
                if(tifSelector != null)
                {
                    tifSelector.SelectionChanged += tifSelector_SelectionChanged;
                    timeInForce = tifSelector.SelectedTif;
                }

                atmStrategySelector = LogicalTreeHelper.FindLogicalNode(chartWindow, "cbxStrategySelector") as NinjaTrader.Gui.NinjaScript.AtmStrategy.AtmStrategySelector;
                if (atmStrategySelector != null)
                {
                    atmStrategySelector.SelectionChanged += atmStrategySelector_SelectionChanged;
                    selectedAtmStrategy = atmStrategySelector.SelectedAtmStrategy;
                }

                addedRow = new System.Windows.Controls.RowDefinition() { Height = new GridLength(455) };

                commonGrid = new System.Windows.Controls.Grid();

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(35) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(25) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(25) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(25) });

                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(5) });
                commonGrid.RowDefinitions.Add(new System.Windows.Controls.RowDefinition() { Height = new GridLength(25) });


                System.Windows.Controls.Grid row1Grid = new System.Windows.Controls.Grid();
                row1Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());
                row1Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition() { Width = new GridLength(5) });
                row1Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());

                System.Windows.Controls.Grid row2Grid = new System.Windows.Controls.Grid();
                row2Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());
                row2Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition() { Width = new GridLength(5) });
                row2Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());

                System.Windows.Controls.Grid row3Grid = new System.Windows.Controls.Grid();
                row3Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());
                row3Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition() { Width = new GridLength(5) });
                row3Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());

                System.Windows.Controls.Grid row4Grid = new System.Windows.Controls.Grid();
                row4Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());
                row4Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition() { Width = new GridLength(5) });
                row4Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());

                System.Windows.Controls.Grid row5Grid = new System.Windows.Controls.Grid();
                row5Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());
                row5Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition() { Width = new GridLength(5) });
                row5Grid.ColumnDefinitions.Add(new System.Windows.Controls.ColumnDefinition());

                #region Buy Sell Buttons


                BuyButton = new Button
                {
                    Background = TradeLongs ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TradeLongs ? "Long On":"Long Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                BuyButton.Click += BuyButton_Click;
                Grid.SetColumn(BuyButton, 0);
                row1Grid.Children.Add(BuyButton);

                SellButton = new Button
                {
                    Background = TradeShorts ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TradeShorts ? "Short On" : "Short Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                SellButton.Click += SellButton_Click;
                Grid.SetColumn(SellButton, 2);
                row1Grid.Children.Add(SellButton);

                Grid.SetRow(row1Grid, 1);

                Grid.SetColumn(commonGrid, 1);
                commonGrid.Children.Add(row1Grid);

                #endregion

                #region Filters/Entry

                //Renko
                RenkoButton = new Button
                {
                    Background = RenkoFilter ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = RenkoFilter ? "Renko On" : "Renko Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                RenkoButton.Click += RenkoButton_Click;
                Grid.SetRow(RenkoButton, 3);
                commonGrid.Children.Add(RenkoButton);

                //Ichimoku
                IchimokuButton = new Button
                {
                    Background = IchimokuFilter ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = IchimokuFilter ? "Ichimoku On" : "Ichimoku Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                IchimokuButton.Click += IchimokuButton_Click;
                Grid.SetRow(IchimokuButton, 5);
                commonGrid.Children.Add(IchimokuButton);

                //Double Top/Bottom
                DTDBButton = new Button
                {
                    Background = DTDBFilter ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = DTDBFilter ? "DT/DB On" : "DT/DB Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                DTDBButton.Click += DTDBButton_Click;
                Grid.SetRow(DTDBButton, 7);
                commonGrid.Children.Add(DTDBButton);

                #endregion

                #region Entry Offset QUD


                EntryTicksQUD = new TextBox()
                {
                    Text = EntryOffset.ToString(),
                    VerticalContentAlignment = VerticalAlignment.Center,
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    HorizontalAlignment = HorizontalAlignment.Stretch,
                    MaxWidth = 1000,
                    Margin = new Thickness(2.5, 0, 0, 0),
                };


                EntryTicksQUD.PreviewKeyDown += TextBox_PreviewKeyDown;
                EntryTicksQUD.TextChanged += EntryTicksQUD_TextChanged;
                Grid.SetRow(EntryTicksQUD, 9);
                commonGrid.Children.Add(EntryTicksQUD);

                #endregion

                #region Close Button

                CloseButton = new Button
                {
                    Background = Brushes.Orange,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = "Close",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };
                CloseButton.Click += CloseButton_Click;

                Grid.SetRow(CloseButton, 11);

                commonGrid.Children.Add(CloseButton);

                #endregion

                #region Strategy Enabled Button

                StrategyEnabledButton = new Button
                {
                    Background = StrategyEnabled ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = StrategyEnabled ? "Strategy Enabled" : "StrategyDisabled",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                StrategyEnabledButton.Click += StrategyEnabledButton_Click;
                Grid.SetRow(StrategyEnabledButton, 13);
                commonGrid.Children.Add(StrategyEnabledButton);

                #endregion

                #region Trend Sense Button

                TrendSenseButton = new Button
                {
                    Background = TrendFilter ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TrendFilter ? "Trend Sense On" : "Trend Sense Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                TrendSenseButton.Click += TrendSenseButton_Click;
                Grid.SetRow(TrendSenseButton, 15);
                commonGrid.Children.Add(TrendSenseButton);

                #endregion

                #region TF1 

                TF1Button = new Button
                {
                    Background = TF1Enabled ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TF1Enabled ? "TF1 On" : "TF1 Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                TF1Button.Click += TF1Button_Click;
                Grid.SetColumn(TF1Button, 0);

//                TF1CheckBox = new CheckBox
//                {
//                    MinWidth = 10,
//                    FontWeight = FontWeight.FromOpenTypeWeight(400),
//                    Content = "Aggressive",
//                    HorizontalContentAlignment = HorizontalAlignment.Center,
//                    Margin = new Thickness(2.5, 0, 0, 0)
//                };

//                TF1CheckBox.Click += TF1CheckBox_Click;
//                Grid.SetColumn(TF1CheckBox, 2);

                Grid.SetRow(TF1Button, 17);

//                row2Grid.Children.Add(TF1Button);
//                row2Grid.Children.Add(TF1CheckBox);

                commonGrid.Children.Add(TF1Button);

                #endregion

                #region TF2 

                TF2Button = new Button
                {
                    Background = TF2Enabled ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TF2Enabled ? "TF2 On" : "TF2 Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                TF2Button.Click += TF2Button_Click;
                Grid.SetColumn(TF2Button, 0);

//                TF2CheckBox = new CheckBox
//                {
//                    MinWidth = 10,
//                    FontWeight = FontWeight.FromOpenTypeWeight(400),
//                    Content = "Aggressive",
//                    HorizontalContentAlignment = HorizontalAlignment.Center,
//                    Margin = new Thickness(2.5, 0, 0, 0)
//                };

//                TF2CheckBox.Click += TF2CheckBox_Click;
//                Grid.SetColumn(TF2CheckBox, 2);

                Grid.SetRow(TF2Button, 19);

//                row3Grid.Children.Add(TF2Button);
//                row3Grid.Children.Add(TF2CheckBox);

                commonGrid.Children.Add(TF2Button);

                #endregion

                #region TF3 

                TF3Button = new Button
                {
                    Background = TF3Enabled ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TF3Enabled ? "TF3 On" : "TF3 Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                TF3Button.Click += TF3Button_Click;
                Grid.SetColumn(TF3Button, 0);

//                TF3CheckBox = new CheckBox
//                {
//                    MinWidth = 10,
//                    FontWeight = FontWeight.FromOpenTypeWeight(400),
//                    Content = "Aggressive",
//                    HorizontalContentAlignment = HorizontalAlignment.Center,
//                    Margin = new Thickness(2.5, 0, 0, 0)
//                };

//                TF3CheckBox.Click += TF3CheckBox_Click;
//                Grid.SetColumn(TF3CheckBox, 2);

                Grid.SetRow(TF3Button, 21);

//                row4Grid.Children.Add(TF3Button);
//                row4Grid.Children.Add(TF3CheckBox);

                commonGrid.Children.Add(TF3Button);

                #endregion

                #region TF4 

                TF4Button = new Button
                {
                    Background = TF4Enabled ? Brushes.Green : Brushes.Crimson,
                    Foreground = Brushes.White,
                    MinWidth = 10,
                    FontWeight = FontWeight.FromOpenTypeWeight(400),
                    Content = TF4Enabled ? "TF4 On" : "TF4 Off",
                    HorizontalContentAlignment = HorizontalAlignment.Center,
                    Margin = new Thickness(2.5, 0, 0, 0)
                };

                TF4Button.Click += TF4Button_Click;
                Grid.SetColumn(TF4Button, 0);

//                TF4CheckBox = new CheckBox
//                {
//                    MinWidth = 10,
//                    FontWeight = FontWeight.FromOpenTypeWeight(400),
//                    Content = "Aggressive",
//                    HorizontalContentAlignment = HorizontalAlignment.Center,
//                    Margin = new Thickness(2.5, 0, 0, 0)
//                };

//                TF4CheckBox.Click += TF4CheckBox_Click;
//                Grid.SetColumn(TF4CheckBox, 2);

                Grid.SetRow(TF4Button, 23);

//                row5Grid.Children.Add(TF4Button);
//                row5Grid.Children.Add(TF4CheckBox);

                commonGrid.Children.Add(TF4Button);

                #endregion


                if (accountSelector != null)
                {
                    accountSelector.SelectionChanged += AccountSelector_SelectionChanged;
                    if (accountSelector.SelectedAccount != null)
                    {
                        selectedAccount = accountSelector.SelectedAccount;
                        SubcribeToAccount();

                    }
                }

                if (TabSelected())
                    InsertWPFControls();

                chartWindow.MainTabControl.SelectionChanged += TabChangedHandler;


            }
            catch (Exception e)
            {
                Print(e.Message);
            }
        }



        #endregion

        #region DisposeWPFControls

        private void DisposeWPFControls()
        {

            if (chartWindow != null)
                chartWindow.MainTabControl.SelectionChanged -= TabChangedHandler;

            //if (selectedAccount != null)
            //{
            //    selectedAccount.OrderUpdate -= SelectedAccountOnOrderUpdate;
            //    selectedAccount.ExecutionUpdate -= SelectedAccountOnExecutionUpdate;
            //    selectedAccount.PositionUpdate -= SelectedAccountOnPositionUpdate;
            //}

            if (TrendSenseButton != null)
                TrendSenseButton.Click -= TrendSenseButton_Click;
            if (TF1Button != null)
                TF1Button.Click -= TF1Button_Click;
            if (TF2Button != null)
                TF2Button.Click -= TF2Button_Click;
            if (TF3Button != null)
                TF3Button.Click -= TF3Button_Click;
            if (TF4Button != null)
                TF4Button.Click -= TF4Button_Click;
//            if (TF1CheckBox != null)
//                TF1CheckBox.Click -= TF1CheckBox_Click;
//            if (TF2CheckBox != null)
//                TF2CheckBox.Click -= TF2CheckBox_Click;
//            if (TF3CheckBox != null)
//                TF3CheckBox.Click -= TF3CheckBox_Click;
//            if (TF4CheckBox != null)
//                TF4CheckBox.Click -= TF4CheckBox_Click;

            if (BuyButton != null)
                BuyButton.Click -= BuyButton_Click;
            if (SellButton != null)
                SellButton.Click -= SellButton_Click;
            if (RenkoButton != null)
                RenkoButton.Click -= RenkoButton_Click;
            if (IchimokuButton != null)
                IchimokuButton.Click -= IchimokuButton_Click;
            if(DTDBButton != null)
                DTDBButton.Click -= DTDBButton_Click;
            if (CloseButton != null)
                CloseButton.Click -= CloseButton_Click;
            if (StrategyEnabledButton != null)
                StrategyEnabledButton.Click -= StrategyEnabledButton_Click;
            if(qudQuantity != null)
                qudQuantity.ValueChanged -= qudQuantity_ValueChanged;
            if (tifSelector != null)
                tifSelector.SelectionChanged -= tifSelector_SelectionChanged;
            if (EntryTicksQUD != null)
                EntryTicksQUD.TextChanged -= EntryTicksQUD_TextChanged;
            if (EntryTicksQUD != null)
                EntryTicksQUD.PreviewKeyDown -= TextBox_PreviewKeyDown;
            if (atmStrategySelector != null)
                atmStrategySelector.SelectionChanged -= atmStrategySelector_SelectionChanged;
            if(accountSelector != null && accountSelector.SelectedAccount != null) 
                accountSelector.SelectedAccount.PositionUpdate -= SelectedAccountOnPositionUpdate;

            RemoveWPFControls();
        }

        #endregion

        #region InsertWPFControls

        private void InsertWPFControls()
        {


            if (panelActive)
                return;

            chartTraderGrid.RowDefinitions.Add(addedRow);
            System.Windows.Controls.Grid.SetRow(commonGrid, (chartTraderGrid.RowDefinitions.Count - 1));
            chartTraderGrid.Children.Add(commonGrid);

            panelActive = true;
        }

        #endregion

        #region RemoveWPFControls

        private void RemoveWPFControls()
        {
            if (!panelActive)
                return;

            if (chartTraderGrid != null || commonGrid != null)
            {
                chartTraderGrid.Children.Remove(commonGrid);
                chartTraderGrid.RowDefinitions.Remove(addedRow);
            }

            panelActive = false;
        }

        #endregion

        #region TabSelected

        private bool TabSelected()
        {
            bool tabSelected = false;

            // loop through each tab and see if the tab this indicator is added to is the selected item
            foreach (System.Windows.Controls.TabItem tab in chartWindow.MainTabControl.Items)
                if ((tab.Content as ChartTab).ChartControl == ChartControl && tab == chartWindow.MainTabControl.SelectedItem)
                    tabSelected = true;

            return tabSelected;
        }

        #endregion

        #region TabChangedHandler

        private void TabChangedHandler(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count <= 0)
                return;

            tabItem = e.AddedItems[0] as System.Windows.Controls.TabItem;
            if (tabItem == null)
                return;

            chartTab = tabItem.Content as NinjaTrader.Gui.Chart.ChartTab;
            if (chartTab == null)
                return;

            if (TabSelected())
                InsertWPFControls();
            else
                RemoveWPFControls();
        }

        #endregion

        #region Handlers

        private void TrendSenseButton_Click(object sender, RoutedEventArgs e)
        {
            TrendFilter = !TrendFilter;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TrendFilter ? "Trend Sense On" : "Trend Sense Off", TrendFilter ? Brushes.Green : Brushes.Crimson);
        }

        private void TF1Button_Click(object sender, RoutedEventArgs e)
        {
            TF1Enabled = !TF1Enabled;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TF1Enabled ? "TF1 On" : "TF1 Off", TF1Enabled ? Brushes.Green : Brushes.Crimson);
        }

//        private void TF1CheckBox_Click(object sender, RoutedEventArgs e)
//        {
//            TF1Aggressive = TF1CheckBox.IsChecked == true;
//        }

        private void TF2Button_Click(object sender, RoutedEventArgs e)
        {
            TF2Enabled = !TF2Enabled;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TF2Enabled ? "TF2 On" : "TF2 Off", TF2Enabled ? Brushes.Green : Brushes.Crimson);
        }

//        private void TF2CheckBox_Click(object sender, RoutedEventArgs e)
//        {
//            TF2Aggressive = TF2CheckBox.IsChecked == true;
//        }

        private void TF3Button_Click(object sender, RoutedEventArgs e)
        {
            TF3Enabled = !TF3Enabled;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TF3Enabled ? "TF3 On" : "TF3 Off", TF3Enabled ? Brushes.Green : Brushes.Crimson);
        }

//        private void TF3CheckBox_Click(object sender, RoutedEventArgs e)
//        {
//            TF3Aggressive = TF3CheckBox.IsChecked == true;
//        }

        private void TF4Button_Click(object sender, RoutedEventArgs e)
        {
            TF4Enabled = !TF4Enabled;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TF4Enabled ? "TF4 On" : "TF4 Off", TF4Enabled ? Brushes.Green : Brushes.Crimson);
        }

//        private void TF4CheckBox_Click(object sender, RoutedEventArgs e)
//        {
//            TF4Aggressive = TF4CheckBox.IsChecked == true;
//        }

        private void ChangeContentBrush(System.Windows.Controls.Control control, string newContent, Brush brush)
        {
            Button btn = control as Button;

            if(btn != null)
            {
                btn.Content = newContent;
                btn.Background = brush;
            }
        }

        private void BuyButton_Click(object sender, RoutedEventArgs e)
        {
            TradeLongs = !TradeLongs;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TradeLongs ? "Long On" : "Long Off", TradeLongs ? Brushes.Green : Brushes.Crimson);
        }

        private void SellButton_Click(object sender, RoutedEventArgs e)
        {
            TradeShorts = !TradeShorts;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), TradeShorts ? "Short On" : "Short Off", TradeShorts ? Brushes.Green : Brushes.Crimson);
        }

        private void RenkoButton_Click(object sender, RoutedEventArgs e)
        {
            RenkoFilter = !RenkoFilter;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), RenkoFilter ? "Renko On" : "Renko Off", RenkoFilter ? Brushes.Green : Brushes.Crimson);
        }

        private void IchimokuButton_Click(object sender, RoutedEventArgs e)
        {
            IchimokuFilter = !IchimokuFilter;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), IchimokuFilter ? "Ichimoku On" : "Ichimoku Off", IchimokuFilter ? Brushes.Green : Brushes.Crimson);
        }

        private void DTDBButton_Click(object sender, RoutedEventArgs e)
        {
            DTDBFilter = !DTDBFilter;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), DTDBFilter ? "DT/DB On" : "DT/DB Off", DTDBFilter ? Brushes.Green : Brushes.Crimson);
        }

        private void CloseButton_Click(object sender, RoutedEventArgs e)
        {

            //CloseTrade();

        }

        private void StrategyEnabledButton_Click(object sender, RoutedEventArgs e)
        {
            StrategyEnabled = !StrategyEnabled;
            ChangeContentBrush(((System.Windows.Controls.Control)sender), StrategyEnabled ? "Strategy Enabled" : "Strategy Disabled", StrategyEnabled ? Brushes.Green : Brushes.Crimson);

            //CloseTrade();

        }

        private void AccountSelector_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            if (accountSelector == null)
                return;

            if (accountSelector.SelectedAccount != null)
            {
                SubcribeToAccount();
                selectedAccount = accountSelector.SelectedAccount;
            }
            else
            {
                selectedAccount = null;
            }
        }

        private void EntryTicksQUD_TextChanged(object sender, RoutedEventArgs e)
        {
            
            int number = 0;

            if(Int32.TryParse(EntryTicksQUD.Text, out number))
            {
                EntryOffset = number;
            }
        }

        private void SubcribeToAccount()
        {
            // Unsubscribe to any prior account subscriptions
            //accountSelector.SelectedAccount.ExecutionUpdate -= SelectedAccountOnExecutionUpdate;
            //accountSelector.SelectedAccount.OrderUpdate -= SelectedAccountOnOrderUpdate;
            accountSelector.SelectedAccount.PositionUpdate -= SelectedAccountOnPositionUpdate;

            //// Subscribe to new account subscriptions
            //accountSelector.SelectedAccount.ExecutionUpdate += SelectedAccountOnExecutionUpdate;
            //accountSelector.SelectedAccount.OrderUpdate += SelectedAccountOnOrderUpdate;
            accountSelector.SelectedAccount.PositionUpdate += SelectedAccountOnPositionUpdate;
        }

        private void qudQuantity_ValueChanged(object sender, RoutedEventArgs e)
        {
            quantity = qudQuantity.Value;
        }

        private void tifSelector_SelectionChanged(object sender, RoutedEventArgs e)
        {
            timeInForce = tifSelector.SelectedTif;
        }

        private void atmStrategySelector_SelectionChanged(object sender, RoutedEventArgs e)
        {
            selectedAtmStrategy = atmStrategySelector.SelectedAtmStrategy;
        }

        private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
        {

            e.Handled = true;

            // handle the keydown event for the text box,					
            System.Windows.Controls.TextBox textBoxSender = (System.Windows.Controls.TextBox)sender;


            string textBoxText = textBoxSender.Text;
            if (e.Key.ToString() == "Space")
                textBoxText += " ";

            else if (e.Key.ToString() == "Back" && textBoxSender.Text.Length > 0)
            {
                if (textBoxSender.SelectedText != "")
                {
                    int index1 = textBoxSender.SelectionStart;
                    textBoxSender.Text = textBoxSender.Text.Replace(textBoxSender.Text.Substring(textBoxSender.SelectionStart, textBoxSender.SelectionLength), "");
                    textBoxSender.SelectionStart = index1;
                    return;
                }

                int index = textBoxSender.SelectionStart;
                if (index == 0)
                    return;
                if (index <= textBoxSender.Text.Length)
                {
                    int lengthOfString = textBoxSender.Text.Length;
                    string firstHalf = textBoxSender.Text.Substring(0, index - 1);
                    string secondHalf = textBoxSender.Text.Substring(index, lengthOfString - index);
                    textBoxText = firstHalf + secondHalf;
                    textBoxSender.Text = textBoxText;
                    textBoxSender.SelectionStart = index - 1;
                }
                else
                {

                }
                return;
            }
            else if (e.Key.ToString() == "Back")
                return;
            else if (e.Key.ToString() == "Delete" && textBoxSender.Text.Length > 0)
            {
                if (textBoxSender.SelectedText != "")
                {
                    int index1 = textBoxSender.SelectionStart;
                    textBoxSender.Text = textBoxSender.Text.Replace(textBoxSender.Text.Substring(textBoxSender.SelectionStart, textBoxSender.SelectionLength), "");
                    textBoxSender.SelectionStart = index1;
                    return;
                }

                int index = textBoxSender.SelectionStart;

                if (index < textBoxSender.Text.Length)
                {
                    string firstHalf = textBoxSender.Text.Substring(0, index);
                    string secondHalf = textBoxSender.Text.Substring(firstHalf.Length + 1);
                    textBoxText = firstHalf + secondHalf;
                    textBoxSender.Text = textBoxText;
                    textBoxSender.SelectionStart = index;
                }
                return;
            }
            else if (e.Key.ToString() == "Delete")
                return;
            else if (e.Key.ToString() == "Capital")
                return;
            else if (e.Key.ToString() == "Left")
            {
                if (textBoxSender.SelectionStart > 0)
                    textBoxSender.SelectionStart = textBoxSender.SelectionStart - 1;
                return;
            }
            else if (e.Key.ToString() == "Right")
            {
                if (textBoxSender.SelectionStart < textBoxSender.Text.Length)
                    textBoxSender.SelectionStart = textBoxSender.SelectionStart + 1;
                return;
            }
            else
            {

                int index = 0;
                if (textBoxSender.Text.Length > 0)
                    index = textBoxSender.SelectionStart;
                string firstHalf = "";
                string secondHalf = "";
                if (index < textBoxSender.Text.Length)
                {
                    firstHalf = textBoxSender.Text.Substring(0, index);
                    secondHalf = textBoxSender.Text.Substring(firstHalf.Length);

                }
                else if (index == 0)
                {

                }
                else
                {
                    firstHalf = textBoxSender.Text.Substring(0, index);
                }
                string toAdd = "";

                if
                (
                    (Keyboard.IsKeyToggled(Key.CapsLock) || (Keyboard.IsKeyDown(Key.LeftShift) ||
                    Keyboard.IsKeyDown(Key.RightShift))) && e.Key.ToString().Length == 1
                )
                {
                    toAdd = e.Key.ToString();
                }
                else if (e.Key.ToString().Length == 1)
                    toAdd = e.Key.ToString().ToLower();
                else if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
                {
                    if (e.Key == Key.D0)
                        toAdd = ")";
                    if (e.Key == Key.D1)
                        toAdd = "!";
                    if (e.Key == Key.D2)
                        toAdd = "@";
                    if (e.Key == Key.D3)
                        toAdd = "#";
                    if (e.Key == Key.D4)
                        toAdd = "$";
                    if (e.Key == Key.D5)
                        toAdd = "%";
                    if (e.Key == Key.D6)
                        toAdd = "^";
                    if (e.Key == Key.D7)
                        toAdd = "&";
                    if (e.Key == Key.D8)
                        toAdd = "*";
                    if (e.Key == Key.D9)
                        toAdd = "(";
                    if (e.Key == Key.OemSemicolon)
                        toAdd = ":";

                }
                else
                {
                    if (e.Key == Key.D0)
                        toAdd = "0";
                    if (e.Key == Key.D1)
                        toAdd = "1";
                    if (e.Key == Key.D2)
                        toAdd = "2";
                    if (e.Key == Key.D3)
                        toAdd = "3";
                    if (e.Key == Key.D4)
                        toAdd = "4";
                    if (e.Key == Key.D5)
                        toAdd = "5";
                    if (e.Key == Key.D6)
                        toAdd = "6";
                    if (e.Key == Key.D7)
                        toAdd = "7";
                    if (e.Key == Key.D8)
                        toAdd = "8";
                    if (e.Key == Key.D9)
                        toAdd = "9";

                    if (e.Key == Key.NumPad0)
                        toAdd = "0";
                    if (e.Key == Key.NumPad1)
                        toAdd = "1";
                    if (e.Key == Key.NumPad2)
                        toAdd = "2";
                    if (e.Key == Key.NumPad3)
                        toAdd = "3";
                    if (e.Key == Key.NumPad4)
                        toAdd = "4";
                    if (e.Key == Key.NumPad5)
                        toAdd = "5";
                    if (e.Key == Key.NumPad6)
                        toAdd = "6";
                    if (e.Key == Key.NumPad7)
                        toAdd = "7";
                    if (e.Key == Key.NumPad8)
                        toAdd = "8";
                    if (e.Key == Key.NumPad9)
                        toAdd = "9";

                    if (e.Key == Key.Divide)
                        toAdd = "/";
                    if (e.Key == Key.Multiply)
                        toAdd = "*";
                    if (e.Key == Key.Subtract)
                        toAdd = "-";
                    if (e.Key == Key.Add)
                        toAdd = "+";
                    if (e.Key == Key.Decimal || e.Key == Key.OemPeriod)
                        toAdd = ".";


                    if (e.Key == Key.OemMinus)
                        toAdd = "-";
                    if (e.Key == Key.OemPlus)
                        toAdd = "+";
                    if (e.Key == Key.OemOpenBrackets)
                        toAdd = "[";
                    if (e.Key == Key.OemCloseBrackets)
                        toAdd = "]";
                    if (e.Key == Key.OemSemicolon)
                        toAdd = ";";

                }
                if (textBoxSender.SelectionLength == 0)
                {
                    textBoxText = firstHalf + toAdd + secondHalf;
                    textBoxSender.Text = textBoxText;
                }
                else
                    textBoxSender.Text = textBoxSender.Text.Replace(textBoxSender.Text.Substring(textBoxSender.SelectionStart, textBoxSender.SelectionLength), toAdd);


                if (toAdd != "")
                    textBoxSender.SelectionStart = index + 1;
                else
                    textBoxSender.SelectionStart = index;

            }

        }

        #endregion

        #endregion

        #region TimeFilterClass

        public class TimeFilter
        {
            public TimeSpan StartTime { get; set; }
            public TimeSpan EndTime { get; set; }

            public bool Enabled { get; set; }

            public TimeFilter(TimeSpan StartTime, TimeSpan EndTime, bool Enabled)
            {
                this.StartTime = StartTime;
                this.Enabled = Enabled;
                this.EndTime = EndTime;
            }

            public bool IsValidTime(DateTime time)
            {
                TimeSpan dayTime = time.TimeOfDay;
                if (StartTime < EndTime)
                {
                    if (dayTime >= StartTime && dayTime <= EndTime)
                        return (true);
                }
                else if (StartTime > EndTime)
                {
                    if (dayTime >= StartTime || dayTime <= EndTime)
                    {
                        return (true);
                    }
                }
                else
                {
                    return (true);
                }

                return (false);
            }
        }

        bool IsNewTime(DateTime time0, DateTime time1)
        {
            if (timeFilters.Count == 0)
            {
                if (BarsArray[0].IsFirstBarOfSession)
                {
                    return true;
                }
            }

            for (int i = 0; i < timeFilters.Count; i++)
            {
                if (time0.TimeOfDay > timeFilters[i].StartTime && time1.TimeOfDay <= timeFilters[i].EndTime)
                {
                    return true;
                    break;
                }
            }



            return false;
        }

        bool IsValidTime(DateTime time)
        {
            int disabledCount = 0;

            for (int i = 0; i < timeFilters.Count; i++)
            {

                if (!timeFilters[i].Enabled)
                {
                    disabledCount++;
                    continue;
                }
                if (timeFilters[i].Enabled)
                {

                    if (timeFilters[i].IsValidTime(time))
                        return (true);
                }
            }


            if (disabledCount == timeFilters.Count)
                return (true);

            return (false);
        }

        #endregion
		
		private Dictionary<string, int> Get_TF_Keys()
        {
            Dictionary<string, int> TFKeys = new Dictionary<string, int>();

            Type[] types = NinjaTrader.Core.Globals.AssemblyRegistry.GetDerivedTypes(typeof(BarsType));
            for (int i = 0; i < types.Length; i++)
            {
                Type type = types[i];
                if (type == null || type.FullName.IsNullOrEmpty()) continue;
                var type2 = NinjaTrader.Core.Globals.AssemblyRegistry.GetType(type.FullName);
                if (type2 == null) continue;
                BarsType bar = Activator.CreateInstance(type2) as BarsType;
                if (bar != null)
                {
                    bar.SetState(State.SetDefaults);
                    int id = (int)bar.BarsPeriod.BarsPeriodType;

                    //					Print(string.Format("{0} - {1}", bar.Name, id,id));

                    TFKeys.Add(bar.Name, id);

                    bar.SetState(State.Terminated);
                }
            }

            return TFKeys;
        }
		
		public class TF_Converter : TypeConverter
        {
            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                if (context == null) { return null; }
                ArrayList list = new ArrayList();


                //				List<int>	list	=	new List<int>();
                Type[] types = NinjaTrader.Core.Globals.AssemblyRegistry.GetDerivedTypes(typeof(BarsType));
                for (int i = 0; i < types.Length; i++)
                {
                    Type type = types[i];
                    if (type == null || type.FullName.IsNullOrEmpty()) continue;
                    var type2 = NinjaTrader.Core.Globals.AssemblyRegistry.GetType(type.FullName);
                    if (type2 == null) continue;
                    BarsType bar = Activator.CreateInstance(type2) as BarsType;
                    if (bar != null)
                    {
                        bar.SetState(State.SetDefaults);
                        int id = (int)bar.BarsPeriod.BarsPeriodType;

                        //					TFIdx.Add(id);
                        //					Print(string.Format("{0} - {1}", bar.Name, id,id));
                        list.Add(bar.Name);
                        bar.SetState(State.Terminated);
                    }
                }



                return new TypeConverter.StandardValuesCollection(list);
            }

            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
        }

		
    }

    #region 	Show/Hide Inputs Converter

    // This custom TypeConverter is applied ot the entire strategy object and handles two of our use cases
    // IMPORTANT: Inherit from StrategyBaseConverter so we get default NinjaTrader property handling logic
    // IMPORTANT: Not doing this will completely break the property grids!
    // If targeting a "Strategy", use the "StrategyBaseConverter" base type instead
    public class RenkoTrader_Converter : IndicatorBaseConverter // or StrategyBaseConverter
    {

        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object component, Attribute[] attrs)
        {
            // we need the strategy instance which actually exists on the grid
            RenkoTrader indicator = component as RenkoTrader;

            // base.GetProperties ensures we have all the properties (and associated property grid editors)
            // NinjaTrader internal logic determines for a given strategy
            PropertyDescriptorCollection propertyDescriptorCollection = base.GetPropertiesSupported(context)
                                                                        ? base.GetProperties(context, component, attrs)
                                                                        : TypeDescriptor.GetProperties(component, attrs);

            if (indicator == null || propertyDescriptorCollection == null)
                return propertyDescriptorCollection;


            #region Use Case #1: Show/hide properties based on secondary input


            System.Reflection.PropertyInfo[] props = typeof(RenkoTrader).GetProperties();
            foreach (System.Reflection.PropertyInfo prop in props)
            {
                object[] attributes = prop.GetCustomAttributes(true);

                foreach (object a in attributes)
                {
                    IvAttributes.IvShowHideAttribute customAttribute = a as IvAttributes.IvShowHideAttribute;

                    if (customAttribute != null)
                    {
                        string[] propNames = customAttribute.PropertyName.Split('|');
                        string[] propResults = customAttribute.PropertyResult.Split('|');

                        for (int i = 0; i < propNames.Length; i++)
                        {
                            string[] OrResults = propResults[i].Split('/');
                            string[] NorResults = propResults[i].Split('!');

                            Object mainProp = indicator.GetType().GetProperty(propNames[i]).GetValue(indicator, null);

                            if (((mainProp.ToString() != propResults[i] && OrResults.Length == 1) ||
                                (OrResults.Length > 0 && OrResults.All(x => x != mainProp.ToString())))
                                && (NorResults.Length == 1 || NorResults.Any(x => x == mainProp.ToString()))
                                )
                            {
                                propertyDescriptorCollection.Remove(propertyDescriptorCollection[prop.Name]);
                            }
                        }

                    }
                }
            }

            #endregion

            return propertyDescriptorCollection;
        }

        // Important: This must return true otherwise the type convetor will not be called
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        { return true; }
    }


    #endregion
}

namespace RenkoTraderEnums
{
    public enum TimeFiltersNumberEnum { _1, _2, _3, _4 };


}

#region NinjaScript generated code. Neither change nor remove.

namespace NinjaTrader.NinjaScript.Indicators
{
	public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
	{
		private RenkoTrader[] cacheRenkoTrader;
		public RenkoTrader RenkoTrader(bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			return RenkoTrader(Input, strategyEnabled, tradeLongs, tradeShorts, renkoFilter, ichimokuFilter, dTDBFilter, entryOffset, cancelEntryBars, trendFilter, periodFast, periodMedium, periodSlow, cloudDisplacement, timeFilterEnabled, timeFiltersNumber, startTime1, endTime1, startTime2, endTime2, startTime3, endTime3, startTime4, endTime4, tF1Enabled, tF2Enabled, tF3Enabled, tF4Enabled, mAPeriod);
		}

		public RenkoTrader RenkoTrader(ISeries<double> input, bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			if (cacheRenkoTrader != null)
				for (int idx = 0; idx < cacheRenkoTrader.Length; idx++)
					if (cacheRenkoTrader[idx] != null && cacheRenkoTrader[idx].StrategyEnabled == strategyEnabled && cacheRenkoTrader[idx].TradeLongs == tradeLongs && cacheRenkoTrader[idx].TradeShorts == tradeShorts && cacheRenkoTrader[idx].RenkoFilter == renkoFilter && cacheRenkoTrader[idx].IchimokuFilter == ichimokuFilter && cacheRenkoTrader[idx].DTDBFilter == dTDBFilter && cacheRenkoTrader[idx].EntryOffset == entryOffset && cacheRenkoTrader[idx].CancelEntryBars == cancelEntryBars && cacheRenkoTrader[idx].TrendFilter == trendFilter && cacheRenkoTrader[idx].PeriodFast == periodFast && cacheRenkoTrader[idx].PeriodMedium == periodMedium && cacheRenkoTrader[idx].PeriodSlow == periodSlow && cacheRenkoTrader[idx].CloudDisplacement == cloudDisplacement && cacheRenkoTrader[idx].TimeFilterEnabled == timeFilterEnabled && cacheRenkoTrader[idx].TimeFiltersNumber == timeFiltersNumber && cacheRenkoTrader[idx].StartTime1 == startTime1 && cacheRenkoTrader[idx].EndTime1 == endTime1 && cacheRenkoTrader[idx].StartTime2 == startTime2 && cacheRenkoTrader[idx].EndTime2 == endTime2 && cacheRenkoTrader[idx].StartTime3 == startTime3 && cacheRenkoTrader[idx].EndTime3 == endTime3 && cacheRenkoTrader[idx].StartTime4 == startTime4 && cacheRenkoTrader[idx].EndTime4 == endTime4 && cacheRenkoTrader[idx].TF1Enabled == tF1Enabled && cacheRenkoTrader[idx].TF2Enabled == tF2Enabled && cacheRenkoTrader[idx].TF3Enabled == tF3Enabled && cacheRenkoTrader[idx].TF4Enabled == tF4Enabled && cacheRenkoTrader[idx].MAPeriod == mAPeriod && cacheRenkoTrader[idx].EqualsInput(input))
						return cacheRenkoTrader[idx];
			return CacheIndicator<RenkoTrader>(new RenkoTrader(){ StrategyEnabled = strategyEnabled, TradeLongs = tradeLongs, TradeShorts = tradeShorts, RenkoFilter = renkoFilter, IchimokuFilter = ichimokuFilter, DTDBFilter = dTDBFilter, EntryOffset = entryOffset, CancelEntryBars = cancelEntryBars, TrendFilter = trendFilter, PeriodFast = periodFast, PeriodMedium = periodMedium, PeriodSlow = periodSlow, CloudDisplacement = cloudDisplacement, TimeFilterEnabled = timeFilterEnabled, TimeFiltersNumber = timeFiltersNumber, StartTime1 = startTime1, EndTime1 = endTime1, StartTime2 = startTime2, EndTime2 = endTime2, StartTime3 = startTime3, EndTime3 = endTime3, StartTime4 = startTime4, EndTime4 = endTime4, TF1Enabled = tF1Enabled, TF2Enabled = tF2Enabled, TF3Enabled = tF3Enabled, TF4Enabled = tF4Enabled, MAPeriod = mAPeriod }, input, ref cacheRenkoTrader);
		}
	}
}

namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
	public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
	{
		public Indicators.RenkoTrader RenkoTrader(bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			return indicator.RenkoTrader(Input, strategyEnabled, tradeLongs, tradeShorts, renkoFilter, ichimokuFilter, dTDBFilter, entryOffset, cancelEntryBars, trendFilter, periodFast, periodMedium, periodSlow, cloudDisplacement, timeFilterEnabled, timeFiltersNumber, startTime1, endTime1, startTime2, endTime2, startTime3, endTime3, startTime4, endTime4, tF1Enabled, tF2Enabled, tF3Enabled, tF4Enabled, mAPeriod);
		}

		public Indicators.RenkoTrader RenkoTrader(ISeries<double> input , bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			return indicator.RenkoTrader(input, strategyEnabled, tradeLongs, tradeShorts, renkoFilter, ichimokuFilter, dTDBFilter, entryOffset, cancelEntryBars, trendFilter, periodFast, periodMedium, periodSlow, cloudDisplacement, timeFilterEnabled, timeFiltersNumber, startTime1, endTime1, startTime2, endTime2, startTime3, endTime3, startTime4, endTime4, tF1Enabled, tF2Enabled, tF3Enabled, tF4Enabled, mAPeriod);
		}
	}
}

namespace NinjaTrader.NinjaScript.Strategies
{
	public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
	{
		public Indicators.RenkoTrader RenkoTrader(bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			return indicator.RenkoTrader(Input, strategyEnabled, tradeLongs, tradeShorts, renkoFilter, ichimokuFilter, dTDBFilter, entryOffset, cancelEntryBars, trendFilter, periodFast, periodMedium, periodSlow, cloudDisplacement, timeFilterEnabled, timeFiltersNumber, startTime1, endTime1, startTime2, endTime2, startTime3, endTime3, startTime4, endTime4, tF1Enabled, tF2Enabled, tF3Enabled, tF4Enabled, mAPeriod);
		}

		public Indicators.RenkoTrader RenkoTrader(ISeries<double> input , bool strategyEnabled, bool tradeLongs, bool tradeShorts, bool renkoFilter, bool ichimokuFilter, bool dTDBFilter, int entryOffset, int cancelEntryBars, bool trendFilter, int periodFast, int periodMedium, int periodSlow, int cloudDisplacement, bool timeFilterEnabled, RenkoTraderEnums.TimeFiltersNumberEnum timeFiltersNumber, TimeSpan startTime1, TimeSpan endTime1, TimeSpan startTime2, TimeSpan endTime2, TimeSpan startTime3, TimeSpan endTime3, TimeSpan startTime4, TimeSpan endTime4, bool tF1Enabled, bool tF2Enabled, bool tF3Enabled, bool tF4Enabled, int mAPeriod)
		{
			return indicator.RenkoTrader(input, strategyEnabled, tradeLongs, tradeShorts, renkoFilter, ichimokuFilter, dTDBFilter, entryOffset, cancelEntryBars, trendFilter, periodFast, periodMedium, periodSlow, cloudDisplacement, timeFilterEnabled, timeFiltersNumber, startTime1, endTime1, startTime2, endTime2, startTime3, endTime3, startTime4, endTime4, tF1Enabled, tF2Enabled, tF3Enabled, tF4Enabled, mAPeriod);
		}
	}
}

#endregion
Editor is loading...
Leave a Comment