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