package jtrade.indicator;
import jtrade.marketfeed.Bar;
import jtrade.marketfeed.BarListener;
import jtrade.marketfeed.Tick;
import jtrade.marketfeed.TickListener;
import jtrade.timeseries.TimeSeries;
import jtrade.timeseries.TimeSeriesArray;
import jtrade.timeseries.TimeSeriesOp;
import jtrade.util.Util;
import org.joda.time.DateTime;
public abstract class AbstractIndicator implements Indicator, TimeSeriesOp, BarListener, TickListener {
public AbstractIndicator() {
}
@Override
public double update(long t, double v) {
throw new UnsupportedOperationException();
}
@Override
public double update(long time, double[] values) {
return update(time, values[0]);
}
@Override
public double update(DateTime dt, double v) {
return update(dt.getMillis(), v);
}
@Override
public double update(DateTime dt, double[] values) {
return update(dt.getMillis(), values);
}
@Override
public double[] update(long[] times, double[] values) {
final int len = times.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
d[i] = update(times[i], values[i]);
}
return d;
}
@Override
public double[] update(long[] times, double[][] values) {
final int len = times.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
d[i] = update(times[i], values[i]);
}
return d;
}
public double[] update(DateTime[] dates, double[] values) {
final int len = dates.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
d[i] = update(dates[i].getMillis(), values[i]);
}
return d;
}
public double[] update(DateTime[] dates, double[][] values) {
final int len = dates.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
d[i] = update(dates[i].getMillis(), values[i]);
}
return d;
}
public double[] update(DateTime[] dates, double[] values, String property) {
try {
final int len = dates.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
update(dates[i].getMillis(), values[i]);
d[i] = Util.getDoubleProperty(this, property);
}
return d;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
public double[] update(DateTime[] dates, double[][] values, String property) {
try {
final int len = dates.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
update(dates[i].getMillis(), values[i]);
d[i] = Util.getDoubleProperty(this, property);
}
return d;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
public double[] update(long[] times, double[] values, String property) {
try {
final int len = times.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
update(times[i], values[i]);
d[i] = Util.getDoubleProperty(this, property);
}
return d;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
public double[] update(long[] times, double[][] values, String property) {
try {
final int len = times.length;
double[] d = new double[len];
for (int i = 0; i < len; i++) {
update(times[i], values[i]);
d[i] = Util.getDoubleProperty(this, property);
}
return d;
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
@Override
public double update(Bar bar) {
return update(bar.getDateTime().getMillis(), new double[] { bar.getOpen(), bar.getHigh(), bar.getLow(), bar.getClose(), bar.getVolume(), bar.getTrades() });
}
@Override
public double update(Tick tick) {
return update(tick.getDateTime().getMillis(), new double[] { tick.getAsk(), tick.getBid(), tick.getPrice(), tick.getVolume(), tick.getLastSize() });
}
@Override
public TimeSeries apply(TimeSeries ts) {
double[] values = update(ts.dates(), ts.data());
ts = new TimeSeriesArray(ts.dates().clone(), values);
reset();
return ts;
}
public TimeSeries apply(TimeSeries ts, String property) {
final int len = ts.size();
double[] newData = new double[len];
for (int i = 0; i < len; i++) {
update(ts.dates()[i].getMillis(), ts.data()[i]);
newData[i] = Util.getDoubleProperty(this, property);
}
ts = new TimeSeriesArray(ts.dates().clone(), newData);
reset();
return ts;
}
@Override
public void onTick(Tick tick) {
update(tick.getDateTime().getMillis(), tick.getMidPrice());
}
@Override
public void onBar(Bar bar) {
update(bar.getDateTime().getMillis(), bar.getClose());
}
}