Elliott Wave counts are subjective. We ship the invalidation level instead.
Wave counting is irreducibly subjective: the ZigZag threshold determines the count, multiple valid counts coexist, and labels are provisional until hindsight. So our engine never emits one count. It emits ranked candidates with the price that breaks each one.
Elliott Wave has a problem that no amount of engineering removes, and pretending otherwise is how most software about it goes wrong.
The count is not derived from the data. It is chosen.
Change the ZigZag threshold — the minimum swing size that counts as a pivot — and you get a different wave count from the identical price series. Multiple counts can satisfy every rule simultaneously. And a label is provisional until hindsight confirms it, at which point it was never a forecast.
We built an Elliott engine anyway. Here is what we made it refuse to do.
What is actually falsifiable
Elliott's framework has three cardinal rules. Unlike most of the theory, they are hard predicates on the wave points — they either hold or they do not:
1. Wave 2 never retraces more than 100% of Wave 1. The end of Wave 2 stays past the start of Wave 1. 2. Wave 3 is never the shortest of waves 1, 3 and 5. 3. Wave 4 never overlaps Wave 1's price territory (in a non-diagonal structure).
That is the falsifiable core. Everything else — which degree you are counting, whether this is a correction inside a larger impulse, where the extension is — is interpretation.
So the engine enumerates instead of deciding
Our implementation is a ranked-candidate analyser, never a single-count oracle. Given a pivot sequence it:
- enumerates every candidate 5-wave impulse it can construct,
- hard-filters by the three cardinal rules, discarding anything that violates
- scores the survivors on Fibonacci proportion and alternation,
- and emits the top N counts, each with its invalidation level.
one,
That last output is the point. The invalidation level is the price at which this count is dead — and it is the one number in Elliott analysis that is robust, deterministic, and identical for anyone reading the same chart.
A wave count is an opinion. An invalidation level is a falsifiable statement.
The engine's advisory flag is always true and its confidence is capped by design. It is an input to discretion, never a standalone trigger. We could not have built it as a trigger honestly.
What the book rules did
Separately, we extracted mechanical Elliott rules from trading books and ran them through our backtest mill:
| Rules extracted | 85 |
| Ever scored | 4 |
| Reached 20 trades | 2 |
| Trades across those two | 714 |
| Win rate | 45.6% |
| Profit factor | 0.59 |
| Cleared deflated Sharpe 0.95 | 0 |
Two testable rules out of 85, and those two lost money.
This does not condemn Elliott Wave, and the reason is the subject of this post. A book rule that encodes a wave count has already made the subjective choice — it has frozen one ZigZag threshold, one degree, one interpretation, and then applied it mechanically to every chart. That is not Elliott. It is one analyst's parameter selection, backtested.
We measured the shadow. The finding is that the shadow does not work, which is what you would expect whether or not the method does.
What this changes about how you read a wave count
If someone shows you a count, the questions that matter are not "is this the right count."
- What ZigZag or swing threshold produced it? A different one produces a
- What price invalidates it? If there is no such price, it is not a forecast,
- How many valid alternatives were there? A count presented alone has hidden
- Was it published before or after the move? Elliott labels are famously
different count from the same bars.
it is a description.
its competitors.
clear in hindsight, and hindsight is where the entire apparent accuracy lives.
Our engine answers the first three by construction, and the fourth is why every count it emits is stamped and stored when it is produced.
The honest position
We do not claim Elliott Wave predicts price. We have not measured that, and the version we could measure — frozen book rules — returned a profit factor of 0.59 on a very thin sample.
What we do claim is narrower and defensible: the three cardinal rules are mechanically checkable, so a count can be tested for validity even when it cannot be tested for accuracy. Enumerating the valid counts and publishing the price that kills each one is more useful than asserting the right one, and it is the only version of this we could build without pretending the subjectivity away.
Related: seven frameworks, thirteen testable rules, and why SMC and Dow gave opposite answers as rules versus as engines.