Syntax
public TSI(DataSeries ds, int period1, int period2, string description)
public static TSISeries(DataSeries ds, int period1, int period2)
Parameter Description
  
    | ds | Price series | 
  
    | period1 | First EMA period | 
  
    | period2 | Second EMA period | 
Description
The True Strength Index (TSI) is a momentum-based oscillator, developed by William Blau, designed to determine both the trend and overbought-
oversold conditions.
Interpretation
- The True Strength Index is a variation of the Relative Strength Index, so values of -25 and +25 can also be used to identify levels where a security is overbought or oversold.
- A signal line (7-day EMA) is usually added in the Moving Average Convergence/Divergence (MACD) fashion to help identify reversals. 
 
Calculation
The formula for the TSI is:
TSI(close,r,s) = 100*EMA(EMA(mtm,r),s)/EMA(EMA(|mtm|,r),s)
where
mtm = close today – close yesterday
EMA(mtm,r) = exponential moving average of mtm with period length = r
EMA(EMA(mtm,r),s) = exponential moving average of EMA(mtm,r) with period length = s
|mtm| = absolute value of mtm
r = 25,
s = 13
References
Example
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Indicators; // TSI
namespace WealthLab.Strategies
{
	public class ATMag02_2002_TSI : WealthScript
	{
		protected override void Execute()
		{
			// Plot True Strength Index and Signal Line
			ChartPane TSIPane = CreatePane( 50, true, true );
			SetPaneMinMax( TSIPane, -30, 30 );
			DataSeries TSISer = TSI.Series( Close, 25, 13 );
			PlotSeries( TSIPane, TSISer, Color.Blue, LineStyle.Solid, 1 );
			DataSeries Signal = EMA.Series( TSISer, 7, EMACalculation.Modern );
			PlotSeries( TSIPane, Signal, Color.Black, LineStyle.Dashed, 1 );
			// Obtain Difference of TSI and Signal Line, Plot it
			DataSeries Diff = TSISer - Signal;
			Diff.Description = "TSI/Signal Difference";
			ChartPane DiffPane = CreatePane( 35, false, true );
			PlotSeries( DiffPane, Diff, Color.Black, LineStyle.Histogram, 2 );
			for(int bar = 20; bar < Bars.Count; bar++)
			{
				if (IsLastPositionActive)
				{
					if( CrossUnder( bar, Diff, 0 ) )
						SellAtMarket( bar + 1, LastPosition );
				}
				else
				{
					if( CrossOver( bar, Diff, 0 ) )
						BuyAtMarket( bar + 1 );
				}
			}
		}
	}
}