Schaff Trend Cycle Indicator: Formula, Settings and How to Read It

The Schaff Trend Cycle runs a MACD line through two successive stochastic normalisations to produce a 0 to 100 oscillator. Its defaults are a 23-period fast EMA, a 50-period slow EMA, a cycle length of 10 and a smoothing factor of 0.5.

Senzoukria · Indicators · Updated September 2026


Schaff Trend Cycle ships with the Senzoukria desktop app, in the Momentum group of the indicator catalogue. It is drawn in its own panel below the chart.

What Schaff Trend Cycle measures

The input is the difference between two exponential averages of the close, each seeded with a simple moving average and using the classic coefficient rather than Wilder's. The first stage converts that unbounded, instrument-dependent number into a 0 to 100 position inside its own cycle window, then applies an exponential smoothing with a fixed factor, 0.5 by default; note that this factor is a weight, not a period, and it is seeded on the first defined value. The second stage repeats the same operation on that smoothed result. This second pass is the whole point of the indicator and is what a first reading usually misses: it measures the position of a position, so the line describes how far a move has progressed through its cycle rather than how large that move is. When a window is flat, with maximum equal to minimum, the output is undefined and the smoothing state is frozen rather than carried forward with an invented value.

The formula, as implemented

This is not a description of how the indicator is usually defined elsewhere — it is what the shipped code computes, documented next to the implementation:

STC — Schaff Trend Cycle (Doug Schaff, 1999) : le MACD passé à la moulinette d'une DOUBLE STOCHASTIQUE. 1. macd = EMA_fast(close) − EMA_slow(close) — EMA à GRAINE SMA, α = 2/(N+1) (convention du repo), PAS de Wilder ; 2. PREMIÈRE stochastique, sur le macd, fenêtre `cycle` : %K₁ = 100·(macd − min)/(max − min) pf ← premier %K₁ défini, puis pf + f·(%K₁ − pf) (f = `factor`) 3. SECONDE stochastique, sur `pf` — MÊME fenêtre, MÊME facteur : %K₂ = 100·(pf − min)/(max − min) STC ← premier %K₂ défini, puis STC + f·(%K₂ − STC) POURQUOI DEUX ÉTAGES — c'est tout l'indicateur, et c'est ce que la première lecture rate. Une seule stochastique sur le MACD donnerait un signal qui sature à 0/100 dès que le MACD touche un extrême de sa fenêtre : bruyant et binaire. Le premier étage transforme le MACD (grandeur non bornée, dépendant de l'instrument) en un POSITIONNEMENT 0..100 dans son propre cycle ; le second étage mesure la position de CE positionnement dans SON cycle, c'est- à-dire la MATURITÉ du mouvement plutôt que son amplitude. D'où la lecture usuelle : franchissement de 25 en montée = début de cycle haussier, franchissement de 75 en baisse = fin. Le lissage entre les deux n'est PAS une EMA de période : c'est un lissage exponentiel à FACTEUR FIXE (0.5 chez Schaff), amorcé sur la première valeur définie. Défauts 23/50/10, facteur 0.5 (Schaff). Fenêtre PLATE (max == min) → null ET état FIGÉ (cf. `schaffStage`) : ni valeur inventée, ni report de la dernière — le trou se propage aux fenêtres qui le contiennent, ce qui est le comportement voulu. Warm-up : slow − 1 (EMA lente) + cycle − 1 (étage 1) + cycle − 1 (étage 2).

How to read it

  • The conventional reading treats a rise through 25 as the start of a rising cycle and a fall through 75 as the end of one. These levels come with the indicator's design; nothing measured here establishes them.
  • The line spends long stretches very close to 0 or to 100, because two stacked normalisations saturate quickly. The transitions between those areas carry more information than the time spent in them.
  • A move away from a bound is the event most readings key on, and it occurs after the underlying MACD has already turned.
  • Since the output is bounded, a strong trend and a moderate one both end up at the top of the scale. Read the size of a move on price or on the MACD itself, never on this line.
  • Breaks in the line mark flat windows where the calculation has no reference; the internal state is held rather than advanced across them.

Parameters and defaults

Fast EMA 23 and slow EMA 50 define the MACD input, the slow field accepting up to 500. Cycle, 10 by default and adjustable from 2 to 200, sets the window used by both stochastic stages. The smoothing factor of 0.5 controls how quickly each stage follows its raw stochastic value and accepts 0.05 to 1: at 1 the smoothing disappears and each stage takes its raw value directly, while low values make the line sluggish and slow to leave a bound.

Schaff Trend Cycle — parameters exposed in the app, with the values it ships with.
ParameterTypeDefaultRange
Fast EMAnumber231 – 200
Slow EMAnumber502 – 500
Cyclenumber102 – 200
Smoothing factornumber0.50.05 – 1

What it does not show

Three sources of delay are stacked: the slow exponential average, then one cycle window per stochastic stage. At the defaults that is 49 plus 9 plus 9, so 67 bars of warm-up pass before anything can plot. The bounded scale discards magnitude entirely. The calculation is derived from closes alone, so nothing in it reflects the resting liquidity of the book or the aggressor side that a footprint column records. And flat windows propagate as gaps into every later window that contains them, which is deliberate but leaves visible holes in quiet periods.

Using it in Senzoukria

Add it from the Indicators panel of any footprint chart or candle chart. It runs on futures data from Rithmic or Databento and on crypto pairs from Binance and Bybit, on the same engine — the calculation does not change with the venue, only the data feeding it does. Market data subscriptions are billed by the provider, separately from the app.

See the full indicator library, or start with the order flow guide if you are new to reading aggression, delta and absorption.

Frequently asked questions

What does the Schaff Trend Cycle measure?
It measures how far a MACD move has progressed through its own cycle, on a 0 to 100 scale. The MACD line is first normalised to a position inside its recent range, and that position is then normalised again inside its own recent range, so the output describes the maturity of a move rather than its size.
Why does STC apply the stochastic twice?
A single stochastic applied to the MACD would saturate at 0 or 100 as soon as the MACD touched an extreme of its window, giving a noisy, nearly binary signal. The first stage converts the unbounded MACD into a position; the second measures where that position sits in its own cycle, which is what produces the smoother, cycle-oriented line.
What do the 25 and 75 levels mean on the Schaff Trend Cycle?
They are the conventional reading levels that come with the indicator's design: a rise through 25 is usually treated as the beginning of a rising cycle and a fall through 75 as the end of one. They are conventions attached to the construction, not thresholds derived from any measurement published here.

Keep reading