design-patterns - 计算动态数据的设计模式
问题描述
我正在编写一个计算各种股票价格指标的项目,例如简单/指数移动平均线等。我正在使用的数据是实时的,这些指标中的大多数都是迭代的,并使用以前的值来确定当前值.
以指数移动平均线为例。如果我要基于 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。如果每次都重新计算整个值范围,则会对性能造成明显影响,因此缓存过去的值并仅重新计算当前值很重要。
我想知道是否有某种设计模式允许这种类型的功能。理想情况下,我希望每个指标都从基本模式类继承,以保持一切统一。
解决方案
听起来像一个累加器模式。我可以用(类似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();
}
}
推荐阅读
- php - 如何在主域和子域的 Laravel 上使用
- sql - 使用数组列将表连接到自身?
- karma-jasmine - 如何在 karma.conf.js 中加载第三方库
- php - 不要自动调整上传的png大小
- javascript - “函数”构造函数在 javascript 中如何工作?
- google-apps-script - 如何将单元格引用传递给 Apps 脚本自定义函数?
- r - 在 Mac OS X High Sierra 上安装 rgeos 和 rgdal 的问题
- python - (速度计算)如何做简单的方法?
- python - 访问Python中另一个函数中的函数的值列表?
- matlab - 用于拆分数据集的自组织地图