Ta4j is an open source Java library for technical analysis

Overview

ta4j Build Status develop Build Status master Discord License: MIT Maven Central Sonatype Nexus (Snapshots)

Technical Analysis For Java

Ta4j main chart

Ta4j is an open source Java library for technical analysis. It provides the basic components for creation, evaluation and execution of trading strategies.


Features

  • 100% Pure Java - works on any Java Platform version 8 or later
  • More than 130 technical indicators (Aroon, ATR, moving averages, parabolic SAR, RSI, etc.)
  • A powerful engine for building custom trading strategies
  • Utilities to run and compare strategies
  • Minimal 3rd party dependencies
  • Simple integration
  • One more thing: it's MIT licensed

Maven configuration

Ta4j is available on Maven Central. You just have to add the following dependency in your pom.xml file.

<dependency>
  <groupId>org.ta4jgroupId>
  <artifactId>ta4j-coreartifactId>
  <version>0.14version>
dependency>

For snapshots, add the following repository to your pom.xml file.

<repository>
    <id>sonatype snapshotsid>
    <url>https://oss.sonatype.org/content/repositories/snapshotsurl>
repository>

The current snapshot version is 0.15-SNAPSHOT from the develop branch.

<dependency>
  <groupId>org.ta4jgroupId>
  <artifactId>ta4j-coreartifactId>
  <version>0.15-SNAPSHOTversion>
dependency>

You can also download example code from the maven central repository by adding the following dependency to your pom.xml:

<dependency>
  <groupId>org.ta4jgroupId>
  <artifactId>ta4j-examplesartifactId>
  <version>0.14version>
dependency>

Getting Help

The wiki is the best place to start learning about ta4j. For more detailed questions, please use the issues tracker.

Contributing to ta4j

Here are some ways for you to contribute to ta4j:

See also: the contribution policy and Code of Cunduct

Issues
  • Extract interface of BigDecimal to provide calculations with other data types

    Extract interface of BigDecimal to provide calculations with other data types

    Issue #75 shows that there is also a big demand for increasing the performance of ta4j. It also shows that with BigDecimal the potential of increasing performance is very limited.

    To satisfy the demand for performance and precision, I think it will be a good solution to create several classes like FastDecimal and ExactDecimal which implement an interface of the current Decimal class.

    • FastDecimal will have a double as delegate and will be standard (?)

    • ExactDecimal will have a BigDecimal as delegate and can be used as parameter by creating a Tick/TimeSeries

    With a Decimal interface it will be also possible to have further data types for calculation. E.g. if someone needs only integers he can do so with a custom class that implement the interface.

    enhancement performance 
    opened by team172011 58
  • Lack of performance

    Lack of performance

    Hello guys,

    I'm watching this project since few months. It seems to be good (tests, docs, etc.). But.. this framework has a lack of performance.

    Here is an example:

    `
    @Test public void testIfQuickEnough() { long start = System.currentTimeMillis(); int initialCapacity = 54 * 5 * 24 * 60 * 3;

        double[] input = new double[initialCapacity];
        for (int i = 0; i < input.length; i++) {
            input[i] = 5d;
        }
    
        /**
         * just adding close price instead timestamp with close price:
         *   AnotherMockTimeSeries: ticks.add(new MockTick(data[i]));
             //MockTimeSeries: ticks.add(new MockTick(ZonedDateTime.now().with(ChronoField.MILLI_OF_SECOND, i), data[i]));
         */
        TimeSeries timeSeries = new AnotherMockTimeSeries(input);
    
        Decimal average = null;
        for (int h = 2; h < 3; h++) {
            SMAIndicator quoteSMA = new SMAIndicator(new ClosePriceIndicator(timeSeries), h);
            for (int i = 0; i < timeSeries.getTickCount(); i++) {
                average = quoteSMA.getValue(i);
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("average = " + average);
    
        System.out.println("Time elapsed: " + (end - start));
    }
    

    `

    Output: average = 5 Time elapsed: 15811

    if you use int h = 2; h < 200 instead h < 3: ... stopped java process... too slow.... 200x15811~3 000 000 ms ~50 min.

    ... VERY SLOW...

    Used Macbook Pro Mid 2014. Looks like this framework is only for realtime trading :)

    For comparison:

    Are there any roadmap issues to increase performance?

    enhancement question 
    opened by damir78 51
  • Unable to use because of ZonedDateTime

    Unable to use because of ZonedDateTime

    Hi I want to use this library for Android App. But this library uses ZonedDateTime class which is supported only in Oreo (API 26) based Android devices. You can confirm it from below URL : https://developer.android.com/reference/java/time/ZonedDateTime.html So my question is how I can use this library function for older API based devices. Oreo is not available on almost 80% of total Android devices as of now.

    enhancement question 
    opened by yogikorke 45
  • Update AnalysisCriterion to Num

    Update AnalysisCriterion to Num

    Fixes #186 .

    Changes proposed in this pull request:

    • Fixed requirements as mentioned in #186

    • Use Num in AnalysisCriterion

    • But keep Criterion parameters as primitives

    • [x] added an entry to the unreleased section of CHANGES.md

    Notes:

    • There was 1 test, namely NumberOfTradesTest::calculateWithOneTrade that passed the TimeSeries as null, but I changed this to some series, otherwise series.numOf() would give a null pointer exception,
    • LinearTransactionCostCriterionTest is giving different results, it's not consistent anymore with external data, nor the test data, it looks to me like a precision diff between double/Num. Please check it. I think we should change the xls/tests to reflect the new outcome. (Because of this the tests are currently failing)
    • Don't merge yet, until LinearTransactionCostCriterion(Test) is fixed :)
    opened by MarijnKoesen 30
  • Trade != Order

    Trade != Order

    We know a trade is not an order. However, ta4j uses Trade and Order in a confusing way.

    • in ta4j, a trade is a pair of entry and exit order, however, an order is not a trade and even two orders are not a trade.

    Maybe we should consider to rename the followings: -rename Order.class to Trade.class -rename Trade.classto TradePair.class (or other better names?)

    Or?

    opened by nimo23 24
  • Construct StochasticRSI indicator properly

    Construct StochasticRSI indicator properly

    Hello,

    I am trying to build Stochastic RSI indicator. In StochasticRSI there are K, D, Rsi and Stochastic parameters.

    I want build StochRSI(14, 9, 3, 3):

    • RSI = 14
    • Stoch = 9
    • K = 3
    • D = 3
    StochasticOscillatorKIndicator k = new StochasticOscillatorKIndicator(series, 3);
    StochasticOscillatorDIndicator d = new StochasticOscillatorDIndicator(k);
    RSIIndicator rsi = new RSIIndicator(d, 14); // I think it's wrong
    StochasticRSIIndicator stochRsi = new StochasticRSIIndicator(rsi, 9);
    

    Result of the stochRsi calculation is totally wrong when compare to result with exchange's graphs. How can I construct StochasticRSIIndicator properly?

    enhancement question 
    opened by FatihErdem 24
  • "constrained time" series vs "subseries"

    I have a timeseries s and want to create a new subseries s1 from it. s has 20 ticks with index 0 to 19. s1 should be a subseries from s containing only the last 10 ticks from the actual index backwards.

    TimeSeries s1 = new BaseTimeSeries(s, index - 10, index);

    However, after printing "s1.getTickData()" and "series.getTickData()", both timeseries has the same ticks included. s1 normally should have only 10 ticks included and not 20. What is wrong?

    bug change enhancement 
    opened by nimo23 21
  • Fixes #287 Implemented a way to find the best result for multiple strategies by submitting a range of numbers while backtesting

    Fixes #287 Implemented a way to find the best result for multiple strategies by submitting a range of numbers while backtesting

    Fixes #287 Implemented a way to find the best result for multiple strategies by submitting a range of numbers while backtesting

    • [x] added an entry to the unreleased section of CHANGES.md
    opened by jansoren 21
  • ADX Constructors

    ADX Constructors

    Fixes:

    Fixed numOf() inside calculate() for ADX related indicators using existing final instance field pattern.

    Changes proposed in this pull request:

    Added constructors so ADX and related objects can be created and used with substantially fewer "child" indicators. Reduces the number of array lists (27 to 12, by my count) if ADX and +/-DI are used together in a strategy. Might improve processing a little. These constructors will create 1 instance of each object, rather than separate objects that end up calculating and caching the same numbers.

    Moved DX to adx package. The ADX constructor is the only place DX is referenced.

    +DM and -DM were also moved to adx package, only being referenced by +/-DI respectively. There is a small chance these 3 moves will break import statements in 0.13 user code, but it seems unlikely that people would instantiate these objects independently.

    Added getBarCount() and toString to ATR.

    opened by johnthetireless 21
  • New: convergence and divergence rules

    New: convergence and divergence rules

    Changes proposed in this pull request:

    • ConvergenceDivergenceIndicator.java

    • ChaikinOscillator.java

    • add parameter "name" in (Base)Strategy.java

    • [x] added an entry to the unreleased section of CHANGES.md

    opened by nimo23 21
  • remove unused imports

    remove unused imports

    Changes proposed in this pull request:

    • remove unused imports

    • [ ] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by nimo23 0
  • New: CriterionIndicator

    New: CriterionIndicator

    Changes proposed in this pull request:

    • CriterionIndicator.java

    • [x] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    Replaces https://github.com/ta4j/ta4j/pull/747.

    opened by nimo23 0
  • ValueAtRiskCriterion: rename var to valueAtRisk

    ValueAtRiskCriterion: rename var to valueAtRisk

    Changes proposed in this pull request:

    • rename var to valueAtRisk

    In Java, var is a reserved keyword which should not be used as a property/parameter name.

    • [ ] added an entry with related ticket number(s) to the unreleased section of CHANGES.md
    opened by nimo23 0
  • Simplify criterions

    Simplify criterions

    Changes proposed in this pull request:

    • NumberOfWinningPositionsCriterion removed in favour of NumberOfPositionsCriterion

    • NumberOfLosingPositionsCriterion removed in favour of NumberOfPositionsCriterion

    • WinningPositionsRatioCriterion removed in favour of PositionsRatioCriterion

    • LosingPositionsRatioCriterion removed in favour of PositionsRatioCriterion

    • NetProfitCriterion removed in favour of NetCriterion

    • NetLossCriterion removed in favour of NetCriterion

    • GrossProfitCriterion removed in favour of GrossCriterion

    • GrossLossCriterion removed in favour of GrossCriterion

    • AverageProfitCriterion removed in favour of AverageCriterion

    • AverageLossCriterion removed in favour of AverageCriterion

    • [x] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by nimo23 4
  • Feature: Simplified indicator cache

    Feature: Simplified indicator cache

    Fixes #.

    Changes proposed in this pull request:

    • Reduce complexity by replacing complicated cache index computations with simple TreeMap-Konstruct

    • The new TA4JCache sorts automatically by indeces, and removes the least results regarding the index, if the capacity of the corresponding series is exceeded-

    • [x] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by MarcDahlem 2
  • Feature: trade-dependent indicators

    Feature: trade-dependent indicators

    Fixes #742.

    Changes proposed in this pull request:

    • Allow trade based indicators, which can easily calculate their values by using the last executed trade

    • Added a break even indicator based on the last executed entry position

    • [x] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by MarcDahlem 0
  • TradingRecord: support consecutive trades from same TradeType

    TradingRecord: support consecutive trades from same TradeType

    This issue is for discussion (brainstorming) the best solution (implementation) to provide the ability to record consecutive trades from the same TradeType. After discussion, a PR should be created.

    In short:

    Redesign of backtesting logic (buy/sell at any index, drop the "just one open trade"-concept)

    The actual (Base)TradingRecord (and all Criteria) does not support the following:

    @Test
    public void createConsecutiveEntries() {
    
        TradingRecord record = new BaseTradingRecord();
    
        // Currently, consecutive entries or exits are not supported. 
        // Only the first entry is recorded, the others are silently ignored:
       
        // we have a BUY-order executed in 4 trades (at different times with different quantites)
        record.enter(0);
        record.enter(1);
        record.enter(2);
        record.enter(3);
    
        // we have a SELL-order executed in 2 trades (at different times with different quantites)
        record.exit(4);
        record.exit(5);
    
        System.out.println(record);
    }
    

    Additional informations:

    • https://github.com/ta4j/ta4j/issues/487
    enhancement 
    opened by nimo23 4
  • Improve BarSeries with numType

    Improve BarSeries with numType

    Changes proposed in this pull request:

    Currently, all BarSeries (with its builder) needs Function<Number, Num> function. Instead of providing such function anywhere (where it is needed), we can replace it by providing an example of a Num (the property is called numType which is a common Num). Having the direct glue with Num instead of its Function (when constructing the BarSeries), provides the following benefits:

    • we use numType#function() to get its function: no need to instantiate a new Function for every BarSeries-constructors or BarSeriesBuilders.
    • we use static defined Num's (for example, DecimalNum.ZERO): no need to instantiate a new Num for every BarSeries-constructors or BarSeriesBuilders
    • with Function<Number, Num> function, it's not possible to determine its (runtime) Num-Type. With numType, it is easy to determine its runtime type.
    • using numType instead of DecimalNum::valueOf, we can provide both the function (by numType.function()) and also determine its type - vice versa, it's not possible.
    • we can use series.zero(), series.one(), series().hundred() (etc.) which get its value by its static defined properties in the dedicated Num.class (this avoids the need to instantiate, for example, series.valueOf(1)).
    • we can use those static series.zero() on any other place (for example, indicators). Actually, we need at least one number to derive its constants (0,1,100, etc). Having numType instead of numFunction as a first class property in any barSeries solves this issue and we can access those static nums without the need of an instantiated num. So we can call easily series.zero() instead of numberOfTen.zero() (which is a little irritating).
    • it eliminates the excessive instance creation of num-function when putting it, for example, in BarSeries-constructor or Bar-constructor. We always use one static constant from the Num-class (for example, DoubleNum.ZERO) and put this into those constructors.

    Please review this PR carefully (in case I did forget something).

    By the way:

    • if this PR is taken, then we can easily replace all those valueOf(0), valueOf(1), valueOf(100) by series.zero(), series.one(), series.hundred() in the next step. Actually, we need at least one instantiated Num to access its constants. (A BarSeries can be empty, thus indicators cannot actually acccess the Num constants. Having numType solves this issue.).

    • with numType, there is no more need to instantiate a Num and/or a Num-function on every construction (because both, numType and numfunction can be easily accessed by constants defined in the Num-classes, for example: within BaseBarConstructor, I can put Decimal.ZERO to provide numType and implicitly numFunction)

    • [ ] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by nimo23 1
  • Add: NumberOfConsecutivePositionsCriterion

    Add: NumberOfConsecutivePositionsCriterion

    Changes proposed in this pull request:

    • :tada: Enhancement added NumberOfConsecutiveLosingPositionsCriterion

    • [x] added an entry with related ticket number(s) to the unreleased section of CHANGES.md

    opened by nimo23 4
  • Position-based indicators

    Position-based indicators

    I have checked existing issues and wiki

    If possible provide a minimal working example!

    Hi,

    I created a break-even indicator, which contains the value that must be reached to close a position with a positive net profit (regarding transaction costs).

    grafik

    So far, I constructed the indicator manually by executing a strategy and storing all buy and sell timepoints/index positions. Is there a way to calculate such an position-based indicator live ?

    i.e. can I get the already executed trades/ opened and closed positions inside the "protected Num calculate(int index) { " - Method ?

    Here the code I have so far:

            ...
            BigDecimal buyFeeFactor = BigDecimal.ONE.add(buyFee);
            BigDecimal sellFeeFactor = BigDecimal.ONE.subtract(sellFee);
            breakEvenCalculator = TransformIndicator.divide(TransformIndicator.multiply(new ClosePriceIndicator(series), buyFeeFactor), sellFeeFactor);
            ...
            
        @Override
        protected Num calculate(int index) {
            Integer lastBuyIndex = sortedBuyIndeces.floor(index);
            Integer lastSellIndex = sortedSellIndeces.floor(index);
            if (lastBuyIndex == null) {
                return NaN;
            }
    
            if (lastSellIndex == null || lastSellIndex <= lastBuyIndex || lastSellIndex == index) {
                    return breakEvenCalculator.getValue(lastBuyIndex);
            }
            return NaN;
        }
    

    The problem with this code is, that I have to collect all buy and sell points manually (sortedBuyIndeces, sortedSellIndeces) ... Is there a better way that I didn't see so far?

    question 
    opened by MarcDahlem 2
Releases(0.14)
  • 0.14(Apr 25, 2021)

    Release 0.14 of the Ta4j library.

    This is the first release via GitHub Releases. Ta4j is also available on the maven central repository

    www.ta4j.org

    CHANGELOG:

    0.14 (released April 25, 2021)

    Breaking

    • Breaking: PrecisionNum renamed to DecimalNum
    • Breaking: AverageProfitableTradesCriterion renamed to WinningTradesRatioCriterion
    • Breaking: AverageProfitCriterion renamed to AverageReturnPerBarCriterion
    • Breaking: BuyAndHoldCriterion renamed to BuyAndHoldReturnCriterion
    • Breaking: RewardRiskRatioCriterion renamed to ReturnOverMaxDrawdownCriterion
    • Breaking: ProfitLossCriterion moved to PnL-Package
    • Breaking: ProfitLossPercentageCriterion moved to PnL-Package
    • Breaking: TotalProfitCriterion renamed to GrossReturnCriterion and moved to PnL-Package.
    • Breaking: TotalProfit2Criterion renamed to GrossProfitCriterion and moved to PnL-Package.
    • Breaking: TotalLossCriterion renamed to NetLossCriterion and moved to PnL-Package.
    • Breaking: package "tradereports" renamed to "reports"
    • Breaking: NumberOfTradesCriterion renamed to NumberOfPositionsCriterion
    • Breaking: NumberOfLosingTradesCriterion renamed to NumberOfLosingPositionsCriterion
    • Breaking: NumberOfWinningTradesCriterion renamed to NumberOfWinningPositionsCriterion
    • Breaking: NumberOfBreakEvenTradesCriterion renamed to NumberOfBreakEvenPositionsCriterion
    • Breaking: WinningTradesRatioCriterion renamed to WinningPositionsRatioCriterion
    • Breaking: TradeStatsReport renamed to PositionStatsReport
    • Breaking: TradeStatsReportGenerator renamed to PositionStatsReportGenerator
    • Breaking: TradeOpenedMinimumBarCountRule renamed to OpenedPositionMinimumBarCountRule
    • Breaking: Trade.class renamed to Position.class
    • Breaking: Order.class renamed to Trade.class
    • Breaking: package "tradereports" renamed to "reports"
    • Breaking: package "trading/rules" renamed to "rules"
    • Breaking: remove Serializable from all indicators
    • Breaking: Bar#trades: changed type from int to long

    Fixed

    • Fixed Trade: problem with profit calculations on short trades.
    • Fixed TotalLossCriterion: problem with profit calculations on short trades.
    • Fixed BarSeriesBuilder: removed the Serializable interface
    • Fixed ParabolicSarIndicator: problem with calculating in special cases
    • Fixed BaseTimeSeries: can now be serialized
    • Fixed ProfitLossPercentageCriterion: use entryPrice#getValue() instead of entryPrice#getPricePerAsset()

    Changed

    • Trade: Changed the way Nums are created.
    • WinningTradesRatioCriterion (previously AverageProfitableTradesCriterion): Changed to calculate trade profits using Trade's getProfit().
    • BuyAndHoldReturnCriterion (previously BuyAndHoldCriterion): Changed to calculate trade profits using Trade's getProfit().
    • ExpectedShortfallCriterion: Removed unnecessary primitive boxing.
    • NumberOfBreakEvenTradesCriterion: Changed to calculate trade profits using Trade's getProfit().
    • NumberOfLosingTradesCriterion: Changed to calculate trade profits using Trade's getProfit().
    • NumberOfWinningTradesCriterion: Changed to calculate trade profits using Trade's getProfit().
    • ProfitLossPercentageCriterion: Changed to calculate trade profits using Trade's entry and exit prices.
    • TotalLossCriterion: Changed to calculate trade profits using Trade's getProfit().
    • TotalReturnCriterion (previously TotalProfitCriterion): Changed to calculate trade profits using Trade's getProfit().
    • WMAIndicator: reduced complexity of WMAIndicator implementation

    Removed/Deprecated

    • MultiplierIndicator: replaced by TransformIndicator.
    • AbsoluteIndicator: replaced by TransformIndicator.

    Added

    • Enhancement Improvements on gitignore
    • Enhancement Added TradeOpenedMinimumBarCountRule - rule to specify minimum bar count for opened trade.
    • Enhancement Added DateTimeIndicator a new Indicator for dates.
    • Enhancement Added DayOfWeekRule for specifying days of the week to trade.
    • Enhancement Added TimeRangeRule for trading within time ranges.
    • Enhancement Added floor() and ceil() to Num.class
    • Enhancement Added getters getLow() and getUp() in CrossedDownIndicatorRule
    • Enhancement Added BarSeriesUtils: common helpers and shortcuts for BarSeries methods.
    • Enhancement Improvements for PreviousValueIndicator: more descriptive toString() method, validation of n-th previous bars in
    • Enhancement Added Percentage Volume Oscillator Indicator, PVOIndicator.
    • Enhancement Added Distance From Moving Average Indicator, DistanceFromMAIndicator.
    • Enhancement Added Know Sure Thing Indicator, KSTIndicator. constructor of PreviousValueIndicator
    • :tada: Enhancement added getGrossProfit() and getGrossProfit(BarSeries) on Trade.
    • :tada: Enhancement added getPricePerAsset(BarSeries) on Order.
    • :tada: Enhancement added convertBarSeries(BarSeries, conversionFunction) to BarSeriesUtils.
    • :tada: Enhancement added UnstableIndicator.
    • :tada: Enhancement added Chainrule.
    • :tada: Enhancement added BarSeriesUtils#sortBars.
    • :tada: Enhancement added BarSeriesUtils#addBars.
    • :tada: Enhancement added Num.negate() to negate a Num value.
    • :tada: Enhancement added GrossLossCriterion.class.
    • :tada: Enhancement added NetProfitCriterion.class.
    • :tada: Enhancement added chooseBest() method with parameter tradeType in AnalysisCriterion.
    • :tada: Enhancement added AverageLossCriterion.class.
    • :tada: Enhancement added AverageProfitCriterion.class.
    • :tada: Enhancement added ProfitLossRatioCriterion.class.
    • :tada: Enhancement added ExpectancyCriterion.class.
    • :tada: Enhancement added ConsecutiveWinningPositionsCriterion.class.
    • :tada: Enhancement added LosingPositionsRatioCriterion.class
    • :tada: Enhancement added Position#hasProfit.
    • :tada: Enhancement added Position#hasLoss.
    • :tada: Enhancement exposed both EMAs in MACD indicator
    Source code(tar.gz)
    Source code(zip)
    CHANGELOG.md(27.67 KB)
Micro second messaging that stores everything to disk

Chronicle Queue Contents Table of Contents Contents About Chronicle Software What is Chronicle Queue Java Docs Usage More benchmarks Downloading Chron

Chronicle Software : Open Source 2.3k Mar 13, 2021
GS Collections has been migrated to the Eclipse Foundation, re-branded as Eclipse Collections. https://www.eclipse.org/collections/

GS Collections is now Eclipse Collections We are pleased to announce that GS Collections has been migrated to the Eclipse Foundation, re-branded as Ec

null 1.8k Mar 8, 2021
JGit project repository (jgit)

Java Git An implementation of the Git version control system in pure Java. This project is licensed under the EDL (Eclipse Distribution License). JGit

Eclipse Foundation 977 Mar 10, 2021
An open-source Java library for Constraint Programming

Documentation, Support and Issues Contributing Download and installation Choco-solver is an open-source Java library for Constraint Programming. Curre

null 518 Mar 10, 2021
简繁体汉字转拼音的项目,解决多音字的问题。ElasticSearch、solr 的拼音分词工具

pinyin-plus 汉字转拼音的库,有如下特点 拼音数据基于 cc-cedict 、kaifangcidian 开源词库 基于拼音词库的数据初始化分词引擎进行分词,准确度高,解决多音字的问题 支持繁体字 支持自定义词库,词库格式同 cc-cedict 字典格式 api 简单,分为普通模式、索引模

TapTap 42 Mar 27, 2021
Dex : The Data Explorer -- A data visualization tool written in Java/Groovy/JavaFX capable of powerful ETL and publishing web visualizations.

Dex Dex : The data explorer is a powerful tool for data science. It is written in Groovy and Java on top of JavaFX and offers the ability to: Read in

Patrick Martin 1.2k Mar 11, 2021
Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas

Arthas Arthas is a Java Diagnostic tool open sourced by Alibaba. Arthas allows developers to troubleshoot production issues for Java applications with

Alibaba 25k Mar 13, 2021
A Java library for designing good error messages

JDoctor, a Java library for good error messages Designing good error messages is hard. In Java, most often, developers just rely on throwing exception

Cédric Champeau 25 Mar 26, 2021
Gephi - The Open Graph Viz Platform

Gephi - The Open Graph Viz Platform Gephi is an award-winning open-source platform for visualizing and manipulating large graphs. It runs on Windows,

Gephi 4.2k Mar 13, 2021
Google core libraries for Java

Guava: Google Core Libraries for Java Guava is a set of core Java libraries from Google that includes new collection types (such as multimap and multi

Google 40.6k Mar 13, 2021
A Light-weight Job Scheduling Framework

Sundial A Lightweight Job Scheduling Framework for Java. In a Nutshell Sundial makes adding scheduled jobs to your Java application a walk in the park

Knowm 230 Mar 8, 2021
Java Collections till the last breadcrumb of memory and performance

Koloboke A family of projects around collections in Java (so far). The Koloboke Collections API A carefully designed extension of the Java Collections

Roman Leventov 908 Mar 13, 2021
Java rate limiting library based on token/leaky-bucket algorithm.

Java rate-limiting library based on token-bucket algorithm. Advantages of Bucket4j Implemented on top of ideas of well known algorithm, which are by d

Vladimir Bukhtoyarov 1k Mar 13, 2021
Object-Oriented Java primitives, as an alternative to Google Guava and Apache Commons

Project architect: @victornoel ATTENTION: We're still in a very early alpha version, the API may and will change frequently. Please, use it at your ow

Yegor Bugayenko 616 Mar 13, 2021