public static void main(String[] args) {

    // Getting a time series (from any provider: CSV, web service, etc.)
    TimeSeries series = CsvTradesLoader.loadBitstampSeries();

    // Getting the close price of the ticks
    double firstClosePrice = series.getTick(0).getClosePrice();
    System.out.println("First close price: " + firstClosePrice);
    // Or within an indicator:
    ClosePriceIndicator closePrice = new ClosePriceIndicator(series);
    // Here is the same close price:
    System.out.println(firstClosePrice == closePrice.getValue(0)); // equal to firstClosePrice

    // Getting the simple moving average (SMA) of the close price over the last 5 ticks
    SMAIndicator shortSma = new SMAIndicator(closePrice, 5);
    // Here is the 5-ticks-SMA value at the 42nd index
    System.out.println("5-ticks-SMA value at the 42nd index: " + shortSma.getValue(42));

    // Getting a longer SMA (e.g. over the 30 last ticks)
    SMAIndicator longSma = new SMAIndicator(closePrice, 30);

    // Ok, now let's building our trading strategy!

    // Initial strategy:
    //  - Buy when 5-ticks SMA crosses over 30-ticks SMA
    //  - Sell when 5-ticks SMA crosses under 30-ticks SMA
    Strategy ourStrategy = new IndicatorCrossedIndicatorStrategy(shortSma, longSma);

    // Cutomizing our strategy...
    // We want to buy if the price goes below a defined price (e.g $800.00)
    ourStrategy = new SupportStrategy(closePrice, ourStrategy, 800d);
    // And we want to sell if the price looses more than 3%
    ourStrategy = new StopLossStrategy(closePrice, ourStrategy, 3);
    // Or if the price earns more than 2%
    ourStrategy = new StopGainStrategy(closePrice, ourStrategy, 2);

    // Running our juicy trading strategy...
    Runner ourRunner = new Runner(series, ourStrategy);
    List<Trade> trades = ourRunner.run();
    System.out.println("Number of trades for our strategy: " + trades.size());

    // Analysis

    // Getting the cash flow of the resulting trades
    CashFlow cashFlow = new CashFlow(series, trades);

    // Running a reference strategy (for comparison) in which we buy just once
    Runner referenceRunner = new Runner(series, new JustBuyOnceStrategy());
    List<Trade> referenceTrades = referenceRunner.run();
    System.out.println("Number of trades for reference strategy: " + referenceTrades.size());

    // Comparing our strategy to the just-buy-once strategy according to a criterion
    TotalProfitCriterion criterion = new TotalProfitCriterion();

    // Our strategy is better than a just-buy-once one
    System.out.println("Total profit for our strategy: " + criterion.calculate(series, trades));
    System.out.println(
        "Total profit for reference strategy: " + criterion.calculate(series, referenceTrades));
  }
 /**
  * Builds a JFreeChart time series from a Ta4j time series and an indicator.
  *
  * @param tickSeries the ta4j time series
  * @param indicator the indicator
  * @param name the name of the chart time series
  * @return the JFreeChart time series
  */
 private static org.jfree.data.time.TimeSeries buildChartTimeSeries(
     TimeSeries tickSeries, Indicator<Decimal> indicator, String name) {
   org.jfree.data.time.TimeSeries chartTimeSeries = new org.jfree.data.time.TimeSeries(name);
   for (int i = 0; i < tickSeries.getTickCount(); i++) {
     Tick tick = tickSeries.getTick(i);
     chartTimeSeries.add(new Day(tick.getEndTime().toDate()), indicator.getValue(i).toDouble());
   }
   return chartTimeSeries;
 }
 @Override
 protected Decimal calculate(int index) {
   return series.getTick(index).getClosePrice();
 }