|
From: Márcio V. d. S. <mv...@us...> - 2007-05-12 19:39:36
|
Update of /cvsroot/tail/Tail/src/java/net/sf/tail/indicator/tracker In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv25546/src/java/net/sf/tail/indicator/tracker Added Files: RSIIndicator.java Log Message: implementado o EMA e implementando o RSI --- NEW FILE: RSIIndicator.java --- package net.sf.tail.indicator.tracker; import net.sf.tail.Indicator; public class RSIIndicator implements Indicator<Double> { private final Indicator<? extends Number> indicator; private final int timeFrame; private Double[] resultsList; public RSIIndicator(Indicator<? extends Number> indicator, int timeFrame) { this.indicator = indicator; this.timeFrame = timeFrame; resultsList = new Double[100]; } public Double getValue(int index) { if(resultsList.length <= index ) { resultsList = increaseLenght(resultsList); } if(resultsList[index] == null){ resultsList[index] = calculate(index); } return resultsList[index]; } private Double[] increaseLenght(Double[] array) { Double[] tmpDouble = new Double[array.length*2]; for (int i = 0; i < array.length; i++) { tmpDouble[i] = array[i]; } return tmpDouble; } private Double calculate(int index) { return 100d - 100d/(1 + calculateRS(index)); } private Double calculateRS(int index) { if(index < timeFrame){ /* TODO - Na interpretação da minha fonte (www.stockcharts.com) RSI de Ãndices menores que o timeFrame são null */ } else if( index == timeFrame){ /** Base */ return averageGain(index)/averageLoss(index); } double up = (averageGain(index) * (index) + currentGain(index))/(double)timeFrame; double down = (averageGain(index) * (index) + currentLoss(index))/(double)timeFrame; return up/down; } private double currentLoss(int index) { if(index == 0) return 0; double loss = indicator.getValue(index - 1).doubleValue() - indicator.getValue(index).doubleValue(); if( loss < 0 ) loss = 0; return loss; } private double currentGain(int index) { if(index == 0) return 0; double gain = indicator.getValue(index).doubleValue() - indicator.getValue(index-1).doubleValue(); if( gain < 0 ) gain = 0; return gain; } private double averageLoss(int index) { double result = 0; for (int i = 1; i <= index; i++) { if(indicator.getValue(i).doubleValue() < indicator.getValue(i-1).doubleValue() ){ result += indicator.getValue(i-1).doubleValue() - indicator.getValue(i).doubleValue(); } } return result/(double)timeFrame; } private double averageGain(int index) { double result = 0; for (int i = 1; i <= index; i++) { if(indicator.getValue(i).doubleValue() > indicator.getValue(i-1).doubleValue() ){ result += indicator.getValue(i).doubleValue() - indicator.getValue(i-1).doubleValue(); } } return result/(double)timeFrame; } } |