# API ChartStyles Community Components Community Indicators IndexDefinitions Knowledge Base Misc Optimizers Pending Deletion PosSizers Providers Standard Indicators TASC Traders Tips TASCIndicators Tutorial Videos Visualizers Quick Search
»

# SMI

### Syntax

```
DataSeries SMI (Bars bars, int period1, int period2, int period3, string description)
public static SMI Series(Bars bars, int period1, int period2, int period3)
```

### Parameter Description

 bars A Bars object to apply SMI to period1 First smoothing period (for the highest/lowest range) period2 Second smoothing period (for smoothing the distance of today's close from the midpoint of the range) period3 Third smoothing period (final smoothing; usually, period3 is equal to period2)

### Description

The Stochastic Momentum Index (SMI) by William Blau is an advancement of the familiar Stochastic Oscillator indicator, that shows the distance between the current close and the midpoint of the recent n-period High/Low range. The SMI ranges between +100 and -100 and is somewhat less erratic than a Stochastic Oscillator over the same period.

### Calculation

According to TAI - Stochastic Momentum Index, the SMI is calculated as follows:

Begin by selecting the desired range. We use n = 10.

Then calculate the midpoint price M of the highest high and the lowest low in the range:

`    M = (HighMAX + LowMIN) / 2`

where

HighMAX = the highest high in the range LowMIN = the lowest low in the range

Next calculate the difference (or “distance”) D of today’s closing price from the midpoint of the range:

`    D = CPTODAY – M`

where CPTODAY = today’s closing price

Then smooth the value of D twice with an exponential moving average. We use a three-period EMA:

```    DS1 = EMA(3)(D)
DS2 = EMA(3)(DS1)```

Next, smooth the difference between the maximum high and minimum low twice, using the same EMA as before, and divide the second smoothed result by 2:

```    DHL = EMA(3)(HighMAX - LowMIN)
DHL2 = EMA(3)(DHL) / 2```

Finally, calculate the SMI:

`SMITODAY = 100 * (DS2 / DHL2)`

### Interpretation

The output of SMI varies between -100 and +100. When SMI rises above the threshold of +40, a sell signal is indicated. Similarly, if SMI falls below -40, a buy signal is indicated. Another common trading sign is that, when SMI crosses above moving average, a buy signal is generated, and when SMI crosses under moving average, a sell signal is generated.

### Example

```
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators;namespace WealthLab.Strategies
{
public class SMIDemo : WealthScript
{
private StrategyParameter paramPeriod1;
private StrategyParameter paramPeriod2;
private StrategyParameter paramPeriod3;

public SMIDemo()
{
paramPeriod1 = CreateParameter("Period 1", 10, 2, 20, 1);
paramPeriod2 = CreateParameter("Period 2", 3, 2, 10, 1);
paramPeriod3 = CreateParameter("Period 3", 3, 2, 20, 1);
}

protected override void Execute()
{
int per1 = paramPeriod1.ValueInt;
int per2 = paramPeriod2.ValueInt;
int per3 = paramPeriod3.ValueInt;

SMI smi = SMI.Series( Bars,per1,per2,per3 );			for(int bar = GetTradingLoopStartBar(smi.FirstValidValue * 3); bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
if( CrossUnder( bar, smi, -40 ) )
SellAtMarket( bar+1, LastPosition );
}
else
{
if( CrossOver( bar, smi, 40 ) )
}
}

ChartPane sPane = CreatePane( 40,true,true );
PlotSeries( sPane, smi, Color.Fuchsia, LineStyle.Solid, 2 );
DrawHorzLine( sPane, 40, Color.Green, LineStyle.Dashed, 1 );
DrawHorzLine( sPane, -40, Color.Red, LineStyle.Dashed, 1 );
HideVolume();
}
}
}
```