package org.jlucrum.realtime.strategy;
import org.jlucrum.realtime.eventtypes.MarketSignal;
import org.jtotus.common.MethodResults;
import org.jtotus.database.DataFetcher;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.jtotus.common.DayisHoliday;
/**
* 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/3/11
* Time: 7:48 PM
*/
public class SimpleIndicatorsOnlyStrategy implements DecisionStrategy {
double bestRsi = Double.MIN_VALUE;
String stockToBuy = null;
DataFetcher fetcher = new DataFetcher();
@Override
public MarketSignal makeDecision(HashMap<String, MethodResults> inputs) {
bestRsi = Double.MAX_VALUE;
MethodResults res = inputs.get("TaLibRSI");
HashMap<String, Double> indResults = res.getResults();
for (Map.Entry<String, Double> entry : indResults.entrySet()) {
if (entry.getKey().compareTo("Nokia Oyj") == 0)
continue;
double rsi = entry.getValue();
if (rsi > 40)
continue;
double freq = inputs.get("StatisticsFreqPeriod").getResults().get(entry.getKey());
if (freq < -0.04f || freq >= 0f) {
System.out.printf("rejected freq for:%s is :%f\n", entry.getKey(), freq);
continue;
}
if (bestRsi > freq * rsi) {
System.out.printf("Accpeted : rsi:%f freq: %f\n", rsi, freq);
bestRsi = freq * rsi;
stockToBuy = entry.getKey();
}
}
if (bestRsi == Double.MIN_VALUE) {
return null;
}
DateTime dateToFetch = res.getDate().plusDays(1);
while(DayisHoliday.isHoliday(dateToFetch)) {
dateToFetch = dateToFetch.plusDays(1);
}
if (res.getDate().isBefore(dateToFetch.plusDays(1))) {
return null;
}
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");
System.out.printf("price to buy for date %s '%s'\n", formatter.print(dateToFetch), stockToBuy);
//fixme:ensure that day corresponds to processing day!
double price = fetcher.fetchData(stockToBuy, dateToFetch, "CLOSE").doubleValue();
final MarketSignal signal = new MarketSignal();
signal.setStockName(stockToBuy);
signal.setPriceToBuy(price);
return signal;
}
}