Systemicalpha

Tripple Exponentially Smoothed Moving Average

systemic:core-trixIndicatorsfunction1 cr

Inputs

NameTypeDescription
WindowintegerThe EMA period applied at each of the three smoothing stages.
PricefloatarrayThe time series of price values used as input for TRIX calculation.

Outputs

NameTypeDescription
TRIXfloatarrayThe TRIX line—a momentum oscillator showing the percentage rate of change of a triple exponentially smoothed moving average.

The Problem TRIX Was Built to Solve

In the early 1980s, traders using moving average crossover systems faced a brutal reality: whipsaws.

Picture this scenario: Price crosses above your moving average—you buy. The next day it dips below—you sell at a small loss. Then it crosses back above—you buy again. This cycle repeats, each small loss compounding into significant drawdown, all while the market ultimately goes nowhere.

Jack Hutson, writing in Technical Analysis of Stocks & Commodities magazine, asked a simple question: What if we could filter out all the noise and only react to real trend changes?

His answer was aggressive: smooth the data not once, not twice, but three times. Then measure whether even this ultra-smooth line is rising or falling.


The Intuition: What Triple Smoothing Actually Does

Think of price data as a signal contaminated by noise at different frequencies:

flowchart TD
    subgraph Noise["Price Contains Multiple Cycles"]
        N1["🔊 Daily noise (random walk)"]
        N2["📈 Weekly swings (mean reversion)"]
        N3["📊 Monthly trends (momentum)"]
        N4["🌊 Major trends (what we want)"]
    end
    
    subgraph Filter1["First EMA"]
        F1["Removes daily noise ✓"]
    end
    
    subgraph Filter2["Second EMA"]
        F2["Removes weekly swings ✓"]
    end
    
    subgraph Filter3["Third EMA"]
        F3["Removes monthly oscillations ✓"]
    end
    
    subgraph Result["What Remains"]
        R["Only major trend direction"]
    end
    
    Noise --> Filter1 --> Filter2 --> Filter3 --> Result

Each smoothing pass is like a low-pass filter in audio engineering—it removes higher-frequency components. By the third pass, only the underlying trend survives.

But here's the key insight: TRIX doesn't output this ultra-smooth line directly. It outputs the rate of change of that line. Why? Because we don't care about the absolute level—we care about whether the trend is accelerating or decelerating.

TRIX=EMAt3−EMAt−13EMAt−13×100\text{TRIX} = \frac{\text{EMA}^3_t - \text{EMA}^3_{t-1}}{\text{EMA}^3_{t-1}} \times 100

When TRIX is positive, the triple-smoothed average is rising. When it crosses zero, the trend has genuinely changed direction—not just wiggled.


Why Not Just Use a Longer Moving Average?

This is the natural question. If you want smoothness, why not just use a 100-period EMA instead of triple-smoothing a 15-period EMA?

The answer is lag behavior.

A very long single EMA responds slowly to everything—including genuine trend changes you want to catch. Triple smoothing has a different character: it's extremely unresponsive to noise but more responsive to sustained directional moves than an equivalently smooth single EMA.

flowchart LR
    subgraph LongEMA["Long Single EMA (e.g., 100-period)"]
        L1["Smooth ✓"]
        L2["Slow to react to real trends ✗"]
        L3["Uniform lag on all movements"]
    end
    
    subgraph TripleEMA["Triple EMA (e.g., 15×3)"]
        T1["Equally smooth ✓"]
        T2["Faster response to sustained moves ✓"]
        T3["Variable lag: ignores noise, follows trends"]
    end

Hutson's insight was that not all lag is equal. Triple smoothing creates selective lag—maximum delay for noise, minimum delay for genuine trend changes.


Reading TRIX: The Zero Line is Everything

Forget overbought/oversold levels. TRIX isn't RSI. The zero line is what matters:

TRIX PositionMeaning
Above zero, risingStrong uptrend, momentum increasing
Above zero, fallingUptrend intact but weakening
Crossing down through zeroMajor trend change: bullish → bearish
Below zero, fallingStrong downtrend, momentum increasing
Below zero, risingDowntrend intact but weakening
Crossing up through zeroMajor trend change: bearish → bullish

The power of TRIX: When it crosses zero, you can have high confidence that something real has changed—not just noise.


When TRIX Shines (And When It Doesn't)

TRIX Excels At:

1. Position Trading / Swing Trading If you hold positions for weeks or months, TRIX helps you stay in trends longer without being shaken out by normal volatility.

2. Trend Filtering Use TRIX as a "regime detector": only take long trades when weekly TRIX > 0, only short when < 0. This keeps you aligned with the major trend.

3. Divergence Detection Because TRIX is so smooth, divergences between price and TRIX are meaningful. If price makes new highs but TRIX doesn't, the underlying trend momentum is genuinely weakening.

4. Multi-Asset Comparison TRIX is a percentage, so you can compare momentum across assets with different price levels. A TRIX of 0.3 means the same thing for a 10stockanda10 stock and a 1000 stock.

TRIX Struggles With:

1. Day Trading / Scalping The lag is simply too much. By the time TRIX confirms a move, day traders have already captured it.

2. Mean-Reverting Markets In choppy, range-bound markets, TRIX will eventually generate a zero-line cross—just in time for the range to reverse again.

3. Fast V-Shaped Reversals TRIX will miss the bottom of a V-reversal entirely. By the time it confirms the new uptrend, much of the move is over.


Creative Applications

1. The "Major Trend Bias" System

Set your trading bias based on weekly TRIX:

  • Weekly TRIX > 0 → Only look for long entries on daily timeframe
  • Weekly TRIX < 0 → Only look for short entries on daily timeframe

This simple filter eliminates many losing trades that go against the major trend.

2. Volatility Regime Detection

Apply TRIX to the VIX (or any volatility measure):

  • TRIX of VIX crossing above zero → Volatility regime increasing, reduce position sizes
  • TRIX of VIX crossing below zero → Volatility regime decreasing, normal position sizes

3. The "Confirmation Delay" Strategy

When you see a potential entry on faster indicators (RSI, MACD), wait for TRIX to confirm before entering with full size. Enter 1/3 position immediately, add remaining 2/3 when TRIX confirms.

4. Sector Rotation

Calculate TRIX for multiple sector ETFs. Overweight sectors where TRIX is positive and rising; underweight where it's negative and falling.


Configuration

This module takes a single parameter:

ParameterDefaultEffect
Window15The EMA period applied at each of the three smoothing stages

Window Selection Guide

Your GoalWindowCharacter
More signals, accept more noise9-12Swing trading on daily charts
Balanced (Hutson's original)14-15Position trading
Maximum smoothness, few signals18-25Long-term trend following

Warmup note: TRIX needs exactly 3×(window−1)+13 \times (\text{window} - 1) + 1 observed bars before producing its first value. For window=15, budget 43 observed bars of warmup; a closed-market gap (weekend, holiday) does not add to this count.


Missing Data

A gap (weekend, holiday, missing print) is None, never fabricated:

  • Closed-market bars stay None — never a carried-forward EMA-chain state, never a look-ahead value seeded from the series mean.
  • "Window" periods = window observed bars at each of the three EMA stages; the final percentage-change step also runs over observed bars, so a Friday-to-Monday gap bridges as adjacent bars (the real bridged rate of change), never nulled and never fabricated.
  • Warm-up (fewer than 3×(window−1)+13 \times (\text{window}-1)+1 observed bars) is None, never a partial-smoothing value.
  • All-None input returns an all-None output at full length, never a crash.

Building a Complete System

This module outputs only the TRIX line. To add a Signal Line (for crossover signals), connect the output to an EMA module:

flowchart LR
    subgraph This["This Module"]
        T["TRIX Line"]
    end
    
    subgraph Add["Connect EMA Module"]
        S["9-period EMA of TRIX"]
    end
    
    subgraph Use["Trading Signals"]
        C1["TRIX crosses above EMA → Bullish"]
        C2["TRIX crosses below EMA → Bearish"]
    end
    
    This --> Add --> Use

Combining with Other Modules

CombinationStrategy
TRIX + RSIEnter RSI signals only when TRIX confirms trend direction
TRIX + ATRSize positions inversely to ATR when TRIX gives entry signals
TRIX + VolumeRequire volume confirmation on TRIX zero-line crosses
TRIX (weekly) + MACD (daily)Weekly TRIX for bias, daily MACD for timing

On Comparisons to Other Indicators

You might expect a comparison table here ranking TRIX against MACD, RSI, and others on dimensions like "smoothness" or "lag." I've deliberately omitted this.

Why? Such comparisons require subjective scores that would be fabricated. The honest answer is: TRIX solves a specific problem (whipsaws in trend-following) through aggressive smoothing. It's not "better" than MACD or RSI—it's different. If you trade major trends and hate false signals, TRIX is worth exploring. If you trade short-term reversals, TRIX will frustrate you.

Choose your tools based on your trading style, not arbitrary comparison scores.


Historical Note

Jack Hutson introduced TRIX in 1983. The indicator emerged from a specific frustration: moving average systems of that era generated too many false signals in choppy markets. Hutson's contribution wasn't mathematical sophistication—triple EMAs are simple to compute—but the insight that aggressive smoothing followed by rate-of-change analysis could separate trend from noise more effectively than other approaches of the time.

Four decades later, TRIX remains useful precisely because the problem it solves—distinguishing real trends from noise—is timeless.


Further Reading


Indicator Assessment

The following chart positions TRIX based on its complexity (ease of understanding and implementation) versus reliability (consistency of signals across market conditions). Points closer to the top indicate higher reliability; points to the left indicate lower complexity.

quadrantChart
    title TRIX Indicator Assessment
    x-axis Low Complexity --> High Complexity
    y-axis Low Reliability --> High Reliability
    quadrant-1 Complex & Reliable
    quadrant-2 Simple & Reliable
    quadrant-3 Simple & Unreliable
    quadrant-4 Complex & Unreliable
    Stocks: [0.45, 0.70]
    Crypto: [0.45, 0.60]

Assessment Breakdown

DimensionStocksCryptoNotes
Popularity5/105/10Moderately known but overshadowed by MACD; niche following among trend-followers
Reliability7/106/10Excellent for major trends due to triple smoothing; struggles in sideways markets; crypto's volatility causes more false signals
Complexity4.5/104.5/10Concept is intuitive (smooth three times, measure rate of change); implementation straightforward
Versatility5.5/105.5/10Best for position trading and weekly charts; limited utility for short-term trading due to lag
Recent Interest4.5/105/10Steady but not growing in traditional markets; slight uptick in crypto for noise filtering
Rendering diagrams...
© 2026 WanoLabs. All rights reservedAlpha build v0.1.5