How it works
Rate of Change is the least processed momentum indicator there is: today's price against the price N bars ago, expressed as a percentage. There is no smoothing, no averaging and no normalisation beyond the division that makes it a percentage. Because of that it is honest in a way most oscillators are not — the number on the chart is a fact about the price series that you could verify with a calculator, not the output of a filter with its own dynamics.
The percentage form is what makes it portable. A 12-day ROC of +8 means the same thing on any instrument at any price level, which is why ROC is the raw material inside composite indicators like the Coppock Curve and Pring's KST: both build their output from ROC readings at several horizons and then smooth the result. If you want to compare the speed of two different markets, ROC is usually the correct primitive.
The behaviour that catches people out is the two-ended window. ROC changes for two reasons: because today moved, or because the bar dropping out of the back of the window was unusual. A large drop that occurred N bars ago will fall out of the calculation today and cause ROC to jump sharply upward even if today's price is flat. This 'drop-off effect' produces phantom signals in any rule that reacts to ROC crossing a level, and it is the single most common source of confusion with the indicator.
Practically, ROC is read three ways. The zero line separates net advance from net decline over the window, which is a crude but effective regime marker on higher timeframes. The magnitude tells you how fast, which is useful for filtering — many systems refuse to take a breakout unless ROC exceeds some threshold, on the reasoning that a breakout without speed is likely to fail. And the shape of ROC against the shape of price gives the standard divergence read.
Its close relative, plain Momentum, is the same idea expressed as a difference in price units rather than a percentage. That single change makes Momentum non-portable across instruments and across long time spans, which is why ROC is generally the better default of the two.
Calculation
The arithmetic in words, in the order it happens.
ROC = 100 x (current close - close N bars ago) / (close N bars ago). The default N on most platforms is 9, though 12 and 14 are equally common in the literature. The result is a percentage centred on zero: +5 means price is five percent above where it stood N bars ago, -5 means five percent below. A closely related variant, sometimes plotted as 'ROC ratio' or 'price ratio', omits the subtraction and the multiplication and simply divides current close by the close N bars ago, giving a series centred on 1 instead of 0.
Source
An AlgoBeamScript implementation of the formula above, written by us from the arithmetic so the code and the calculation agree line for line.
Runs unchanged on the platform and in the AlgoBeamTS runtime. The language reference is in the documentation.
Inputs
Defaults are the values most charting packages ship with. They are conventions, not optimal settings — the right length depends on your instrument and your holding period.
| Input | Default | What it changes |
|---|---|---|
| Length | 9 | The lookback in bars. This is the only real decision the indicator asks you to make and it changes everything: 5 measures a week of daily action and is dominated by noise, 12 is a common swing setting, and 200 turns ROC into a long-horizon trend gauge closely related to twelve-month momentum studies. |
| Source | Close | The price series compared across the window. Close is standard. Using a smoothed source such as an EMA of close removes most of the drop-off jumpiness at the cost of introducing the smoothing's own lag. |
How to read it
What practitioners take from the plot. Read these as descriptions of market state, not as entry signals.
- Crossing above zero
- Price is now higher than it was N bars ago for the first time in the current sequence. A crude but clean regime marker, most useful on weekly or monthly charts.
- Crossing below zero
- Net decline over the window. On longer settings this is a slow, high-conviction change of state rather than a trading trigger.
- Rising while price rises
- The advance is accelerating: each new N-bar span is covering more ground than the last. Trend continuation in its healthiest form.
- Flattening near a high while price still rises
- The advance continues at a decreasing rate. It says the move is maturing, not that it is finished — plenty of trends spend months in this state.
- A sharp jump with no matching price move
- Almost always the drop-off effect: an outlier bar has left the back of the window. Check the price N bars ago before treating it as information.
Limitations
Where this indicator misleads. None of these are fixed by a better parameter.
- The drop-off effect creates signals from history rather than from the present. Any threshold rule on raw ROC will fire on bars where nothing happened today.
- It is completely unsmoothed, so on short settings it is as noisy as the price series itself and produces a stream of zero-line crossings in a range.
- It is unbounded and its typical magnitude scales with the instrument's volatility, so a threshold tuned on an index will be far too tight for a small-cap or a crypto pair.
- Like all momentum measures it is backward-looking: it tells you how fast the market has been moving, which is only weak evidence about how fast it will move next.
Educational reference. This page explains how an indicator is built and how it is commonly read. It is not investment advice, not a recommendation and not a signal service. No indicator is profitable on its own — each is a way of describing a market, and any rule built on one has to be tested with realistic costs before it is traded.