◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Indicators / Chande Momentum Oscillator (CMO)
Momentum indicator

Chande Momentum Oscillator (CMO)

An RSI relative that uses the same up/down price changes but raw sums and a symmetric −100 to +100 scale.

Illustrative diagram — not live market data.

What it is

The Chande Momentum Oscillator (CMO) was introduced by Tushar Chande in 1994 in The New Technical Trader. It starts from exactly the same raw material as RSI — each bar's price change split into an 'up' part and a 'down' part — but processes it differently. Where RSI smooths the gains and losses with Wilder's running average and maps the ratio onto a 0–100 scale, CMO takes the plain sums of gains and losses over the lookback window and computes the net change as a fraction of total change, scaled to a symmetric −100 to +100 range with zero as the natural midpoint. The difference between CMO and RSI is therefore pure arithmetic, not a different theory of markets: same inputs, different smoothing (none versus Wilder's) and different normalization (symmetric versus 0–100). In fact, an RSI computed with raw sums instead of Wilder smoothing relates to CMO by the exact identity CMO = 2 × RSI_raw − 100. CMO is plotted in its own pane, typically with reference lines at +50 and −50. Like all oscillators it is descriptive rather than predictive — it summarizes recent price changes and forecasts nothing. This is educational content, not financial advice, and trading involves risk of loss.

How it works

Over a lookback of N bars (default 14 or, in Chande's original work, often 9 or 20), each bar's change is classified: if the close rose, the gain is added to sumUp; if it fell, the absolute loss is added to sumDown. CMO is then 100 × (sumUp − sumDown) / (sumUp + sumDown). The numerator is the net price change over the window; the denominator is the total absolute movement, up plus down. When every bar in the window closed higher, CMO reads +100; when every bar closed lower, −100; when gains and losses balance, 0. Compare this with RSI mechanically: RSI computes avgGain / (avgGain + avgLoss) × 100 where the averages use Wilder's smoothing, an exponential-style running average that never fully forgets old data. CMO's raw sums mean every bar in the window carries equal weight and drops out abruptly after N bars — so CMO is jumpier than RSI at the same length, both because there is no smoothing and because of the drop-off effect when a large old bar exits the window. The symmetric scale also changes interpretation: CMO's zero corresponds to RSI's 50, and the conventional ±50 CMO bands correspond to raw-sum RSI readings of 75 and 25, tighter definitions of stretched momentum than RSI's usual 70/30.

How traders read it

Common settings

Length 14 is the usual platform default; Chande also worked with 9 (faster) and 20 (smoother). Reference lines at +50 and −50, sometimes with a zero midline. Source is normally the close. Some traders smooth CMO with a short moving average to tame the raw-sum jumpiness — at which point its responsiveness advantage over RSI largely disappears, which is worth understanding rather than assuming either version is 'better'.

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("CMO Example", overlay = false)

length = input.int(14, "Length", minval = 1)
src    = input.source(close, "Source")

chg     = ta.change(src)
sumUp   = math.sum(math.max(chg, 0), length)
sumDown = math.sum(math.max(-chg, 0), length)

// Guard the flat-window edge case where sumUp + sumDown = 0
cmo = (sumUp + sumDown) == 0 ? 0.0 : 100 * (sumUp - sumDown) / (sumUp + sumDown)

plot(cmo, "CMO", color = color.blue)
hline(50,  "Upper",   color = color.gray)
hline(0,   "Zero",    color = color.new(color.gray, 50))
hline(-50, "Lower",   color = color.gray)

Pro tip: When choosing between CMO and RSI, be clear about what you are actually choosing: the same up/down inputs with or without Wilder smoothing, on a symmetric versus 0–100 scale. If you smooth CMO to reduce its noise, you have largely rebuilt RSI — so pick one, understand its lag/noise trade-off, and read it alongside price structure rather than in isolation. Educational information only, not advice; no indicator removes the risk of loss.

Built an indicator from this? Run it through the Validator to catch look-ahead bias and repainting, or convert a strategy to Pine Script.

Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro