org.jlucrum.realtime.training.TrainManager.java Source code

Java tutorial

Introduction

Here is the source code for org.jlucrum.realtime.training.TrainManager.java

Source

package org.jlucrum.realtime.training;

import org.jlucrum.realtime.BrokerWatcher;
import org.jlucrum.realtime.eventtypes.MarketData;
import org.jlucrum.realtime.eventtypes.MarketSignal;
import org.jlucrum.realtime.strategy.DecisionStrategy;
import org.jlucrum.realtime.strategy.SimpleIndicatorsOnlyStrategy;
import com.espertech.esper.client.EPRuntime;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jtotus.common.MethodResults;
import org.jtotus.config.ConfPortfolio;
import org.jtotus.config.ConfTrainWithLongTermIndicators;
import org.jtotus.config.ConfigLoader;
import org.jtotus.database.DataFetcher;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.jtotus.methods.MethodEntry;
import org.jtotus.methods.StatisticsFreqPeriod;
import org.jtotus.methods.TaLibRSI;
import org.jtotus.threads.MethodFuture;

/**
 * This file is part of JTotus.
 * <p/>
 * jTotus is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * <p/>
 * jTotus is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * <p/>
 * You should have received a copy of the GNU General Public License
 * along with jTotus.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
* Created by IntelliJ IDEA.
* Author: Evgeni Kappinen
* Date: 5/2/11
* Time: 6:38 PM
*/
public class TrainManager {
    private final ConfPortfolio portfolio = ConfPortfolio.getPortfolioConfig();
    private final DecisionStrategy strategy = new SimpleIndicatorsOnlyStrategy();
    private final EPRuntime epRuntime = BrokerWatcher.getMainEngine().getEPRuntime();
    private final DataFetcher fetcher = new DataFetcher();
    private LinkedList<MethodEntry> methods = new LinkedList<MethodEntry>();
    private LinkedList<MethodFuture> indResults = new LinkedList<MethodFuture>();
    private ConfTrainWithLongTermIndicators config = null;
    private ExecutorService threadExecutor = Executors.newCachedThreadPool();

    public TrainManager() {
        ConfigLoader<ConfTrainWithLongTermIndicators> loader = new ConfigLoader<ConfTrainWithLongTermIndicators>(
                "ConfTrainWithLongTermIndicators");
        config = loader.getConfig();
        if (config == null) {
            config = new ConfTrainWithLongTermIndicators();
            loader.storeConfig(config);
        }

        methods.add(new TaLibRSI());
        methods.add(new StatisticsFreqPeriod());
    }

    public void train() {
        HashMap<String, MethodResults> inputs = new HashMap<String, MethodResults>();
        DateTime currentDate = portfolio.inputStartingDate;

        while (currentDate.isBefore(portfolio.inputEndingDate.minusDays(1))) {
            final MarketData data = fetcher.prepareMarketData(portfolio.inputListOfStocks,
                    portfolio.inputStartIndicatorDate, currentDate);

            MethodFuture<MethodResults> futureTask = null;
            for (MethodEntry task : methods) {
                if (task.isCallable()) {
                    task.setMarketData(data);
                    futureTask = new MethodFuture<MethodResults>(task);
                    threadExecutor.execute(futureTask);
                    indResults.push(futureTask);
                } else {
                    //Lets support Runnable for now.
                    System.err.printf("TrainManager support only callable indicators ! : %s\n", task.getMethName());
                }
            }

            MethodResults res = null;
            while (indResults.size() > 0) {
                for (Iterator<MethodFuture> iter = indResults.iterator(); iter.hasNext();) {
                    MethodFuture<MethodResults> iterTask = iter.next();
                    if (iterTask.isDone()) {
                        try {
                            if ((res = iterTask.get()) != null) {
                                iter.remove();
                                inputs.put(res.getMethodName(), res);
                            }
                        } catch (InterruptedException ex) {
                            Logger.getLogger(TrainManager.class.getName()).log(Level.SEVERE, null, ex);
                            ex.printStackTrace();
                            System.exit(-1);
                        } catch (ExecutionException ex) {
                            Logger.getLogger(TrainManager.class.getName()).log(Level.SEVERE, null, ex);
                            ex.printStackTrace();
                            System.exit(-1);
                        }

                    }
                }
            }

            currentDate = performStrategyTest(inputs, currentDate);
            if (currentDate == null) {
                break;
            }
            System.out.printf("%s processing %s\n", this.getClass().getSimpleName(),
                    currentDate.toDate().toString());
            inputs.clear();
        }
    }

    private DateTime performStrategyTest(HashMap<String, MethodResults> inputs, DateTime currentDate) {
        boolean sold = false;
        MarketSignal signal = strategy.makeDecision(inputs);

        if (signal != null) {
            epRuntime.sendEvent(signal); // Buying

            BigDecimal maxWin = BigDecimal.valueOf(signal.getPriceToBuy())
                    .multiply(BigDecimal.valueOf(config.maxWin));
            BigDecimal maxLoss = BigDecimal.valueOf(signal.getPriceToBuy())
                    .multiply(BigDecimal.valueOf(config.maxLost));

            while (!sold) {
                currentDate = currentDate.plusDays(1);
                if (currentDate.isAfter(portfolio.inputEndingDate.minusDays(1))) {
                    System.out.printf("%s is done!\n", this.getClass().getSimpleName());
                    return null;
                }

                DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");
                System.out.printf("Train manager %s\n", formatter.print(currentDate));
                BigDecimal price = fetcher.fetchData(signal.getStockName(), currentDate, "CLOSE");

                if (price == null) {
                    continue;
                }

                if (price.compareTo(maxWin) > 0 || price.compareTo(maxLoss) <= 0) {
                    sold = true;
                    signal.setPriceToSell(price.doubleValue());
                    epRuntime.sendEvent(signal); // Buying
                }
            }
        }

        currentDate = currentDate.plusDays(1);
        return currentDate;
    }
}