The Stochastic Momentum Index (SMI), developed by William Blau, is a smoother version of the standard Stochastic Oscillator. It measures the relationship between the closing price and the *midpoint* of its high-low range, rather than the closing price's position within the range.
The result is an oscillator that fluctuates around a zero line, providing clearer signals and minimizing erratic behavior.
Our `SMI_Pro` implementation is a unified, professional version that allows the calculation to be based on either **standard** or **Heikin Ashi** price data, selectable from a single input parameter.
## 2. Mathematical Foundations and Calculation Logic
The SMI involves multiple layers of smoothing, using Exponential Moving Averages (EMAs).
### Required Components
* **%K Period:** The lookback period for finding the highest high and lowest low.
* **%D Period:** The period for the double EMA smoothing.
* **Signal Period:** The period for the final EMA smoothing that creates the signal line.
### Calculation Steps (Algorithm)
1.**Find the Price Range:** For each bar, determine the highest high and lowest low over the `%K Period`.
2.**Calculate the Relative Distance:** Determine the distance of the current close from the midpoint of the high-low range.
The entire calculation logic is encapsulated within a reusable include file.
* **`CSMICalculator`**: The base class that performs the full, multi-stage SMI calculation on a given set of High, Low, and Close prices.
* **`CSMICalculator_HA`**: A child class that inherits all the complex logic and only overrides the initial data preparation step to use smoothed Heikin Ashi prices as its input. This object-oriented approach eliminates code duplication.
Unlike basic implementations that recalculate the entire history on every tick, this indicator employs an intelligent incremental algorithm.
* It utilizes the `prev_calculated` state to determine the exact starting point for updates.
* The internal buffers (`m_ema_rel`, `m_ema_range`, etc.) persist their state between ticks, allowing the recursive EMA algorithms to continue seamlessly from the last known value.
* This results in **O(1) complexity** per tick, ensuring instant updates and zero lag, even on charts with extensive history.
* **Robust EMA Initialization:** Each recursive EMA calculation step is carefully initialized with a simple average to provide a stable starting point for the calculation chain and prevent floating-point overflows.
## 4. Parameters
* **%K Length (`InpLengthK`):** The lookback period for finding the highest high and lowest low. Default is `10`.
* **%D Length (`InpLengthD`):** The period used for the double EMA smoothing. Default is `3`.
* **EMA Length (`InpLengthEMA`):** The smoothing period for the final signal line. Default is `3`.
* **Candle Source (`InpCandleSource`):** Allows the user to select the candle type for the calculation (`Standard` or `Heikin Ashi`).
## 5. Usage and Interpretation
* **Overbought/Oversold Levels:** The SMI typically uses +40 as the overbought level and -40 as the oversold level.
* **Crossovers:**
* **SMI / Signal Line Crossover:** When the SMI line crosses above its signal line, it can be considered a bullish signal. When it crosses below, it's a bearish signal.
* **Zero Line Crossover:** A crossover of the SMI line above the zero line indicates that bullish momentum is taking control. A crossover below zero indicates bearish momentum.
* **Divergence:** Look for divergences between the SMI and the price. A bearish divergence (higher price highs, lower SMI highs) can signal a potential top, while a bullish divergence (lower price lows, higher SMI lows) can signal a potential bottom.
* **Caution:** While smoother than a standard Stochastic, the SMI is still a momentum oscillator and can give false signals in choppy markets.