For the Geeks
You do not need this page to use the oscillator. But if you want to understand *why* it behaves the way it does — why it flattens at extremes, why sensitivity changes everything, why different tickers can share the sa...
Written By Axiom Admin
Last updated About 1 month ago
For the Geeks
You do not need this page to use the oscillator. But if you want to understand why it behaves the way it does — why it flattens at extremes, why sensitivity changes everything, why different tickers can share the same scale — this is where that understanding lives.
This page explains how Axiom MA Osc Lite converts a raw price-to-MA distance into a bounded oscillator score. It covers the normalization, the bounding function, the sensitivity parameter's real effect on the oscillator's shape, and why cross-ticker blending works mechanically. It also includes three verification exercises you can run on your own chart — because seeing the behavior on your instrument teaches more than reading about it in the abstract.
The explanation stays at the level of what the oscillator does conceptually and why. It does not make the implementation reproducible.
The core construction: distance to bounded score
Every oscillator reading in this indicator follows the same pipeline:
Step 1 — Measure the distance. The indicator computes the signed distance between the source price and the baseline moving average for each slot, on that slot's timeframe and symbol. If price is above the MA, the distance is positive. If below, negative. This raw distance is in the instrument's price units — dollars, satoshis, pips, whatever the instrument trades in.
Step 2 — Normalize by volatility. The raw distance is divided by the ATR (Average True Range) at the same timeframe. This converts the distance from price units into "how many ATR units is price away from the MA?" The result is unitless — a distance of 1.5 means price is 1.5 times the instrument's typical bar range away from the average. This normalization is what makes readings from different instruments comparable: an AAPL reading of 1.5 ATR and a Bitcoin reading of 1.5 ATR both mean "price is moderately stretched relative to this instrument's normal movement."
Step 3 — Scale by sensitivity. The normalized distance is multiplied by the sensitivity parameter. At sensitivity 1.0, the value passes through unchanged. At sensitivity 0.5, it is halved. At sensitivity 2.0, it is doubled. This step controls how much of the normalized distance range gets mapped into the active portion of the bounded scale versus how much gets pushed into the saturated zone.
Step 4 — Apply the bounding function. The scaled value is passed through a hyperbolic tangent (tanh) function. Tanh takes any real number and maps it to a value between −1 and +1. The result is then multiplied by 100 to produce the −100 to +100 display range.
That is the entire pipeline for the Fast line: distance → normalize by ATR → scale by sensitivity → tanh → multiply by 100.
The Slow line is a moving average of the Fast line, computed using the slot's configured Slow Type and Slow Length. The Blended Fast and Blended Slow are weighted averages of the enabled slots' Fast and Slow values respectively.
What the tanh function actually does to the score
The hyperbolic tangent is a specific mathematical function with properties that shape the oscillator's entire behavior. You do not need to know the formula — you need to understand the shape.
Near zero: approximately linear
When the input is small (roughly between −0.5 and +0.5 before sensitivity scaling), tanh passes it through nearly unchanged. An input of 0.3 produces an output of approximately 0.29. An input of −0.2 produces approximately −0.20. In this zone, the oscillator behaves almost like a simple rescaled distance — small changes in the input produce proportional changes in the output.
This means: when price is close to the MA (small distance in ATR units), the oscillator gives you high-resolution, proportional readings. The difference between +20 and +30 on the display represents a proportional increase in the actual normalized distance.
Further from zero: compression begins
As the input grows larger (roughly 0.5 to 1.5), the tanh function starts to curve. The output still increases, but each additional unit of input produces a smaller increase in output. An input of 1.0 produces an output of about 0.76. An input of 1.5 produces about 0.91. The function is still responsive, but the response is decelerating.
This means: at moderate distance from the MA, the oscillator still shows meaningful changes, but it takes progressively more actual distance to move the reading by the same amount on the display. You are entering the compression zone.
At the extremes: saturation
When the input exceeds roughly 2.0, the tanh output is already above 0.96 (which is above +96 on the display scale). Each additional unit of input produces a tiny, barely visible change. An input of 3.0 produces 0.995. An input of 5.0 produces 0.99999. The function asymptotically approaches ±1 but never reaches it.
This means: once the oscillator enters the saturated zone, large changes in the actual normalized distance — which might represent significant moves in real terms — are compressed into a few points of oscillator space. The reading at +96 and the reading at +99 could represent a doubling or tripling of the actual distance, but the oscillator cannot show you the difference.
Why tanh and not something simpler?
A simpler approach would be to clip the value — "if the normalized distance exceeds 1.0, just show +100." Clipping is easy to understand, but it creates a hard edge: the oscillator slams into the bound and gives you no information about the territory beyond it.
Another simple approach: percentile rank — "how does the current distance compare to the last N bars of distance?" Percentile rank preserves resolution at all levels but requires a lookback window and recomputes the scale based on recent history, making the reading less stable.
Tanh is a compromise. It provides smooth, symmetric bounding with no hard edge. It preserves resolution near the center where most of the day-to-day reading happens. It compresses the extremes gracefully. And it is stable — the same input always produces the same output, regardless of what the oscillator did on previous bars.
The cost is the resolution loss at extremes. That cost is permanent and structural. It is the trade-off for having a smooth, bounded, stable scale.
What sensitivity really controls
The sensitivity parameter sits between the normalization step and the tanh step. It multiplies the ATR-normalized distance before tanh is applied. This seemingly simple operation changes the entire shape of the oscillator.
Low sensitivity (e.g., 0.3)
At sensitivity 0.3, the normalized distance is multiplied by 0.3 before entering tanh. An actual distance of 2.0 ATR becomes an input of 0.6 to tanh, which produces an output of about 0.54 — roughly +54 on the display.
The effect: the oscillator uses the center of the range. Most readings fall between ±50 or ±60 even during significant moves. The OB/OS levels at ±70 are rarely reached. The oscillator preserves high resolution across a wide range of distances because most of its operating range stays in the linear portion of the tanh curve.
Think of it as zooming out. You can see a wider range of distance values on the bounded scale, but the scale does not reach the extremes.
Default sensitivity (1.0)
The normalized distance passes through unscaled. An actual distance of 1.0 ATR enters tanh as 1.0, producing about +76 on the display. An actual distance of 2.0 ATR enters as 2.0, producing about +96.
The effect: moderate distance readings land in the ±60 to ±80 zone. Strong moves push toward ±90 to ±100. The oscillator uses a reasonable portion of the range in most conditions, with some time in the saturated zone during trends.
High sensitivity (e.g., 2.5)
At sensitivity 2.5, a normalized distance of 1.0 ATR becomes an input of 2.5 to tanh, producing about +99 on the display. Even a distance of 0.5 ATR produces an input of 1.25, yielding about +85.
The effect: the oscillator reaches the extremes quickly and stays there. Any meaningful distance from the MA pins the reading near ±100. The zero crossing is sharp — the oscillator spends very little time in the center because the amplified input pushes it toward the bounds aggressively. The oscillator becomes a near-binary indicator: above the MA reads close to +100, below reads close to −100.
Think of it as zooming in. You can see small distances near the center very clearly (the zero crossing is well-defined), but anything beyond a small distance is immediately compressed against the bound.
The relationship between sensitivity and your instrument
Different instruments have different typical normalized distances. A volatile crypto might routinely sit 2-3 ATR from its 20-period EMA. A stable bond ETF might rarely exceed 0.5 ATR. The same sensitivity setting produces a saturated oscillator on one and a centered oscillator on the other.
This is why there is no "correct" sensitivity. The right value depends on what range of ATR-normalized distance is typical for your instrument at your timeframe, and how you want that range displayed on the bounded scale. The verification exercise below helps you find a reasonable value empirically.
How cross-ticker blending works
Each slot computes its Fast line entirely within its own symbol and timeframe context. The data request runs the full pipeline — MA, ATR, distance, normalization, sensitivity, tanh — on the slot's configured ticker and timeframe. The result is a bounded, unitless score that represents "how far is this instrument's price from its own MA, in its own volatility units."
When two slots run on different tickers, both produce scores on the −100 to +100 scale. The blend averages those scores using the configured weights.
Why the scores are comparable
A reading of +60 on AAPL means AAPL's price is moderately above AAPL's MA relative to AAPL's ATR. A reading of +60 on SPY means SPY's price is moderately above SPY's MA relative to SPY's ATR. Both numbers represent the same kind of measurement — volatility-relative distance — applied to different instruments. Averaging them is arithmetically valid because the normalization put them on the same scale.
Where comparability breaks down
Arithmetic comparability does not guarantee analytical meaningfulness. The oscillator scores from two instruments are comparable in the sense that both represent normalized distance — but if the instruments are driven by completely different forces, averaging their distances does not produce a coherent reading.
Example: you blend one slot running on ES (S&P 500 futures) with one slot running on a gold mining stock. ES and the mining stock sometimes move together, sometimes move inversely, and sometimes are unrelated. A blended reading of +20 could mean "both are mildly above their averages" or "ES is at +60 and the mining stock is at −20, and they happen to average to +20." The number is on the right scale, but the number is not about anything.
The rule of thumb: Blend instruments that share some structural relationship — a stock and its sector ETF, a stock and the broad index, a currency pair and a commodity that typically correlates. If you cannot explain why the instruments' MA-distance readings should be related, the blend probably does not mean anything useful.
Why this is not an "inter-market analysis tool"
The oscillator computes distance from a moving average, normalized by ATR. It does not compute correlation, relative strength, or any form of inter-market relationship. It simply puts different instruments on the same scale so you can visually compare or arithmetically average them. Whether that comparison is informative depends entirely on whether the instruments' distance profiles have a relationship worth observing. The oscillator does not check — it just averages.
Verification exercise 1: The sensitivity experiment
This exercise lets you see the sensitivity parameter's effect on your own instrument instead of taking the description above on faith.
Setup
Open your instrument on a timeframe you normally trade.
Add Axiom MA Osc Lite with default settings.
Look at a section of chart with both trending and range-bound periods — at least a few days of intraday data, or several weeks of daily data.
Procedure
Set sensitivity to 0.3. Observe the oscillator's shape. Note how much of the ±100 range it uses. Where do the readings cluster? Does the oscillator reach your OB/OS levels? How much time does it spend near zero versus near the extremes?
Set sensitivity to 1.0 (default). Observe the same section. The oscillator should use more of the range. Trending periods should push readings into the ±70 to ±100 zone. Range-bound periods should show readings closer to center.
Set sensitivity to 2.5. Observe again. The oscillator should spend most of its time near ±100, with sharp transitions through zero. The OB/OS levels are reached almost immediately when price moves away from the MA.
What to look for
At 0.3: the oscillator looks "calm" — wide range available, rarely approaching the bounds. Good resolution everywhere, but the extremes are hard to reach. If you need to know when the oscillator is in a distinctive zone (e.g., above OB), low sensitivity may make that zone unreachable.
At 1.0: a balance between center resolution and extreme reach. Most of the day-to-day action happens in a readable band, with the extremes reserved for strong moves.
At 2.5: the oscillator is nearly binary. Trending periods pin it at ±100. Range-bound periods still show rapid flips through zero. The zero crossing is sharp and well-defined, but everything beyond a small distance from the MA is compressed into the last few points near ±100.
The question to answer
"At which sensitivity level does the oscillator provide the most useful information for the way I trade this instrument?" If you need to distinguish between moderate and strong MA-distance, you want a sensitivity that keeps those readings in the non-saturated zone. If you mostly care about "is price above or below the MA?" and want a sharp binary reading, high sensitivity serves that purpose — but you lose the distance information.
Verification exercise 2: The cross-ticker experiment
This exercise lets you confirm that the ATR normalization produces comparable scores across different instruments and observe how the blend responds to weight changes.
Setup
Open any instrument.
Set slot 01 to the chart symbol's timeframe (e.g., 15m).
Set slot 02 to the same timeframe but set its Optional Ticker to a different instrument (e.g., SPY if your chart is on AAPL, or a different forex pair if you trade currencies).
Set slot 03's weight to 0 or disable it.
Set slots 01 and 02 to equal weight.
Procedure
Observe both Fast lines in the pane. They should both oscillate within the same −100 to +100 range, even though the underlying instruments have different prices and different ATR magnitudes. A reading of +50 on each means both instruments are moderately above their respective MAs in their own volatility terms.
Compare the two lines. When both are positive, the blend (if visible) will be positive. When one is positive and one is negative, the blend will sit between them.
Set slot 01's weight to 80 and slot 02's weight to 20. Observe the blend shift toward slot 01. The blend should now track slot 01 closely, with slot 02 providing minor corrections.
Set slot 02's weight to 0. The blend should now exactly match slot 01's Fast line.
What this confirms
The ATR normalization makes scores from different instruments sit on the same scale.
The blend responds predictably to weight changes — it is a simple weighted average.
A weight of 0 cleanly removes a slot from the blend while keeping it visible in the pane.
Verification exercise 3: The ATR-expansion experiment
This exercise shows you how ATR expansion affects the oscillator even when price does not reverse.
Setup
Find a period on your instrument where there was a sudden volatility spike — an earnings announcement, a news event, a period where bar ranges suddenly widened. The daily chart of a stock around earnings works well.
Apply the indicator with default settings. Set one slot to the daily timeframe if you are on a daily chart.
What to look for
Leading up to the volatility event, the oscillator should show some reading based on the pre-event distance and ATR. When the volatility event happens, ATR jumps. If price moved away from the MA, the oscillator may spike briefly — but if ATR grew by more than the price-to-MA distance grew, the oscillator actually compresses. The same distance (or even a larger distance) now represents fewer ATR units because the ATR denominator got bigger.
Look for a bar or short sequence where the oscillator drops even though price did not reverse toward the MA. That drop is the normalization adjusting to the new volatility regime. The oscillator is not wrong — it is accurately saying "this distance, which used to be large relative to typical movement, is now less remarkable because typical movement just got much bigger."
This is one of the most counterintuitive properties of ATR normalization, and the only way to internalize it is to see it happen on a real chart with a real instrument.
What this page does not cover
This page explains the oscillator at a conceptual level — enough to understand why it behaves the way it does and to verify that behavior on your own chart. It does not cover:
The exact implementation of the bounding function (guard conditions, clamping ranges, input preprocessing)
The data request pattern or the specific
request.security()configurationThe internal computation structure of the slot or blend functions
Pseudocode, formulas, or parameter-passing details that would make the implementation reproducible
The verification exercises are designed to let you observe and confirm the oscillator's behavior without those details. If you run the sensitivity experiment and see the shape change, you understand the sensitivity parameter at the level that matters for your trading — which is the behavioral level, not the code level. If you run the cross-ticker experiment and see comparable scores from different instruments, you understand the normalization. The behavior is the understanding.