PRD + ARD — TA4J Elliott Wave Engine Enhancements (feature/ew-analysis-improvements)
Branch scope: ta4j/ta4j → feature/ew-analysis-improvements
Goal: Turn the improvement recommendations into a testable PRD, plus an architecture + codebase mapping plan aligned to TA4J’s current Elliott Wave package (swing processing, scenario generation, scoring, projections, examples).
PRD
1) Title + 1-line summary
Title: Adaptive, Modular Elliott Wave Analysis & Trading Extensions for TA4J
Summary: Improve Elliott Wave accuracy and usability by adding volatility-adaptive swing detection, time-based alternation scoring, pattern-aware confidence modeling, modular/puggable architecture, optional trade-advisor utilities, and configurable/expanded pattern coverage.
2) Context / problem
TA4J’s Elliott Wave package already provides:
- swing processing (
ElliottSwingIndicator,ElliottSwingCompressor) - wave state tracking (
ElliottPhaseIndicator,ElliottInvalidationIndicator) - fib/channel/confluence analysis (
ElliottRatioIndicator,ElliottChannelIndicator,ElliottConfluenceIndicator,ElliottFibonacciValidator) - scenario + confidence (
ElliottScenario,ElliottScenarioSet,ElliottConfidence,ElliottConfidenceScorer,ScenarioType)
However, the current system can be materially improved in five areas you called out:
- Swing detection adaptivity + alternation logic (including time/duration alternation).
- Confidence scoring flexibility (dynamic weights, more factors like momentum/volume).
- Architecture modularization (clean pluggable pipeline, better live-signal ergonomics).
- Live-trading utilities (risk/reward, scaling, advisor objects).
- Pattern coverage + pattern-set customization (diagonals, complex corrections, etc.).
3) Goals + non-goals
Goals
- Accuracy: reduce mislabels caused by volatility changes and micro-noise swings.
- Explainability: confidence output indicates which rules passed/failed (diagnostic).
- Extensibility: pattern-aware scoring + user-pluggable swing detectors and profiles.
- Strategy friendliness: easier to convert “scenario” into “trade decision” with helpers.
- Multi-timeframe readiness: avoid design dead-ends that block MTF aggregation later.
Non-goals
- Building a full execution engine inside TA4J.
- Promising profitability.
- Replacing all heuristics with ML (ML is optional “Later”).
4) Users/personas + key use cases
Personas
- Quant/Algo trader: wants programmatic, explainable wave scenarios for bots.
- Technical analyst: wants scenario ranking, alternation cues, fib validation diagnostics.
- Strategy developer: wants a stable API surface and “batteries included” helpers.
Key use cases
- Identify and rank impulse/correction scenarios for an instrument/timeframe.
- Validate counts with time alternation and volatility-aware swings.
- Integrate scenario confidence into rules (enter Wave 3, exit on invalidation, etc.).
- (Later) Align degrees across timeframes (e.g., hourly Wave 3 inside daily Wave 3).
5) Requirements
MVP — Functional
A) Enhanced swing detection & swing compression
- Volatility-adaptive ZigZag threshold
- Support dynamic threshold driven by ATR/volatility regime so pivots don’t disappear in high-volatility periods.
- Composite swing confirmation
- Allow confirming pivots via multiple detectors (e.g., Fractal(5) AND ZigZag(%)) before accepting a swing.
- Noise swing filtering
- Add minimum-magnitude rules (e.g., ignore swings < X% of the largest swing in window) to prevent “jitter waves.”
- Time-aware alternation inputs
- Ensure swings retain bar-index/time metadata needed for duration comparisons downstream.
B) Alternation scoring: add time/duration dimension
- Extend alternation scoring beyond depth/pattern to include:
- bar-count comparison Wave 2 vs Wave 4 (and analogous ABC subwaves where applicable)
- awarding points for classic alternation: “sharp/brief vs sideways/long”
- Output: a sub-score + diagnostic fields (barsW2, barsW4, ratio, pass/fail thresholds).
C) Richer confidence modeling (dynamic & multi-factor)
- Pattern-aware weight profiles
- Confidence scoring can select weights by
ScenarioType(Impulse vs Triangle etc.).
- Confidence scoring can select weights by
- Granular fib relationships
- Break “fib proximity” into individually scored relationships (W2 retrace, W3 extension, W4 retrace, W5 targets, A/B/C relations) using existing validator-style continuous scoring.
- Extensible factor framework
- New factors can be added without rewriting the scorer; each factor contributes:
- score (0..1)
- weight
- diagnostics (computed values, thresholds, deltas)
- New factors can be added without rewriting the scorer; each factor contributes:
D) Architectural refactor & modularization
- Provide a higher-level “analyzer” orchestration class that:
- accepts series + configuration
- returns plain result objects (scenarios, confidence breakdown, projections)
- does not require plotting/CLI
- Ensure each stage is swappable via interface/factory:
- Swing detection
- Swing compression
- Scenario generation
- Confidence scoring
- Projections
E) Pattern coverage and customization
- Add configuration to enable/disable pattern types for scenario generation (performance + user preference).
MVP — Non-functional
- Deterministic results for identical inputs/config.
- Backwards compatible defaults (existing examples keep working).
- No material performance regression on common dataset sizes.
Later — Functional
- Momentum + volume factors in confidence:
- Wave 3 momentum/volume expansion vs Wave 1
- Wave 5 divergence vs Wave 3 (RSI/MACD)
- Market-regime-aware tolerances (looser fib proximity in high-vol regimes).
- Multi-timeframe “scenario aggregation” and consensus.
- Additional patterns:
- Leading/ending diagonals
- Double zigzag / W-X-Y (complex corrections)
6) Proposed solution
Pipeline (conceptual)
- Detect candidate swing points (one or more detectors).
- Optionally “confirm” swings via composite rules.
- Compress/normalize swings to target degree.
- Generate scenarios for enabled patterns.
- Score each scenario with pattern-aware confidence profiles.
- Compute invalidation + targets + (later) R/R advisory.
Java API sketch (ta4j-style)
ElliottWaveAnalyzer analyzer = ElliottWaveAnalyzer.builder()
.swingDetector(SwingDetectors.composite(
SwingDetectors.fractal(5),
SwingDetectors.adaptiveZigZag(adaptiveCfg)
))
.swingCompression(CompressionProfiles.primaryDegree())
.scenarioGenerator(ScenarioGenerators.defaultEnabled())
.confidenceModel(ConfidenceProfiles.defaultByScenarioType())
.build();
ElliottAnalysisResult result = analyzer.analyze(series);
ElliottScenario base = result.scenarios().base();
7) Constraints, edge cases, dependencies
- Elliott Wave remains probabilistic; multiple plausible scenarios must remain first-class.
- Volatility adaptation must avoid “overfitting” swings to recent noise.
- Composite swing confirmation can reduce swing count too aggressively; must be configurable.
8) Success metrics + telemetry
- Offline (dev): agreement with curated expert-labeled wave datasets (where available).
- Backtesting: improved hit-rate of “high-confidence” scenarios vs low-confidence buckets.
- Diagnostics: lower incidence of “noise” waves being assigned structural wave numbers.
9) Rollout/release plan + backward compatibility
- Introduce new APIs as additive (
ElliottWaveAnalyzer, factor framework, profiles). - Keep existing
ElliottWaveFacadeusage working; optionally implement facade via analyzer internally. - Ship new examples (and/or update existing examples) to show:
- adaptive swings
- time alternation scoring output
- per-pattern confidence profiles
10) Risks + mitigations
- Complexity creep: mitigate with sensible defaults + profile presets.
- Perf regression: mitigate with benchmarks and optional composite checks.
- User confusion: mitigate with docs showing “confidence breakdown” and examples.
11) Open questions
- Should “signals/events” be in-core or an extension module?
- What minimal set of additional patterns is worth supporting in TA4J core?
12) Acceptance criteria + test plan
- Unit tests verify:
- adaptive ZigZag threshold changes pivot selection under volatility changes.
- time alternation score increases when W2 and W4 durations differ materially.
- confidence profiles differ by
ScenarioTypeand affect ranking.
- Golden tests (snapshot-style) for a fixed dataset:
- scenario ordering stable for given config
- confidence breakdown fields present and consistent
ARD — Architecture + Codebase Mapping (feature/ew-analysis-improvements)
A) Current Elliott Wave surface (what exists today)
The Elliott Wave feature set includes (at minimum) the following conceptual components and classes (per TA4J release notes and documentation):
- Swing processing:
ElliottSwingIndicator,ElliottSwingCompressor,ElliottSwingMetadata - Scenario + confidence:
ElliottScenario,ElliottScenarioSet,ScenarioType,ElliottConfidence,ElliottConfidenceScorer - Validation/projections:
ElliottRatioIndicator,ElliottChannelIndicator,ElliottConfluenceIndicator,ElliottFibonacciValidator - State/invalidation:
ElliottPhaseIndicator,ElliottInvalidationIndicator,ElliottPhase
Examples exist under ta4j-examples such as ElliottWaveAnalysis, BTCUSDElliottWaveAnalysis, etc.
Mapping note: the exact package paths may differ slightly in-branch, but TA4J’s Elliott Wave implementation is clearly structured around these components.
B) Proposed package layout (additive, minimal disruption)
1) ta4j-core: Elliott Wave analysis package
Target root (existing):
ta4j-core/src/main/java/org/ta4j/core/analysis/elliottwave/(or current equivalent in-branch)
Add subpackages (if they don’t already exist) to formalize the pipeline:
...elliottwave.swingSwingDetector(new interface)AdaptiveZigZagSwingDetector(new)CompositeSwingDetector(new)SwingFilter/MinMagnitudeSwingFilter(new)- Adapters around existing
RecentSwingIndicatorimplementations (existing concept: fractal/zigzag)
...elliottwave.compressionElliottSwingCompressor(existing)CompressionProfile(new) + presets
...elliottwave.scenarioScenarioGenerator(new interface)DefaultScenarioGenerator(wrap existing generation logic)PatternSet(new: enabled patterns bitset/enumset)- uses
ScenarioType(existing)
...elliottwave.confidenceConfidenceModel(new: selects profile byScenarioType)ConfidenceProfile(new: weights + factor set)ConfidenceFactor(new: score+diagnostics)ElliottConfidenceScorerremains, but can be refactored to “compose factors.”- Add
TimeAlternationFactor(new; uses bar counts) - Add
FibRelationshipFactorSet(new; decomposed scoring using validator methods)
...elliottwave.projection- projection calculators (existing target logic likely lives near
ElliottScenariotoday) - add optional
RiskRewardCalculator avoidance(MVP optional; see “Live utilities” below)
- projection calculators (existing target logic likely lives near
...elliottwave.api(or keep in root)ElliottWaveAnalyzer(new orchestrator)ElliottAnalysisResult(new immutable output)- Option: re-implement/bridge
ElliottWaveFacadeto call analyzer internally (keep facade stable).
2) ta4j-examples: example modernization + new examples
Target root:
ta4j-examples/src/main/java/ta4jexamples/analysis/elliottwave/
Add/Update:
- Update existing
ElliottWaveAnalysisexample to print confidence breakdown including time alternation data. - Add
ElliottWaveAdaptiveSwingAnalysisexample demonstrating:- ATR-adaptive zigzag threshold
- composite confirmation (fractal + zigzag)
- Add
ElliottWavePatternProfileDemoshowing pattern-specific profiles and their effect on ranking.
C) Design decisions (to keep it TA4J-native)
- Preserve “multiple scenarios” as core output (
ElliottScenarioSetstays). - Favor immutable records/POJOs for outputs (
ElliottConfidence,ElliottScenario,ElliottScenarioSetare already record-like). - Use continuous scoring (0..1) for factors (consistent with
ElliottFibonacciValidatorproximity scoring approach). - Keep defaults simple: current weights remain the default profile unless overridden, to avoid breaking user expectations.
D) Concrete implementation checklist (mapped to code areas)
D1) Swing adaptivity
- Add
SwingDetectorinterface + adapters around existingRecentSwingIndicatorstyle detectors. - Implement
AdaptiveZigZagSwingDetector(config: ATR period, min/max threshold, smoothing). - Implement
CompositeSwingDetector(policy: AND/OR; reconcile pivot disagreements). - Implement
MinMagnitudeSwingFilter(relative-to-largest-swing or ATR-based). - Add unit tests with synthetic volatility regime shifts.
D2) Time alternation scoring
- Extend internal swing metadata to always include bar indices / durations (if not already tracked).
- Add
TimeAlternationFactor:- inputs: swing index positions of W2 and W4
- outputs:
barsW2,barsW4,ratio,score
- Ensure confidence output exposes these diagnostics.
D3) Confidence model refactor
- Introduce
ConfidenceFactorframework. - Convert existing scorer subparts into factors:
- fib proximity (existing), time proportions (existing), alternation (existing), channel adherence (existing), structure completeness (existing)
- Add per-pattern
ConfidenceProfilemap keyed byScenarioType. - Add granular fib relationships (factor set uses
ElliottFibonacciValidatorscoring functions).
D4) Analyzer orchestration
- Add
ElliottWaveAnalyzerbuilder andElliottAnalysisResult. - Optionally wire
ElliottWaveFacadeto use analyzer behind the scenes (no API break).
D5) Pattern set configuration
- Add
PatternSetconfig and route into scenario generation selection. - Add tests that ensure disabled patterns are never produced.
D6) Examples
- Update
ElliottWaveAnalysisto show:- base + alternative scenarios
- confidence breakdown + time alternation diagnostics
E) Minimal API additions (proposed)
public interface SwingDetector {
RecentSwings detect(BarSeries series, SwingDetectorConfig config);
}
public interface ConfidenceFactor {
String name();
FactorResult score(ElliottContext ctx, ElliottScenario scenario);
}
public final class ElliottWaveAnalyzer {
// builder with swingDetector, compression, generator, confidence model
public ElliottAnalysisResult analyze(BarSeries series);
}
F) Compatibility notes
- Keep the existing indicator-based flow usable for users who prefer “poll each bar.”
- The analyzer is an additive orchestration layer; it should not force a new usage pattern.
References
- Branch root:
feature/ew-analysis-improvements - Elliott Wave package class inventory + scoring weights + scenario types
- Example usage coverage for ElliottWaveAnalysis and related examples