tzutrader
A composable C++ backtesting library for trading strategies (experimental)
Loading...
Searching...
No Matches
strategies.h
Go to the documentation of this file.
1#ifndef STRATEGIES_H
2#define STRATEGIES_H
3
4#include "indicators.h"
5
16
17namespace tzu {
18
19template <class T, typename In>
20class Strategy {
21public:
22 Signal update(const In& data) {
23 return static_cast<T*>(this)->update(data);
24 }
25};
26
34class SMACrossover: public Strategy<SMACrossover, SingleValue> {
35 SMA short_sma;
36 SMA long_sma;
37 double threshold;
38 Side last_side = Side::NONE;
39public:
40 SMACrossover(size_t short_period, size_t long_period,
41 double threshold = 0.0) :
42 short_sma(short_period), long_sma(long_period), threshold(threshold) {}
43
44 Signal update(const SingleValue& data) {
45 double short_value = short_sma.update(data.value);
46 double long_value = long_sma.update(data.value);
47 Signal signal = {data.timestamp, Side::NONE, data.value};
48 if ((short_value > long_value * (1.0 + threshold))
49 && (last_side != Side::BUY))
50 last_side = signal.side = Side::BUY;
51 else if ((short_value < long_value * (1.0 - threshold))
52 && (last_side != Side::SELL))
53 last_side = signal.side = Side::SELL;
54 return signal;
55 }
56};
57
68class RSIStrat: public Strategy<RSIStrat, Ohlcv> {
69 RSI rsi;
70 double oversold;
71 double overbought;
72 Side last_side;
73public:
74 RSIStrat(size_t window_size = 14, double oversold = 30.0,
75 double overbought = 70.0) :
76 rsi(window_size), oversold(oversold), overbought(overbought),
77 last_side(Side::NONE) {}
78 Signal update(const Ohlcv& data) {
79 double rsi_value = rsi.update(data);
80 Signal signal = {data.timestamp, Side::NONE, data.close};
81 if (std::isnan(rsi_value))
82 return signal;
83 if ((rsi_value < oversold) && (last_side != Side::BUY))
84 last_side = signal.side = Side::BUY;
85 else if ((rsi_value > overbought) && (last_side != Side::SELL))
86 last_side = signal.side = Side::SELL;
87 return signal;
88 }
89};
90
103 MACD macd;
104 double threshold;
105 Side last_side;
106public:
107 MACDStrat(size_t short_period, size_t long_period, size_t signal_period,
108 double smoothing = 2.0, double threshold = 0.0)
109 : macd(short_period, long_period, signal_period, smoothing),
110 threshold(threshold), last_side(Side::NONE) {}
111 Signal update(const SingleValue& data) {
112 MACDResult macd_value = macd.update(data.value);
113 Signal signal = {data.timestamp, Side::NONE, data.value};
114 if (std::isnan(macd_value.macd) || std::isnan(macd_value.signal))
115 return signal;
116 if ((macd_value.macd > macd_value.signal * (1.0 + threshold))
117 && (last_side != Side::BUY))
118 last_side = signal.side = Side::BUY;
119 else if ((macd_value.macd < macd_value.signal * (1.0 - threshold))
120 && (last_side != Side::SELL))
121 last_side = signal.side = Side::SELL;
122 return signal;
123 }
124};
125
126} // namespace tzu
127
128#endif // STRATEGIES_H
Signal update(const SingleValue &data)
Definition strategies.h:111
MACDStrat(size_t short_period, size_t long_period, size_t signal_period, double smoothing=2.0, double threshold=0.0)
Definition strategies.h:107
Definition indicators.h:233
Signal update(const Ohlcv &data)
Definition strategies.h:78
RSIStrat(size_t window_size=14, double oversold=30.0, double overbought=70.0)
Definition strategies.h:74
Definition indicators.h:189
Signal update(const SingleValue &data)
Definition strategies.h:44
SMACrossover(size_t short_period, size_t long_period, double threshold=0.0)
Definition strategies.h:40
Simple Moving Average (SMA).
Definition indicators.h:59
Definition strategies.h:20
Signal update(const In &data)
Definition strategies.h:22
Technical indicators for financial analysis.
Definition defs.h:20
Side
Trade direction enumeration.
Definition defs.h:28
@ SELL
Sell signal or short position.
Definition defs.h:30
@ NONE
No action, hold current position.
Definition defs.h:31
@ BUY
Buy signal or long position.
Definition defs.h:29
Definition indicators.h:216
double signal
Definition indicators.h:218
double macd
Definition indicators.h:217
Open-High-Low-Close-Volume candlestick data.
Definition defs.h:84
double close
Closing price.
Definition defs.h:89
int64_t timestamp
Unix timestamp for the candle.
Definition defs.h:85
Trading signal generated by a strategy.
Definition defs.h:44
Side side
Trade direction (BUY/SELL/NONE).
Definition defs.h:46
Definition defs.h:134
double value
Definition defs.h:136
int64_t timestamp
Definition defs.h:135