For the Geeks
This page is for the reader who wants to understand why the oscillator behaves the way it does, not just what the settings change. It explains the normalization and saturation ideas at a concept level, without turning...
Written By Axiom Admin
Last updated About 1 month ago
For the Geeks
This page is for the reader who wants to understand why the oscillator behaves the way it does, not just what the settings change. It explains the normalization and saturation ideas at a concept level, without turning the page into a rebuild guide.
You do not need this page to use the indicator well. But if you have wondered why the oscillator flattens near the boundaries during strong moves, why a 5-ATR spike and a 10-ATR spike can look almost the same on the chart, or why changing ATR Sensitivity reshapes the whole character of the pane, this is where those questions get answered.
The problem the normalization solves
Most oscillators measure distance from a reference point. The problem is that raw distance is denominated in price units, and price units are not comparable across instruments.
If Bitcoin is 2,400 dollars above its 20 EMA and the S&P is 18 points above its 20 EMA, both numbers can be correct and still tell you almost nothing about which instrument is more stretched relative to its own normal behavior. Bitcoin moves in bigger units. The S&P has a different volatility profile. Raw distance does not travel well across symbols or timeframes.
If you want to blend multiple slots into one pane, you need a unit that means the same thing everywhere.
Why ATR is the normalizer
ATR is the volatility ruler in this script. It measures how much an instrument has been moving per bar over the chosen lookback.
When the script divides source-vs-baseline distance by ATR, the reading stops being "how many dollars" or "how many points" and becomes "how many recent-range units." That is what makes the slots comparable. A 1-ATR stretch on ES and a 1-ATR stretch on NQ are different raw distances, but they describe the same kind of relative displacement from baseline.
That is why cross-ticker mixing works here at all. The blend is not averaging points with dollars. It is averaging normalized stretch.
What the saturation curve does
ATR normalization gives you a value that can keep growing. In a quiet move it might stay around 0.3 or 0.8 ATR. In a violent move it can jump to 3, 5, or 10 ATR. If you plotted that raw value directly, one extreme event would wreck the scale for everything around it.
The saturation curve solves that by compressing the normalized distance into a fixed range from -100 to +100.
Near zero, the curve is close enough to linear that you still get useful gradient. At the default sensitivity, a half-ATR stretch lands around the middle of the pane.
As the distance grows, the curve flattens. At the default sensitivity, a 1-ATR stretch is already well past the midpoint, and a 2-ATR stretch is already crowding the ceiling.
At the extremes, the curve asymptotes. Very large distances push the oscillator close to the boundary but never beyond it.
That shape is the whole personality of the indicator. The middle range gives you detail. The edges give you a clear "this is stretched" warning, but not much precision about exactly how extreme the move is beyond that point.
The tradeoff at the boundaries
The compression is useful, and it costs you something.
What you gain: a bounded pane that stays readable even when markets get ugly. One extreme move does not blow out the chart.
What you lose: precision once the reading is already far from baseline. When the oscillator reads +95, you know price is very stretched in normalized terms. You do not know whether it is 3 ATR away or 6 ATR away, because both can live in the same compressed neighborhood.
That matters during outsized events. If a stock gaps hard on earnings or a macro headline detonates a futures market, the oscillator can tell you "this is at the wall." It cannot keep telling you how much harder the wall is being hit after that.
How ATR Sensitivity changes the character
ATR Sensitivity multiplies the normalized distance before it goes into the saturation curve.
At sensitivity 1.0, the curve uses the raw normalized stretch as-is.
At sensitivity 2.0, the same move reaches the flat part of the curve faster. The pane gets louder. More readings crowd the boundaries. You get quicker emphasis, but less detail at the extremes.
At sensitivity 0.5, the same move stays closer to the center. The pane gets quieter. You keep more gradient in the middle, but big stretches look less dramatic.
The important thing is this: sensitivity does not change the underlying measurement. It changes where that measurement sits on the curve.
Why the oscillator can look stuck near a boundary
When the oscillator sits near +95 or -95 for several bars, that does not mean it broke. It means the normalized distance is large enough that the curve is already in its flat region. Small changes in the underlying stretch barely move the plotted score.
That is the trade you made when you accepted bounded output. The pane stays readable, but once the market is already far from baseline, the indicator stops pretending it can preserve fine detail there.
If you want more variation near the edges, lower the ATR Sensitivity. That keeps the same stretch in a steeper part of the curve for longer.
What you can verify yourself
You do not need to take any of this on faith.
Check 1: Normalization is working
Add a separate ATR indicator to your chart with the same ATR Length the oscillator uses.
Approximate the distance between price and the slot's baseline MA.
Divide that distance by the ATR.
Compare the result to the oscillator reading.
At the default sensitivity, a half-ATR stretch should land around the middle of the pane, a 1-ATR stretch should already be well beyond midrange, and multi-ATR moves should crowd the boundary. If you changed sensitivity, the same stretch will land somewhere else on the curve.
This is only an approximation because the script does the whole calculation inside each slot's symbol/timeframe context, and the final mapping is nonlinear. But the relationship should still make sense. If your rough math says the slot is barely stretched and the oscillator is pinned near the ceiling, the mismatch is probably in your manual setup, not in the indicator.
Check 2: Cross-instrument normalization
Compare two instruments with different raw volatility.
Find a point where both are stretched by roughly the same ATR multiple relative to their own baselines.
The oscillator scores should be in the same neighborhood even though the raw distances are completely different.
That is the normalization doing its job.
Check 3: Sensitivity effect
Note a slot reading.
Double ATR Sensitivity.
The same market state should push the reading closer to the boundary.
Halve ATR Sensitivity.
The same state should pull the reading back toward the center.
The change will not be linear, because the curve is not linear.
Check 4: Boundary behavior during extreme moves
Find a sharp gap or news spike.
Watch the oscillator approach the boundary.
Notice that it does not break past +/-100, and that extreme moves start looking more alike once they are both deep in the compressed zone.
That is the bounded output doing exactly what it was designed to do.
What this page deliberately does not explain
This page explains the concepts that matter for using the tool well. It does not publish:
The exact implementation formula chain
The internal clamp values used to keep the math stable
The full shape details of the saturation curve
Pseudocode that would let someone reproduce the implementation directly
The point is to make the behavior legible, not to pretend the behavior is magic.