/// <summary>
        /// Basic settings for the strategy.
        /// </summary>
        private void SetDefaultWorkings()
        {
            m_EntryLongNode  = new TradingNode("Enter Long Node");
            m_EntryShortNode = new TradingNode("Enter Short Node");
            m_FadeLongNode   = new TradingNode("Fade Long Node");
            m_FadeShortNode  = new TradingNode("Fade Short Node");

            m_EntryLongNode.WorkingEnterQty  = m_EntryQty;
            m_EntryShortNode.WorkingEnterQty = m_EntryQty;
            m_FadeLongNode.WorkingEnterQty   = m_FadeQty;
            m_FadeShortNode.WorkingEnterQty  = m_FadeQty;

            m_EntryLongNode.IsEnterEnable  = true;
            m_EntryShortNode.IsEnterEnable = true;
            m_FadeLongNode.IsEnterEnable   = true;
            m_FadeShortNode.IsEnterEnable  = true;

            m_EntryLongNode.TradeLevel  = 0;
            m_EntryShortNode.TradeLevel = 0;
            m_FadeLongNode.TradeLevel   = 1;
            m_FadeShortNode.TradeLevel  = 1;

            m_EntryLongNode.TradeSide  = TradeSide.Buy;
            m_EntryShortNode.TradeSide = TradeSide.Sell;
            m_FadeLongNode.TradeSide   = TradeSide.Buy;
            m_FadeShortNode.TradeSide  = TradeSide.Sell;

            this.TryAddTradingNode(m_EntryLongNode);
            this.TryAddTradingNode(m_EntryShortNode);
            this.TryAddTradingNode(m_FadeLongNode);
            this.TryAddTradingNode(m_FadeShortNode);
        }
        public override void AddSubElement(IStringifiable subElement)
        {
            base.AddSubElement(subElement);
            Type elementType = subElement.GetType();

            if (elementType == typeof(TradingNode))
            {
                TradingNode tradingNode = (TradingNode)subElement;
                if (tradingNode.TradeLevel == 0)
                {
                    switch (tradingNode.TradeSide)
                    {
                    case TradeSide.Unknown:
                        break;

                    case TradeSide.Buy:
                        m_EntryLongNode = tradingNode;
                        break;

                    case TradeSide.Sell:
                        m_EntryShortNode = tradingNode;
                        break;
                    }
                }
                if (tradingNode.TradeLevel == 1)
                {
                    switch (tradingNode.TradeSide)
                    {
                    case TradeSide.Unknown:
                        break;

                    case TradeSide.Buy:
                        m_FadeLongNode = tradingNode;
                        break;

                    case TradeSide.Sell:
                        m_FadeShortNode = tradingNode;
                        break;
                    }
                }
            }
            if (elementType == typeof(KeltnerTradingVariables))
            {
                KeltnerTradingVariables = (KeltnerTradingVariables)subElement;
                m_EntryQty      = KeltnerTradingVariables.EntryQty;
                m_FadeQty       = KeltnerTradingVariables.FadeQty;
                m_EntryWidth    = KeltnerTradingVariables.EntryWidth;
                m_FadeWidth     = KeltnerTradingVariables.FadeWidth;
                m_PukeWidth     = KeltnerTradingVariables.PukeWidth;
                m_EMALength     = KeltnerTradingVariables.EMALength;
                m_ATRLength     = KeltnerTradingVariables.ATRLength;
                m_MOMLength     = KeltnerTradingVariables.MomentumLength;
                m_MomentumEntry = KeltnerTradingVariables.MomentumEntryValue;
                m_MomentumPuke  = KeltnerTradingVariables.MomentumPukeValue;
            }
        }
        //
        //
        /// <summary>
        /// Adjust the trading variables for each level based on the correct position.
        /// </summary>
        /// <param name="correctPosition"></param>
        public void AdjustTradingNodes(int correctPosition)
        {
            SetDefaultWorkings();
            TradingNode tradingNode  = null;
            var         workingNodes = correctPosition > 0 ? m_WorkingBuyNodes : m_WorkingSellNodes;

            correctPosition = Math.Abs(correctPosition);
            int level = 0;

            // Allocate the working quantities for trading levels from lower level to upper level.
            while (correctPosition > 0 && level < workingNodes.Count)
            {
                tradingNode = workingNodes[level];
                if (tradingNode.TradeLevel == level)
                {
                    if (correctPosition <= m_EntryQty)
                    {
                        tradingNode.WorkingEnterQty = m_EntryQty - correctPosition;
                        tradingNode.WorkingExitQty  = correctPosition;
                        correctPosition             = 0;
                    }
                    else
                    {
                        tradingNode.WorkingEnterQty = 0;
                        tradingNode.WorkingExitQty  = m_EntryQty;
                        correctPosition             = correctPosition - m_EntryQty;
                    }
                }
                else if (tradingNode.TradeLevel == level)
                {
                    if (correctPosition <= m_FadeQty)
                    {
                        tradingNode.WorkingEnterQty = m_FadeQty - correctPosition;
                        tradingNode.WorkingExitQty  = correctPosition;
                        correctPosition             = 0;
                    }
                    else
                    {
                        tradingNode.WorkingEnterQty = 0;
                        tradingNode.WorkingExitQty  = m_FadeQty;
                        correctPosition             = correctPosition - m_FadeQty;
                    }
                }
                level++;
            }
        }