Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Nov 19, 2025

This PR contains the following updates:

Package Change Age Confidence
org.ta4j:ta4j-core 0.18 -> 0.19 age confidence

Release Notes

ta4j/ta4j (org.ta4j:ta4j-core)

v0.19

Compare Source

Breaking
  • TradingStatement is now an interface: Converted to an interface implemented by BaseTradingStatement. This exposes the underlying Strategy and TradingRecord for advanced analysis workflows. Action required: Update any code that directly instantiates TradingStatement to use BaseTradingStatement instead.
  • PnL and return criteria refactored into net/gross variants: Split ProfitLossCriterion, ProfitCriterion, LossCriterion, AverageProfitCriterion, AverageLossCriterion, ReturnCriterion, ProfitLossRatioCriterion, and ProfitLossPercentageCriterion into separate net and gross concrete classes. This provides explicit control over whether trading costs are included in calculations. Action required: Update imports and class names to use the appropriate net or gross variant based on your analysis needs.
  • Indicator operation classes consolidated: #​1266 Unified BinaryOperation, UnaryOperation, TransformIndicator, and CombineIndicator into a cleaner API. Action required: Replace deprecated TransformIndicator and CombineIndicator usage with the new consolidated classes.
  • Drawdown criteria moved to sub-package: Relocated MaximumDrawdownCriterion and ReturnOverMaxDrawdownCriterion to the criteria/drawdown/ sub-package for better organization. Action required: Update import statements to reflect the new package location.
Added
  • Rule naming support: Added Rule#getName() and Rule#setName(String) methods to allow rules to have custom names for improved trace logging and serialization. Rules now default to JSON-formatted names that include type and component information, but can be overridden with custom labels for better readability in logs and debugging output.
  • Time-based trading rules: Added HourOfDayRule and MinuteOfHourRule to enable trading strategies based on specific hours of the day (0-23) or minutes of the hour (0-59). These rules work with DateTimeIndicator to filter trading signals by time, enabling time-of-day based strategies.
  • Time-based strategy examples: Added HourOfDayStrategy and MinuteOfHourStrategy as example implementations demonstrating how to use the new time-based rules in complete trading strategies.
  • Enhanced backtesting with performance tracking: Introduced BacktestExecutionResult and BacktestRuntimeReport with new BacktestExecutor entry points. Users can now track per-strategy execution times, receive progress callbacks during long-running backtests, and efficiently stream top-k strategy selection for large strategy grids without loading all results into memory.
  • Strategy serialization for persistence: Added StrategySerialization with Strategy#toJson() and Strategy#fromJson(BarSeries, String) methods. This enables users to save and restore complete strategy configurations (including entry/exit rules) as JSON, making it easy to share strategies, version control configurations, and build strategy libraries.
  • NamedStrategy serialization with compact format: #​1349 Enabled NamedStrategy serialization/deserialization with compact labels (e.g., ToggleNamedStrategy_true_false_u3). Users can now persist strategy presets alongside their parameters in a human-readable format. Added registry/permutation helper APIs and lazy package scanning via NamedStrategy.initializeRegistry(...) for efficient strategy discovery.
  • Renko chart indicators: #​1187 Added RenkoUpIndicator, RenkoDownIndicator, and RenkoXIndicator to detect Renko brick sequences, enabling users to build strategies based on Renko chart patterns.
  • Advanced drawdown analysis: Added CumulativePnL, MaximumAbsoluteDrawdownCriterion, MaximumDrawdownBarLengthCriterion, and MonteCarloMaximumDrawdownCriterion. Users can now analyze drawdowns in absolute terms, measure drawdown duration, and estimate drawdown risk distributions through Monte Carlo simulation of different trade orderings.
  • Comprehensive commission tracking: Added CommissionsCriterion to total commissions paid across positions and CommissionsImpactPercentageCriterion to measure how much trading costs reduce gross profit. This helps users understand the real impact of transaction costs on strategy performance.
  • Streak and extreme position analysis: Added MaxConsecutiveLossCriterion, MaxConsecutiveProfitCriterion, MaxPositionNetLossCriterion, and MaxPositionNetProfitCriterion. Users can now identify worst loss streaks, best win streaks, and extreme per-position outcomes to better understand strategy risk and consistency.
  • Position timing analysis: Added InPositionPercentageCriterion to calculate the percentage of time a strategy remains invested, helping users understand capital utilization and exposure.
  • Flexible bar building options: Added AmountBarBuilder to aggregate bars after a fixed number of amount have been traded. Bars can now be built by beginTime instead of endTime, providing more flexibility in bar aggregation strategies.
  • Volume-weighted MACD: Added MACDVIndicator to volume-weight MACD calculations, providing an alternative MACD variant that incorporates volume information.
  • Net momentum indicator: Added NetMomentumIndicator for momentum-based strategy development.
  • Vote-based rule composition: Added VoteRule class, enabling users to create rules that trigger based on majority voting from multiple underlying rules.
  • Enhanced data loading: Added AdaptiveJsonBarsSerializer to support OHLC bar data from Coinbase or Binance, and new JsonBarsSerializer.loadSeries(InputStream) overload for easier data loading from streams.
  • Improved charting and examples: Expanded charting utilities to overlay indicators with trading records, added NetMomentumStrategy and TopStrategiesExample, and bundled a Coinbase ETH/USD sample data set to demonstrate the new APIs.
  • Automated release pipeline: Added GitHub workflow to automatically version, build, and publish artifacts to Maven Central. The pipeline uses prepare-release.sh to prepare release versions, creates release branches and tags, and publishes to Maven Central. Added scripts/tests/test_prepare_release.sh to validate release preparation functionality.
  • Enhanced performance reporting: Added Gson DurationTypeAdapter, BasePerformanceReport, and revised TradingStatementGenerator so generated statements always carry their source strategy and trading record for complete traceability.
  • UnaryOperation helper: Added substitute helper function to UnaryOperation for easier indicator transformations.
  • Testing infrastructure: Added tests for DoubleNumFactory and DecimalNumFactory, unit tests around indicator concurrency in preparation for future multithreading features, and DecimalNumPrecisionPerformanceTest to demonstrate precision vs performance trade-offs.
Changed
  • Enhanced rule serialization with custom name preservation: Improved RuleSerialization to preserve custom rule names set via setName() during serialization and deserialization. Custom names are now properly distinguished from default JSON-formatted names, enabling better strategy persistence and debugging workflows.
  • Improved trace logging with rule names: Enhanced trace logging in AbstractRule and BaseStrategy to use rule names (custom or default) in log output, making it easier to identify which rules are being evaluated during strategy execution.
  • Unified logging backend: Replaced Logback bindings with Log4j 2 log4j-slf4j2-impl so examples and tests share a single logging backend. Added Log4j 2 configurations for modules and tests. This simplifies logging configuration and ensures consistent behavior across all modules. Set unit test logging level to INFO and cleaned build output of all extraneous logging.
  • More accurate return calculations: Changed AverageReturnPerBarCriterion, EnterAndHoldCriterion, and ReturnOverMaxDrawdownCriterion to use NetReturnCriterion instead of GrossReturnCriterion to avoid optimistic bias. This provides more realistic performance metrics that account for trading costs.
  • Improved drawdown criterion behavior: ReturnOverMaxDrawdownCriterion now returns 0 instead of NaN for strategies that never operate, and returns net profit instead of NaN for strategies with no drawdown. This makes the criterion more robust and easier to use in automated analysis.
  • More flexible stop rules: StopGainRule and StopLossRule now accept any price Indicator instead of only ClosePriceIndicator. Users can now create stop rules based on high, low, open, or custom price indicators for more sophisticated exit strategies.
  • Enhanced swing indicators: Reworked RecentSwingHighIndicator and RecentSwingLowIndicator with plateau-aware, NaN-safe logic and exposed getLatestSwingIndex for downstream analysis. This improves reliability and enables more advanced swing-based strategies.
  • Configurable numeric precision: Reduced default DecimalNum precision from 32 to 16 digits, improving performance while still maintaining sufficient accuracy for most use cases. Users can configure precision based on their specific needs.
  • Improved numeric indicator chaining: NumericIndicator's previous method now returns a NumericIndicator, enabling fluent method chaining for indicator composition.
  • Enhanced trading statements: Added TradingRecord property to TradingStatement for more downstream flexibility around analytics, enabling users to access the full trading record from performance reports.
  • Better code maintainability: Removed magic number 25 in UpTrendIndicator and DownTrendIndicator, making the code more maintainable and self-documenting.
  • Modernized build infrastructure: #​1399 Refreshed dependencies, plugins, and build tooling while enforcing Java 21 and Maven 3.9+. This ensures compatibility with modern development environments and security updates.
  • Maven Central distribution: Changed snapshot distribution to Maven Central after OSSRH end-of-life, ensuring continued availability of snapshot builds.
  • Improved bar series builder: BaseBarSeriesBuilder now automatically uses the NumFactory from given bars instead of the default one, ensuring consistent numeric types throughout bar series construction.
Fixed
  • Kalman filter robustness: Guarded KalmanFilterIndicator against NaN/Infinity measurements to keep the Kalman state consistent, preventing calculation errors when input data contains invalid values.
  • Recursive indicator stack overflow: Fixed recursion bug in RecursiveCachedIndicator that could lead to stack overflow in certain situations, improving reliability for complex indicator calculations.
  • Cost tracking in enter-and-hold: Fixed EnterAndHoldCriterion to properly keep track of transaction and hold costs, ensuring accurate performance comparisons.
  • Convergence divergence indicator: Fixed strict rules of ConvergenceDivergenceIndicator for more accurate divergence detection.
  • Return over max drawdown calculation: Fixed calculation for ReturnOverMaxDrawdownCriterion and VersusEnterAndHoldCriterion to ensure accurate performance metrics.
  • Profit/loss percentage calculation: Refactored ProfitLossPercentageCriterion to correctly calculate aggregated return, fixing previous calculation errors.
  • Bar series trade parameter order: Fixed swapped parameter naming in BaseBarSeries#addTrade(final Number tradeVolume, final Number tradePrice) to match the method signature order.
  • Bar builder aggregation: Fixed aggregation of amount and trades in VolumeBarBuilder and TickBarBuilder to ensure accurate bar construction.
  • SMA unstable period calculation: Corrected the calculation of unstable bars for the SMA indicator, ensuring indicators report accurate stability periods.
  • Java 25 compatibility: Fixed PivotPointIndicatorTest to work with Java 25, ensuring compatibility with the latest Java versions. Note that this does not mean Ta4j as a whole now supports Java 25, that will come in a future release.
  • JSON data loading: Fixed bug in MovingAverageCrossOverRangeBacktest that prevented successfully loading test JSON bar data.
  • Build performance: Updated GitHub test workflow to cache dependencies for quicker builds, reducing CI/CD execution time.
  • Documentation: Updated test status badge on README and clarified PnL criterion comments about trading costs for better user understanding.
Removed/Deprecated
  • Deprecated indicator classes: Removed TransformIndicator and CombineIndicator in favor of the consolidated BinaryOperationIndicator and UnaryOperationIndicator classes. Action required: Migrate any code using these deprecated classes to the new consolidated API.

Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot enabled auto-merge (squash) November 19, 2025 21:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant