/*
This file is part of jTotus.
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.
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.
You should have received a copy of the GNU General Public License
along with jTotus. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jlucrum.realtime.generators;
import org.jlucrum.realtime.eventtypes.StockTick;
import org.jlucrum.realtime.indicators.SimpleTechnicalIndicators;
import com.espertech.esper.client.EventBean;
import com.tictactec.ta.lib.MInteger;
import java.util.HashMap;
import org.apache.commons.lang.ArrayUtils;
/**
*
* @author Evgeni Kappinen
*/
public class RsiGenerator extends TickAnalyzer {
private SimpleTechnicalIndicators indicators = new SimpleTechnicalIndicators();
private HashMap<String, Double[]> stockIndx = new HashMap<String, Double[]>();
public RsiGenerator() {
super();
}
private Double[] storeValue(Double table[], double newValue) {
Double newTable[] = new Double[table.length + 1];
System.arraycopy(table, 0, newTable, 0, table.length);
newTable[table.length] = newValue;
return newTable;
}
//FIXME: bound period to Beta or test it !
//Double -> double/float ?
public void update(EventBean[] ebs, EventBean[] ebs1) {
for (int i = 0; i < ebs.length; i++) {
StockTick tick = (StockTick) ebs[i].getUnderlying();
Double[] data = stockIndx.get(tick.getStockName());
if (data == null) {
data = new Double[0];
}
data = storeValue(data, tick.getLatestPrice());
stockIndx.put(tick.getStockName(), data);
if (data.length < 60)
return;
double input[] = ArrayUtils.toPrimitive(data);
if (data.length > config.rsiPeriod + 1) {
MInteger outBegIdx = new MInteger();
MInteger outNbElement = new MInteger();
double[] output = indicators.RSI(input,
outBegIdx, outNbElement,
//config.rsiPeriod);
// data.length - 2); //FIXME: Which is better, calculate over all available data or tested period ????
50 - 2); //FIXME: Which is better, calculate over all available data or tested period ????
if (output != null) {
sendEvent(tick.getStockName(), output[output.length - 1]);
}
}
}
}
public String getName() {
return "RSI";
}
public String getListnerInfo() {
return "<html>"
+ "RSI - Relative Strength Index\n<br>"
+ "Sournce: http://tadoc.org/indicator/RSI.htm\n<br>"
+ "</html>";
}
}