33template <
class T,
typename In,
typename Out>
36 Out
get() const noexcept {
37 return static_cast<const T*
>(
this)->
get();
40 return static_cast<T*
>(
this)->
update(value);
60 double data = std::nan(
"");
61 std::vector<double> prev;
66 SMA(
size_t window_size): prev(window_size, std::nan(
"")) {}
67 double get() const noexcept {
return data; }
69 if (len < prev.size())
75 pos = (pos + 1) % prev.size();
76 data = len < prev.size()
78 : sum /
static_cast<double>(prev.size());
101 double data = std::nan(
"");
107 EMA(
size_t period,
double smoothing = 2.0)
108 : alpha(smoothing / (period + 1.0)), period(period) {}
109 double get() const noexcept {
return data; }
115 }
else if (len == period) {
120 prev = (value * alpha) + (prev * (1.0 - alpha));
144 double data = std::nan(
"");
146 std::vector<double> prev;
152 MVar(
size_t window_size,
size_t dof)
153 : sma(window_size), prev(window_size, std::nan(
"")), dof(dof) {}
154 double get() const noexcept {
return data; }
156 if (len < prev.size()) len++;
158 pos = (pos + 1) % prev.size();
160 if (len < prev.size())
163 for (
size_t prev_value : prev) {
164 if (std::isnan(prev_value))
166 double diff = prev_value - sma.get();
167 accum += diff * diff;
169 data = accum / (prev.size() - dof);
190 double data = std::nan(
"");
194 RSI(
size_t period): gains(period), losses(period) {}
195 double get() const noexcept {
return data; }
198 gains.update(diff >= 0.0 ? diff : 0.0);
199 losses.update(diff < 0 ? -diff : 0.0);
200 if (std::isnan(losses.get()))
202 data = 100.0 - 100.0 / (1.0 + gains.get() / losses.get());
241 MACD(
size_t short_period,
size_t long_period,
size_t signal_period,
242 double smoothing = 2.0)
243 : short_ema(short_period, smoothing),
244 long_ema(long_period, smoothing),
245 signal_ema(signal_period, smoothing),
246 start(std::fmax(short_period, long_period)) {}
250 short_ema.update(value);
251 long_ema.update(value);
253 return {std::nan(
""), std::nan(
""), std::nan(
"")};
254 double diff = short_ema.get() - long_ema.get();
255 signal_ema.update(diff);
256 data = {diff, signal_ema.get(), diff - signal_ema.get()};
276 double get() const noexcept {
return data; }
281 double curr = (value - peak) / peak;
Definition indicators.h:100
double get() const noexcept
Definition indicators.h:109
EMA(size_t period, double smoothing=2.0)
Definition indicators.h:107
double update(double value)
Definition indicators.h:110
Base indicator class using CRTP for static polymorphism.
Definition indicators.h:34
Out get() const noexcept
Definition indicators.h:36
Out update(In value)
Definition indicators.h:39
MACDResult get() const noexcept
Definition indicators.h:247
MACD(size_t short_period, size_t long_period, size_t signal_period, double smoothing=2.0)
Definition indicators.h:241
MACDResult update(double value)
Definition indicators.h:248
Definition indicators.h:272
double update(double value)
Definition indicators.h:277
double get() const noexcept
Definition indicators.h:276
MVar(size_t window_size, size_t dof)
Definition indicators.h:152
double get() const noexcept
Definition indicators.h:154
double update(double value)
Definition indicators.h:155
double update(Ohlcv value)
Definition indicators.h:196
RSI(size_t period)
Definition indicators.h:194
double get() const noexcept
Definition indicators.h:195
Simple Moving Average (SMA).
Definition indicators.h:59
SMA(size_t window_size)
Definition indicators.h:66
double update(double value)
Definition indicators.h:68
double get() const noexcept
Definition indicators.h:67
Core data structures and types for the tzutrader library.
Definition indicators.h:216
double signal
Definition indicators.h:218
double macd
Definition indicators.h:217
double histogram
Definition indicators.h:219
Open-High-Low-Close-Volume candlestick data.
Definition defs.h:84
double close
Closing price.
Definition defs.h:89
double open
Opening price.
Definition defs.h:86