public void Dispose() { m_context.ReleaseArray(Smooth); m_context.ReleaseArray(Detrender); m_context.ReleaseArray(I1); m_context.ReleaseArray(Q1); }
public static IList <double> CalcDIM(ISecurity source, int period, IMemoryContext context = null) { var bars = source.Bars; int count = bars.Count; var trueRange = Series.TrueRange(bars, context); var atr = Series.EMA(trueRange, period, context); context?.ReleaseArray((Array)trueRange); IList <double> diM1 = context?.GetArray <double>(count) ?? new double[count]; for (int i = 1; i < count; i++) { var dmP = bars[i].High - bars[i - 1].High; var dmM = bars[i - 1].Low - bars[i].Low; if ((dmP < 0 && dmM < 0) || dmP == dmM) { dmP = dmM = 0; } if (dmP > dmM) { dmM = 0; } diM1[i] = dmM; } var diM2 = Series.EMA(diM1, period, context); context?.ReleaseArray((Array)diM1); for (int i = 1; i < count; i++) { diM2[i] = atr[i] == 0 ? 0 : diM2[i] / atr[i]; } context?.ReleaseArray((Array)atr); return(diM2); }
public static IList <double> Calc(IList <double> source, int period, IMemoryContext context = null) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (period <= 0) { throw new ArgumentOutOfRangeException(nameof(period)); } var result = context?.GetArray <double>(source.Count) ?? new double[source.Count]; if (result.Length > 0) { if (period == 1 || result.Length == 1) { source.CopyTo(result, 0); } else { var ema1 = Series.EMA(source, period, context); var ema2 = Series.EMA(ema1, period, context); var ema3 = Series.EMA(ema2, period, context); for (var i = 0; i < result.Length; i++) { result[i] = 3 * ema1[i] - 3 * ema2[i] + ema3[i]; } context?.ReleaseArray((Array)ema1); context?.ReleaseArray((Array)ema2); context?.ReleaseArray((Array)ema3); } } return(result); }
public static IList <double> CalcADX(IList <double> source1, IList <double> source2, int period, IMemoryContext context = null) { int count = source1.Count; IList <double> dx1 = context?.GetArray <double>(count) ?? new double[count]; for (int i = 1; i < count; i++) { dx1[i] = source1[i] == 0 && source2[i] == 0 ? 0 : Math.Abs(source1[i] - source2[i]) / (source1[i] + source2[i]) * 100; } var dx2 = Series.EMA(dx1, period, context); context?.ReleaseArray((Array)dx1); return(dx2); }