Warrior_EA/docs/Wyckoff/AD_Wyckoff_Indicators_Reference.md

898 lines
69 KiB
Markdown

# AD Wyckoff Indicators — Reference
## Overview
This document describes Richard Wyckoff's market cycle methodology as detailed in *"La Méthodologie Wyckoff en Profondeur"* (2019) and *"Wyckoff 2.0: Structures, Volume Profile et Order Flow"* (2021) by Rubén Villahermosa.
Wyckoff's approach is based on observing price/volume relationships to determine **who is in control** of the market — large institutional traders (Composite Operators) or the general public.
## Implementation Status (SQX/MT5)
As of 2026-09-10 (evening) the three indicators are at **ADWyckoffEventStream
v5.2**, **ADWyckoffFailedStructure v2.0** and **ADWyckoffSignificantBarInversion
v2.0**. EventStream moved twice more the same day, in a same-day re-audit of the
v5.0 rewrite below: see "v5.1 / v5.2" further down for what changed and why.
v5.0 is the answer to an audit that put every event side by side with what the
two Villahermosa books actually define. The audit's verdict on v4.0 was that the
architecture was right — climax, anchored range, events tested against frozen
levels — but that most of the individual rules were approximations with an
invented threshold where the book supplies an ordinal comparison, and that three
of them contradicted the book outright.
### What changed in v5.0 / v2.0
Each entry is a defect the audit named, and what it now does instead.
| Defect | v4.0 / v1.0 | Now |
| --- | --- | --- |
| LPS emitted only after the SOS | gated behind `gRHasSOS`, so buffer 6 was really the back-up and the book's pre-SOS entry never existed | LPS is the higher low **before** the SOS (p147 context); the back-up is its own event `±9` |
| Spring and UTAD shared one flag | a range that printed an upthrust could never print a spring | separate shake state per range, and the **test of the shake** is a first-class event `±8` (p135) |
| "ATR" was not a true range | mean high−low, so gaps were invisible and every tolerance was understated at an index open | Wilder true range |
| Volume baseline included the current bar | shrank the ratio on exactly the climactic bars the rules hunt for | baseline is the **preceding** window only |
| The newest bar repainted once | the guard was on `rates_total`, so the just-opened bar was stepped then frozen | only closed bars advance the state machine |
| Phases were an event counter | `SC=1, AR=2, ST=3, Spring=4, SOS=5`; the duration rule was never checked | the book's **A–E** (p169), and Phase B must outlast Phase A before a shake can open C, and outlast Phase C before an SOS can confirm |
| Climax was a ratio | volume ≥ 2.5× and range ≥ 1.8× the 50-bar mean | a **rank**: the widest true range and the heaviest volume of the move so far, the move being measured from the last confirmed pivot |
| Test validity was a ratio | volume ≤ 0.6× the mean | the book's only hard volume rule (p118): volume below **each** of the two preceding bars, on a narrowing range |
| AR was a fixed ATR multiple | progress ≥ 1.0 "ATR" | measured against the mean of the recent same-direction legs (p100); twice that mean sets `ARStrength` |
| SOS was a bar shape | close above Creek + 0.5 ATR on range ≥ 1.2× and volume ≥ 1.5× | the book's significant bar (pp191-192, W2.0 p241) **plus** the p147 conditions: reached the range midpoint, no pullback below the shake low |
| Spring grades absent | one undifferentiated spring | three grades by penetration and volume (pp130-132); only **grade 3** may be entered directly, grades 1–2 must wait for the test |
| Creek ignored Phase B | frozen at the AR extreme | AR extreme **plus the Phase B extremes** (p26, p29); it widens only while Phase B runs, and never tracks a rolling window |
| Range character was midpoint drift | the slope buffers were read as character | book item 14 as its own output: falling volume with up bars wider than down bars is accumulation, the mirror is distribution. The slope buffers remain, as **context** |
| FailedStructure was not what the docs said | described as spring/upthrust/SOS failure | documented as what it is: W2.0 §1.4 failed breakout and §1.5 structural failure, with §1.5's invented tolerance band removed |
| Both FailedStructure flags on one bar | plateau pivots satisfied both and the signed `Value` netted to zero | mutually exclusive |
| SBI's level was weak | "prior resistance" fell back to the previous bar's high, so the first breaks in any history were free | falls back to the lookback window extreme. The p194 flip rule itself is unchanged — it was already faithful |
**Parameter count as of v5.0: 34 → 10 across the three indicators.** The book
states most of its rules as comparisons, so they need no number. What survived
in v5.0 was `LookbackPeriod` and `ZigZagStrength` (structure), `ARLegs` (p100),
`SpringPenetration` and `SpringVolume` (the two numbers pp130-132 sanctions and
pp157-159 says to settle by backtest), `BoundaryTolerance`, and `MaxRangeBars`
(housekeeping). The context-mode / session-type / session-count block is gone
from all three: it gated nothing at its defaults, and the climax window is now
structural rather than a bar count. v5.2 removes `SpringPenetration` and
`SpringVolume` too (see below) — EventStream now runs 5 functional inputs.
**This invalidates every previously measured Wyckoff result.** Every threshold
moved, so event counts, densities and any downstream study built on the v4
buffers have to be re-run. That is the intended consequence of the corrections.
### v5.1 / v5.2 — same-day re-audit of the v5.0 rewrite
A second, independent read of the v5.0 EventStream state machine (2026-09-10,
after the table above shipped) found five defects the rewrite itself
introduced, plus two consequences, fixed as **v5.1**; a follow-up pass then
replaced the two rules v5.1 still only approximated with the book's own
comparisons, fixed as **v5.2**. FailedStructure and SignificantBarInversion
were re-read too and came through clean (SBI's "prior resistance" weakness
above is the one open item, already listed).
| # | v5.0 did | Book says | v5.1 / v5.2 does |
| --- | --- | --- | --- |
| 1 (v5.1) | The Creek was widened by the bar under test **before** the breakout test read it, so a close could never exceed its own high — no range could resolve without a shake freezing the boundary first | Creek = AR high + Phase B highs (p26/29); SOS = close beyond it | Boundary read as it stood before the bar; Phase B widens it afterwards, never on the breakout bar, never after the SOS |
| 2 (v5.1) | A spring needed a full true-ATR penetration of the Ice | The grade-3 spring is a *slight* penetration (p130) | Any close-back-inside penetration opens the shake once Phase B has outlasted Phase A |
| 3 (v5.1→v5.2) | Grades compared depth with half the range height and volume with the climax bar (the volume maximum of the move) — nothing was ever heavy | Three grades, settle the numbers by backtest (pp157-159) | v5.2: no numbers at all — grade 3 is 1-candle on volume below **and** range narrower than the two preceding bars (p118-style), grade 2 is any other 1-candle, grade 1 is the 2+ candle terminal shakeout (pp124-125), tracked as a pending state until it recovers |
| 4 (v5.1) | A valid test demanded volume **and** range both below the two preceding bars | The only hard rule is the volume half (p118) | `validTest` = the volume rule alone |
| 5 (v5.1) | A climax needed no minimum move and admitted an unknown trend, so reaccumulation/redistribution could never fire | A climax ends a move (p122); a range that forms with the trend is reaccumulation/redistribution (p171) | The move must reach the mean of the recent same-direction legs (p100); trend no longer gates the climax, only classifies the range |
| 6 (v5.1) | Phase E never printed — the range closed on the back-up bar | Phase E is the trend after the back-up (p169) | Range stays open in Phase E while price holds the Creek |
| 7 (v5.1) | Phase A was counted from the climax bar | The schematic runs A from the PS | A same-direction PS within the lookback window before the climax starts the clock |
| 8 (v5.2) | Only the rank-bar climax was modelled | The book gives four forms (p90, pp94-99): the rank bar, several narrow bars on high volume, one bar with a long tail, and exhaustion known only by its reaction | All four: form 2 is a cluster of `ZigZagStrength` narrow high-volume bars under one true ATR with a new-extreme low/high; form 3 is a bar whose lower/upper wick exceeds half its range on above-average volume; form 4 opens the range on the low/high bar of a decline-then-rally-then-stall and confirms the AR on the recognising bar |
Measured on SP500 H1 back to 2008 (55,204 bars): v5.2 emits 2,969 events, 373
resolved ranges, spring grades 37/49/3 — verified bar-for-bar against the
compiled indicator's own exported buffers, not just a simulator. `SpringGrade`
3 (the only grade the book enters directly) is now rare rather than universal.
`InpSpringPenetration`/`InpSpringVolume` (MT5) and the matching Java
`@Parameter` fields, everywhere they were forwarded by a Wyckoff wrapper
condition block, are removed.
### v2.1 / v5.7 — four proposed refinements, measured (2026-09-30)
Four refinements were proposed and each was implemented as an **opt-in input whose default reproduces the
previous build bit-for-bit**, then measured on real MT5 output before deciding what becomes default. The full
method, numbers and verdicts are in [WYCKOFF_V21_EVALUATION.md](Wyckoff/WYCKOFF_V21_EVALUATION.md). Appended
inputs (positional order matters to `iCustom` and to the SQX Indicator Tester, so they go last):
| Indicator | New input | Default | What it does |
| --- | --- | --- | --- |
| `ADWyckoffEventStream` v5.7 | `SpikeATR`, `SpikeScope` | 0, 0 (off) | a bar with true range > `SpikeATR` true ATRs may not stretch a forming range's provisional extreme or widen the Phase B boundary; scope 1 also bars it from opening a range as a climax |
| `ADWyckoffSignificantBarInversion` v2.1 | `TodMode`, `TodDays` | 0, 20 (off) | 1 = the ordinal volume test runs on relative volume (bar / mean of the same minute-of-day over `TodDays` sessions); 2 = raw ordinal test AND relative volume > 1 |
| `ADWyckoffFailedStructure` v2.1 | `LocationATR` | 0 (off) | report a failure only within that many true ATRs of the window's volume-profile POC / VAH / VAL or its VWAP |
| `ADShorteningOfThrust` v2.1 | `ConfirmMode` | 0 (wick) | 1 = a swing reverses only when the bar **closes** the swing threshold away from the extreme |
Not an input: `ADShorteningOfThrust.mq5` now evaluates **closed bars only** (the forming bar publishes 0) and
replays once per new bar instead of once per tick. The SQX Java block already only sees closed bars, so nothing
changes there.
### Reading the chart (MT5)
The MQ5 indicators now draw what they see, labelled the way the book's own
schematic labels it:
- **Phase bands A–E** behind the bars, captioned, one band per contiguous phase.
- **Creek and Ice** drawn and named, with what built each one — "CREEK · AR high
+ Phase B highs", "ICE · SC low" — plus the **midpoint**, because an SOS must
reach it (p147) and an ST above it reads as buyers (p110).
- **Event labels** using the book's names: PS, SC, AR, ST, Spring, Test, LPS,
SOS, BU.
- A **state panel**: direction, phase letter, range character, the shake's grade
and whether it has been tested, and the last event.
`ADWyckoffSignificantBarInversion` and `ADWyckoffFailedStructure` live in a
separate pane but mark the **price** chart: significant bars, control flips, the
failed swing and the rejected breakout. Every drawing switch is display-only and
is forced off in generated strategies.
### v4.0, for the record
### What changed in v4.0 (both platforms)
v3.2 recomputed, for every bar, "the highest-priority Wyckoff event anywhere in the
trailing lookback", and emitted the rolling window's high/low as the zone. Three
consequences, all measured on SP500 H1 (2989 bars):
- **Zones were a Donchian channel.** `ZoneTop`/`ZoneBottom` were the lookback
extremes and were mathematically independent of every threshold parameter except
`Lookback` — sweeping `VolClimax` over 1.5..4.0 and `RangeClimax` over 1.2..3.0
left the mean zone width unchanged at 145.67 points. Parameter tuning could not
move the zone output at all.
- **Spring fired without a range.** The support reference fell back to the running
pivot low when no SC/ST existed, so any bar undercutting a recent minor low and
closing up qualified. 717 Springs were emitted, 32% of them immediately after a
>1 ATR *upward* move.
- **Accumulation/distribution were invisible.** The fixed priority cascade let SOS
(804 bars) overwrite SC (26 bars) whenever both fell in the same window, and 87%
of all bars carried a label — up to 10 within any 10-bar span.
v4.0 anchors a range at its climax (SC/BC) and its automatic reaction (AR/ARB), then
holds those boundaries for the life of the range and tests every later event
(ST, Spring/UTAD, SOS/SOW, LPS/LPSY) against them. On the same data: 4 anchored
ranges, 24 events total (0.8% of bars), 1 Spring — preceded by a 2.21 ATR *down*
move, not an up-impulse — and at most 2 labels per 10-bar span. Range count and
width now respond monotonically to `VolClimax` and `RangeClimax`: at 1.5/1.2 the
sweep yields 17 ranges of 54.3 mean width, at 2.5/1.8 it yields 4 of 73.9, at
3.5/2.5 it yields 2 of 88.3.
Verification: the MQ5 and Java implementations were driven over the same SP500 H1
file and produce a byte-identical event stream (24 events, same bar indices).
All price tolerances are ATR multiples, so the indicator is instrument-agnostic.
v3.2 had hardcoded absolute offsets (`0.0001`, `0.0003`, `0.001`) that were
FX-pip-scaled and effectively zero on indices, metals, and crypto.
### Sloped-structure outputs are self-contained (changed 2026-08-02)
`SlopeAccumulation*` / `SlopeDistribution*` originally compared a range's midpoint
to the **previous range's** midpoint. That made the value depend on unbounded prior
history: the same bar produced a different result depending on how many bars the
platform had loaded. It surfaced as the only parity failure between MT5 and SQX —
196 bars across the first range in the export window, because MT5's chart carried
history before the window and SQX's did not.
They now measure the range's **own** drift: the running mean of `(high+low)/2` over
the bars belonging to the range, against the range's anchored midpoint, with a
deadband of `WYC_SLOPE_DEADBAND` (5% of range height) so the sign does not flap.
Every input is a bar of that same range, so the output is identical regardless of
data-window start. Verified by running the block over the full series and over
windows truncated by 200/500/900 bars — all four slope outputs identical on every
shared bar, including ranges that have predecessors in one run and none in the other.
Note this changes what the outputs mean: previously "this structure sits higher than
the last one" (a staircase reading), now "this structure tilts up/down internally"
(the textbook sloped-range reading). Retrain any model consuming them.
### Warmup is derived, never a hardcoded bar count
v3.2 gated on `bar < LookbackPeriod + 5` and `trend()` on `bar < 10`. Both are gone.
Warmup is now `max(LookbackPeriod, 2*ZigZagStrength + 1)` — the point at which the
normalisation window is full and a confirmed pivot can exist — and `trend()` relies
solely on its pivot-cache guards. Before warmup every output emits 0; callers are
never expected to skip bars. At default settings this shifts warmup from 55 to 50 bars.
### Exposed SQX outputs
- `ADWyckoffEventStream.EventCode`
- `ADWyckoffEventStream.EventPhase`
- `ADWyckoffEventStream.ZoneTop`
- `ADWyckoffEventStream.ZoneBottom`
- `ADWyckoffEventStream.EventPrice`
Notes:
- `EventCode` and `EventPhase` are no longer identical. In v3.2 `EventPhase` duplicated
`EventCode` and was a dead input; in v4.0 `EventCode` is the discrete event on the bar
it occurs (`-7..+7`, sparse) and `EventPhase` is the persistent signed phase (`-5..+5`)
held across the range.
- Tester-facing output list is dotted-output only (no standalone non-dotted main entry).
### New v4.0 parameters (both platforms)
- `TouchATRMultiplier` (0.5) — tolerance for treating a bar as revisiting a boundary
- `ARMinATRMultiplier` (1.0) — minimum rally off the climax before AR anchors the range
- `MaxRangeBars` (200) — hard age cap on a range
These three are threaded through all 41 derived condition blocks, so the generated
`Strategy.Indicators.ADWyckoffEventStream(...)` factory now takes 15 arguments. Any
external caller written against the old 12-argument signature must be updated.
### Condition blocks realigned to the new output semantics
v4.0 made `EventCode` sparse (0.8% of bars vs 87% in v3.2). Blocks that ask "are we
*currently inside* a range" were reading `EventCode`/`StructuralPhase` and only worked
in v3.2 by accident — the window rescan made those outputs behave like a persistent
state. They now read `EventPhase`, which is the real persistent state:
| Block | v3.2 read | v4.0 reads |
|---|---|---|
| `ADWyckoffInAccumulation` / `InDistribution` | `Value` (=EventCode) | `EventPhase` |
| `ADWyckoffEnteringAccumulation` / `EnteringDistribution` | `Value` edge | `EventPhase` edge |
| `ADWyckoffPhaseAtLeast` / `AtMost` / `Equals` | `StructuralPhase` | `EventPhase` |
On SP500 H1 this puts `InAccumulation` true on 277 bars and `InDistribution` on 41
(318 of 2989 bars inside a confirmed range). Left on `EventCode` they would have been
true on roughly 17 bars total.
Blocks that test for a *discrete event* (`ADWyckoffIsSpring`, `IsSellingClimax`,
`IsSignOfStrength`, `LastEventEquals`, `EventInLastNBars`, …) correctly read
`EventCode` and are unchanged — they get strictly more accurate under v4.0.
`IsReaccumulation` / `IsRedistribution` read the `Reaccumulation` / `Redistribution`
buffers, which v4.0 already sets on every bar of an anchored range, so they are
unchanged too.
### v4.1 — Reaccumulation / Redistribution are context, not outcome
v4.0's flags were identically `0` on every instrument (40,000 H1 bars on five
symbols, 41-candidate parameter sweep): they required a range's own direction to
agree with `Trend()` at its climax bar, but an SC only opens when that trend is
`<= 0` and a BC only when it is `>= 0`, so the test was unreachable by construction.
Villahermosa defines the two by the move the range **stopped** crossed with the way
it **resolves** (Methodology in Depth ch. 11 figure: PSY/BC/AR/ST then SOS;
ch. 13 figure: PS/SC/AR/ST then SOW). That is not knowable at the climax bar —
ch. 11: reaccumulation and distribution "are initiated in the same way" — and in
this state machine those two outcomes are exactly the silent "failed distribution"
/ "failed accumulation" close branches. Allowing a range to resolve the "wrong"
way is a v5 design item (it changes `EventCode` and `CHoCH` and breaks the parity
fixtures); it is **not** what v4.1 does.
v4.1 emits what the book says to read a forming range against (pp. 187-188, 197,
200): the trend released by the last confirmed breakout, in force until a
confirmed opposite structure ends it.
- `Reaccumulation` = `1` on every bar of an anchored range that opened while the
last confirmed breakout was an SOS (markup context).
- `Redistribution` = `1` on every bar of an anchored range that opened while the
last confirmed breakout was an SOW (markdown context).
- Independent of the climax that opened the range. A BC-opened range in a markup
reads `EventPhase < 0` **and** `Reaccumulation = 1` — the book's
"reaccumulation or distribution" ambiguity, left for the strategy to weigh.
- Frozen at open; a range's own breakout updates the context for the *next* range.
- Both stay `0` until the first confirmed SOS/SOW of the loaded history.
### MT5 buffer mapping (ADWyckoffEventStream.mq5 v5.6)
Buffers `0`–`13` keep their v4.0 meaning and index, so an existing consumer that
reads by index still reads the same output. `14`–`17` arrived with v5.0, `18`–`25`
with v5.3 and `26`–`28` with v5.6. Every addition is appended, never inserted.
| # | Output | Meaning |
| --- | --- | --- |
| 0 | `EventCode` | discrete event, sparse (`0` on most bars) |
| 1 | `EventPhase` | persistent signed phase, `±1..±5` = A..E |
| 2 | `ZoneTop` | the Creek (`0` when no confirmed range) |
| 3 | `ZoneBottom` | the Ice (`0` when no confirmed range) |
| 4 | `EventPrice` | close on an event bar, `0` otherwise |
| 5 | `StructuralPhase` | event-derived phase, sparse |
| 6 | `CHoCHTrendToRange` | `±1` on the bar a range opens |
| 7 | `CHoCHRangeToTrend` | `±1` on the bar the structure breaks |
| 8–11 | `Slope*` | the range's internal drift — context, not character |
| 12 | `Reaccumulation` | accumulation range formed inside an uptrend |
| 13 | `Redistribution` | distribution range formed inside a downtrend |
| 14 | `SpringGrade` | `±1..±3` on the shake bar; **3 = the only grade the book enters directly** |
| 15 | `RangeCharacter` | `+1` accumulation / `−1` distribution (book item 14) |
| 16 | `TestPlacement` | `+1` test in the upper half (buyers), `−1` below the climax (sellers) |
| 17 | `ARStrength` | `1` when the AR reached twice the recent legs (p100) |
| 18 | `Creek` | the held range top — outlives the range, unlike `ZoneTop` |
| 19 | `Ice` | the held range bottom |
| 20 | `RangeMid` | halfway between them (p110/p147 use the midpoint as a test) |
| 21 | `StopLong` | `Ice` less `BoundaryTolerance` true-ATRs; `StopShort` mirrors above the Creek |
| 22 | `StopShort` | |
| 23 | `TargetLong` | `Creek` plus the range HEIGHT — the vertical projection |
| 24 | `TargetShort` | `Ice` less the range height |
| 25 | `EventLevel` | the held `EventPrice`, so a shakeout stop can be set after the shake bar |
| 26 | `PFCount` | columns of the congestion's figure chart spanning the count line — **the cause, as a number** |
| 27 | `TargetLongPF` | count line `+ PFCount × box` — the HORIZONTAL count objective |
| 28 | `TargetShortPF` | count line `− PFCount × box` |
**Event codes.** `±1` PS/PSY, `±2` SC/BC, `±3` AR, `±4` ST, `±5` Spring/UTAD,
`±6` LPS/LPSY, `±7` SOS/SOW, and new in v5.0: `±8` test of the shake, `±9`
back-up / back-down. Positive is the accumulation side.
**The two objectives (v5.6).** `TargetLong`/`TargetShort` project the range HEIGHT from the
boundary that broke. That reading is duration-blind: a 12-bar range and a 180-bar range of the
same height project the same objective, and the Law of Cause and Effect says they should not.
`TargetLongPF`/`TargetShortPF` are the book's own measure — the horizontal count, taken on a
point-and-figure chart of the congestion:
* **Box** = `0.25 ×` the congestion's own mean true range. Its own, not `AT[]`: the smoothed ATR
reaches outside the range, and the count must describe this cause and no other.
* **Grid** anchored on the `Ice`, so a box boundary always falls on the range floor and a spring
below it simply lands in a negative box — both directions snap the same way.
* **Reversal** = 1 box, the most complete column representation of the same bars.
* **Count line** = the close of the last Phase C/D event before the break — the shake, then its
test, then the LPS/LPSY, each overwriting the one before. That is what "the LAST point of
support" means. Before that event there is no count line and all three outputs are `0`.
* **Window** ends at the bar BEFORE the resolution: once the significant bar breaks out the cause
is complete, and the markup's own columns belong to the effect.
Box size and reversal are chart-construction constants (`WYC_PF_BOX_ATR`, `WYC_PF_REVERSAL`), not
inputs. The book gives an ordinal comparison for every detection rule and none for how coarse a
figure chart should be, and making them parameters would force all sixty wrapper blocks to carry
them for no gain.
**What it actually measures** — SP500 H1, 2025.09.07–2026.09.07, 5894 bars, a count live on 3163
of them:
| | p10 | median | p90 | max |
| --- | --- | --- | --- | --- |
| `PFCount` | — | 7 | — | 34 |
| PF objective ÷ range height | 0.12 | **0.32** | 0.72 | 1.14 |
The mechanism works — the objective tracks the count — but note the level: **on this instrument
and timeframe the horizontal count is systematically more conservative than the height
projection**, a median of about a third of it. The two readings disagree, and both are published
precisely so that disagreement is visible. Do not treat `TargetLongPF` as a drop-in for
`TargetLong`; which one is right is a question for a backtest, not for this document.
On the remaining 2731 bars there is no count line and all three outputs are `0` — the same
"`0` means nothing, not a price" contract the zone outputs carry.
Two invariants worth knowing, because both were violated by the first cut and caught only by
exporting real data:
* **Every AR bar has `PFCount == 0`.** A newly anchored range has not built its cause yet. The
held triple is dropped in `ConfirmAR`, and the step values are zeroed at the *top* of `StepBar`
so the several early-return paths (the climax branches, and the form-4 exhaustion path that
confirms the AR and returns `±3`) cannot leak the previous bar's count past that clear.
* **The count line sits inside the range it was measured in.** It can fall just outside the
anchored boundary — 79 bars do, all in one episode, by `0.027 ×` the range height — because a
Phase C test is constrained on its *high* against the boundary while the count line is its
*close*, and the boundary is an area of `BoundaryTolerance` true-ATRs, not a price. That is the
same boundary-as-area rule (p26) the rest of the indicator uses.
Read `PFCount` on its own as a filter — "only take the break when the cause is big enough" — which
is the part of this that does not depend on trusting the projection at all.
`ZoneTop` and `ZoneBottom` are `0` when there is no anchored range — **`0` means
"nothing", not a price**. Any consumer must treat it as empty; feeding it into a
numeric vector unguarded is how a −580 once reached a network input.
All three indicators evaluate on closed bars only. The forming bar is loaded for
context but never stepped, and none of them advances its state machine twice for
the same bar, so shift 0 no longer repaints once per bar. Read shift ≥ 1 if you
want the value a completed bar produced.
Note on tick size: the three degenerate-case guards in v4.0 (zero-range bar, zero-range
window, zero-width range) use an absolute `WYC_EPS = 1e-10` rather than a platform tick
size. MT5 `_Point` and SQX `InstrumentInfo.tickSize` are not guaranteed to agree for a
given symbol, and using them here would risk a parity divergence for no behavioural
gain — these guards only prevent division by zero. `InstrumentInfo.pointValue` is a
money-per-point value, not a price increment, and is not the right member for this.
---
## Foundational Concepts (Book 1 — Parts 1–4)
### How Markets Move — The Wave Principle (Part 1, Ch.1)
Price does not move linearly between two points. It moves in **waves** — alternating impulses and corrections. Wyckoff's band of traders were the first to observe that price develops through waves of varying size and duration rather than equal time intervals.
**Key principle:** Waves are fractal. Small-scale waves compose intermediate-scale waves, which in turn compose large-scale waves. By studying the relationship between waves — their duration, speed, and amplitude — the trader can determine the nature of the trend and detect the balance shift between supply and demand before price confirms it.
Wave analysis provides a direct window into the relative strength of buyers and sellers. As a trend matures, the character of waves changes:
- **Healthy uptrend:** Impulsive up-waves lengthen and corrective down-waves shorten (demand accelerating, supply withdrawing).
- **Exhausted uptrend:** Impulsive up-waves shorten and corrective down-waves lengthen (demand decelerating, supply entering).
- The reverse applies to downtrends.
This wave behavior is the foundation for **Shortening of Thrust (SOT)** detection.
### The Price Cycle (Part 1, Ch.2)
The market alternates between only two types of price formations:
1. **Trends** — Directional movement (bullish or bearish)
2. **Ranges (Trading Ranges)** — Lateral consolidation where price oscillates within boundaries
These form a complete cycle:
```
Accumulation → Bullish Trend (Markup) → Distribution → Bearish Trend (Markdown)
↑ ↓
└────────── Re-accumulation / Redistribution (continuations) ──┘
```
**Accumulation:** Professional traders absorb all available supply at wholesale prices. Through repeated tests, they verify that no significant selling pressure remains. Once the "path of least resistance" is confirmed as upward, they initiate the markup — price rises easily because resistance (sellers) has been neutralized.
**Distribution:** The reverse process. Professionals distribute holdings to late-arriving retail buyers. Once they verify that demand is exhausted, the path of least resistance shifts downward, and markdown begins.
**Re-accumulation:** A pause during an uptrend where professionals absorb the stock that has migrated to weaker hands during the advance. The process is identical to accumulation but occurs mid-trend.
**Redistribution:** A pause during a downtrend where professionals continue distributing into bounces. The process is identical to distribution but occurs mid-trend.
### The Path of Least Resistance (Part 1, Ch.2)
The single most important concept in Wyckoff methodology: price always follows the path of least resistance. The market moves where the opposing side offers the least obstruction. All Wyckoff events — the Selling Climax, Secondary Tests, Springs, SOS/SOW breakouts — are mechanisms by which professionals **verify** which direction offers the least resistance before committing capital.
**Operational principle:** Do not trade against the trend defined by the last confirmed accumulation or distribution. If the market is in a post-accumulation uptrend, avoid shorting. If in a post-distribution downtrend, avoid buying. Knowing the cycle phase prevents trading against the dominant flow.
### Trends (Part 1, Ch.3)
A trend is the line of least resistance. It is composed of:
- **Impulses:** Waves in the direction of the trend
- **Reactions (Corrections):** Waves counter to the trend
Three trend types by duration: **long-term, medium-term, short-term.** These can evolve in different directions simultaneously — a short-term downtrend can exist within a medium-term uptrend within a long-term uptrend. This multi-timeframe nature creates conflicting signals.
**Trend identification:** An uptrend consists of a series of impulses to the upside and reactions to the downside where **highs and lows increase**. A downtrend consists of impulses to the downside and reactions to the upside where **highs and lows decrease**. A lateral trend exists when highs and lows fluctuate within a price range.
### Trading Ranges (Part 1, Ch.4)
Ranges are pauses between trends. They represent a redistribution of stock from one class of trader to another. The width and duration of the range determine the potential of the subsequent move (Law of Cause and Effect).
Types of ranges:
- **Accumulation range:** Forms after a downtrend; professionals accumulate. Price oscillates between support (where they buy) and resistance (where they stop buying, letting the price drift back down).
- **Distribution range:** Forms after an uptrend; professionals distribute. Price oscillates between resistance (where they sell) and support (where they stop selling, letting the price bounce).
- **Re-accumulation range:** Forms during an uptrend; a pause for further accumulation before continuation.
- **Redistribution range:** Forms during a downtrend; a pause for further distribution before continuation.
The distinction between a reversal range and a continuation range is critical: in a reversal, the preceding trend shows clear stopping action (Preliminary Stop + Climax). In a continuation, there is no Phase A — the price simply pauses mid-trend.
### Stock Control and Structure Duration (Part 4)
**Stock control:** The professional trader's objective is to acquire or distribute the full quantity of stock needed for their campaign. During this process, they must maintain control over price — preventing it from breaking out prematurely. The quality of stock control can be assessed by:
- **Declining volume** as the structure develops (absorption is nearing completion)
- **Tests at extremes** that fail to attract follow-through (the opposing side has withdrawn)
- **Creek and Ice** boundaries holding (professional traders are defending these levels)
**Structure duration:** The longer a structure develops, the more stock changes hands and the more exhausted the opposing side becomes, producing a more powerful subsequent trend. However, the trader cannot be certain whether a long duration means a large campaign or that professionals are struggling to complete it. Duration is an indicator of potential, not a guarantee.
---
## The Three Laws (Part 3, Ch.9–11)
### 1. Law of Supply & Demand
Price moves in the direction of the imbalance. When demand exceeds supply, price rises. When supply exceeds demand, price falls. Wyckoff events are expressions of these imbalances.
### 2. Law of Cause & Effect
The width and duration of an accumulation or distribution range (the *cause*) determines the extent of the subsequent markup or markdown move (the *effect*). A wider range with longer development produces a larger projected move. This is measured through Point & Figure count projections and structural range height.
Both measures are implemented, side by side: structural range height as `TargetLong`/`TargetShort`, and the Point & Figure horizontal count as `PFCount`/`TargetLongPF`/`TargetShortPF` (v5.6). Only the second one is sensitive to *duration* — see [MT5 buffer mapping](#mt5-buffer-mapping-adwyckoffeventstreammq5-v56) for the construction.
### 3. Law of Effort vs Result
Volume is the *effort* and price movement is the *result*. When volume and price move in harmony, the trend is healthy. When volume diverges from price (high volume with little price progress, or low volume with large price moves), exhaustion or reversal is imminent. This law can be assessed at multiple scales: within a single candle, in the subsequent displacement, across complete movements, by wave (Weis Wave), and when approaching key levels.
---
## The Accumulation Process (Part 4, Ch.12)
The accumulation process is the systematic absorption of supply by well-informed traders at progressively higher support levels within the range. Key characteristics:
- **Declining volume** throughout Phase B — professionals have acquired most of the available supply; fewer contracts remain to be absorbed.
- **Higher lows** during tests — each test of the support zone makes a slightly higher low, indicating that sellers are unable to push price as low as before.
- **Creek defense:** Professional traders place limit orders at the upper boundary (Creek) to keep the range contained and prevent premature breakout.
- **Final test before markup:** The Spring (if it occurs) is the professional's final opportunity to verify the path of resistance upwards is clear. After a successful Spring and test, the markup is ready.
## The Distribution Process (Part 4, Ch.13)
The distribution process is the systematic transfer of positions from professionals to late-arriving retail buyers. Key characteristics:
- **Declining volume** throughout Phase B — similar to accumulation, but for the opposite reason: professionals have placed most of their sell orders.
- **Lower highs** during tests — each test of the resistance zone makes a slightly lower high, indicating buyers are unable to push price as high as before.
- **Ice defense:** Professional traders defend the lower boundary (Ice) with buying pressure to prevent premature breakdown.
- **Final test before markdown:** The UTAD (if it occurs) is the professional's final opportunity to verify the path of resistance downwards is clear. After a successful UTAD and test, the markdown is ready.
---
## The 7 Wyckoff Events
### Event 1 — Preliminary Support / Preliminary Supply
| Aspect | Bullish (PS) | Bearish (PSY) |
|--------|-------------|---------------|
| **Book Chapter** | Ch.14 — Preliminary Support | Ch.14 — Preliminary Supply |
| **Description** | First sign of institutional buying after a downtrend | First sign of institutional selling after an uptrend |
| **Price** | Wide-range bar, closes upper half, makes new low | Wide-range bar, closes lower half, makes new high |
| **Volume** | Above average (mid-level) | Above average (mid-level) |
| **Meaning** | Smart money begins absorbing supply | Smart money begins distributing to buyers |
### Event 2 — Selling Climax / Buying Climax
| Aspect | Bullish (SC) | Bearish (BC) |
|--------|-------------|---------------|
| **Book Chapter** | Ch.15 — Selling Climax | Ch.15 — Buying Climax |
| **Description** | Panic selling exhausts itself | Euphoric buying exhausts itself |
| **Price** | Extremely wide range, new low, closes well off low | Extremely wide range, new high, closes well off high |
| **Volume** | Very high (multiple times average volume) | Very high (multiple times average volume) |
| **Meaning** | The last of the sellers have been flushed out | The last of the buyers have been filled |
The book distinguishes between an "exhaustion climax" (the genuine end of a move) and other climax events. The exhaustion climax is the most tradable form — it signals that the prior trend has fully exhausted itself, and a reversal is imminent.
### Event 3 — Automatic Rally / Automatic Reaction
| Aspect | Bullish (AR) | Bearish (AR) |
|--------|-------------|---------------|
| **Book Chapter** | Ch.16 — Automatic Rally | Ch.16 — Automatic Reaction |
| **Description** | Price bounces sharply after SC | Price drops sharply after BC |
| **Price** | Closes above prior bar's high | Closes below prior bar's low |
| **Volume** | At least moderate | At least moderate |
| **Meaning** | The path of least resistance begins to shift upward | The path of least resistance begins to shift lower |
The AR occurs because professional traders, who absorbed the supply at the SC lows, now stop buying aggressively. With selling pressure removed, price naturally rebounds. The AR establishes the initial range boundary for the subsequent structure.
### Event 4 — Secondary Test
| Aspect | Bullish (ST) | Bearish (ST) |
|--------|-------------|---------------|
| **Book Chapter** | Ch.17 — Secondary Test | Ch.17 — Secondary Test |
| **Description** | Price retests the SC low area | Price retests the BC high area |
| **Price** | Narrow range near low, holds above SC low | Narrow range near high, holds below BC high |
| **Volume** | Significantly lower than SC/BC (low volume) | Significantly lower than SC/BC (low volume) |
| **Meaning** | Supply has been absorbed; no new selling pressure | Demand has been absorbed; no new buying pressure |
The book distinguishes the Secondary Test (Phase A) from generic tests in Phases B, C, and after breakouts. The Secondary Test specifically retests the climax extreme (SC low or BC high). Generic tests re-test any extreme at any point in the structure. Tests at the upper extreme in Phase B denote underlying strength — professional traders probe for selling interest. Tests at the lower extreme denote underlying weakness.
### Event 5 — Spring / Upthrust (Shakeout)
| Aspect | Bullish (Spring) | Bearish (UTAD) |
|--------|-------------------|--------------------|
| **Book Chapter** | Ch.18 — Spring/Shakeout | Ch.18 — UpThrust After Distribution |
| **Description** | Price breaks below ST low then reverses back above | Price breaks above ST high then reverses back below |
| **Price** | Low < ST low, close > ST low with moderate volume | High > ST high, close < ST high with moderate volume |
| **Volume** | Moderate (shakeout traps sellers) | Moderate (shakeout traps buyers) |
| **Meaning** | Final liquidity grab before markup begins | Final liquidity grab before markdown begins |
The Spring performs a triple function for institutional traders: (1) it triggers stops of traders positioned long, (2) it induces uninformed traders to sell into the apparent breakdown, and (3) it allows professionals to profit from the move. A Spring does not occur in every accumulation — many structures begin trending without a shakeout. The book distinguishes between several Spring types: ordinary shakeout, terminal shakeout, and minor shakeout. UTAD (UpThrust After Distribution) is the bearish equivalent — it sweeps above the structure's upper boundary, traps breakout buyers, then reverses.
The book also identifies tests of the Spring and tests of the UTAD — confirming behaviors where price revisits the shakeout extreme on low volume, verifying that the opposite side has been neutralized.
### Event 6 — Sign of Strength / Sign of Weakness (Breakout)
| Aspect | Bullish (SOS) | Bearish (SOW) |
|--------|--------------|---------------|
| **Book Chapter** | Ch.19 — Sign of Strength | Ch.19 — Sign of Weakness |
| **Description** | Price breaks above the structure's upper boundary | Price breaks below the structure's lower boundary |
| **Price** | Breaks above highest high with momentum | Breaks below lowest low with momentum |
| **Volume** | High volume, wide spread | High volume, wide spread |
| **Meaning** | Accumulation complete; markup begins | Distribution complete; markdown begins |
A minor SOS (minor Sign of Strength) and SOS Bar are smaller-scale strength signatures that appear within the developing structure. Similarly, a minor SOW and SOW Bar denote smaller-scale weakness signatures. The breakout without volume is a special case: if price breaks structure with no volume, this can represent either genuine interest or a false breakout — the test after breakout resolves the ambiguity.
### Event 7 — Last Point of Support / BUEC / Last Point of Supply / BUES (Confirmation)
| Aspect | Bullish (LPS/BUEC) | Bearish (LPSY/BUES) |
|--------|-------------------|--------------------|
| **Book Chapter** | Ch.20 — Last Point of Support | Ch.20 — Last Point of Supply |
| **Description** | Pullback to the Creek (resistance-turned-support) after breakout | Bounce to the Creek (support-turned-resistance) after breakout |
| **Price** | Retests prior AR high / Creek area | Retests prior AR low / Creek area |
| **Volume** | Low volume (no selling interest) | Low volume (no buying interest) |
| **Meaning** | Last opportunity to join before full trend departure | Last opportunity to short before full trend departure |
---
## Change of Character (CHoCH)
The Change of Character (Ch.19) marks a critical transition between trend and consolidation phases. The book identifies two CHoCH moments in a complete cycle:
1. **First CHoCH — Trend → Range:** In accumulation, a downtrend shifts into sideways movement (Phase A). This is detected when Preliminary Support and Selling Climax events appear in sequence. In distribution, an uptrend flattens into a range marked by Preliminary Supply and Buying Climax.
2. **Second CHoCH — Range → Trend:** The SOS/SOW breakout that breaks the structure boundary signals the transition from consolidation back into a trending state.
---
## The 5 Phases (A-E)
The phases are described in Villahermosa's Part 6 chapters (Ch.21–25). The phases are always numbered and defined conservatively — a structure should not be classified until the events confirm its type.
| Phase | Name | Book Chapter | Description | Events | Trading Opportunity |
|-------|------|-------------|-------------|--------|-------------------|
| 0 | Unknown | — | No structure identified | None | Wait |
| 1 | A — Stop | Ch.21 | Previous trend stops; first signs of accumulation/distribution appear. The market transitions from trending to lateral. | PS, SC, BC, AR | Prepare to trade range; identify initial extremes |
| 2 | B — Build Cause | Ch.22 | Range develops; the cause is built. Secondary tests confirm absorption. Volume typically contracts throughout this phase. | ST | Identify range extremes; observe tests for bias signals |
| 3 | C — Test | Ch.23 | Spring or UTAD shakes out weak hands. The market probes the opposite side before committing to a direction. | Spring, UTAD | Entry on shakeout reversal; highest-conviction event |
| 4 | D — Trend within Range | Ch.24 | Price moves directionally within the structure toward the breakout edge. LPS/LPSY retests occur. | LPS, LPSY, SOS, SOW | LPS/BUEC retest entry; SOS/SOW breakout entry |
| 5 | E — Trend out of Range | Ch.25 | Price breaks out definitively and trends beyond the structure. The cause has produced its effect. | Confirmed SOS/SOW beyond structure | Trend continuation; re-accumulation/re-distribution entries |
---
## Wyckoff 2.0 — Advanced Concepts (Book 2)
### Shortening of Thrust (SOT) — Section 1.6
SOT is a direction-change pattern. Each new extreme covers a shorter distance than the previous one, indicating momentum loss:
- **Bullish SOT:** In a downtrend, each new low travels less distance than the prior low — supply is deteriorating.
- **Bearish SOT:** In an uptrend, each new high travels less distance than the prior high — demand is deteriorating.
Key rules:
- Minimum 3 impulses are required for validity. At 3–4 impulses, begin looking for the SOT pattern.
- If price advance shortens with **high volume** → Effort/Result divergence (effort unrewarded).
- If price advance shortens with **low volume** → exhaustion (one side is withdrawing from the market).
- If there are more than 4 pushes with persistent shortening, the trend may be too strong to trade against.
- Confirmation requires a strong impulsive move in the opposite direction with elevated volume.
**Context matters:** An SOT bullish signal after an Upthrust (where the bias is bearish) should be treated with extreme caution. The dominant shakeout event defines the directional bias.
#### Implementation — `ADShorteningOfThrust` v2.0 (MT5 and SQX)
v1 compared pivot-to-pivot leg *amplitude* of the last two same-direction legs with
no new-extreme requirement. That is not the book's quantity (the §1.6 figure and
pp. 41-42 measure "new highs but little movement between them"), and it had no trend
gate: after a correction's pivot was recorded it compared the last two corrections,
so a shallower pullback in an uptrend carried the same sign as supply exhaustion in
a downtrend. v2.0:
- **Thrust** = progress of each new extreme beyond the previous same-direction
extreme, `|P_k - P_{k+1}|`, on the run of same-direction pivots in which every
older pivot is less extreme than the one after it. Only a trend's own pushes make
new extremes, so the run is the trend gate; a lower high breaks the run.
- **Signal** needs `run >= MinImpulses` (clamped 3..6; three is the book's floor)
and the final thrust shorter than the previous one by `SOTThreshold`.
- **`SOTEffortRegime`** compares the *cumulative* (Weis wave) volume of the last
two pushes: `>= 1.1x` divergence (full weight), `<= 0.9x` exhaustion (half).
- **`SOTPushRegime`** is full weight only on *more than four* pushes with the
shortening persisting (previous thrust already shorter than the one before it);
half weight otherwise. The book's meaning is "too strong to fade".
- **`SOTConfirmation`** fires when the next opposite-direction leg covers `>= 85%`
of the final push's full leg with `>= 105%` of its volume.
- The value is held from the push's pivot confirmation until the next pivot is
recorded, as in v1.
Measured on SP500 H1 (3219 bars): `SOT` nonzero on 11.2% of bars, confirmation on
5.0%. The Java-style and MT5-style simulators in `scripts/` agree on every bar and
every output. The one divergence v1 carried (2026-02-20 09:00) came from the Java
side converting the swing distance to a percent of the pivot and back; the Java now
hands the distance to the shared ZigZag verbatim (`PIVOT_METHOD_ABSOLUTE` in
`ADWyckoffCommon`), which is what the MQ5 compares against.
### Structural Failure — Section 1.5
Structural failure detects when price abandons the established structural logic it had been following:
- **Strength (bullish failure):** Price has been making lower highs and lower lows. On the next leg down, it fails to reach the structure's lower boundary, reversing before getting there. Buyers are blocking the decline aggressively. This does not guarantee an immediate reversal — it may simply be a pause for re-accumulation before continuing lower.
- **Weakness (bearish failure):** Price has been making higher highs and higher lows. On the next leg up, it fails to reach the structure's upper boundary, reversing before getting there. Sellers are capping the advance aggressively.
The key insight is that price was expected to continue its previous structural logic (visiting the opposite extreme) but fails to do so. This is an additional trace for evaluating the balance of power, not a standalone trade signal. The LPS and LPSY events are themselves structural failures — price stops short of visiting the shakeout extreme and instead reverses toward breakout.
**Output mapping (`ADWyckoffFailedStructure`):** `BullishStructuralFailure` = strength (a swing higher-low that reverses up without reaching the established structure low); `BearishStructuralFailure` = weakness (a swing lower-high that reverses down without reaching the established structure high). The swing is a fractal pivot confirmed `ZigZagStrength` bars back, and "reaching" is gated by a reach band of `ATRMultiplier × ATR`. The signal fires on the bar where that pivot is confirmed (non-repainting).
### Failed Accumulation / Failed Distribution — Section 1.4
A structure that shows every characteristic of accumulation (declining volume during development, Spring, bullish SOS breakout) can still fail if, at the crucial moment (test after breakout / BUEC position), aggressive selling overwhelms buyers and rotates the market. The same applies in reverse for distribution.
The critical uncertainty:
- We do not know the intention of traders driving the current move. They may be short-term traders closing at the next liquidity zone, or long-term traders sustaining the move through full structure development.
- We do not know whether higher-capacity traders will intervene at the decisive test-after-breakout moment, potentially with an opposing long-term view.
The shock (Spring/UTAD) is the most decisive action in market operation. Its underlying logic is so powerful that bias always favors it. The last shock dictates the directional lean.
**Output mapping (`ADWyckoffFailedStructure`):** `FailedAccumulation` = a genuine bullish breakout of the structure top (a significant bar closing beyond the range + break buffer) that then fails at the retest — a later bar closes back below the broken boundary within `max(2×ZigZagStrength, 5)` bars — rotating the structure distributive (bearish outcome). `FailedDistribution` is the mirror: a bearish breakout of the structure bottom that rotates accumulative (bullish outcome). The signed `Value` buffer is positive for bullish outcomes (`BullishStructuralFailure`, `FailedDistribution`) and negative for bearish (`BearishStructuralFailure`, `FailedAccumulation`).
### Sloped Structures — Section 1.7.1
Not all Wyckoff structures are horizontal. Four sloped variants exist that reflect the underlying condition of the market:
| Structure | Slope | Condition |
|-----------|-------|-----------|
| Accumulation | Bullish slope | Strongest underlying strength — higher highs and higher lows during accumulation |
| Accumulation | Bearish slope | Underlying weakness during accumulation — lower highs and lower lows; often preceded by SOT |
| Distribution | Bearish slope | Strongest underlying weakness — lower highs and lower lows during distribution |
| Distribution | Bullish slope | Initial apparent strength that pivots bearish — rising highs converging with SOT, then UTAD breaks it |
The identification of sloped structures requires connecting the extremes of Phases A, B, and C with a channel that contains the majority of price action. Perfect touches are not required — use zones of a certain width rather than precise lines.
### Auction Market Theory & Volume Profile — Parts 4–5
The Auction Market Theory underpins all Wyckoff methodology. The market exists to facilitate trade between buyers and sellers. When price is within a range, buyers and sellers agree on value — this is **equilibrium** (market efficiency). When price trends, one side dominates — this is **disequilibrium** (market inefficiency).
A Wyckoff accumulation range is an equilibrium zone where professionals build positions. The breakout into markup represents disequilibrium. This maps directly to Auction Market Theory's balance/imbalance framework.
#### Volume Profile Components
- **POC (Point of Control):** Price level with the highest traded volume. Acts as a magnetic level — price is attracted to where the most contracts changed hands.
- **VAH/VAL (Value Area High/Low):** The upper and lower boundaries containing 70% of traded volume. The Value Area represents the equilibrium zone where both sides find price acceptable.
- **HVN (High Volume Node):** A price level with significantly above-average volume. Identified as an accumulation zone if price is above it, a distribution zone if price is below it.
- **LVN (Low Volume Node):** A price level with significantly below-average volume. Price moves quickly through these zones — excellent locations for quick entries as the breakout through an LVN has minimal resistance.
- **VPOC Migration:** In a healthy trend, the VPOC migrates in the trend direction across successive sessions. A VPOC that fails to migrate signals trend weakness — effort is not producing result.
- **Naked VPOC:** An old POC that has not been revisited. These are high-priority targets as the market seeks to fill these "unfinished business" levels.
#### Profile Types
- **Session Profile:** Based on a single trading session. Best for intraday traders.
- **Composite Profile:** Aggregates multiple sessions or a full structure. Best for swing/position traders identifying overall context.
- **Fixed (Anchored) Profile:** Anchored to a specific structure start/end. Best for Wyckoff structure traders — reveals volume nodes within the structure boundaries.
Completed profiles are more reliable than developing ones — a profile still forming can have its levels shift.
### Volume Profile Operational Principles — Section 5.8
Five principles for trading with Volume Profile, each with a Wyckoff-methodology analogue:
| Principle | Description | Wyckoff Equivalent |
|-----------|-------------|-------------------|
| **Range** | At value area extremes, favor reversals. Buy at VAL, sell at VAH. | Trade at range extremes — Spring near support, UTAD near resistance. |
| **Reversion** | After a shakeout absorbs one extreme, price visits the opposite extreme. 80% rule: once price re-enters the value area after a false break, probability favors visiting the far extreme. | After a Spring, price targets the upper range boundary (Phase D). After UTAD, targets the lower boundary. |
| **Continuation** | After a breakout from the value area, wait for the test of the broken extreme (VAH for bullish, VAL for bearish) to enter in the breakout direction. | LPS/BUEC entry after SOS breakout; LPSY/BUES entry after SOW breakdown. |
| **Failed Reversion** | If price breaks an extreme but fails to re-enter the value area, the breakout is authentic. Enter on the test of the broken boundary. | Genuine SOS/SOW breakout confirmed by price remaining outside the structure. |
| **HVN Bias** | The last High Volume Node determines the short-term directional bias. If price is above the last HVN → bullish bias (HVN = accumulation). If below → bearish bias (HVN = distribution). | Phase B tests above ST = accumulation bias. Tests below ST = distribution bias. |
These principles form a standalone trading framework for traders who do not explicitly use Wyckoff structures. For Wyckoff traders, they provide objective confirmation and additional entry precision.
### Order Flow Integration — Part 6
Order Flow analysis provides microscopic confirmation at the moment of entry. Villahermosa recommends using it **only at identified operational zones** — never in isolation. The two key behaviors:
#### Reversal Model: Absorption + Initiative
- **Absorption:** Large passive orders (limit orders) absorb aggressive market orders without moving price. High volume on a narrow range bar at a key level indicates absorption — a big player is accumulating/distributing.
- **Initiative:** After absorption, aggressive orders push price decisively in the intended direction. A wide-range bar with elevated volume leaving the absorption zone confirms initiative — the composite operator now wants price to move.
The absorption + initiative pattern is the Order Flow fingerprint of a Spring or UTAD. It confirms the SOS/SOW bar's intent at the trigger point.
#### Continuation Model: Control + Test
- **Control:** After the initial impulse, price latches to a new level where professionals maintain bid/ask dominance. Visible as imbalances favoring one side in the DOM (Depth of Market) or Footprint.
- **Test:** Price briefly revisits the control zone on low volume, then resumes. This is the Order Flow equivalent of LPS/LPSY.
If the initial entry trigger is missed, the continuation model provides a second-chance entry. The fractal nature of Order Flow means these patterns repeat at every scale — from tick charts to daily charts.
### Wyckoff 2.0 Integration Framework — Part 7
The complete Wyckoff 2.0 operational process integrates all three disciplines into a 4-step framework:
```
1. CONTEXT ANALYSIS → WHAT to trade (buy/sell bias)
2. ZONES & LEVELS → WHERE to enter (operational levels)
3. SCENARIO PLANNING → HOW price moves (continuous validation)
4. POSITION MANAGEMENT → EXECUTION (entry, SL, TP)
```
#### Step 1 — Context Analysis (What)
Determine the market regime: **Range or Trend**.
- **Range Context — At Extremes:** Favor reversals. Buy at support (Spring zone), sell at resistance (UTAD zone). Aligns with Volume Profile Range principle.
- **Range Context — Inside:** Only trade if the range is wide enough for adequate R:R. Align with HVN bias — be above accumulation, below distribution.
- **Trend Context — Interacting with Value Area:** After breakout, wait for the test of the broken boundary (Creek/Ice or VAH/VAL). Entry is the continuation test.
- **Trend Context — Far from Value Area:** Price has definitively left equilibrium. Wait for a corrective pullback to an operational level (session VAH/VAL, weekly VWAP, impulse VPOC). Enter in trend direction.
#### Step 2 — Zones & Levels (Where)
Three categories of operational levels, used depending on context:
| Context | Wyckoff Structure Levels | Volume Profile Zones | Volume Profile Levels |
|---------|--------------------------|---------------------|----------------------|
| Range extremes | Structure boundaries (Creek/Ice, Spring/UTAD zone) | Value Area extremes | VAH, VAL |
| Range inside | — | LVN (low resistance zones) | VWAP, VPOC |
| Trend near VA | Broken Creek/Ice (LVN zone) | Value Area extremes | VAH, VAL, range VPOC |
| Trend far from VA | Minor structure extremes | LVN, prior session VA | Session VWAP/VPOC, weekly VWAP, impulse VPOC |
**Confluence principle:** Preferred entry zones are where multiple operational levels coincide — for example, a broken Creek level that is also an LVN and near the VAH. Confluence strongly reinforces the scenario.
#### Step 3 — Scenario Planning (How)
Build a protocol of continuous validation using "If X, then Y" logic:
- **Primary scenario:** Dictated by the dominant context bias (the last shakeout)
- **Alternative scenario:** Always maintain the opposite-direction scenario in case the market invalidates the primary bias
- **Single-movement scenario:** Price is already positioned favorably — wait for one corrective move to the operational zone, then enter
- **Two-movement scenario:** Price is not yet in the operational zone — wait for price to first reach the zone (movement 1), then test it (movement 2)
Example: "If price breaks the Creek, I will wait for a test to look for buys. If instead the breakout fails, I will wait for a test in the opposite direction for a short."
#### Step 4 — Position Management (Execution)
- **Entry trigger:** Always a significant bar (SOS/SOW) or Order Flow absorption+initiative pattern at the identified operational zone.
- **Entry order type:** Stop orders above/below the trigger bar. A stop entry acts as a filter — only filled if price continues in the expected direction.
- **Stop Loss:** Structural level (Wyckoff) OR below/above the operational HVN (Volume Profile). The HVN represents the accumulation/distribution protecting the trade.
- **Take Profit:** Next HVN, VAH/VAL, prior-session VPOC, or structure-extreme projection. In a trend context, trail behind the last HVN — continuing to ride as long as each new HVN forms in favor.
- **Missed entry:** If price moves without you, use the Order Flow continuation model (control + test) for a secondary entry at the next test.
This framework reconciles the discretionary methodology with actionable, quantifiable rules suitable for automated strategy implementations.
---
## Trading Entry Mechanics (Ch.26–27)
### Risk/Reward Tradeoff per Phase
| Entry Phase | R:R Potential | Reliability | Best For |
|-------------|:---:|:---:|----------|
| Phase C (shakeout/test) | **Highest** | Lowest | Aggressive traders; earliest signals have largest potential move |
| Phase D (trend in range, breakout test) | Moderate | Moderate | Balanced approach; Wyckoff's preferred entry |
| Phase E (trend out of range) | **Lowest** | Highest | Conservative traders; safest but smallest remaining move |
> **Tradeoff principle:** The earlier you enter, the larger the potential move but the less developed the structure — and therefore the less reliable. Phase C entry into a Spring test offers the best R:R but requires confident pattern recognition.
### Significant Bar Concept (SOS Bar / SOW Bar)
The "significant bar" is the definitive signal of institutional presence. A bar qualifies as significant when it meets ALL of:
1. **Wider range** than preceding candles
2. **Higher volume** than preceding candles — proportional to the expanded range
3. **Close in the direction:** A bullish significant bar closes near the upper half of its range; a bearish significant bar closes near the lower half
4. **Structural break:** Close above a prior resistance (bullish) or below a prior support (bearish)
If a single candle doesn't clearly meet these criteria, two consecutive candles can be merged to form a composite significant bar.
The SOS Bar and SOW Bar are the most important instances of significant bars. They represent the moment institutional traders commit to moving price. The SOS Bar after a Spring + test is the definitive confirmation that professionals support the advance; the SOW Bar after UTAD + test confirms distribution.
### Movement Inversion (Market Control Change)
**Tracking Control:** The market is controlled by the side whose last significant bar dominates. Identify the last significant bar — price is assumed to continue in that direction.
**Control Flip — Bullish to Bearish:** A bearish significant bar closes **below the low** of the last bullish significant bar → sellers seize control.
**Control Flip — Bearish to Bullish:** A bullish significant bar closes **above the high** of the last bearish significant bar → buyers seize control.
This concept directly maps to Change of Character (CHoCH) — the closing of a counter-movement bar beyond the prior significant bar's extreme is the operational signal that the market structure has changed. This is especially useful for identifying:
- The end of the Automatic Rally (after Selling Climax)
- The end of the Automatic Reaction (after Buying Climax)
- Transition between each Wyckoff event within the range
### Position Management
- **Send all 3 orders simultaneously** at entry: Entry + Stop Loss + Take Profit. Never enter bare — emotional decision-making after being in a position is the #1 cause of oversized losses.
- **Risk per trade:** Maximum 1% of account equity. Position size = risk amount ÷ distance from entry to stop loss.
- **Minimum R:R:** Do not enter trades with negative risk/reward ratios. A trade with R < 1.5:1 is generally discouraged.
### Stop Loss Methodology
The book does not prescribe hard SL distances — it uses **structural levels**:
| Structure | Stop Loss Placement |
|-----------|-------------------|
| Accumulation / Re-accumulation | Below the Spring low, below Creek (broken resistance), below the SC low |
| Distribution / Redistribution | Above the UTAD high, above Ice (broken support), above the BC high |
| After LPS/BUEC entry | Below the LPS low (the test of the broken Creek) |
| After LPSY/BUES entry | Above the LPSY high (the test of the broken Ice) |
### Take Profit Methodology
The Wyckoff method does not use fixed TP targets. Profit-taking signals:
1. **Climax volume at an extreme:** High-volume, wide-range buying or selling at a structure extreme is a sufficient reason to close the position — the opposite side is actively entering.
2. **Phase A of a counter-structure:** When the first 4 events of a new Phase A appear (PS+SC+AR+ST or PSY+BC+AR+ST), the prior trend has stopped. Close and re-evaluate.
3. **Liquidity zones:** Prior swing highs/lows, SC minimums (in accumulation), AR extremes, BC highs (in distribution). These zones contain pending orders and act as price magnets.
4. **Volume Profile levels:** VPOC (Point of Control), VWAP (anchored or session), naked VPOCs (old POCs not yet retested). These volume-concentration levels attract price and serve as natural objectives.
5. **Dynamic adaptation:** If price generates a new, closer liquidity zone during the move, that new zone becomes the primary target — the objective moves with the market.
### Trading Checklist
1. Identify the structure (accumulation or distribution) and current phase
2. Identify the last shakeout (Spring or UTAD) — this defines the directional bias
3. Wait for the shakeout's test (low volume, narrow range, no new extreme)
4. Wait for a significant bar (SOS/SOW) confirming intent
5. Enter at the retest (LPS/LPSY) — the book's highest-conviction entry
6. Place SL at the structural level, TP at the next liquidity zone
7. Move SL to breakeven after 1 ATR in favor; trail behind structure as Phase E develops
---
## Wyckoff Strategy Workflow Narratives
### Accumulation → Markup
After a downtrend, smart money begins accumulating shares. The selling climax exhausts the remaining sellers, and a series of tests confirms supply has been absorbed. A Spring (shakeout) — if it occurs — grabs the last liquidity below the range before the markup begins. Not all accumulations feature a Spring; many move directly into markup.
Key price levels in an accumulation structure include: the level where the Secondary Test low marks the structure's lower extreme, the Automatic Rally high which identifies the first upper boundary, the Creek (resistance-turned-support after breakout), the Spring low (shakeout extreme used as initial stop reference), and the LPS pullback zone which offers the highest-conviction entry opportunity.
### Distribution → Markdown
After an uptrend, smart money distributes holdings to the public. The buying climax exhausts demand, and tests confirm no new buying interest. An Upthrust (UTAD) — if it occurs — sweeps out the last buyers above the range before the markdown begins.
Key price levels in a distribution structure include: the Secondary Test high marking the structure's upper extreme, the Automatic Reaction low identifying the first lower boundary, the Creek (support-turned-resistance after breakdown), the UTAD high (shakeout extreme used as initial stop reference), and the LPSY bounce zone offering the highest-conviction short entry.
### Re-accumulation / Redistribution Continuation
During an established trend, price pauses and develops a miniature accumulation (re-accumulation) or distribution (redistribution) structure. These represent a continuation of the trend rather than a reversal. The smaller structure within the larger trend offers high-probability entries with defined risk.
Re-accumulation follows a bullish trend — smart money absorbs the stock that has migrated to weaker hands during the prior advance. Redistribution follows a bearish trend — smart money continues distributing into bounces. The process is identical to accumulation/distribution; the only difference is that re-accumulation begins after a bullish move pauses, while accumulation begins after a bearish move stops. These continuation structures operate at a smaller scale within the parent trend.
---
## References
- Villahermosa, R. (2019). *La Méthodologie Wyckoff en Profondeur*. Independently published. ISBN: 9781713107033.
- Villahermosa, R. (2021). *Wyckoff 2.0: Structures, Volume Profile et Order Flow*. Independently published.