package com.plectix.simulator.util;
/**
*
* @author ecemis
*/
public final class ExponentialMovingAverage {
private static final String NAME_PREFIX = "EMA-";
// parameters:
private String name;
private int timePeriod = -1;
private double percentage = -1.0;
// values:
private int itemCount = 0;
private double currentEMA = 0.0;
//*****************************************************************************
/**
*
* @param timePeriod
*/
public ExponentialMovingAverage(int timePeriod) {
super();
reset(timePeriod);
}
//*****************************************************************************
/**
*
* @param timePeriod
*/
private final void reset(int timePeriod) {
if (timePeriod <= 0) {
throw new RuntimeException("timePeriod " + timePeriod + " is not allowed!");
}
// parameters:
name = NAME_PREFIX + timePeriod;
this.timePeriod = timePeriod;
this.percentage = 2.0 / (1.0+timePeriod);
// values:
itemCount = 0;
currentEMA = 0.0;
}
//*****************************************************************************
/**
*
* @param newValue
*/
public final double addValue(double newValue) {
itemCount++;
if (itemCount <= timePeriod) {
// add new value:
currentEMA += newValue;
if (itemCount == timePeriod) {
currentEMA = currentEMA/itemCount;
}
} else {
currentEMA = currentEMA + percentage * (newValue - currentEMA);
}
return getCurrentValue();
}
//*****************************************************************************
/**
*
* @return the current value
*/
public final double getCurrentValue() {
if (itemCount < timePeriod) {
return currentEMA / itemCount;
}
return currentEMA;
}
//*****************************************************************************
/**
*
* @return the time period
*/
final int getTimePeriod() {
return timePeriod;
}
//*****************************************************************************
/**
*
* @param timePeriod
*/
public final void setTimePeriod(int timePeriod) {
this.timePeriod = timePeriod;
reset(timePeriod);
}
//*****************************************************************************
/*
*
*/
public static void main(String[] args) {
ExponentialMovingAverage exponentialMovingAverage = new ExponentialMovingAverage(10);
for (int i= 0; i< 4*exponentialMovingAverage.getTimePeriod(); i++) {
if (i < exponentialMovingAverage.getTimePeriod()) {
exponentialMovingAverage.addValue(5.0);
} else {
exponentialMovingAverage.addValue(15.0);
}
System.err.println(((i+1.0)/exponentialMovingAverage.getTimePeriod()) + "\t"
+ (exponentialMovingAverage.getCurrentValue()));
}
}
}