예제 #1
0
        public Task <SignalStrength> ProcessSignalAsync(TimePeriod timePeriod, CandleDto[] candles)
        {
            var cmo = new CMO().Calculate(candles, 9);
            var cci = new CCI().Calculate(candles, 20);
            var mfi = new MFI().Calculate(candles, 14);

            var cmoUnit = TraderUtils.NormaliseAndClamp(cmo.First(), -50, 50);
            var cciUnit = TraderUtils.NormaliseAndClamp(cci.First(), -100, 100);
            var mfiUnit = TraderUtils.NormaliseAndClamp(mfi.First(), 10, 80);

            var avg = (cmoUnit + cciUnit + mfiUnit) / 3;

            return(Task.FromResult(TraderUtils.ToSignalStrength(avg)));
        }
예제 #2
0
        public double[] Calculate(CandleDto[] candles, int period)
        {
            var adx = new double[period];
            var pdi = new double[period];
            var mdi = new double[period];

            for (var i = 0; i < adx.Length; i++)
            {
                var current = candles[i];
                var prev    = candles[i + 1];

                var p = current.High - prev.High;
                var m = prev.Low - current.Low;

                if (p.AlmostEqual(m))
                {
                    p = m = 0;
                }
                if (p < 0 || m > p)
                {
                    p = 0;
                }
                if (m < 0 || p > m)
                {
                    m = 0;
                }

                pdi[i] = p;
                mdi[i] = m;
            }

            var atr = TraderUtils.WildersSmoothing(new ATR().Calculate(candles, period));

            pdi = TraderUtils.WildersSmoothing(pdi);
            mdi = TraderUtils.WildersSmoothing(mdi);

            for (var i = 0; i < adx.Length; i++)
            {
                var tr = atr[i];
                var p  = (pdi[i] / tr) * 100;
                var m  = (mdi[i] / tr) * 100;

                adx[i] = 100 * (Math.Abs(p - m) / (p + m));
            }

            return(TraderUtils.WildersSmoothing(adx));
        }