Шаблон проектирования для расчета динамических данных - PullRequest
0 голосов
/ 17 мая 2018

Я пишу проект, который рассчитывает различные индикаторы цен акций, такие как простые / экспоненциальные скользящие средние и т. Д. Данные, с которыми я работаю, являются в реальном времени, и большинство этих индикаторов являются итеративными и используют предыдущие значения для определениятекущее значение.

Возьмите, например, экспоненциальную скользящую среднюю.Если бы я рассчитывал EMA на основе 10 периодов (EMA (10)):

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 необходимо пересчитать с новым значением.Если весь диапазон значений пересчитывается каждый раз, произойдет заметное снижение производительности, поэтому важно кэширование прошлых значений и только пересчет текущего значения.

Мне интересно, существует ли определенный шаблон проектированияэто позволяет для этого типа функциональности.В идеале я хотел бы, чтобы каждый индикатор наследовал от базового шаблонного класса, чтобы все было единообразно.

1 Ответ

0 голосов
/ 18 мая 2018

Походит на образец аккумулятора. Я могу смоделировать с помощью (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();
    }
}
...