/// <summary>
        /// This method is used to configure the strategy and is called once before any strategy method is called.
        /// </summary>
        protected override void MyInitialize()
        {

            if (_indi == null)
            {
                _indi = AmazingCrossoverIndi(_adxMin, _adxPeriod, _atrExclusionMultiplier, _atrPeriod,
                             _crossoverLookbackPeriod, _emaFastPeriod, _emaSlowPeriod, _rsiLower, _rsiPeriod,
                             _rsiUpper);
                _indi.SetupObjects();
                Add(_indi);
            }
            CalculateOnBarClose = true;
        }
        /// <summary>
        /// Enter the description of your new custom indicator here
        /// </summary>
        /// <returns></returns>
        public AmazingCrossoverIndi AmazingCrossoverIndi(Data.IDataSeries input, int aDXMinimum, int aDXPeriod, double aTRExclusionMultiplier, int aTRPeriod, int crossoverLookbackPeriod, int eMAFastPeriod, int eMASlowPeriod, int rSILower, int rSIPeriod, int rSIUpper)
        {
            if (cacheAmazingCrossoverIndi != null)
                for (int idx = 0; idx < cacheAmazingCrossoverIndi.Length; idx++)
                    if (cacheAmazingCrossoverIndi[idx].ADXMinimum == aDXMinimum && cacheAmazingCrossoverIndi[idx].ADXPeriod == aDXPeriod && Math.Abs(cacheAmazingCrossoverIndi[idx].ATRExclusionMultiplier - aTRExclusionMultiplier) <= double.Epsilon && cacheAmazingCrossoverIndi[idx].ATRPeriod == aTRPeriod && cacheAmazingCrossoverIndi[idx].CrossoverLookbackPeriod == crossoverLookbackPeriod && cacheAmazingCrossoverIndi[idx].EMAFastPeriod == eMAFastPeriod && cacheAmazingCrossoverIndi[idx].EMASlowPeriod == eMASlowPeriod && cacheAmazingCrossoverIndi[idx].RSILower == rSILower && cacheAmazingCrossoverIndi[idx].RSIPeriod == rSIPeriod && cacheAmazingCrossoverIndi[idx].RSIUpper == rSIUpper && cacheAmazingCrossoverIndi[idx].EqualsInput(input))
                        return cacheAmazingCrossoverIndi[idx];

            lock (checkAmazingCrossoverIndi)
            {
                checkAmazingCrossoverIndi.ADXMinimum = aDXMinimum;
                aDXMinimum = checkAmazingCrossoverIndi.ADXMinimum;
                checkAmazingCrossoverIndi.ADXPeriod = aDXPeriod;
                aDXPeriod = checkAmazingCrossoverIndi.ADXPeriod;
                checkAmazingCrossoverIndi.ATRExclusionMultiplier = aTRExclusionMultiplier;
                aTRExclusionMultiplier = checkAmazingCrossoverIndi.ATRExclusionMultiplier;
                checkAmazingCrossoverIndi.ATRPeriod = aTRPeriod;
                aTRPeriod = checkAmazingCrossoverIndi.ATRPeriod;
                checkAmazingCrossoverIndi.CrossoverLookbackPeriod = crossoverLookbackPeriod;
                crossoverLookbackPeriod = checkAmazingCrossoverIndi.CrossoverLookbackPeriod;
                checkAmazingCrossoverIndi.EMAFastPeriod = eMAFastPeriod;
                eMAFastPeriod = checkAmazingCrossoverIndi.EMAFastPeriod;
                checkAmazingCrossoverIndi.EMASlowPeriod = eMASlowPeriod;
                eMASlowPeriod = checkAmazingCrossoverIndi.EMASlowPeriod;
                checkAmazingCrossoverIndi.RSILower = rSILower;
                rSILower = checkAmazingCrossoverIndi.RSILower;
                checkAmazingCrossoverIndi.RSIPeriod = rSIPeriod;
                rSIPeriod = checkAmazingCrossoverIndi.RSIPeriod;
                checkAmazingCrossoverIndi.RSIUpper = rSIUpper;
                rSIUpper = checkAmazingCrossoverIndi.RSIUpper;

                if (cacheAmazingCrossoverIndi != null)
                    for (int idx = 0; idx < cacheAmazingCrossoverIndi.Length; idx++)
                        if (cacheAmazingCrossoverIndi[idx].ADXMinimum == aDXMinimum && cacheAmazingCrossoverIndi[idx].ADXPeriod == aDXPeriod && Math.Abs(cacheAmazingCrossoverIndi[idx].ATRExclusionMultiplier - aTRExclusionMultiplier) <= double.Epsilon && cacheAmazingCrossoverIndi[idx].ATRPeriod == aTRPeriod && cacheAmazingCrossoverIndi[idx].CrossoverLookbackPeriod == crossoverLookbackPeriod && cacheAmazingCrossoverIndi[idx].EMAFastPeriod == eMAFastPeriod && cacheAmazingCrossoverIndi[idx].EMASlowPeriod == eMASlowPeriod && cacheAmazingCrossoverIndi[idx].RSILower == rSILower && cacheAmazingCrossoverIndi[idx].RSIPeriod == rSIPeriod && cacheAmazingCrossoverIndi[idx].RSIUpper == rSIUpper && cacheAmazingCrossoverIndi[idx].EqualsInput(input))
                            return cacheAmazingCrossoverIndi[idx];

                AmazingCrossoverIndi indicator = new AmazingCrossoverIndi();
                indicator.BarsRequired = BarsRequired;
                indicator.CalculateOnBarClose = CalculateOnBarClose;
#if NT7
                indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256;
                indicator.MaximumBarsLookBack = MaximumBarsLookBack;
#endif
                indicator.Input = input;
                indicator.ADXMinimum = aDXMinimum;
                indicator.ADXPeriod = aDXPeriod;
                indicator.ATRExclusionMultiplier = aTRExclusionMultiplier;
                indicator.ATRPeriod = aTRPeriod;
                indicator.CrossoverLookbackPeriod = crossoverLookbackPeriod;
                indicator.EMAFastPeriod = eMAFastPeriod;
                indicator.EMASlowPeriod = eMASlowPeriod;
                indicator.RSILower = rSILower;
                indicator.RSIPeriod = rSIPeriod;
                indicator.RSIUpper = rSIUpper;
                Indicators.Add(indicator);
                indicator.SetUp();

                AmazingCrossoverIndi[] tmp = new AmazingCrossoverIndi[cacheAmazingCrossoverIndi == null ? 1 : cacheAmazingCrossoverIndi.Length + 1];
                if (cacheAmazingCrossoverIndi != null)
                    cacheAmazingCrossoverIndi.CopyTo(tmp, 0);
                tmp[tmp.Length - 1] = indicator;
                cacheAmazingCrossoverIndi = tmp;
                return indicator;
            }
        }
        /// <summary>
        /// Enter the description of your new custom indicator here
        /// </summary>
        /// <returns></returns>
        public AmazingCrossoverIndi AmazingCrossoverIndi(Data.IDataSeries input, int aDXMinimum, int aDXPeriod, double aTRExclusionMultiplier, int aTRPeriod, int crossoverLookbackPeriod, int eMAFastPeriod, int eMASlowPeriod, int rSILower, int rSIPeriod, int rSIUpper)
        {
            if (cacheAmazingCrossoverIndi != null)
            {
                for (int idx = 0; idx < cacheAmazingCrossoverIndi.Length; idx++)
                {
                    if (cacheAmazingCrossoverIndi[idx].ADXMinimum == aDXMinimum && cacheAmazingCrossoverIndi[idx].ADXPeriod == aDXPeriod && Math.Abs(cacheAmazingCrossoverIndi[idx].ATRExclusionMultiplier - aTRExclusionMultiplier) <= double.Epsilon && cacheAmazingCrossoverIndi[idx].ATRPeriod == aTRPeriod && cacheAmazingCrossoverIndi[idx].CrossoverLookbackPeriod == crossoverLookbackPeriod && cacheAmazingCrossoverIndi[idx].EMAFastPeriod == eMAFastPeriod && cacheAmazingCrossoverIndi[idx].EMASlowPeriod == eMASlowPeriod && cacheAmazingCrossoverIndi[idx].RSILower == rSILower && cacheAmazingCrossoverIndi[idx].RSIPeriod == rSIPeriod && cacheAmazingCrossoverIndi[idx].RSIUpper == rSIUpper && cacheAmazingCrossoverIndi[idx].EqualsInput(input))
                    {
                        return(cacheAmazingCrossoverIndi[idx]);
                    }
                }
            }

            lock (checkAmazingCrossoverIndi)
            {
                checkAmazingCrossoverIndi.ADXMinimum = aDXMinimum;
                aDXMinimum = checkAmazingCrossoverIndi.ADXMinimum;
                checkAmazingCrossoverIndi.ADXPeriod = aDXPeriod;
                aDXPeriod = checkAmazingCrossoverIndi.ADXPeriod;
                checkAmazingCrossoverIndi.ATRExclusionMultiplier = aTRExclusionMultiplier;
                aTRExclusionMultiplier = checkAmazingCrossoverIndi.ATRExclusionMultiplier;
                checkAmazingCrossoverIndi.ATRPeriod = aTRPeriod;
                aTRPeriod = checkAmazingCrossoverIndi.ATRPeriod;
                checkAmazingCrossoverIndi.CrossoverLookbackPeriod = crossoverLookbackPeriod;
                crossoverLookbackPeriod = checkAmazingCrossoverIndi.CrossoverLookbackPeriod;
                checkAmazingCrossoverIndi.EMAFastPeriod = eMAFastPeriod;
                eMAFastPeriod = checkAmazingCrossoverIndi.EMAFastPeriod;
                checkAmazingCrossoverIndi.EMASlowPeriod = eMASlowPeriod;
                eMASlowPeriod = checkAmazingCrossoverIndi.EMASlowPeriod;
                checkAmazingCrossoverIndi.RSILower = rSILower;
                rSILower = checkAmazingCrossoverIndi.RSILower;
                checkAmazingCrossoverIndi.RSIPeriod = rSIPeriod;
                rSIPeriod = checkAmazingCrossoverIndi.RSIPeriod;
                checkAmazingCrossoverIndi.RSIUpper = rSIUpper;
                rSIUpper = checkAmazingCrossoverIndi.RSIUpper;

                if (cacheAmazingCrossoverIndi != null)
                {
                    for (int idx = 0; idx < cacheAmazingCrossoverIndi.Length; idx++)
                    {
                        if (cacheAmazingCrossoverIndi[idx].ADXMinimum == aDXMinimum && cacheAmazingCrossoverIndi[idx].ADXPeriod == aDXPeriod && Math.Abs(cacheAmazingCrossoverIndi[idx].ATRExclusionMultiplier - aTRExclusionMultiplier) <= double.Epsilon && cacheAmazingCrossoverIndi[idx].ATRPeriod == aTRPeriod && cacheAmazingCrossoverIndi[idx].CrossoverLookbackPeriod == crossoverLookbackPeriod && cacheAmazingCrossoverIndi[idx].EMAFastPeriod == eMAFastPeriod && cacheAmazingCrossoverIndi[idx].EMASlowPeriod == eMASlowPeriod && cacheAmazingCrossoverIndi[idx].RSILower == rSILower && cacheAmazingCrossoverIndi[idx].RSIPeriod == rSIPeriod && cacheAmazingCrossoverIndi[idx].RSIUpper == rSIUpper && cacheAmazingCrossoverIndi[idx].EqualsInput(input))
                        {
                            return(cacheAmazingCrossoverIndi[idx]);
                        }
                    }
                }

                AmazingCrossoverIndi indicator = new AmazingCrossoverIndi();
                indicator.BarsRequired        = BarsRequired;
                indicator.CalculateOnBarClose = CalculateOnBarClose;
#if NT7
                indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256;
                indicator.MaximumBarsLookBack         = MaximumBarsLookBack;
#endif
                indicator.Input                   = input;
                indicator.ADXMinimum              = aDXMinimum;
                indicator.ADXPeriod               = aDXPeriod;
                indicator.ATRExclusionMultiplier  = aTRExclusionMultiplier;
                indicator.ATRPeriod               = aTRPeriod;
                indicator.CrossoverLookbackPeriod = crossoverLookbackPeriod;
                indicator.EMAFastPeriod           = eMAFastPeriod;
                indicator.EMASlowPeriod           = eMASlowPeriod;
                indicator.RSILower                = rSILower;
                indicator.RSIPeriod               = rSIPeriod;
                indicator.RSIUpper                = rSIUpper;
                Indicators.Add(indicator);
                indicator.SetUp();

                AmazingCrossoverIndi[] tmp = new AmazingCrossoverIndi[cacheAmazingCrossoverIndi == null ? 1 : cacheAmazingCrossoverIndi.Length + 1];
                if (cacheAmazingCrossoverIndi != null)
                {
                    cacheAmazingCrossoverIndi.CopyTo(tmp, 0);
                }
                tmp[tmp.Length - 1]       = indicator;
                cacheAmazingCrossoverIndi = tmp;
                return(indicator);
            }
        }