首页 > 解决方案 > 计算动态数据的设计模式

问题描述

我正在编写一个计算各种股票价格指标的项目,例如简单/指数移动平均线等。我正在使用的数据是实时的,这些指标中的大多数都是迭代的,并使用以前的值来确定当前值.

以指数移动平均线为例。如果我要基于 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。如果每次都重新计算整个值范围,则会对性能造成明显影响,因此缓存过去的值并仅重新计算当前值很重要。

我想知道是否有某种设计模式允许这种类型的功能。理想情况下,我希望每个指标都从基本模式类继承,以保持一切统一。

标签: design-patterns

解决方案


听起来像一个累加器模式。我可以用(类似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();
    }
}

推荐阅读