/// <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; } }