/// <summary>
        /// Parabolic SAR
        /// </summary>
        /// <returns></returns>
        public ParabolicSAR ParabolicSAR(Data.IDataSeries input, double acceleration, double accelerationMax, double accelerationStep)
        {
            if (cacheParabolicSAR != null)
                for (int idx = 0; idx < cacheParabolicSAR.Length; idx++)
                    if (Math.Abs(cacheParabolicSAR[idx].Acceleration - acceleration) <= double.Epsilon && Math.Abs(cacheParabolicSAR[idx].AccelerationMax - accelerationMax) <= double.Epsilon && Math.Abs(cacheParabolicSAR[idx].AccelerationStep - accelerationStep) <= double.Epsilon && cacheParabolicSAR[idx].EqualsInput(input))
                        return cacheParabolicSAR[idx];

            lock (checkParabolicSAR)
            {
                checkParabolicSAR.Acceleration = acceleration;
                acceleration = checkParabolicSAR.Acceleration;
                checkParabolicSAR.AccelerationMax = accelerationMax;
                accelerationMax = checkParabolicSAR.AccelerationMax;
                checkParabolicSAR.AccelerationStep = accelerationStep;
                accelerationStep = checkParabolicSAR.AccelerationStep;

                if (cacheParabolicSAR != null)
                    for (int idx = 0; idx < cacheParabolicSAR.Length; idx++)
                        if (Math.Abs(cacheParabolicSAR[idx].Acceleration - acceleration) <= double.Epsilon && Math.Abs(cacheParabolicSAR[idx].AccelerationMax - accelerationMax) <= double.Epsilon && Math.Abs(cacheParabolicSAR[idx].AccelerationStep - accelerationStep) <= double.Epsilon && cacheParabolicSAR[idx].EqualsInput(input))
                            return cacheParabolicSAR[idx];

                ParabolicSAR indicator = new ParabolicSAR();
                indicator.BarsRequired = BarsRequired;
                indicator.CalculateOnBarClose = CalculateOnBarClose;
            #if NT7
                indicator.ForceMaximumBarsLookBack256 = ForceMaximumBarsLookBack256;
                indicator.MaximumBarsLookBack = MaximumBarsLookBack;
            #endif
                indicator.Input = input;
                indicator.Acceleration = acceleration;
                indicator.AccelerationMax = accelerationMax;
                indicator.AccelerationStep = accelerationStep;
                Indicators.Add(indicator);
                indicator.SetUp();

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