ha-track is a modular Java toolkit for technical analysis, backtesting, and charting, rooted in Heikin Ashi candle analysis. It is headless and framework-agnostic (no DI container), and strongly oriented toward code quality — so you can develop, test, and visualise trading strategies cleanly and reproducibly.
It is a set of libraries, not an application: pick the ones you need and compose them. The three are independent and give an application three capabilities, with a shared vocabulary to connect them:
- see the market — chart prices and indicators (heerwisch)
- recognise the market — detect patterns and indicator events (nachtkrapp)
- test an idea — backtest a trading strategy over history (frau-holle)
They share one small kernel of data types (commons) so a bar of price data means the same thing everywhere. The modules are named after continental Germanic folklore — each a helper that can also mislead. The end-user product is a separate consumer application.
- Modular, independently testable architecture
- Heikin Ashi as the foundation for pattern detection
- No magic — specs are plain, inspectable data: configurable and debuggable (no reflection, no DI container)
- Built to be embedded in batch pipelines or interactive tools alike
A few headless outputs produced by the heerwisch charting library — rendered
straight from a ChartSpec with no manual post-processing.
A single backtest trade — candles, an SMA overlay, a Donchian-style HHV/LLV channel, semantic entry / target / stop horizontal levels, the in-position WIN band, and entry/exit glyphs.
Multi-pane indicators — candles with an EMA overlay, a MACD sub-pane and an RSI(14) sub-pane with shaded overbought/oversold danger zones.
Pivot levels and a σ sub-pane — STANDARD pivot point levels drawn as
horizontal lines on the price pane, plus a standalone σ(20) standard-deviation
sub-pane (added in 0.55.0-alpha).
| Start here | For |
|---|---|
| docs/concepts.md | what ha-track is for and the ideas behind it — read this first |
| docs/modules.md | per-module functional guide, with code examples |
| docs/getting-started.md | build, test, and a runnable end-to-end example |
CLAUDE.md (root + per module) |
the authoritative, rule-by-rule behavioural specification |
AGENTS.md |
code-review guidelines for AI and human reviewers |
Each module has its own README.md (human-friendly guide, with API usage) and
a CLAUDE.md (the authoritative behavioural specification).
| Module | Role |
|---|---|
commons |
shared kernel — JDK-only data types and pure functions, zero external dependencies |
indicators |
shared kernel — JDK-only technical-indicator calculators (SMA, EMA, RSI, MACD, …) |
heerwisch-api |
plotting library — immutable chart spec types and the ChartRenderer port |
heerwisch-jfreechart |
default plotting driver — renders a ChartSpec to a PNG/JPEG ChartImage, headless |
frau-holle |
backtesting library — the Backtester, with MarketDataSource and SignalGenerator ports |
frau-holle-csv |
reference data driver — reads OHLC bars from local CSV files |
frau-holle-eodhd |
reference data driver — fetches bars from the EODHD End-of-Day API |
nachtkrapp |
pattern detection library — Heikin Ashi patterns plus MA/RSI/MACD primitives |
./mvnw -DskipTests=false verifyRequires JDK 25. A Maven Wrapper is committed, so a system Maven installation is optional. See docs/getting-started.md for details.
The default build attaches a -sources.jar to every module. Publishing to
Maven Central additionally requires the release profile, which attaches the
-javadoc.jar and GPG-signs all artifacts:
./mvnw -Prelease deployDeploying must use -Prelease — a plain mvn deploy would omit the
javadoc jar and the signatures. The release CI workflow already passes the
flag; manual deploys must include it.
This software is a tool for historical analysis only. It is NOT a trading platform, brokerage, financial advice service, or investment product.
No warranties. The software is provided "AS IS" under its license. The author makes no warranties regarding accuracy, completeness, reliability, or fitness for any purpose.
Past performance is not indicative of future results. Results obtained with this software reflect hypothetical performance on historical data and have inherent limitations:
- They cannot account for all market conditions
- They cannot model unforeseen events
- They cannot guarantee future returns
Use at your own risk. Any trading decisions based on output from this software are made solely at the user's discretion and risk. The author accepts no liability for any financial losses, regulatory issues, or other consequences arising from use of this software.
No financial advice. Nothing in this software, its documentation, its output, or its associated artifacts constitutes financial, investment, legal, or tax advice. Users should consult qualified professionals before making investment decisions.
No regulatory endorsement. This software is not registered with, endorsed by, or approved by any financial regulatory authority. Users are solely responsible for compliance with applicable laws and regulations in their jurisdiction.





