7.2 KiB
EOM: Ease of Movement
Ease of Movement reveals when price advances effortlessly versus when it struggles against resistance. It's the market's accelerometer.
| Property | Value |
|---|---|
| Category | Volume |
| Inputs | OHLCV bar (TBar) |
| Parameters | period (default 14), volumeScale (default 10000) |
| Outputs | Single series (Eom) |
| Output range | Unbounded |
| Warmup | period + 1 bars |
| PineScript | eom.pine |
- Ease of Movement (EOM) quantifies how easily price moves relative to volume.
- Similar: CMF, EFI | Complementary: ATR | Trading note: Ease of Movement; volume-normalized price displacement. High = price moves easily on low volume.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
Ease of Movement (EOM) quantifies how easily price moves relative to volume. High positive values indicate price is advancing with little resistance (low volume relative to price range), while high negative values reveal price declining easily. Values near zero suggest price is meeting resistance, requiring substantial volume to produce movement.
The elegance of EOM lies in its normalization: it divides price change by a "box ratio" that accounts for both volume and price range. This makes the indicator comparable across securities with different price and volume characteristics.
Historical Context
Developed by Richard W. Arms Jr. in the 1980s, the Ease of Movement indicator emerged from Arms' work on volume-price relationships (he also created the Arms Index/TRIN and Equivolume charting). Arms recognized that the relationship between price movement and volume tells a story about supply and demand balance.
The key insight: when price moves significantly on low volume, the market is offering little resistance to that direction. Conversely, large volume producing small price changes indicates significant opposition to the move.
This implementation uses a Simple Moving Average for smoothing, consistent with Arms' original formulation. The volumeScale parameter (default 10,000) normalizes the output to reasonable numeric ranges.
Architecture & Physics
EOM operates as a three-stage pipeline:
1. Midpoint Distance
The distance moved is based on the midpoint of the High-Low range:
Midpoint_t = \frac{High_t + Low_t}{2}
Distance_t = Midpoint_t - Midpoint_{t-1}
Using midpoints rather than closes provides a better measure of the "center of gravity" of price action for each bar.
2. Box Ratio
The box ratio measures how much volume was required per unit of price range:
BoxRatio_t = \frac{Volume_t / VolumeScale}{High_t - Low_t}
- High box ratio: lots of volume relative to range (resistance)
- Low box ratio: little volume relative to range (ease)
3. Raw EOM and Smoothing
RawEOM_t = \frac{Distance_t}{BoxRatio_t}
The raw values are smoothed with a Simple Moving Average:
EOM_t = SMA(RawEOM, period)
Mathematical Foundation
Distance Calculation
D_t = \frac{H_t + L_t}{2} - \frac{H_{t-1} + L_{t-1}}{2}
where:
H_t= High at time tL_t= Low at time t
Box Ratio
B_t = \frac{V_t / S}{H_t - L_t}
where:
V_t= Volume at time tS= Volume scale (default 10,000)
Raw Ease of Movement
E_t = \frac{D_t}{B_t} = \frac{D_t \times (H_t - L_t) \times S}{V_t}
Expanding fully:
E_t = \frac{(H_t + L_t - H_{t-1} - L_{t-1}) \times (H_t - L_t) \times S}{2 \times V_t}
Interpretation Signals
- Strong positive EOM: Price rising easily, bullish
- Strong negative EOM: Price falling easily, bearish
- EOM near zero: Price meeting resistance
- Zero line crossover: Potential trend change
- Divergence: Price vs EOM disagreement warns of reversal
Performance Profile
Operation Count (Streaming Mode)
| Operation | Count | Notes |
|---|---|---|
| ADD | 2 | Midpoint calculation |
| SUB | 3 | Distance, range |
| MUL | 1 | Scale application |
| DIV | 2 | Box ratio, EOM |
| SMA Update | O(1) | Ring buffer |
| Total | ~10 | Per bar |
Memory Footprint
| Component | Size | Notes |
|---|---|---|
| State record | 40 bytes | 5 doubles |
| Previous state | 40 bytes | For bar correction |
| Ring buffer | period × 8 bytes | SMA calculation |
| Total | ~80 + 8n bytes | n = period |
Quality Metrics
| Metric | Score | Notes |
|---|---|---|
| Accuracy | 10/10 | Matches original formulation |
| Timeliness | 7/10 | SMA lag proportional to period |
| Overshoot | 8/10 | Well-behaved, bounded by SMA |
| Smoothness | 8/10 | SMA provides good smoothing |
| Allocation | 10/10 | Zero heap allocations in hot path |
Validation
| Library | Status | Notes |
|---|---|---|
| QuanTAlib | ✅ | Ring buffer SMA implementation |
| TA-Lib | — | No EOM implementation |
| Skender | — | No EOM implementation |
| Tulip | — | Has EMV (different formula) |
| Ooples | — | No matching EOM implementation |
Note: External library implementations vary in their handling of volume scaling and SMA period. Tulip's EMV uses a different formula without the volume scale divisor.
Common Pitfalls
-
First Bar: No previous midpoint exists, so raw EOM = 0. The implementation initializes previous midpoint on the first valid bar.
-
Zero Range (High = Low): Creates division by zero in box ratio. Implementation guards against this by returning last valid EOM value.
-
Zero Volume: Creates division by zero. Implementation treats as infinite resistance (EOM = 0).
-
Volume Scale Selection:
- Default 10,000 works for most equities
- Crypto/forex may need 1,000,000+ due to different volume scales
- Scale affects magnitude, not direction or signal timing
-
Period Selection:
- Short periods (7-10): More responsive, more noise
- Standard period (14): Good balance for swing trading
- Long periods (20+): Smoother, confirms longer-term trends
-
Not Bounded: Unlike RSI or stochastics, EOM has no fixed range. Compare signals relative to the indicator's own history, not absolute values.
-
isNew Parameter: When correcting a bar (isNew=false), the implementation properly restores previous state and ring buffer position. Critical for live trading.
-
NaN/Infinity Handling: Implementation substitutes last valid values for NaN inputs and guards against infinite results from zero volume or zero range.
References
- Arms, R.W. Jr. (1989). "The Arms Index (TRIN)." Dow Jones-Irwin.
- Arms, R.W. Jr. (1994). "Trading Without Fear." John Wiley & Sons.
- StockCharts. "Ease of Movement (EMV)." Technical Indicators
- Investopedia. "Ease of Movement Indicator." Technical Analysis
- TradingView Wiki. "Ease of Movement." Pine Script Reference