我正在编写一个计算各种股票价格指标的项目,例如简单/指数移动平均线等。我正在使用的数据是实时的,大多数这些指标都是迭代的,并使用以前的值来确定当前价值。
以指数移动平均线为例。如果我根据10个时期(EMA(10))计算EMA:
Initial: SMA(10) = [Sum of previous 10 periods]/10
Multiplier: ( 2 / ( # Periods + 1 ) = ( 2 / 11 ) = 0.1818
EMA: ( Current Value - EMA(Previous) ) * Multiplier + EMA(Previous)
当前时间段的值发生变化时,必须使用新值重新计算EMA。如果每次重新计算整个值范围,则会有明显的性能损失,因此缓存过去的值并仅重新计算当前值非常重要。
我想知道是否有某种设计模式允许这种类型的功能。理想情况下,我希望每个指标都从一个基本模式类继承,以保持一致。
答案 0 :(得分:0)
听起来像累加器模式。我可以用(类似java的代码)建模:
interface Accumulator {
void init();
void update(double value);
double getValue();
}
class SMA implements Accumulator {
private List<Double> window = new ArrayList<>();
private int limit;
SMA(int limit) {
this.limit = limit;
}
@Override
void init() {
window.clear();
}
@Override
void update(double value) {
if (window.size() >= limit) {
window.remove(0);
}
window.add(value);
}
@Override
double getValue() {
if (window.isEmpty()) {
return 0;
}
double sum = 0;
for (Double value: window) {
sum += value;
}
return sum/window.size();
}
}