예제 #1
0
 public void Dispose()
 {
     m_context.ReleaseArray(Smooth);
     m_context.ReleaseArray(Detrender);
     m_context.ReleaseArray(I1);
     m_context.ReleaseArray(Q1);
 }
예제 #2
0
파일: ADX.cs 프로젝트: barbagrigia/Handlers
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
파일: ADX.cs 프로젝트: barbagrigia/Handlers
        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);
        }