原文 http://www.mql5.com/zh/articles/238 红璟指标: //------------------------------------------- public class MMM : IndicatorBase // MovingMiniMax { public double M = 0; public double N = 0; public MMM() : base() { AddParam("M", "20", "0", "500", "", IndicatorParamType.Double); AddParam("N", "300", "10", "1000", "", IndicatorParamType.Double); } public override IndicatorPackage Run(IDataProvider DP) { this.DataProvider = DP; // double[] LJWZ = new double[C.Length]; DataArray mm = new double[C.Length]; //DataArray mm2 = new double[C.Length]; int m = (int)M; // Smoothing window width 平滑窗口宽度 int n = (int)N; // Time window width 时间窗口宽度 int cd = n + 2 * m; double[] S = new double[cd]; double[] sQiip1 = new double[n]; double[] sQiim1 = new double[n]; double[] sPiip1 = new double[n]; double[] sPiim1 = new double[n]; double[] sui = new double[n]; double[] dQiip1 = new double[n]; double[] dQiim1 = new double[n]; double[] dPiip1 = new double[n]; double[] dPiim1 = new double[n]; double[] dui = new double[n]; for (int dqxh = 0; dqxh < C.Length; dqxh++) { if (dqxh > cd) { // DataArray S= new DataArray(C, cd); for (int i = 0; i < cd; i++) { S = C[dqxh - cd + 1 + i]; } //---------------------------- // void calcQii() { int i, k; for (i = 0; i < n; i++) { double sqiip1 = 0; double sqiim1 = 0; double dqiip1 = 0; double dqiim1 = 0; for (k = 0; k < m; k++) { sqiip1 += Math.Exp(2 * (S[m - 1 + i + k] - S) / (S[m - 1 + i + k] + S)); sqiim1 += Math.Exp(2 * (S[m - 1 + i - k] - S) / (S[m - 1 + i - k] + S)); dqiip1 += Math.Exp(-2 * (S[m - 1 + i + k] - S) / (S[m - 1 + i + k] + S)); dqiim1 += Math.Exp(-2 * (S[m - 1 + i - k] - S) / (S[m - 1 + i - k] + S)); } sQiip1 = sqiip1; sQiim1 = sqiim1; dQiip1 = dqiip1; dQiim1 = dqiim1; } } //----------------------- calcQii end // void calcPii() { int i; for (i = 0; i < n; i++) { sPiip1 = sQiip1 / (sQiip1 + sQiim1); sPiim1 = sQiim1 / (sQiip1 + sQiim1[i]); dPiip1[i] = dQiip1[i] / (dQiip1[i] + dQiim1[i]); dPiim1[i] = dQiim1[i] / (dQiip1[i] + dQiim1[i]); } } //----------------calcPii end // void calcui() { int i; sui[0] = 1; dui[0] = 1; for (i = 1; i < n; i++) { sui[i] = (sPiim1[i] / sPiip1[i]) * sui[i - 1]; dui[i] = (dPiim1[i] / dPiip1[i]) * dui[i - 1]; } double uSum = 0; double dSum = 0; double[] uSi = new double[n]; double[] dSi = new double[n]; for (i = 0; i < n; i++) { uSum += sui[i]; dSum += dui[i]; } for (i = 0; i < n; i++) { uSi[n - 1 - i] = sui[i] / uSum; dSi[n - 1 - i] = dui[i] / dSum; } mm[dqxh] = (uSi[n - 1] - dSi[n - 1])*1000*1000; } //-----------calcui end } } mm.Name = "MovingMiniMax"; mm.SetAttrs(" COLORSTICK"); return new IndicatorPackage(new DataArray[] { mm }, ""); } public override string LongName { get { return "MovingMiniMax(按事件方式计算)"; } } public override string Description { get { return ""; } } } //class mmmsj[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]