The Chande Momentum Oscillator (CMO) is a momentum indicator developed by Tushar Chande. Unlike RSI which uses smoothed averages of gains and losses, CMO uses raw sums of up and down movements, making it more responsive to price changes. The indicator oscillates between -100 and +100.
CMO(N) maintains two ring buffers — `_upBuffer` (gains) and `_downBuffer` (losses) — and derives its value from the running sums already tracked by each buffer. The per-bar cost is dominated by the ring buffer updates and the single division.
O(1) per bar. At N = 14 (default), WarmupPeriod = 15 bars (one extra for the initial delta). Typical measured cost: 28–32 cycles on a Zen 4 core with turbo.
### Batch Mode (SIMD Analysis)
| Operation | Vectorizable? | Notes |
| :--- | :---: | :--- |
| Price delta series | Yes | `VSUBPD` across entire input span |
| Prefix-sum of up/down windows | Yes | scan-then-window via AVX2 prefix scan |
| Sliding window sum (subtract old, add new) | Yes | vectorizable once prefix sums are built |
| Final CMO formula (per bar) | Yes | `VSUBPD`, `VADDPD`, `VDIVPD` |
The classification branch (up vs. down) is the primary SIMD barrier. A branchless formulation using `Vector.ConditionalSelect` replaces the branch with a mask, enabling full vectorization. For N = 14, AVX2 processes 8 bars simultaneously after the prefix-sum setup.