The Balance of Power measures buying versus selling pressure by comparing the body (Close minus Open) to the range (High minus Low). Created by Igor Livshin in 2001, this ratio oscillates between -1 and +1, providing instantaneous momentum readings with zero lag. A stateless indicator: each bar evaluated independently, no memory of previous values required.
## Historical Context
Igor Livshin introduced BOP in the August 2001 issue of *Stocks & Commodities* magazine. The concept emerged from a simple observation: the relationship between open and close within a bar's range reveals buyer-seller dynamics more directly than price movement alone.
The brilliance lies in normalization. A large-bodied candle on a narrow-range day might represent significant conviction. A similar-sized body on a wide-range day might indicate indecision. BOP captures this nuance by measuring body size relative to range, not absolute body size.
Unlike momentum oscillators built on smoothed averages, BOP provides raw, unfiltered readings. This makes it noisy but responsive: ideal for detecting immediate shifts in market sentiment that lagging indicators miss.
The indicator found adoption in high-frequency and scalping strategies where milliseconds matter. Zero warmup, zero lag, zero state: BOP computes the same value regardless of historical context.
## Architecture & Physics
BOP operates as a pure function: input bar, output ratio. No internal state, no memory, no recursion.
### 1. Body Calculation
The body measures directional movement within the bar:
$$
Body = Close - Open
$$
Positive body indicates closing above opening (buyers prevailed). Negative body indicates closing below opening (sellers prevailed). Zero body (doji) indicates equilibrium.
### 2. Range Calculation
The range measures total price movement:
$$
Range = High - Low
$$
Range provides the denominator for normalization. Larger ranges indicate higher volatility; smaller ranges indicate consolidation.
### 3. Ratio Computation
The core BOP formula:
$$
BOP = \frac{Close - Open}{High - Low}
$$
This ratio is bounded:
- Maximum +1: Close equals High, Open equals Low (perfect bullish bar)
- Minimum -1: Close equals Low, Open equals High (perfect bearish bar)
- Zero: Close equals Open (doji or no movement)
### 4. Zero-Range Handling
When High equals Low (no range), division by zero would occur. QuanTAlib returns zero:
BOP produces high-frequency signals with no smoothing. Signal-to-noise ratio depends entirely on timeframe and instrument volatility. Common practice: smooth with SMA(14) or EMA(10) for trend identification while preserving raw readings for entry timing.
## Mathematical Foundation
### Closed-Form Expression
BOP admits no transfer function: it is a ratio, not a filter. No z-domain representation applies because there is no temporal dependency.
### Statistical Properties
For random price movements (no trend):
$$
E[BOP] = 0
$$
The expected value is zero when buyers and sellers have equal strength over time.
### Variance
Variance depends on the distribution of body sizes relative to ranges:
Empirically, BOP variance increases during trending periods (bodies consistently directional) and decreases during consolidation (bodies randomly directional).
### Correlation with Returns
BOP correlates with bar-level returns but captures different information:
Returns measure change from previous close; BOP measures efficiency of movement within current bar. A gap-up bar with a bearish body produces positive return but negative BOP.
Tolerance: exact match (ratio of integers produces identical floating-point results).
## Common Pitfalls
1.**Noise Sensitivity**: Raw BOP is extremely volatile. Single-bar spikes or dips rarely indicate trend changes. Smooth with SMA(14) or similar before making trend judgments. Use raw BOP for entry timing within an established trend direction.
2.**Gap Handling**: Gaps create disconnect between bars. A gap-up followed by bearish bar produces negative BOP despite overall bullish day. Consider combining with gap analysis for complete picture.
3.**Doji Interpretation**: BOP equals zero when Close equals Open. This indicates indecision, not necessarily equilibrium. High-range dojis and low-range dojis both produce BOP = 0 but carry different implications.
4.**TValue Input Limitation**: The `Update(TValue)` method returns zero because BOP requires OHLC data. Using TValue input produces meaningless results. Always use `Update(TBar)` for proper calculation.
5.**Period Selection for Smoothing**: When smoothing BOP, period choice affects signal timing. Shorter periods (7-10) preserve responsiveness; longer periods (14-21) reduce whipsaws. Match to trading timeframe.
6.**Extreme Value Rarity**: BOP reaching ±1.0 is rare: requires Close at High/Low and Open at Low/High. Values beyond ±0.8 typically indicate strong conviction. Use these for confirmation, not entry signals.
7.**Volume Ignorance**: BOP ignores volume entirely. A high-BOP bar on low volume carries different weight than same BOP on high volume. Consider pairing with volume analysis.