Exemplo n.º 1
0
        public RMI(DataSeries ds, int len1, int len2, string description)
            : base(ds, description)
        {
            base.FirstValidValue = Math.Max(len1, len2);
            if (FirstValidValue < 2)
            {
                return;
            }

            if (ds.Count < Math.Max(len1, len2))
            {
                return;
            }

            // dansmo version

            double     u1        = 0;
            double     d1        = 0;
            DataSeries u1Series  = new DataSeries(ds, "u1Series(" + ds.Description + "," + len1 + "," + len2 + ")");
            DataSeries d1Series  = new DataSeries(ds, "d1Series(" + ds.Description + "," + len1 + "," + len2 + ")");
            DataSeries ugSeries  = new DataSeries(ds, "ugSeries(" + ds.Description + "," + len1 + "," + len2 + ")");
            DataSeries dgSeries  = new DataSeries(ds, "dgSeries(" + ds.Description + "," + len1 + "," + len2 + ")");
            DataSeries rmiSeries = new DataSeries(ds, "rmiSeries(" + ds.Description + "," + len1 + "," + len2 + ")");

            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                if (ds[bar] > ds[bar - len1])
                {
                    u1 = ds[bar] - ds[bar - len1];
                }
                else
                {
                    u1 = 0;
                }

                if (ds[bar] < ds[bar - len1])
                {
                    d1 = Math.Abs(ds[bar] - ds[bar - len1]);
                }
                else
                {
                    d1 = 0;
                }

                u1Series[bar] = u1;
                d1Series[bar] = d1;
            }

            ugSeries = WilderMA.Series(u1Series, len2);
            dgSeries = WilderMA.Series(d1Series, len2);

            for (int bar = FirstValidValue; bar < ds.Count; bar++)
            {
                base[bar] = 100.0 - (100.0 / (1 + ugSeries[bar] / dgSeries[bar]));
            }

            // fundtimer's version

            /*for (int bar = FirstValidValue; bar < ds.Count; bar++)
             * {
             *  base[bar] = RSI.Series(Momentum.Series(ds, len1), len2)[bar];
             * }*/

            // dansmo's version, rescaled

            /*double u1 = 0;
             * double d1 = 0;
             * DataSeries u1Series = new DataSeries(ds, "u1Series(" + ds.Description + "," + len1 + "," + len2 +")");
             * DataSeries d1Series = new DataSeries(ds, "d1Series(" + ds.Description + "," + len1 + "," + len2 + ")");
             * DataSeries ugSeries = new DataSeries(ds, "ugSeries(" + ds.Description + "," + len1 + "," + len2 + ")");
             * DataSeries dgSeries = new DataSeries(ds, "dgSeries(" + ds.Description + "," + len1 + "," + len2 + ")");
             *
             * for (int bar = FirstValidValue; bar < ds.Count; bar++)
             * {
             *  if (ds[bar] > ds[bar - len1])
             *      u1 = ds[bar] - ds[bar - len1];
             *  else
             *      u1 = 0;
             *
             *  if (ds[bar] < ds[bar - len1])
             *      d1 = Math.Abs(ds[bar] - ds[bar - len1]);
             *  else
             *      d1 = 0;
             *
             *  u1Series[bar] = u1;
             *  d1Series[bar] = d1;
             * }
             *
             * ugSeries = WilderMA.Series(u1Series, len2);
             * dgSeries = WilderMA.Series(d1Series, len2);
             *
             * for (int bar = FirstValidValue; bar < ds.Count; bar++)
             * {
             *  double rm = ugSeries[bar] / dgSeries[bar];
             *  base[bar] = rm / (1.0 + rm);
             * }*/
        }