1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// libs/v1/src/finance/trend.rs
//
//! # Трендовые фильтры (Moving Averages)
//!
//! Модуль содержит скалярные функции для расчета скользящих средних,
//! используемых для сглаживания временных рядов и определения трендов.
/// # Обновление простого скользящего среднего (SMA Update)
///
/// Вычисляет новое значение SMA на основе его предыдущего значения,
/// новой пришедшей цены и цены, которая выходит из скользящего окна.
///
/// ### Примеры
/// ```
/// use v1::finance::trend::sma_update;
///
/// let prev_sma = 100.0;
/// let new_price = 105.0;
/// let old_price = 95.0;
/// let period = 5;
///
/// let next_sma = sma_update(prev_sma, new_price, old_price, period);
/// // 100.0 + (105.0 - 95.0) / 5.0 = 102.0
/// assert_eq!(next_sma, 102.0);
/// ```
/// # Экспоненциальное скользящее среднее (EMA Update)
///
/// Рассчитывает новое значение EMA. Придает больший вес свежим данным,
/// из-за чего реагирует на изменения тренда быстрее, чем SMA.
///
/// ### Формула
/// ```text
/// alpha = 2 / (period + 1)
/// EMA = alpha * new_price + (1 - alpha) * prev_ema
/// ```
///
/// ### Примеры
/// ```
/// use v1::finance::trend::ema_update;
///
/// let prev_ema = 100.0;
/// let new_price = 110.0;
/// let period = 9; // alpha = 2 / (9 + 1) = 0.2
///
/// let next_ema = ema_update(prev_ema, new_price, period);
/// // 0.2 * 110.0 + 0.8 * 100.0 = 22.0 + 80.0 = 102.0
/// assert!((next_ema - 102.0).abs() < 1e-6);
/// ```