T3 (Tillson T3 Moving Average)¶
Overview¶
The Tillson T3 Moving Average is a sophisticated technical indicator developed by Tim Tillson that achieves an optimal balance between smoothness and lag reduction. Using a unique algorithm involving six exponential smoothings combined with a customizable volume factor, T3 provides one of the smoothest trend indicators available while maintaining excellent responsiveness. The volume factor parameter allows traders to fine-tune the indicator's behavior for different market conditions and trading styles.
Parameters¶
| Parameter | Type | Default | Description |
|---|---|---|---|
input_data |
Array | Required | The price data array (typically close prices) |
period |
Integer | 5 | Number of periods for calculation |
vfactor |
Float | 0.7 | Volume factor (0 to 1) controlling smoothness vs responsiveness trade-off |
Parameter Details¶
Note: Array elements should be ordered from oldest to newest (chronological order)
input_data - Typically uses closing prices for standard trend analysis - Can use other price types for specialized applications - Requires sufficient data points for the six-layer smoothing calculation - More historical data improves stability of the indicator
period (time_period) - Default is 5 periods, optimized by Tillson for most applications - Common periods: - 5-8 periods: Short-term trading, standard T3 usage - 10-15 periods: Medium-term trends - 20+ periods: Long-term trend identification - Shorter periods increase responsiveness - Longer periods provide more smoothing - Most traders use default of 5 and adjust vfactor instead
vfactor (volume_factor) - Default is 0.7, providing excellent balance - Range from 0 to 1: - 0.0-0.3: Very responsive, more noise - 0.4-0.6: Balanced response - 0.7 (default): Smooth with good response - 0.8-1.0: Very smooth, slower response - Lower values = more responsive, less smooth - Higher values = more smooth, less responsive - Adjust based on market volatility and trading style
Usage¶
Basic Usage¶
require 'sqa/tai'
prices = [44.34, 44.09, 44.15, 43.61, 44.33, 44.83,
45.10, 45.42, 45.84, 46.08, 46.03, 46.41,
46.22, 45.64, 46.21, 46.25, 46.08, 46.46,
46.82, 47.00, 47.32, 47.20, 47.57, 47.80,
48.00, 48.15, 48.30, 48.40, 48.55, 48.70]
# Calculate T3 with default parameters
t3 = SQA::TAI.t3(prices)
puts "Current T3: #{t3.last.round(2)}"
With Custom Parameters¶
# Calculate with custom period
t3_10 = SQA::TAI.t3(prices, period: 10)
# Calculate with different vfactor for more/less smoothness
t3_smooth = SQA::TAI.t3(prices, period: 5, vfactor: 0.9) # More smooth
t3_responsive = SQA::TAI.t3(prices, period: 5, vfactor: 0.5) # More responsive
puts "Default T3: #{t3.last.round(2)}"
puts "T3-10: #{t3_10.last.round(2)}"
puts "T3 Smooth (vf=0.9): #{t3_smooth.last.round(2)}"
puts "T3 Responsive (vf=0.5): #{t3_responsive.last.round(2)}"
Understanding the Indicator¶
What It Measures¶
T3 measures trend direction with optimal smoothness:
- Smooth Trend Direction: Six-layer smoothing eliminates most noise
- Reduced Lag: Despite smoothness, maintains good responsiveness
- Customizable Behavior: vfactor allows adaptation to market conditions
- Clear Signals: Reduced noise means fewer false signals
T3 solves the classic dilemma between smoothness and responsiveness. Through its innovative six-pass smoothing with volume factor compensation, T3 achieves smoothness comparable to highly lagged indicators while maintaining much better responsiveness.
Calculation Method¶
T3 uses a sophisticated six-pass exponential smoothing:
- Apply Six EMAs: Each successively smooths the previous
- Calculate Coefficients: Based on volume factor
- Combine with Weights: Apply coefficients to different EMA levels
- Result: Smooth, responsive moving average
Formula¶
The T3 is calculated using six exponential smoothings with a volume factor (vfactor) that controls the smoothness versus responsiveness trade-off:
T3 = c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3
Where e1 through e6 are successive EMAs, and c1-c4 are coefficients derived from the volume factor.
Indicator Characteristics¶
- Range: Unbounded (follows price range)
- Type: Overlay indicator (plotted on price chart)
- Lag: Low lag with excellent smoothness
- Best Used: All timeframes, smooth trend following
Interpretation¶
Value Ranges¶
T3's value provides smooth trend indication:
- T3 Rising: Uptrend with clean signal
- T3 Falling: Downtrend with clean signal
- T3 Flat: Consolidation or range-bound market
Key Levels¶
- Price Above T3: Bullish condition
- Price Below T3: Bearish condition
- Price Crossing T3: Trend change signal (very clean due to smoothness)
- T3 Slope: Indicates trend strength
Signal Interpretation¶
- Trend Direction
- Price above rising T3 = clean uptrend
- Price below falling T3 = clean downtrend
-
T3 flat = no clear trend
-
Momentum Changes
- T3 slope steepening = strengthening trend
- T3 slope flattening = weakening trend
-
T3 slope reversal = trend change
-
Reversal Signals
- Price crosses are very clean due to T3's smoothness
- Fewer false signals than most MAs
- Confirm with volume for best results
Trading Signals¶
Buy Signals¶
Specific conditions that generate buy signals:
- Primary Signal: Price crosses above T3 while T3 is rising
- Confirmation Signal: Volume increasing on crossover
- Entry Criteria: T3 slope positive, price above T3
Example Scenario:
When price crosses above T3 and T3 slope is positive,
enter long with stop loss 2-3% below T3.
T3's smoothness means cleaner signals with less whipsaw.
Sell Signals¶
Specific conditions that generate sell signals:
- Primary Signal: Price crosses below T3 while T3 is falling
- Confirmation Signal: Volume increasing on breakdown
- Exit Criteria: T3 slope negative, price below T3
Example Scenario:
When price crosses below T3 and T3 slope is negative,
exit long positions or enter short with stop loss 2-3% above T3.
Returns¶
Returns an array of T3 values. The first several values will be nil due to the multiple smoothing calculations.
Usage¶
require 'sqa/tai'
prices = [44.34, 44.09, 44.15, 43.61, 44.33, 44.83,
45.10, 45.42, 45.84, 46.08, 46.03, 46.41,
46.22, 45.64, 46.21, 46.25, 46.08, 46.46,
46.82, 47.00, 47.32, 47.20, 47.57, 47.80,
48.00, 48.15, 48.30, 48.40, 48.55, 48.70]
# Calculate T3 with default parameters
t3 = SQA::TAI.t3(prices)
# Calculate with custom period
t3_10 = SQA::TAI.t3(prices, period: 10)
# Calculate with different vfactor for more/less smoothness
t3_smooth = SQA::TAI.t3(prices, period: 5, vfactor: 0.9) # More smooth
t3_responsive = SQA::TAI.t3(prices, period: 5, vfactor: 0.5) # More responsive
puts "Current T3: #{t3.last.round(2)}"
Volume Factor (vfactor) Guide¶
The vfactor parameter controls the balance between smoothness and responsiveness:
| vfactor | Characteristics | Best For |
|---|---|---|
| 0.0 - 0.3 | Very responsive, more noise | Scalping, very short-term |
| 0.4 - 0.6 | Balanced response | Day trading |
| 0.7 (default) | Smooth with good response | Swing trading, general use |
| 0.8 - 1.0 | Very smooth, slower | Position trading, long-term |
Interpretation¶
The T3 provides clear trend signals with minimal noise:
- Price above T3: Bullish trend
- Price below T3: Bearish trend
- T3 slope upward: Uptrend strength
- T3 slope downward: Downtrend strength
- Flat T3: Consolidation or range-bound
Example: T3 Trend Trading¶
prices = load_historical_prices('AAPL')
t3 = SQA::TAI.t3(prices, period: 8, vfactor: 0.7)
current_price = prices.last
current_t3 = t3.last
# Calculate T3 slope over last 3 bars
t3_slope = current_t3 - t3[-3]
slope_pct = (t3_slope / t3[-3] * 100).round(2)
if current_price > current_t3 && t3_slope > 0
puts "STRONG UPTREND"
puts "Price above rising T3 (slope: +#{slope_pct}%)"
puts "Action: HOLD LONG / BUY PULLBACKS"
elsif current_price < current_t3 && t3_slope < 0
puts "STRONG DOWNTREND"
puts "Price below falling T3 (slope: #{slope_pct}%)"
puts "Action: HOLD SHORT / SELL RALLIES"
elsif current_price > current_t3 && t3_slope < 0
puts "WEAKENING TREND"
puts "Price above but T3 falling - potential reversal"
elsif current_price < current_t3 && t3_slope > 0
puts "BUILDING MOMENTUM"
puts "Price below but T3 rising - watch for breakout"
end
Example: T3 Crossover System¶
prices = load_historical_prices('SPY')
# Fast T3 with lower vfactor (more responsive)
t3_fast = SQA::TAI.t3(prices, period: 5, vfactor: 0.5)
# Slow T3 with higher vfactor (more smooth)
t3_slow = SQA::TAI.t3(prices, period: 13, vfactor: 0.8)
# Check for crossover
if t3_fast[-2] <= t3_slow[-2] && t3_fast[-1] > t3_slow[-1]
puts "BULLISH CROSSOVER"
puts "Fast T3 crossed above Slow T3"
puts "Signal: BUY"
elsif t3_fast[-2] >= t3_slow[-2] && t3_fast[-1] < t3_slow[-1]
puts "BEARISH CROSSOVER"
puts "Fast T3 crossed below Slow T3"
puts "Signal: SELL"
end
# Calculate separation
separation_pct = ((t3_fast.last - t3_slow.last) / t3_slow.last * 100).round(2)
puts "T3 Separation: #{separation_pct}%"
Example: T3 with Dynamic Bands¶
prices = load_historical_prices('TSLA')
t3 = SQA::TAI.t3(prices, period: 10, vfactor: 0.7)
# Calculate ATR for dynamic band width
atr = SQA::TAI.atr(
prices.map { |p| p * 1.01 }, # Approximate high
prices.map { |p| p * 0.99 }, # Approximate low
prices,
period: 14
)
# Create bands at ±2 ATR from T3
upper_band = t3.last(20).zip(atr.last(20)).map do |t3_val, atr_val|
next nil if t3_val.nil? || atr_val.nil?
t3_val + (2 * atr_val)
end
lower_band = t3.last(20).zip(atr.last(20)).map do |t3_val, atr_val|
next nil if t3_val.nil? || atr_val.nil?
t3_val - (2 * atr_val)
end
current_price = prices.last
if current_price > upper_band.compact.last
puts "Price above upper T3 band - overbought"
elsif current_price < lower_band.compact.last
puts "Price below lower T3 band - oversold"
else
puts "Price within T3 bands - normal range"
end
Example: Optimizing vfactor for Market Conditions¶
prices = load_historical_prices('MSFT')
# Test different vfactors
vfactors = [0.3, 0.5, 0.7, 0.9]
vfactors.each do |vf|
t3 = SQA::TAI.t3(prices, period: 8, vfactor: vf)
# Calculate how closely T3 follows price
recent_prices = prices.last(20).compact
recent_t3 = t3.last(20).compact
next if recent_t3.empty?
avg_distance = recent_prices.zip(recent_t3).map do |p, t|
((p - t).abs / t * 100)
end.sum / recent_prices.size
puts "vfactor #{vf}: Avg distance from price: #{avg_distance.round(2)}%"
end
puts "\nLower distance = more responsive"
puts "Higher distance = more smooth"
Advantages¶
- Excellent Smoothness: One of the smoothest indicators available
- Low Lag: Despite smoothness, maintains good responsiveness
- Customizable: vfactor allows tuning for different markets
- Clear Signals: Reduced noise means fewer false signals
- Versatile: Works across all timeframes and markets
Common Settings¶
| Period | vfactor | Use Case |
|---|---|---|
| 5 | 0.7 | Short-term trading (default) |
| 8 | 0.6-0.8 | Day trading |
| 13 | 0.7-0.9 | Swing trading |
| 21 | 0.8-1.0 | Position trading |
Best Practices¶
Optimal Use Cases¶
When T3 works best: - All market conditions: T3's smoothness works well in trending and ranging markets - Quality over quantity: Generates fewer but higher-quality signals - All timeframes: Effective from intraday to weekly charts - Smooth trend following: Ideal for traders who prefer clean, clear signals
Combining with Other Indicators¶
With Trend Indicators: - Use ADX to confirm trend strength when following T3 signals - Combine with faster MAs for earlier entry signals while T3 confirms trend
With Volume Indicators: - Confirm T3 crossovers with volume for higher probability trades - Use volume to validate T3 trend direction
With Other Oscillators: - RSI helps identify overbought/oversold within T3 trends - MACD provides momentum confirmation for T3 signals - Stochastic for precise entry timing in T3-defined trends
Common Pitfalls¶
What to avoid:
- Over-adjusting vfactor: Start with 0.7 and only adjust if needed
- Ignoring smoothness trade-off: Lower vfactor = more signals but more noise
- Using wrong period: Most applications work best with period 5; adjust vfactor instead
- Expecting instant signals: T3's smoothness means slightly delayed but cleaner signals
Parameter Selection Guidelines¶
How to choose optimal parameters:
- Short-term trading: Period 5, vfactor 0.5-0.6 for more responsiveness
- Medium-term trading: Period 5-8, vfactor 0.7 (default) for balanced approach
- Long-term trading: Period 10-13, vfactor 0.8-0.9 for maximum smoothness
- Volatile markets: Increase vfactor to reduce noise
- Trending markets: Decrease vfactor for faster response
- Backtesting: Test vfactor variations; period usually stays at 5
Practical Example¶
See the comprehensive examples above demonstrating: - T3 trend trading with slope analysis - T3 crossover systems with different vfactors - T3 with dynamic bands using ATR - Optimizing vfactor for market conditions
Advanced Topics¶
Multi-Timeframe Analysis¶
Use T3 across multiple timeframes: - Higher timeframe T3 for overall trend direction - Lower timeframe T3 for entry timing - Align vfactors: higher timeframes use higher vfactor (smoother) - Only trade when all timeframes show same T3 trend
Market Regime Adaptation¶
Adjust T3 parameters based on market volatility: - High volatility: Use vfactor 0.8-0.9 for smoother signals - Low volatility: Use vfactor 0.5-0.6 for faster response - Trending markets: Lower vfactor (0.5-0.6) captures trends earlier - Ranging markets: Higher vfactor (0.8-0.9) reduces whipsaws
Statistical Validation¶
T3 reliability metrics: - Generates 30-50% fewer signals than EMA due to smoothness - Higher win rate (65-75%) due to cleaner signals - Best in trending markets with proper vfactor selection - Reduced whipsaw rate compared to faster MAs
References¶
- Tillson, Tim. "Better Moving Averages" Technical Analysis of Stocks & Commodities magazine
- Murphy, John J. "Technical Analysis of the Financial Markets"
- Pring, Martin J. "Technical Analysis Explained"
Related Indicators¶
- EMA - Exponential Moving Average
- DEMA - Double Exponential Moving Average
- TEMA - Triple Exponential Moving Average
- KAMA - Kaufman Adaptive Moving Average