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

Percentage Price Oscillator (PPO)

MACD expressed as a percentage of price — the same two-EMA momentum measure, normalized so readings are comparable across symbols and across time.

Illustrative diagram — not live market data.

What it is

The Percentage Price Oscillator (PPO) is a momentum indicator that answers a specific shortcoming of MACD. MACD is the fast EMA minus the slow EMA, measured in price units — so a MACD of 2.0 means something entirely different on a $20 stock than on a $2,000 index, and different on the same instrument in 2005 versus today. PPO takes the identical EMA difference and divides it by the slow EMA, multiplying by 100: PPO = 100 × (EMA12 − EMA26) / EMA26. The result reads as 'the fast average is X percent above (or below) the slow average', a unit-free number that can be meaningfully compared across instruments, portfolios, and long histories. Like MACD, PPO comes with a signal line (a 9-period EMA of the PPO) and a histogram (PPO minus signal). Everything qualitative about MACD carries over: it is a lagging calculation on past prices, descriptive rather than predictive, and normalization changes what readings mean — not whether they foresee anything. This entry is educational only, not financial advice, and all trading carries risk of loss.

How it works

Start from the MACD machinery: a fast EMA (default 12 periods) and a slow EMA (default 26) of the closing price. MACD plots their difference in price units; PPO divides that difference by the slow EMA and scales by 100, converting the spread into a percentage of price. The two indicators are related by an exact identity — PPO equals MACD divided by the slow EMA, times 100 — so at any moment they are positive together, negative together, and cross zero on the same bar. Signal-line crossovers occur at almost identical times too (not exactly identical, because the signal EMA is taken after the division, and the divisor itself moves bar to bar). What the normalization genuinely changes: a PPO of 2 means the fast EMA is 2% above the slow EMA whether the instrument trades at $5 or $50,000, and whether you are looking at last month or twenty years ago on a stock that has since risen tenfold. That makes PPO the correct choice for screening across symbols and for studying long histories, where raw MACD values inflate mechanically with price level. The percentage framing also has a subtle asymmetry worth knowing: because the divisor is the slow EMA, equal-sized up and down spreads in price terms produce slightly different percentage magnitudes when price levels differ.

How traders read it

Common settings

The defaults mirror MACD: 12-period fast EMA, 26-period slow EMA, and a 9-period EMA signal line on the closing price — PPO(12,26,9). Faster settings increase sensitivity and whipsaw; slower ones smooth at the cost of lag. Because PPO is in percent, its typical range differs by instrument volatility (an FX pair's PPO lives in a much narrower band than a small-cap stock's), so any thresholds should be calibrated per instrument rather than copied across markets. Settings are conventions to test, not truths.

Strengths

Pitfalls to watch

Pine v6 example

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

fastLen = input.int(12, "Fast EMA Length", minval = 1)
slowLen = input.int(26, "Slow EMA Length", minval = 1)
sigLen  = input.int(9,  "Signal Length",   minval = 1)
src     = input.source(close, "Source")

fastMa = ta.ema(src, fastLen)
slowMa = ta.ema(src, slowLen)

// PPO = MACD normalized by the slow EMA, in percent
ppo    = 100 * (fastMa - slowMa) / slowMa
signal = ta.ema(ppo, sigLen)
hist   = ppo - signal

plot(ppo,    "PPO",       color = color.blue)
plot(signal, "Signal",    color = color.orange)
plot(hist,   "Histogram", color = color.gray, style = plot.style_histogram)
hline(0, "Zero", color = color.gray)

Pro tip: Use PPO whenever the question involves comparison — across symbols, across a watchlist, or across years of history on one chart — and treat single-instrument, short-window readings as interchangeable with MACD, because there they nearly are. If two tools differ only by a divisor, pick the one whose units match your question. Educational information only, not financial advice: PPO describes past momentum in percent terms, predicts nothing, and all trading carries 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