Ta4j Wiki

Documentation, examples and further information of the ta4j project

View the Wiki On GitHub

This project is maintained by ta4j Organization

Frequently Asked Questions

Is there a ta4j chat?

We are at discord. Create your account and join!

How to make a sell/short order when running a Strategy ?

You can determine the kind of order in the BarSeriesManager#run method with help of the OrderType parameter:

/**
 * Runs the provided strategy over the managed series.
 * <p>
 * Opens the trades with the specified {@link OrderType orderType} order.
 * @param strategy the trading strategy
 * @param orderType the {@link OrderType} used to open the trades
 * @return the trading record coming from the run
 */
public TradingRecord run(Strategy strategy, OrderType orderType) {
    return run(strategy, orderType, NaN);
}

The standard value for this mehtod is OrderType.BUY. That means entry signals generated by your Strategy will create a buying order and every exit signal will create a complementary (in this case OrderType.SELL) order. If you change this parameter to OrderType.SELL, the BarSeriesManager will create selling orders for entry signals and buying orders for exit signals.

What does Num or Function<Number, Num>?

With help of the Num interface and a Function<Number, Num> ta4j enables the use of different data types like Double or BigDecimal for storage and calculations. For further information take a look at the Num article.

Why does my Indicator not match someone else’s values?

If you are using an Indicator that uses an exponential moving average (EMA) such as EMAIndicator or RSIIndicator then you will have to understand data length dependence and convergence. The short answer is that you need to “seed” your Indicator with several hundred Bars of data prior to the indices for which you seek the values or those values will have relatively large error.

Since EMA’s use the prior value in their calculation, the values depend on how many prior values you have. Related, there is some question as to how to initialize the first value of an EMA. The first problem is generally solved by including at least 200 Bars of BarSeries data prior to the indices for which you are interested. The second problem is currently solved by setting the first EMA value to the first data value:

@Override
protected Num calculate(int index) {
    if (index == 0) {
        return indicator.getValue(0);
    }
}

If a different solution to initialization is required, then the EMAIndicator may be extended to a subclass with a different solution to if (index == 0).

Note that due to the volume of questions of this nature, you are highly encourage to fully educate yourself on these issues prior to being engaged in a conversation about them.

How to contribute?

Ta4j lives from your participation! For more information, take a look at the how to contribute section.