Complete thin Dx-composition wrapper indicators with full test coverage: - PlusDi/MinusDi: Directional Indicator wrappers (DiPlus/DiMinus from Dx) - PlusDm/MinusDm: Directional Movement wrappers (DmPlus/DmMinus from Dx) - Individual validation tests per indicator directory (TALib, Skender, bounds) - Combined unit tests (DiDm.Tests.cs) and validation tests (DiDm.Validation.Tests.cs) - Quantower wrappers + tests for all 4 indicators - PineScript v6 implementations with compensated RMA - Normalized .md documentation for all indicators and categories - 182 tests passing, 0 failures
5.3 KiB
HT_PHASOR: Ehlers Hilbert Transform Phasor Components
Phasor components decompose price into in-phase and quadrature parts, mapping the cycle as a rotating vector.
| Property | Value |
|---|---|
| Category | Cycle |
| Inputs | Source (close) |
| Parameters | None |
| Outputs | Single series (HT_PHASOR) |
| Output range | Varies (see docs) |
| Warmup | LOOKBACK bars |
| PineScript | phasor.pine |
- HT_PHASOR decomposes the price signal into two orthogonal components, InPhase (
I) and Quadrature (Q), using the Hilbert Transform. - No configurable parameters; computation is stateless per bar.
- Output range: Varies (see docs).
- Requires
LOOKBACKbars of warmup before first valid output (IsHot = true). - Validated against TA-Lib, Skender, and Tulip reference implementations where available.
HT_PHASOR decomposes the price signal into two orthogonal components, InPhase (I) and Quadrature (Q), using the Hilbert Transform. Together these form a complex phasor Z = I + jQ that describes the instantaneous amplitude and phase of the dominant market cycle. Compatible with TA-Lib's HT_PHASOR function, this dual-output indicator provides the fundamental building blocks for cycle analysis, phasor crossover timing, and instantaneous amplitude measurement.
Historical Context
John Ehlers introduced phasor decomposition of market data in Rocket Science for Traders (2001). In electrical engineering, a phasor represents a sinusoidal signal as a rotating complex vector, separating the cycle's "position" (InPhase) from its "velocity" (Quadrature). Ehlers recognized that this decomposition is the mathematical foundation for all his cycle indicators: HT_SINE, HT_DCPERIOD, HT_DCPHASE, and HOMOD all derive from these same I/Q components. TA-Lib exposes HT_PHASOR to give advanced users direct access to the analytic signal for custom cycle analysis. The InPhase output is delayed by 3 bars to align with the Quadrature component's effective lag from the Hilbert Transform FIR.
Architecture & Physics
1. WMA Smoothing
SmoothPrice_t = \frac{4P_t + 3P_{t-1} + 2P_{t-2} + P_{t-3}}{10}
2. Hilbert Transform FIR
Using Ehlers' coefficients (A = 0.0962, B = 0.5769), the 4-tap discrete Hilbert approximation generates the detrender, and from it the fundamental In-Phase and Quadrature components (I_1, Q_1). Further Hilbert transforms of these produce jI and jQ.
3. Phasor Components
I_{2,t} = I_{1,t} - jQ_t, \qquad Q_{2,t} = Q_{1,t} + jI_t
Both smoothed with EMA (\alpha = 0.2):
I_t = 0.2 \cdot I_{2,t} + 0.8 \cdot I_{t-1}
Q_t = 0.2 \cdot Q_{2,t} + 0.8 \cdot Q_{t-1}
4. Phase Relationship
Q leads I by 90°. When I peaks, Q crosses zero downward. When I crosses zero upward, Q peaks. The instantaneous amplitude is A = \sqrt{I^2 + Q^2} and the instantaneous phase is \phi = \arctan(Q/I).
5. Complexity
O(1) per bar. Fixed Hilbert cascade with circular buffers. Warmup: 32 bars (TA-Lib lookback).
Mathematical Foundation
Parameters
| Parameter | Description | Default | Constraint |
|---|---|---|---|
| (none) | No user-configurable parameters |
Phasor Crossover Signals
| Condition | Signal |
|---|---|
Q crosses I from below |
Bullish (anticipates cycle trough) |
Q crosses I from above |
Bearish (anticipates cycle peak) |
\sqrt{I^2 + Q^2} increasing |
Cycle amplitude growing |
\sqrt{I^2 + Q^2} decreasing |
Cycle amplitude fading (trend or noise) |
Output Interpretation
| Output | Range | Meaning |
|---|---|---|
InPhase |
unbounded | Cycle component aligned with price |
Quadrature |
unbounded | Rate of change (velocity) of cycle |
Performance Profile
Operation Count (Streaming Mode)
| Operation | Count per bar | Notes |
|---|---|---|
| 4-bar WMA | ~5 | 3 MUL + 1 ADD + 1 MUL(×0.1) |
| Hilbert FIR (detrender) | ~7 | 4-tap FIR: 4 MUL + 3 ADD |
| Hilbert FIR (Q1) | ~7 | Same 4-tap structure on det buffer |
| Hilbert FIR (jI) | ~7 | 4-tap on I1 history |
| Hilbert FIR (jQ) | ~7 | 4-tap on Q1 history |
| Phasor EMA (I2, Q2) | ~8 | 2 SUB/ADD + 4 FMA |
| Buffer management | ~10 | 4 circular buffer writes + index arithmetic |
| Total | ~51 | O(1) fixed; no transcendentals (no period/phase extraction) |
Batch Mode (SIMD Analysis)
| Aspect | Assessment |
|---|---|
| SIMD vectorizable | No: cascaded IIR EMA smoothing creates sequential dependencies |
| Bottleneck | Circular buffer indexed lookups for 4 Hilbert FIR passes |
| Parallelism | None: each bar's phasor depends on previous bar's EMA state |
| Memory | O(1): 4 circular buffers (7 elements each) + 2 scalar EMA states (~240 bytes) |
| Throughput | Fastest of the HT family; no transcendental calls (no ATAN/SIN/COS) |
Resources
- Ehlers, J.F. Rocket Science for Traders. Wiley, 2001.
- TA-Lib
TA_HT_PHASOR()reference implementation. - Ehlers, J.F. Cybernetic Analysis for Stocks and Futures. Wiley, 2004.