ta4j

Technical Analysis for Java

Build, test, and deploy trading bots in Java. With more than 190 (and counting) indicators, readable APIs, and production-minded tooling, you can explore markets, validate trading ideas, visualize signals, and ship automated bots without leaving the JVM.
Table of Contents
- Why Ta4j?
- Install in seconds
- Quick start: Your first strategy
- Sourcing market data
- Visualize and share strategies
- Features at a glance
- Evaluate performance with metrics
- From backtest to live trading
- Real-world examples
- Performance
- Community & Support
- What's next?
- Contributing
Why Ta4j?
Build, test, and deploy trading bots in Javaāwithout leaving your favorite language or IDE. Ta4j gives you everything you need to explore markets, validate trading ideas, and ship production-ready automated trading systems.
What can you build?
- Backtest trading strategies: Test "what if" scenarios on historical data before risking real money
- Paper trading bots: Run strategies live against market data without placing real orders
- Research tools: Analyze market patterns, compare indicators, and explore new trading ideas
- Automated trading systems: Deploy production bots that execute trades based on your strategies
- Market analysis dashboards: Build visualizations and reports for your trading research
Why Java developers choose Ta4j
- Pure Java, zero friction: Works anywhere Java 21+ runsācloud functions, desktop tools, microservices, or trading bots. No Python bridges or external dependencies.
- Type-safe and IDE-friendly: Full Java type system means autocomplete, refactoring, and compile-time checks work perfectly.
- Huge indicator catalog: Aroon, ATR, Ichimoku, MACD, RSI, Renko, Heikin-Ashi, and 190+ more ready to plug together. New indicators are added regularly based on community needs and contributions.
- Composable strategies: Chain rules fluently using familiar Java patternsāno DSLs or configuration files required.
- Backtesting built-in: Evaluate risk/reward with realistic trading costs and performance metrics in just a few lines.
- Production-ready: Deterministic outputs, JSON serialization for strategies/indicators, and minimal dependencies make it easy to deploy.
- MIT licensed: Use it at work, in research, or inside your next trading product without legal concerns.
Install in seconds
Add Ta4j from Maven Central:
<dependency>
<groupId>org.ta4j</groupId>
<artifactId>ta4j-core</artifactId>
<version>0.21.0</version>
</dependency>
Prefer living on the edge? Use the snapshot repository and version:
<repository>
<id>central-portal-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</repository>
<dependency>
<groupId>org.ta4j</groupId>
<artifactId>ta4j-core</artifactId>
<version>0.22.0-SNAPSHOT</version>
</dependency>
Sample applications are also published so you can copy/paste entire flows:
<dependency>
<groupId>org.ta4j</groupId>
<artifactId>ta4j-examples</artifactId>
<version>0.21.0</version>
</dependency>
Like living on the edge? Use the snapshot version of ta4j-examples for the latest experimental/beta features:
<dependency>
<groupId>org.ta4j</groupId>
<artifactId>ta4j-examples</artifactId>
<version>0.22.0-SNAPSHOT</version>
</dependency>
š” Tip: The ta4j-examples module includes runnable demos, data loaders, and charting utilities. It's a great way to see Ta4j in action and learn by example.
Try it now
Option 1: Run the Quickstart example (2-3 minutes)
# Clone the repository
git clone https://github.com/ta4j/ta4j.git
cd ta4j
# Build the project first
mvn clean install -DskipTests
# Run the Quickstart example (Quickstart is configured as the default)
mvn -pl ta4j-examples exec:java
Alternative: To run a different example class:
# On Linux/Mac/Git Bash
mvn -pl ta4j-examples exec:java -Dexec.mainClass=ta4jexamples.Quickstart
# On Windows CMD (use quotes)
mvn -pl ta4j-examples exec:java "-Dexec.mainClass=ta4jexamples.Quickstart"
This will load historical Bitcoin data, run a complete trading strategy, display performance metrics, and show an interactive chartāall in one go!
Option 2: Copy the code into your project (requires ta4j-core and ta4j-examples dependencies)
See the Quick start: Your first strategy section below for a complete, runnable example you can paste into your IDE.
Quick start: Your first strategy
Load price data, plug in indicators, and describe when to enter/exit. The API reads like the trading notes you already keep.
š” Want to see this in action? The Quickstart example includes this same pattern plus performance metrics and charting. Run it with:
mvn -pl ta4j-examples exec:java -Dexec.mainClass=ta4jexamples.Quickstart
Key concepts:
- Indicators: Calculate values from price data (e.g., moving averages, RSI, MACD)
- Rules: Boolean conditions that determine when to enter or exit trades
- Strategies: Combine entry and exit rules into a complete trading system
- BarSeries: Your price data (OHLCV bars) that everything operates on
Note: The example below uses BitStampCsvTradesFileBarSeriesDataSource from ta4j-examples for convenience. See the Sourcing market data section below for more options.
import org.ta4j.core.*;
import org.ta4j.core.indicators.EMAIndicator;
import org.ta4j.core.indicators.helpers.ClosePriceIndicator;
import org.ta4j.core.rules.*;
import org.ta4j.core.backtest.BarSeriesManager;
import ta4jexamples.datasources.BitStampCsvTradesFileBarSeriesDataSource; // Requires ta4j-examples dependency
// Load historical price data (or use your own data source)
BarSeries series = BitStampCsvTradesFileBarSeriesDataSource.loadBitstampSeries();
// Create indicators: calculate moving averages from close prices
ClosePriceIndicator close = new ClosePriceIndicator(series);
EMAIndicator fastEma = new EMAIndicator(close, 12); // 12-period EMA
EMAIndicator slowEma = new EMAIndicator(close, 26); // 26-period EMA
// Define entry rule: buy when fast EMA crosses above slow EMA (golden cross)
Rule entry = new CrossedUpIndicatorRule(fastEma, slowEma);
// Define exit rule: sell when price gains 3% OR loses 1.5%
Rule exit = new StopGainRule(close, 3.0) // take profit at +3%
.or(new StopLossRule(close, 1.5)); // or cut losses at -1.5%
// Combine rules into a strategy
Strategy strategy = new BaseStrategy("EMA Crossover", entry, exit);
// Run the strategy on historical data
BarSeriesManager manager = new BarSeriesManager(series);
TradingRecord record = manager.run(strategy);
// See the results
System.out.println("Number of trades: " + record.getTradeCount());
System.out.println("Number of positions: " + record.getPositionCount());
Sourcing market data
New to trading and not sure where to get historical price data? You're not alone! Ta4j makes it easy to get started with real market data.
Quick solution: Yahoo Finance (no API key required)
The easiest way to get started is using the built-in YahooFinanceBarSeriesDataSource from ta4j-examples. It fetches real market data from Yahoo Finance's public APIāno registration or API key needed.
import ta4jexamples.datasources.YahooFinanceBarSeriesDataSource;
// Enable response caching to avoid hitting API limits during development
YahooFinanceBarSeriesDataSource dataSource = new YahooFinanceBarSeriesDataSource(true);
// Load data by desired bar count (e.g., 2 years of daily candles)
BarSeries series = dataSource.loadSeriesInstance("AAPL",
YahooFinanceBarSeriesDataSource.YahooFinanceInterval.DAY_1, 730);
// Or load by date range
BarSeries series = dataSource.loadSeriesInstance("AAPL",
YahooFinanceBarSeriesDataSource.YahooFinanceInterval.DAY_1,
Instant.parse("2023-01-01T00:00:00Z"),
Instant.parse("2023-12-31T23:59:59Z"));
Supported assets:
- Stocks:
"AAPL","MSFT","GOOGL","TSLA", etc. - ETFs:
"SPY","QQQ","VTI", etc. - Cryptocurrencies:
"BTC-USD","ETH-USD","SOL-USD", etc.
Supported intervals:
- Intraday:
MINUTE_1,MINUTE_5,MINUTE_15,MINUTE_30,HOUR_1,HOUR_4 - Daily/weekly/monthly:
DAY_1,WEEK_1,MONTH_1
š” Tip: Enable caching (new YahooFinanceBarSeriesDataSource(true)) to cache API responses locally. This speeds up development and reduces API calls. Cached data is automatically reused for the same requests.
See it in action: Run the complete example with:
mvn -pl ta4j-examples exec:java -Dexec.mainClass=ta4jexamples.backtesting.YahooFinanceBacktest
This example demonstrates loading data from Yahoo Finance, building an advanced multi-indicator strategy (Bollinger Bands, RSI, ATR stops), running a backtest, and visualizing results.
Other data sources
Ta4j works with any OHLCV (Open, High, Low, Close, Volume) data. The ta4j-examples module includes examples for several data sources:
- YahooFinanceBarSeriesDataSource - Fetch live data from Yahoo Finance API (stocks, ETFs, crypto)
- CsvFileBarSeriesDataSource - Load OHLCV data from CSV files
- BitStampCsvTradesFileBarSeriesDataSource - Load trade data from Bitstamp CSV and aggregate into bars
- JsonFileBarSeriesDataSource - Load Coinbase/Binance OHLCV data from json files
Create your own data source: Simply implement a method that returns a BarSeries. You can load data from:
- CSV files
- REST APIs (your broker, exchange, or data provider)
- Databases (SQL, NoSQL)
- WebSocket streams (for live data)
- Any other source you prefer
See the Data Loading Examples section for more details.
Evaluate performance with metrics
Turn ideas into numbers. Add trading costs for realism and measure what mattersāreturns, risk, drawdowns, and more.
import org.ta4j.core.criteria.pnl.NetReturnCriterion;
import org.ta4j.core.criteria.drawdown.MaximumDrawdownCriterion;
import org.ta4j.core.cost.LinearTransactionCostModel;
import org.ta4j.core.cost.LinearBorrowingCostModel;
// Run backtest with realistic trading costs
// Transaction cost: 0.1% per trade (typical for crypto exchanges)
// Borrowing cost: 0.01% per period (for margin/short positions)
TradingRecord record = new BarSeriesManager(series,
new LinearTransactionCostModel(0.001), // 0.1% fee per trade
new LinearBorrowingCostModel(0.0001)) // 0.01% borrowing cost
.run(strategy);
// Calculate performance metrics
System.out.printf("Trades executed: %d%n", record.getTradeCount());
System.out.printf("Net return: %.2f%%%n",
new NetReturnCriterion().calculate(series, record).multipliedBy(series.numOf(100)));
System.out.printf("Max drawdown: %.2f%%%n",
new MaximumDrawdownCriterion().calculate(series, record).multipliedBy(series.numOf(100)));
// Explore more metrics: Sharpe ratio, win rate, profit factor, etc.
// See the wiki for the full list of available criteria
Backtest hundreds or even thousands of strategies
Want to find the top performers? Generate strategies with varying parameters and compare them:
// Generate strategies with varying parameters
List<Strategy> strategies = new ArrayList<>();
for (int fastPeriod = 5; fastPeriod <= 20; fastPeriod += 5) {
for (int slowPeriod = 20; slowPeriod <= 50; slowPeriod += 10) {
EMAIndicator fastEma = new EMAIndicator(close, fastPeriod);
EMAIndicator slowEma = new EMAIndicator(close, slowPeriod);
Rule entry = new CrossedUpIndicatorRule(fastEma, slowEma);
Rule exit = new CrossedDownIndicatorRule(fastEma, slowEma);
strategies.add(new BaseStrategy("EMA(" + fastPeriod + "," + slowPeriod + ")", entry, exit));
}
}
// Run all strategies with progress tracking
BacktestExecutionResult result = new BacktestExecutor(series)
.executeWithRuntimeReport(strategies,
series.numFactory().numOf(1), // position size: 1 unit
Trade.TradeType.BUY, // long positions (use Trade.TradeType.SELL for shorts)
ProgressCompletion.loggingWithMemory(); // logs progress with memory stats
// Get top 10 strategies sorted by net profit, then by RoMaD (for ties)
// You can sort by any combination of AnalysisCriterion - mix and match to find strategies that meet your goals
AnalysisCriterion returnOverMaxDradownCriterion = new ReturnOverMaxDrawdownCriterion();
AnalysisCriterion netProfitCriterion = new NetProfitCriterion();
List<TradingStatement> topStrategies = result.getTopStrategies(10,
netProfitCriterion, // primary sort: highest net profit first
returnOverMaxDradownCriterion); // secondary sort: highest RoMaD for ties
// Review the winners
topStrategies.forEach(statement -> {
System.out.printf("Strategy: %s, Net Profit: %.2f, Return over Max Drawdown: %.2f%n",
statement.getStrategy().getName(),
statement.getCriterionScore(netProfitCriterion).orElse(series.numOf(0)),
statement.getCriterionScore(returnOverMaxDradownCriterion).orElse(series.numOf(0)));
});
Visualize and share strategies
See your strategies in action. Ta4j includes charting helpers, but you're not locked ināserialize to JSON and use any visualization stack you prefer.
Built-in Java charting (using JFreeChart):
Basic strategy visualization with indicator overlays:
// Generate simplified chart - just price, indicators, and signals (no subchart)
ChartWorkflow chartWorkflow = new ChartWorkflow();
JFreeChart chart = chartWorkflow.builder()
.withTitle("EMA Crossover Strategy")
.withSeries(series) // Price bars (candlesticks)
.withIndicatorOverlay(fastEma) // Overlay indicators on price chart
.withIndicatorOverlay(slowEma)
.withTradingRecordOverlay(record) // Mark entry/exit points with arrows
.toChart();
chartWorkflow.saveChartImage(chart, series, "ema-crossover-strategy", "output/charts"); // Save as image

The chart above shows candlestick price data with EMA lines overlaid and buy/sell signals marked with arrows. This demonstrates basic strategy visualization with indicator overlays.
Adding indicator subcharts for indicators with different scales (like RSI, which ranges from 0-100):
// Create indicators
ClosePriceIndicator close = new ClosePriceIndicator(series);
RSIIndicator rsi = new RSIIndicator(close, 14);
// RSI strategy: buy when RSI crosses below 30 (oversold), sell when RSI crosses
// above 70 (overbought)
Rule entry = new CrossedDownIndicatorRule(rsi, 30);
Rule exit = new CrossedUpIndicatorRule(rsi, 70);
Strategy strategy = new BaseStrategy("RSI Strategy", entry, exit);
TradingRecord record = new BarSeriesManager(series).run(strategy);
ChartWorkflow chartWorkflow = new ChartWorkflow();
JFreeChart chart = chartWorkflow.builder()
.withTitle("RSI Strategy with Subchart")
.withSeries(series) // Price bars (candlesticks)
.withTradingRecordOverlay(record) // Mark entry/exit points
.withSubChart(rsi) // RSI indicator in separate subchart panel
.toChart();

Visualizing performance metrics alongside your strategy:
// Create indicators: multiple moving averages
ClosePriceIndicator close = new ClosePriceIndicator(series);
SMAIndicator sma20 = new SMAIndicator(close, 20);
EMAIndicator ema12 = new EMAIndicator(close, 12);
// Strategy: buy when EMA crosses above SMA, sell when EMA crosses below SMA
Rule entry = new CrossedUpIndicatorRule(ema12, sma20);
Rule exit = new CrossedDownIndicatorRule(ema12, sma20);
Strategy strategy = new BaseStrategy("EMA/SMA Crossover", entry, exit);
TradingRecord record = new BarSeriesManager(series).run(strategy);
ChartWorkflow chartWorkflow = new ChartWorkflow();
JFreeChart chart = chartWorkflow.builder()
.withTitle("Strategy Performance Analysis")
.withSeries(series) // Price bars (candlesticks)
.withIndicatorOverlay(sma20) // Overlay SMA on price chart
.withIndicatorOverlay(ema12) // Overlay EMA on price chart
.withTradingRecordOverlay(record) // Mark entry/exit points
.withSubChart(new MaximumDrawdownCriterion(), record) // Performance metric in subchart
.toChart();

This chart shows price action with indicator overlays, trading signals, and a performance subchart displaying maximum drawdown over timeāhelping you understand risk alongside returns.
Advanced multi-indicator analysis with multiple subcharts:
// Create indicators
ClosePriceIndicator close = new ClosePriceIndicator(series);
SMAIndicator sma50 = new SMAIndicator(close, 50);
EMAIndicator ema12 = new EMAIndicator(close, 12);
MACDIndicator macd = new MACDIndicator(close, 12, 26);
RSIIndicator rsi = new RSIIndicator(close, 14);
// Strategy: buy when EMA crosses above SMA and RSI > 50, sell when EMA crosses
// below SMA
Rule entry = new CrossedUpIndicatorRule(ema12, sma50).and(new OverIndicatorRule(rsi, 50));
Rule exit = new CrossedDownIndicatorRule(ema12, sma50);
Strategy strategy = new BaseStrategy("Advanced Multi-Indicator Strategy", entry, exit);
TradingRecord record = new BarSeriesManager(series).run(strategy);
ChartWorkflow chartWorkflow = new ChartWorkflow();
JFreeChart chart = chartWorkflow.builder()
.withTitle("Advanced Multi-Indicator Strategy")
.withSeries(series) // Price bars (candlesticks)
.withIndicatorOverlay(sma50) // Overlay SMA on price chart
.withIndicatorOverlay(ema12) // Overlay EMA on price chart
.withTradingRecordOverlay(record) // Mark entry/exit points
.withSubChart(macd) // MACD indicator in subchart
.withSubChart(rsi) // RSI indicator in subchart
.withSubChart(new NetProfitLossCriterion(), record) // Net profit/loss performance metric
.toChart();

This comprehensive chart demonstrates combining multiple indicators (MACD, RSI) in separate subcharts with performance metrics, giving you a complete view of strategy behavior.
See the chart at the top of this README for another example, or check the wiki's charting guide for more examples.
Export to any stack (Python, TypeScript, etc.):
Serialize indicators, rules, and strategies to JSON for persistence, sharing, or integration with other systems:
// Serialize an indicator (RSI) to JSON
ClosePriceIndicator close = new ClosePriceIndicator(series);
RSIIndicator rsi = new RSIIndicator(close, 14);
String rsiJson = rsi.toJson();
LOG.info("Output: {}", rsiJson);
// Output:
// {"type":"RSIIndicator","parameters":{"barCount":14},"components":[{"type":"ClosePriceIndicator"}]}
// Serialize a rule (AndRule) to JSON
Rule rule1 = new OverIndicatorRule(rsi, 50);
Rule rule2 = new UnderIndicatorRule(rsi, 80);
Rule andRule = new AndRule(rule1, rule2);
String ruleJson = ComponentSerialization.toJson(RuleSerialization.describe(andRule));
LOG.info("Output: {}", ruleJson);
// Output:
// {"type":"AndRule","label":"AndRule","components":[{"type":"OverIndicatorRule","label":"OverIndicatorRule","components":[{"type":"RSIIndicator","parameters":{"barCount":14},"components":[{"type":"ClosePriceIndicator"}]}],"parameters":{"threshold":50.0}},{"type":"UnderIndicatorRule","label":"UnderIndicatorRule","components":[{"type":"RSIIndicator","parameters":{"barCount":14},"components":[{"type":"ClosePriceIndicator"}]}],"parameters":{"threshold":80.0}}]}
// Serialize a strategy (EMA Crossover) to JSON
EMAIndicator fastEma = new EMAIndicator(close, 12);
EMAIndicator slowEma = new EMAIndicator(close, 26);
Rule entry = new CrossedUpIndicatorRule(fastEma, slowEma);
Rule exit = new CrossedDownIndicatorRule(fastEma, slowEma);
Strategy strategy = new BaseStrategy("EMA Crossover", entry, exit);
String strategyJson = strategy.toJson();
LOG.info("Output: {}", strategyJson);
// Output: {"type":"BaseStrategy","label":"EMA
// Crossover","parameters":{"unstableBars":0},"rules":[{"type":"CrossedUpIndicatorRule","label":"entry","components":[{"type":"EMAIndicator","parameters":{"barCount":12},"components":[{"type":"ClosePriceIndicator"}]},{"type":"EMAIndicator","parameters":{"barCount":26},"components":[{"type":"ClosePriceIndicator"}]}]},{"type":"CrossedDownIndicatorRule","label":"exit","components":[{"type":"EMAIndicator","parameters":{"barCount":12},"components":[{"type":"ClosePriceIndicator"}]},{"type":"EMAIndicator","parameters":{"barCount":26},"components":[{"type":"ClosePriceIndicator"}]}]}]}
Restore from JSON:
// Restore indicators and strategies from JSON
Indicator<?> restoredIndicator = Indicator.fromJson(series, indicatorJson);
Strategy restoredStrategy = Strategy.fromJson(series, strategyJson);
Features at a glance
- 190+ technical indicators (and counting) - Aroon, ATR, Ichimoku, MACD, RSI, Renko, Heikin-Ashi, and many more. New indicators are added regularly.
- Composable strategy API - Build complex trading rules using fluent Java patterns
- Built-in backtesting engine - Test strategies on years of data in seconds. Same code for backtesting and live trading ā no rewrites.
- Performance metrics - 30+ analysis criteria including Sharpe ratio, drawdown, win rate, and more
- Charting support - Visualize strategies with candlestick charts, indicator overlays, and performance subcharts
- JSON serialization - Save and restore strategies and indicators for persistence and sharing
- Production-ready - Deterministic calculations, minimal dependencies, type-safe APIs
- Extensive examples - Runnable demos covering strategies, indicators, backtesting, and live trading
From backtest to live trading
The same strategies you backtest can run live. Ta4j's deterministic calculations make it safe to deployātest thoroughly, then execute with confidence.
import org.ta4j.core.builder.BaseBarSeriesBuilder;
// Create a live series (starts empty, grows as bars arrive)
BarSeries liveSeries = new BaseBarSeriesBuilder()
.withName("BTC-USD")
.build();
// Build your strategy (same code as backtesting!)
Strategy strategy = buildStrategy(liveSeries);
// Main trading loop: check for signals on each new bar
while (true) {
// Fetch latest bar from your exchange/broker API
Bar latest = fetchLatestBarFromBroker(); // Your integration here
liveSeries.addBar(latest);
int endIndex = liveSeries.getEndIndex();
// Check entry/exit signals (same API as backtesting)
if (strategy.shouldEnter(endIndex)) {
placeBuyOrder(); // Your order execution logic
} else if (strategy.shouldExit(endIndex)) {
placeSellOrder(); // Your order execution logic
}
Thread.sleep(60000); // Wait 1 minute (or your bar interval)
}
Why this works:
- Same code, different data: Your strategy logic is identical for backtests and live trading
- Deterministic: Same inputs always produce same outputsācritical for testing and debugging
- Type-safe: Compile-time checks catch errors before they cost money
Real-world examples
The ta4j-examples module includes runnable examples demonstrating common patterns and strategies:
Strategy Examples
- RSI2Strategy - Mean reversion strategy using RSI with entry/exit rules
- ADXStrategy - Trend-following strategy using ADX and DI indicators
- CCICorrectionStrategy - Commodity Channel Index-based correction strategy
- MovingMomentumStrategy - Momentum-based strategy with moving averages
- GlobalExtremaStrategy - Strategy using global price extrema for entries/exits
- NetMomentumStrategy - Net momentum calculation with multiple indicators
Data Loading Examples
- YahooFinanceBarSeriesDataSource - Fetch historical OHLCV data from Yahoo Finance API (stocks, ETFs, crypto). Includes response caching to reduce API calls. See the Sourcing market data section above for a quick start guide.
- YahooFinanceBacktest - Complete example demonstrating Yahoo Finance data loading, advanced multi-indicator strategy (Bollinger Bands, RSI, ATR stops), backtesting, and visualization
- BitStampCsvTradesFileBarSeriesDataSource - Load historical trade data from Bitstamp CSV files and aggregate into OHLCV bars
- CsvFileBarSeriesDataSource - Load OHLCV bar data from CSV
- JsonFileBarSeriesDataSource - Parse JSON data from Coinbase/Binance APIs
Analysis & Backtesting Examples
- StrategyAnalysis - Comprehensive strategy performance analysis
- MultiStrategyBacktest - Compare multiple strategies side-by-side
- TopStrategiesExampleBacktest - Find top-performing strategies from parameter sweeps
Charting Examples
- IndicatorsToChart - Visualize indicators overlaid on price charts
- CandlestickChart - Basic candlestick chart with trading signals
- CashFlowToChart - Visualize cash flow and equity curves
š” Tip: Run any example with mvn -pl ta4j-examples exec:java -Dexec.mainClass=ta4jexamples.Quickstart (replace Quickstart with the class name).
Performance
Ta4j is designed for performance and scalability:
- Efficient calculations - Optimized indicator implementations with minimal overhead
- Flexible number types - Choose between
DecimalNum(precision) andDoubleNum(speed) based on your needs - Memory-efficient - Support for moving windows and sub-series to minimize memory footprint
- Parallel-friendly - Strategies can be backtested independently for easy parallelization
For detailed performance characteristics and benchmarks, see the wiki's performance guide (TODO: add link when available).
Community & Support
Get help, share ideas, and connect with other Ta4j users:
- š¬ Discord Community - Active community for quick questions, strategy discussions, and real-time help
- š Documentation Wiki - Comprehensive guides covering indicators, strategies, backtesting, and more
- š Javadoc API Reference - Complete API documentation with examples
- š GitHub Issues - Report bugs, request features, or ask questions
- š” Usage Examples - Browse runnable code examples in the repository
What's next?
New to technical analysis?
- Start with the wiki's Getting Started guide to learn core concepts
- Explore the
ta4j-examplesmoduleāeach example is runnable and well-commented - Try modifying the quick start example above: change indicator parameters, add new rules, or test different exit conditions
Ready to go deeper?
- Browse strategy recipes for Renko bricks, Ichimoku clouds, breakout strategies, and more
- Learn about portfolio metrics for multi-asset strategies
- Check out advanced backtesting patterns like walk-forward analysis
Need help?
- See the Community & Support section above for all available resources
Contributing
- Scan the roadmap and how-to-contribute guide.
- Fork the repo, open pull requests, and join code discussions on Discord.
- See the contribution policy and Code of Conduct.
Release & snapshot publishing
Ta4j uses automated workflows for publishing both snapshot and stable releases.
Snapshots
Every push to master triggers a snapshot deployment:
mvn deploy
Snapshots are available at:
https://central.sonatype.com/repository/maven-snapshots/
Stable releases
For detailed information about the release process, see RELEASE_PROCESS.md.