internal double Calc(double thePrice) // Calculate Indicator values { // HEMA(n) = EMA(2 * EMA(n / 2) – EMA(n)), sqrt(n)) if (Period < 1) { throw new Exception("HEMAcalc: period < 1, invalid !!"); } if (Threshold < 1e-10) { throw new Exception("HEMAcalc: Threshold < 1e-10, invalid !!"); } if (trendDir != 0) { prevTrendDir = trendDir; } prevState = trendDir; ema1.Calc(thePrice); ema2.Calc(thePrice); double term3 = 2 * ema2.EMAval - ema1.EMAval; HEMAval = ema3.Calc(term3); isRrising = ema3.isRrising; isFalling = ema3.isFalling; trendDir = isRrising ? 1 : (isFalling ? -1 : 0); trendChanged = (trendDir * prevTrendDir < 0); stateChanged = (trendDir != prevState); return(HEMAval); }
internal double Calc(double thePrice) { EMA1.Calc(thePrice); EMA2.Calc(EMA1.EMAval); EMA3.Calc(EMA2.EMAval); var DEMAval = 2 * EMA1.EMAval - EMA2.EMAval; var TEMAval = 3 * EMA1.EMAval - 3 * EMA2.EMAval + EMA3.EMAval; DTEMAval = (DEMAval + TEMAval) / 2; var diff = DTEMAval - prevDTEMA; prevDTEMA = DTEMAval; isRrising = (diff > Threshold); isFalling = (diff < -Threshold); if (trendDir != 0) { prevTrendDir = trendDir; } prevState = trendDir; trendDir = isRrising ? 1 : (isFalling ? -1 : 0); trendChanged = (trendDir * prevTrendDir < 0); stateChanged = (trendDir != prevState); string msg = thePrice + "," + EMA1.EMAval + "," + EMA2.EMAval + "," + EMA3.EMAval + "," + DTEMAval + "," + prevDTEMA + "," + trendDir + "," + prevTrendDir + "," + trendChanged ; dumpData(msg); return(DTEMAval); }