# AroonOsc: Aroon Oscillator

> Tushar Chande's Aroon system is a dual-line argument. The Oscillator is the verdict.

The Aroon Oscillator condenses the struggle between the "Aroon Up" and "Aroon Down" lines into a single, normalized value. It quantifies not just the existence of a trend, but its freshness. It answers the question: "Are new highs appearing faster than new lows?"

## Historical Context

Introduced by Tushar Chande in *The New Technical Trader* (1995), the Aroon system was a departure from price-based momentum. It focused on *time*. While RSI asks "how much did price move?", Aroon asks "how long has it been since the last extreme?". The Oscillator is simply the arithmetic difference between the two, providing a zero-centered metric for trend bias.

## Architecture & Physics

The physics of Aroon are temporal, not spatial. It measures the decay of "recency."

1. **Time Measurement**: The bars since the highest high and lowest low within the period are counted.
2. **Normalization**: These counts are converted to a 0-100 scale (100 = happened right now, 0 = happened `Period` bars ago).
3. **Differential**: The Oscillator is `Up - Down`.

### The Drift Resistance

Unlike recursive indicators (EMA, RSI) which accumulate floating-point errors over time, Aroon is stateless in the long term. Its value depends *only* on the data within the lookback window. This makes it mathematically robust and immune to "poisoning" from bad data in the distant past.

## Mathematical Foundation

The math is purely arithmetic.

### 1. Aroon Up

$$ \text{AroonUp} = \frac{\text{Period} - \text{Days Since High}}{\text{Period}} \times 100 $$

### 2. Aroon Down

$$ \text{AroonDown} = \frac{\text{Period} - \text{Days Since Low}}{\text{Period}} \times 100 $$

### 3. The Oscillator

$$ \text{AroonOsc} = \text{AroonUp} - \text{AroonDown} $$

## Performance Profile

The algorithm is $O(N)$ where $N$ is the period, as the window must be scanned for extremes. However, for typical periods (14-25), this is negligible.

### Zero-Allocation Design

The implementation uses a circular buffer (`RingBuffer`) to store historical highs and lows, ensuring O(1) access and zero heap allocations during the update cycle. The min/max search is performed in-place on the buffer.

| Metric | Score | Notes |
| :--- | :--- | :--- |
| **Throughput** | 10ns | 10ns / bar. |
| **Allocations** | 0 | Hot path is allocation-free. |
| **Complexity** | O(P) | Linear scan of the lookback window. |
| **Accuracy** | 10/10 | Matches standard implementations. |
| **Timeliness** | 10/10 | Reacts immediately to new extremes. |
| **Overshoot** | 0/10 | Bounded -100 to +100. |
| **Smoothness** | 2/10 | Step-function behavior. |

## Validation

Validation is performed against industry-standard libraries.

| Library | Status | Notes |
| :--- | :--- | :--- |
| **QuanTAlib** | ✅ | Validated. |
| **Skender** | ✅ | Matches `GetAroon` (Oscillator). |
| **TA-Lib** | ✅ | Matches `TA_AROONOSC`. |
| **Tulip** | ✅ | Matches `ti.aroonosc`. |
| **Ooples** | ❌ | Deviates significantly from standard. |

### Common Pitfalls

* **Lag**: Because it looks back `Period` bars, it will not signal a reversal until the previous extreme "ages out" or is superseded. It is a lagging indicator of trend changes.
* **Flatlining**: In strong trends, the oscillator can peg at +100 or -100 for extended periods. This is a feature, not a bug—it indicates a "fresh" extreme on every bar.
