Files

112 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TD_SEQ: TD Sequential
> *TD Sequential counts consecutive closes relative to a prior bar, mapping exhaustion through the simple act of counting.*
| Property | Value |
| ---------------- | -------------------------------- |
| **Category** | Oscillator |
| **Inputs** | OHLCV bar (TBar) |
| **Parameters** | None |
| **Outputs** | Single series (TdSeq) |
| **Output range** | Varies (see docs) |
| **Warmup** | `comparePeriod + 1` bars |
| **PineScript** | [td_seq.pine](td_seq.pine) |
- TD Sequential is Tom DeMark's exhaustion counting system that identifies potential trend reversals through two phases: a 9-count Setup phase that d...
- No configurable parameters; computation is stateless per bar.
- Validated against TA-Lib, Skender, and Tulip reference implementations where available.
TD Sequential is Tom DeMark's exhaustion counting system that identifies potential trend reversals through two phases: a 9-count Setup phase that detects overextended trends, and a 13-count Countdown phase that pinpoints probable reversal timing. Unlike oscillators that measure momentum magnitude, TD Sequential counts consecutive qualifying bars, producing integer outputs (Setup: $\pm 1$ to $\pm 9$; Countdown: $\pm 1$ to $\pm 13$) that represent the progression toward exhaustion. A completed 9-count Setup followed by a completed 13-count Countdown signals high-probability trend exhaustion. All state is maintained in O(1) scalar variables with no buffers required.
## Historical Context
Thomas DeMark developed TD Sequential during the 1970s-1990s as part of his comprehensive market timing framework, published in *The New Science of Technical Analysis* (1994) and *New Market Timing Techniques* (1997). The indicator was conceived as a structural alternative to momentum oscillators: rather than measuring how overbought or oversold a market is, it counts how long a directional condition has persisted and identifies specific exhaustion points. DeMark's key insight was that trends exhaust at predictable counting thresholds (9 for Setup, 13 for Countdown), a pattern he validated across equity, fixed-income, commodity, and currency markets. The indicator found significant institutional adoption, with Bloomberg terminals providing native DeMark indicators and firms like Tudor Investment Corporation licensing the methodology. The compare period (typically 4 bars) determines the lookback for the close comparison: each Setup bar requires close above/below close[4], creating a structural requirement that the trend has been sustained for at least 4 additional bars beyond the count itself. The Countdown phase adds a higher bar: the close must exceed the high or low of 2 bars ago, a condition that doesn't occur on every bar, making the Countdown non-consecutive.
## Architecture & Physics
### Two-Phase State Machine
**Phase 1: Setup ($\pm 1$ to $\pm 9$)**
The Setup counter compares the current close to the close `comparePeriod` bars ago. If close > close[comparePeriod], the sell setup count increments (positive); if close < close[comparePeriod], the buy setup count decrements (negative). The count resets to zero when the condition breaks or reverses direction. Counts are clamped to $\pm 9$.
When the count reaches exactly $\pm 9$ for the first time (without having been reset), the setup is "complete" and Phase 2 begins. The setupComplete flag prevents re-triggering until a reset occurs.
**Phase 2: Countdown ($\pm 1$ to $\pm 13$)**
After a completed 9-count Setup, the Countdown phase begins. Unlike Setup, Countdown is non-consecutive: a sell countdown bar requires close > high[2]; a buy countdown bar requires close < low[2]. Only qualifying bars increment the countdown. The count progresses toward $\pm 13$, at which point the countdown completes and the directional signal resets.
An opposite 9-count Setup during an active Countdown resets and restarts the Countdown in the new direction.
### Zero-Buffer Design
The entire indicator state consists of four scalar variables: `setupCount`, `countdownCount`, `countdownDir`, and `setupComplete`. No circular buffers, arrays, or sliding windows are needed. The only historical lookback dependency is PineScript's `close[comparePeriod]`, `low[2]`, and `high[2]`.
## Mathematical Foundation
**Setup counting** (comparePeriod = $p$):
$$S_t = \begin{cases} S_{t-1} - 1 & \text{if } C_t < C_{t-p} \text{ and } S_{t-1} \leq 0 \\ -1 & \text{if } C_t < C_{t-p} \text{ and } S_{t-1} > 0 \\ S_{t-1} + 1 & \text{if } C_t > C_{t-p} \text{ and } S_{t-1} \geq 0 \\ +1 & \text{if } C_t > C_{t-p} \text{ and } S_{t-1} < 0 \\ 0 & \text{if } C_t = C_{t-p} \end{cases}$$
$$S_t = \text{clamp}(S_t, -9, +9)$$
**Setup completion trigger:**
$$\text{if } |S_t| = 9 \text{ and not previously complete} \Rightarrow \text{begin Countdown, dir} = \text{sign}(S_t)$$
**Countdown** (non-consecutive):
$$CD_t = \begin{cases} CD_{t-1} - 1 & \text{if dir} = -1 \text{ and } C_t < L_{t-2} \\ CD_{t-1} + 1 & \text{if dir} = +1 \text{ and } C_t > H_{t-2} \\ CD_{t-1} & \text{otherwise (no qualifying bar)} \end{cases}$$
**Countdown completion:**
$$\text{if } |CD_t| \geq 13 \Rightarrow CD_t = \text{sign}(dir) \times 13, \text{ reset dir}$$
**Countdown reset on opposite Setup:**
$$\text{if dir} = +1 \text{ and } S_t = -9, \text{ or dir} = -1 \text{ and } S_t = +9 \Rightarrow \text{reset CD, new dir}$$
**Default parameters:** comparePeriod = 4.
## Performance Profile
### Operation Count (Streaming Mode)
TD Sequential counts sequential close comparisons (Setup: 9 bars; Countdown: 13 bars). Pure comparison arithmetic, no floating-point math.
| Operation | Count | Cost (cycles) | Subtotal |
| :--- | :---: | :---: | :---: |
| CMP (close[0] > close[4]) setup count | 1 | 1 | 1 |
| CMP (close[2] ≤ close[0]) countdown | 1 | 1 | 1 |
| Counter increment/reset | 2 | 1 | 2 |
| RingBuffer reads × 2 (lag 2 and lag 4) | 2 | 1 | 2 |
| State encode (setup bar, countdown bar) | 2 | 1 | 2 |
| **Total** | **8** | — | **~8 cycles** |
The cheapest oscillator in the library: purely integer comparisons and counters. ~8 cycles per bar.
### Batch Mode (SIMD Analysis)
| Operation | Vectorizable? | Notes |
| :--- | :---: | :--- |
| Lag-4 comparison (Setup) | Yes | VCMPPD on offset arrays |
| Lag-2 comparison (Countdown) | Yes | VCMPPD on offset arrays |
| Sequential counter | **No** | State-dependent — each bar depends on prior count |
The counter state is inherently sequential. The individual comparisons are vectorizable in a pre-pass, but the sequential counting dependency prevents full SIMD acceleration.
### Quality Metrics
| Metric | Score | Notes |
| :--- | :---: | :--- |
| **Accuracy** | 10/10 | Exact binary comparisons; no floating-point |
| **Timeliness** | 9/10 | 9-bar setup window is short; immediate signal |
| **Smoothness** | 3/10 | Discrete count output jumps at signal events |
| **Noise Rejection** | 5/10 | Sequential counting requires exact pattern; no noise tolerance |
## Resources
- DeMark, T.R. (1994). *The New Science of Technical Analysis*. Wiley
- DeMark, T.R. (1997). *New Market Timing Techniques*. Wiley
- Bloomberg Terminal: DeMark Indicators (DMRK) implementation reference
- PineScript reference: [`td_seq.pine`](td_seq.pine)