Trading System API  3.0
Library for Simulating and Deploying Trading and Investment Strategies
TSAFunctors2.h
1 /* ================================================================================
2 *
3 * Copyright (c) 2014, Fredrik Backheimer
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice, this
10 * list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 * The views and conclusions contained in the software and documentation are those
27 * of the authors and should not be interpreted as representing official policies,
28 * either expressed or implied, of the FreeBSD Project.
29 *
30 * =================================================================================
31 */
32 
33 #ifndef TSA_FUNCTORS2__INCLUDED
34 #define TSA_FUNCTORS2__INCLUDED
35 
36 #include "TSAFunctors.h"
37 
38 #include <vector>
39 #include <memory>
40 #include <algorithm>
41 #include <numeric>
42 #include <cmath>
43 #include <cfloat>
44 
45 namespace tsa {
46  namespace functor {
47 
50  class KalmanMA : public functor::parent<double> {
51  bool m_init = false;
52  size_t m_period;
53 
54  bool m_first_avg_completed;
55  double m_gain;
56  double m_sq_gain;
57  double m_vel;
58  double m_dif;
59  double m_avg;
60  double m_kalman;
61  public:
62  KalmanMA(void);
63  parent<double>& operator()(series<double>& _ser, size_t _period);
64  double value() { return parent::value(0); }
65  };
66 
67  typedef KalmanMA average_kalman2;
68 
70 
73  class Momentum : public functor::parent<double> {
74  bool m_init = false;
75  size_t m_period;
76  double m_mom;
77  public:
79  Momentum(void);
81  parent<double>& operator()(series<double>& _ser, size_t _period);
82  double value() { return parent::value(0); }
83  };
84 
85  typedef Momentum MOM;
86 
88 
91  class ROC : public functor::parent<double> {
92  bool m_init = false;
93  size_t m_period;
94  double m_roc;
95  public:
97  ROC(void);
99  parent<double>& operator()(series<double>& _ser, size_t _period);
100  double value() { return m_roc; }
101  };
102 
103  typedef ROC rate_of_change;
104 
105 
107 
110  class ROCP : public functor::parent<double> {
111  bool m_init = false;
112  size_t m_period;
113  double m_rocp;
114  public:
116  ROCP(void);
118  parent<double>& operator()(series<double>& _ser, size_t _period);
119  double value() { return m_rocp; }
120  };
121 
123 
125 
128  class ROCR : public functor::parent<double> {
129  bool m_init = false;
130  size_t m_period;
131  double m_rocr;
132  public:
134  ROCR(void);
136  parent<double>& operator()(series<double>& _ser, size_t _period);
137  double value() { return m_rocr; }
138  };
139 
140  typedef ROCR rate_of_change_ratio;
141 
143 
146  class XMA : public functor::parent<double> {
147  bool m_init = false;
148  size_t m_period;
149  double m_factor;
150  double m_sum1;
151  double m_sum2;
152  double m_xma;
153  public:
155  XMA(void);
157  parent<double>& operator()(series<double>& _ser, size_t _period);
158  double value() { return m_xma; }
159  };
160 
161  typedef XMA xaverage;
162 
164 
167  class WilderMA : public functor::parent<double> {
168  bool m_init = false;
169  size_t m_period;
170  series<double> s_xma;
171  double m_factor;
172  double m_efactor;
173  double m_xma;
174  double m_avg;
175  public:
177  WilderMA(void);
179  parent<double>& operator()(series<double>& _ser, size_t _period);
180  double value() { return m_avg; }
181  };
182 
184 
187  //class bollinger_bandwidth : public functor::parent<double> {
188  // functor::bollinger_bands BB;
189  // bool m_init = false;
190  // size_t m_period;
191  // double m_bw;
192  // public:
193  // /// @brief
194  // bollinger_bandwidth(void);
195  // /// @brief .
196  // parent<double>& operator()(
197  // series<double>& hi, ///< series of highs
198  // series<double>& lo, ///< series of lows
199  // series<double>& cl, ///< series of closes
200  // size_t _period, ///< Center line (average) period
201  // double _stdev_mult = 2.0
202  // );
203  // //double value() { return m_bbb; }
204  //};
205 
206  //typedef bollinger_bandwidth BollBW;
207 
209 
212  class DynMI : public functor::parent<double> {
213  bool m_init = false;
214  size_t m_std_period;
215  size_t m_ma_period;
216  size_t m_dmi_period;
217  functor::stdev f_stdev;
218  functor::SMA f_sma;
219  functor::WilderMA f_wma0;
220  functor::WilderMA f_wma1;
221  series<double> s_stdev;
222  series<double> s_avg_stdev;
223  series<double> s_mom;
224  series<double> s_mom_abs;
225  double m_stdev;
226  double m_avg_stdev;
227  double m_vi;
228  int m_td;
229  double m_mom;
230  double m_mom_abs;
231  double m_rs0;
232  double m_rs1;
233  double m_rs;
234  double m_dmi;
235  public:
237  DynMI(void);
239  parent<double>& operator()(series<double>& _ser, size_t _std_period, size_t _ma_period,
240  size_t _dmi_period);
241  double value() { return m_dmi; }
242  };
243 
245 
247 
250  class CMO : public functor::parent<double> {
251  bool m_init = false;
252  size_t m_period;
253  functor::sum f_sumup;
254  functor::sum f_sumdn;
255  double m_upday;
256  double m_dnday;
257  series<double> s_upday;
258  series<double> s_dnday;
259  double m_sumup;
260  double m_sumdn;
261  double m_cmo;
262  public:
264  CMO(void);
266  parent<double>& operator()(series<double>& _ser, size_t _period);
267  double value() { return m_cmo; }
268  };
269 
271 
273 
276  class QStick : public functor::parent<double> {
277  bool m_init = false;
278  size_t m_period;
279  functor::SMA f_sma;
280  double m_codiff;
281  series<double> s_codiff;
282  double m_cqs;
283  public:
285  QStick(void);
287  parent<double>& operator()(series<double>& _op, series<double>& _cl, size_t _period);
288  double value() { return m_cqs; }
289  };
290 
291  typedef QStick chande_qstick;
292 
294 
297  class RAVI : public functor::parent<double> {
298  bool m_init = false;
299  size_t m_lperiod;
300  size_t m_speriod;
301  functor::SMA f_lsma;
302  functor::SMA f_ssma;
303  double m_shortma;
304  double m_longma;
305  double m_ravi;
306  public:
308  RAVI(void);
310  parent<double>& operator()(series<double>& _ser, size_t _short_period, size_t _long_period);
311  double value() { return m_ravi; }
312  };
313 
315 
317 
320  class TrendScore : public functor::parent<double> {
321  bool m_init = false;
322  double m_tscore;
323  public:
325  TrendScore(void);
327  parent<double>& operator()(series<double>& _ser);
328  double value() { return m_tscore; }
329  };
330 
332 
335  class VIDYA : public functor::parent<double> {
336  bool m_init = false;
337  size_t m_cmoperiod;
338  size_t m_maperiod;
339  functor::CMO f_cmo;
340  double m_cmo;
341  double m_vidya;
342  public:
344  VIDYA(void);
346  parent<double>& operator()(series<double>& _ser, size_t _cmo_period, size_t _ma_period);
347  double value() { return m_vidya; }
348  };
349 
351 
354  class ChaosAcc : public functor::parent<double> {
355  bool m_init = false;
356  size_t m_lperiod;
357  size_t m_speriod;
358  series<double> s_lsma;
359  series<double> s_ssma;
360  series<double> s_madiff;
361  functor::SMA f_lsma;
362  functor::SMA f_ssma;
363  functor::SMA f_madiff;
364  double m_shortma;
365  double m_longma;
366  double m_madiff;
367  double m_diff;
368  double m_cacc;
369  public:
371  ChaosAcc(void);
373  parent<double>& operator()(series<double>& _ser, size_t _short_period, size_t _long_period);
374  double value() { return m_cacc; }
375  };
376 
377  typedef ChaosAcc chaos_accelerator;
378 
380 
383  class ChaosAO : public functor::parent<double> {
384  bool m_init = false;
385  size_t m_lperiod;
386  size_t m_speriod;
387  functor::SMA f_lsma;
388  functor::SMA f_ssma;
389  double m_shortma;
390  double m_longma;
391  double m_cao;
392  public:
394  ChaosAO(void);
396  parent<double>& operator()(series<double>& _ser, size_t _short_period, size_t _long_period);
397  double value() { return m_cao; }
398  };
399 
401 
403 
406  class ChopIndex : public functor::parent<double> {
407  bool m_init = false;
408  size_t m_period;
409  series<double> s_tr;
410  functor::sum f_sumtr;
411  functor::max f_max;
412  functor::min f_min;
413  double m_tr;
414  double m_sumtr;
415  double m_min;
416  double m_max;
417  double m_chop;
418  public:
420  ChopIndex(void);
422  parent<double>& operator()(series<double>& high, series<double>& low,
423  series<double>& close, size_t period);
424  double value() { return m_chop; }
425  };
426 
427  typedef ChopIndex choppiness_index;
428 
430 
433  class DeMarker : public functor::parent<double> {
434  bool m_init = false;
435  size_t m_period;
436  series<double> s_sumhi;
437  series<double> s_sumlo;
438  functor::sum f_sumhi;
439  functor::sum f_sumlo;
440  double m_himom;
441  double m_lomom;
442  double m_sumhi;
443  double m_sumlo;
444  double m_demark;
445  public:
447  DeMarker(void);
449  parent<double>& operator()(series<double>& _high, series<double>& _low,
450  size_t _period);
451  double value() { return m_demark; }
452  };
453 
455 
458  class REI : public functor::parent<double> {
459  bool m_init = false;
460  size_t m_period;
461  series<double> s_sumtd6;
462  series<double> s_sumtd7;
463  functor::sum f_sumtd6;
464  functor::sum f_sumtd7;
465  double m_himom;
466  double m_lomom;
467  double m_td6;
468  double m_td7;
469  double m_sumtd6;
470  double m_sumtd7;
471  double m_rei;
472  public:
474  REI(void);
476  parent<double>& operator()(series<double>& high, series<double>& low,
477  series<double>& close, size_t period);
478  double value() { return m_rei; }
479  };
480 
481  typedef REI range_expansion_index;
482 
484 
487  class DPO : public functor::parent<double> {
488  bool m_init = false;
489  size_t m_period;
490  series<double> s_sma;
491  functor::SMA f_sma;
492  double m_sma;
493  double m_dpo;
494  public:
496  DPO(void);
498  parent<double>& operator()(series<double>& _ser, size_t _period);
499  double value() { return m_dpo; }
500  };
501 
503 
505 
508  class DispIndex : public functor::parent<double> {
509  bool m_init = false;
510  size_t m_period;
511  functor::XMA f_xma;
512  double m_xma;
513  double m_dispi;
514  public:
516  DispIndex(void);
518  parent<double>& operator()(series<double>& _ser, size_t _period);
519  double value() { return m_dispi; }
520  };
521 
522  typedef DispIndex disparity_index;
523 
525 
528  class DEMA : public functor::parent<double> {
529  bool m_init = false;
530  size_t m_period;
531  series<double> s_xma;
532  functor::XMA f_xma1;
533  functor::XMA f_xma2;
534  double m_xma1;
535  double m_xma2;
536  double m_dema;
537  public:
539  DEMA(void);
541  parent<double>& operator()(series<double>& _ser, size_t _period);
542  double value() { return m_dema; }
543  };
544 
545  typedef DEMA average_double_exp;
546 
548 
551  class DStoch : public functor::parent<double> {
552  bool m_init = false;
553  size_t m_period;
554  size_t m_ma_period;
555  series<double> s_stoch;
556  series<double> s_stochs;
557  series<double> s_stochds;
558  functor::min f_mins;
559  functor::max f_maxs;
560  functor::min f_minds;
561  functor::max f_maxds;
562  functor::SMA f_smas;
563  functor::SMA f_smads;
564  double m_stoch;
565  double m_stochs;
566  double m_stochd;
567  double m_stochds;
568  double m_dstoch;
569  public:
571  DStoch(void);
573  parent<double>& operator()(series<double>& _high, series<double>& _low,
574  series<double>& _close,
575  size_t _period, size_t _ma_period);
576  double value() { return m_dstoch; }
577  };
578 
579  typedef DStoch double_stochastic;
580 
582 
585  class Fisher : public functor::parent<double> {
586  bool m_init = false;
587  size_t m_period;
588  functor::min f_min;
589  functor::max f_max;
590  double m_val1;
591  double m_val2;
592  double m_fish;
593  public:
595  Fisher(void);
597  parent<double>& operator()(series<double>& _ser, size_t _period);
598  double value() { return m_fish; }
599  };
600 
601  typedef Fisher fisher_transform;
602 
604 
607  class LRSI : public functor::parent<double> {
608  bool m_init = false;
609  series<double> s_l0;
610  series<double> s_l1;
611  series<double> s_l2;
612  double m_df;
613  double m_l0;
614  double m_l1;
615  double m_l2;
616  double m_l3;
617  double m_cu;
618  double m_cd;
619  double m_lrsi;
620  public:
622  LRSI(void);
624  parent<double>& operator()(series<double>& _ser, double _damping);
625  double value() { return m_lrsi; }
626  };
627 
628  typedef LRSI laguerre_rsi;
629 
631 
634  class RVI : public functor::parent<double> {
635  bool m_init = false;
636  size_t m_period;
637  series<double> s_v1;
638  series<double> s_v2;
639  functor::sum f_sumv1;
640  functor::sum f_sumv2;
641  double m_v1;
642  double m_v2;
643  double m_sumv1;
644  double m_sumv2;
645  double m_rvi;
646  public:
648  RVI(void);
650  parent<double>& operator()(series<double>& open, series<double>& high,
651  series<double>& low, series<double>& close, size_t period);
652  double value() { return m_rvi; }
653  };
654 
655  typedef RVI relative_vigor_index;
656 
658 
661  class Elliot : public functor::parent<double> {
662  bool m_init = false;
663  size_t m_long_period;
664  size_t m_short_period;
665  functor::SMA f_longsma;
666  functor::SMA f_shortsma;
667  double m_longsma;
668  double m_shortsma;
669  double m_ell;
670  public:
672  Elliot(void);
674  parent<double>& operator()(series<double>& ser, size_t short_period, size_t long_period);
675  double value() { return m_ell; }
676  };
677 
678  typedef Elliot elliot_oscillator;
679 
681 
684  class WMA : public functor::parent<double> {
685  bool m_init = false;
686  size_t m_period;
687  series<double> s_per;
688  functor::sum f_sump;
689  functor::sum f_sumsp;
690  int m_per;
691  double m_sump;
692  double m_sumsp;
693  double m_wma;
694  public:
696  WMA(void);
698  parent<double>& operator()(series<double>& ser, size_t period);
699  double value() { return m_wma; }
700  };
701 
702  typedef WMA average_weighted;
703 
705 
708  class HullMA : public functor::parent<double> {
709  bool m_init = false;
710  size_t m_period;
711  size_t m_half_period;
712  size_t m_sqrt_period;
713  series<double> s_wmadiff;
714  functor::WMA f_wma1;
715  functor::WMA f_wma2;
716  functor::WMA f_wma3;
717  double m_wma1;
718  double m_wma2;
719  double m_wmadiff;
720  double m_hma;
721  public:
723  HullMA(void);
725  parent<double>& operator()(series<double>& _ser, size_t _period);
726  double value() { return m_hma; }
727  };
728 
729  typedef HullMA average_hull;
730 
732 
735  class Inertia : public functor::parent<double> {
736  bool m_init = false;
737  size_t m_period;
738  functor::stdev f_stdevh;
739  functor::stdev f_stdevl;
740  functor::XMA f_xma1;
741  functor::XMA f_xma2;
742  functor::XMA f_xma3;
743  functor::XMA f_xma4;
744  functor::SMA f_sma;
745  series<double> s_val1;
746  series<double> s_val2;
747  series<double> s_val3;
748  series<double> s_val4;
749  series<double> s_val5;
750  double m_stdevh;
751  double m_stdevl;
752  double m_val1;
753  double m_val2;
754  double m_val3;
755  double m_val4;
756  double m_val5;
757  double m_xma1;
758  double m_xma2;
759  double m_xma3;
760  double m_xma4;
761  double m_inrt;
762  public:
764  Inertia(void);
766  parent<double>& operator()(series<double>& _high, series<double>& _low,
767  size_t _period);
768  double value() { return m_inrt; }
769  };
770 
771  typedef Inertia inertia_oscillator;
772 
774 
777  class KAMA : public functor::parent<double> {
778  bool m_init = false;
779  size_t m_period;
780  size_t m_fast_const;
781  size_t m_slow_const;
782  series<double> s_vol;
783  functor::sum f_sum;
784  double m_dir;
785  double m_vol;
786  double m_er;
787  double m_fastsc;
788  double m_slowsc;
789  double m_ssc;
790  double m_const;
791  double m_kama;
792  public:
794  KAMA(void);
796  parent<double>& operator()(series<double>& ser, size_t period, size_t fast_const,
797  size_t slow_const);
798  double value() { return m_kama; }
799  };
800 
801  typedef KAMA average_kaufman;
802 
804 
807  class EffRatio : public functor::parent<double> {
808  bool m_init = false;
809  size_t m_period;
810  series<double> s_vol;
811  functor::sum f_sum;
812  double m_dir;
813  double m_vol;
814  double m_eratio;
815  public:
817  EffRatio(void);
819  parent<double>& operator()(series<double>& _ser, size_t _period);
820  double value() { return m_eratio; }
821  };
822 
823  typedef EffRatio efficiency_ratio;
824 
826 
829  class LinReg : public functor::parent<double> {
830  bool m_init = false;
831  size_t m_period;
832  series<double> s_vol;
833  functor::sum f_sum;
834  double m_dir;
835  double m_vol;
836  double m_linreg;
837  public:
839  LinReg(void);
841  parent<double>& operator()(series<double>& _ser, size_t _period);
842  double value() { return m_linreg; }
843  };
844 
845  typedef LinReg linear_regression;
846 
848 
851  class LinRegSlope : public functor::parent<double> {
852  bool m_init = false;
853  size_t m_period;
854  series<double> s_vol;
855  functor::sum f_sum;
856  double m_dir;
857  double m_vol;
858  double m_lrslope;
859  public:
861  LinRegSlope(void);
863  parent<double>& operator()(series<double>& _ser, size_t _period);
864  double value() { return m_lrslope; }
865  };
866 
868 
870 
873  class MDMA : public functor::parent<double> {
874  bool m_init = false;
875  size_t m_period;
876  double m_mdma;
877  public:
879  MDMA(void);
881  parent<double>& operator()(series<double>& _ser, size_t _period);
882  double value() { return m_mdma; }
883  };
884 
885  typedef MDMA average_mcginley;
886 
888 
891  class PPO : public functor::parent<double> {
892  bool m_init = false;
893  size_t m_fast_period;
894  size_t m_slow_period;
895  functor::XMA f_xmas;
896  functor::XMA f_xmaf;
897  double m_fastma;
898  double m_slowma;
899  double m_ppo;
900  public:
902  PPO(void);
904  parent<double>& operator()(series<double>& _ser, size_t _fast_period, size_t _slow_period);
905  double value() { return m_ppo; }
906  };
907 
909 
911 
914  class PFE : public functor::parent<double> {
915  bool m_init = false;
916  size_t m_period;
917  size_t m_ma_period;
918  series<double> s_pf;
919  series<double> s_sqrt1;
920  functor::XMA f_xma;
921  functor::sum f_sum;
922  double m_sqrt1;
923  double m_pf;
924  double m_pfe;
925  public:
927  PFE(void);
929  parent<double>& operator()(series<double>& _ser, size_t _period, size_t _ma_period);
930  double value() { return m_pfe; }
931  };
932 
934 
936 
939  class RMTA : public functor::parent<double> {
940  bool m_init = false;
941  size_t m_period;
942  series<double> s_bot;
943  double m_alpha;
944  double m_bot;
945  double m_rmta;
946  public:
948  RMTA(void);
950  parent<double>& operator()(series<double>& _ser, size_t _period);
951  double value() { return m_rmta; }
952  };
953 
955 
957 
960  class TOSC : public functor::parent<double> {
961  bool m_init = false;
962  size_t m_period;
963  series<double> s_bot;
964  functor::XMA f_xma;
965  functor::RMTA f_rmta;
966  double m_diff;
967  double m_bot;
968  double m_tosc;
969  public:
971  TOSC(void);
973  parent<double>& operator()(series<double>& _ser, size_t _period);
974  double value() { return m_tosc; }
975  };
976 
977  typedef TOSC trend_oscillator;
978 
980 
983  class RMI : public functor::parent<double> {
984  bool m_init = false;
985  size_t m_ma_period;
986  size_t m_mom_period;
987  series<double> s_mom;
988  series<double> s_amom;
989  functor::WilderMA f_wma1;
990  functor::WilderMA f_wma2;
991  double m_mom;
992  double m_amom;
993  double m_rms;
994  double m_rmi;
995  public:
997  RMI(void);
999  parent<double>& operator()(series<double>& _ser, size_t _ma_period, size_t _mom_period);
1000  double value() { return m_rmi; }
1001  };
1002 
1003  typedef RMI relative_momentum_index;
1004 
1006 
1009  class RVX : public functor::parent<double> {
1010  bool m_init = false;
1011  size_t m_ma_period;
1012  size_t m_sd_period;
1013  series<double> s_rs;
1014  series<double> s_ars;
1015  functor::WilderMA f_wma1;
1016  functor::WilderMA f_wma2;
1017  functor::stdev f_stdev1;
1018  functor::stdev f_stdev2;
1019  double m_sd;
1020  double m_rs;
1021  double m_ars;
1022  double m_rms;
1023  double m_rvx;
1024  public:
1026  RVX(void);
1028  parent<double>& operator()(series<double>& _ser, size_t _sd_period, size_t _ma_period);
1029  double value() { return m_rvx; }
1030  };
1031 
1033 
1035 
1038  class R2 : public functor::parent<double> {
1039  bool m_init = false;
1040  size_t m_period;
1041  double m_r2;
1042  public:
1044  R2(void);
1046  parent<double>& operator()(series<double>& _ser, size_t _period);
1047  double value() { return m_r2; }
1048  };
1049 
1050  typedef R2 r_squared;
1051 
1053 
1056  class STC : public functor::parent<double> {
1057  bool m_init = false;
1058  size_t m_longma_period;
1059  size_t m_shortma_period;
1060  size_t m_cycle_period;
1061  series<double> s_mcd;
1062  series<double> s_st;
1063  functor::WilderMA f_wma1;
1064  functor::WilderMA f_wma2;
1065  functor::WilderMA f_wma3;
1066  functor::min f_min;
1067  functor::max f_max;
1068  double m_mcd;
1069  double m_st;
1070  double m_stc;
1071  public:
1073  STC(void);
1075  parent<double>& operator()(series<double>& _ser, size_t _shortma_period,
1076  size_t _longma_period,
1077  size_t _cycle_period);
1078  double value() { return m_stc; }
1079  };
1080 
1081  typedef STC schaff_trend_cycle;
1082 
1084 
1087  class SMI : public functor::parent<double> {
1088  bool m_init = false;
1089  size_t m_ma_period;
1090  size_t m_dma_period;
1091  size_t m_period;
1092  series<double> s_val1;
1093  series<double> s_val2;
1094  series<double> s_val3;
1095  series<double> s_val4;
1096  functor::XMA f_xma1;
1097  functor::XMA f_xma2;
1098  functor::XMA f_xma3;
1099  functor::XMA f_xma4;
1100  functor::min f_min;
1101  functor::max f_max;
1102  double m_val1;
1103  double m_val2;
1104  double m_val3;
1105  double m_val4;
1106  double m_val5;
1107  double m_val6;
1108  double m_smi;
1109  public:
1111  SMI(void);
1113  parent<double>& operator()(series<double>& _hi, series<double>& _lo,
1114  series<double>& _cl,
1115  size_t _period = 13, size_t _ma_period = 25, size_t _dma_period = 2);
1116  double value() { return m_smi; }
1117  };
1118 
1120 
1122 
1125  class StochRSI : public functor::parent<double> {
1126  bool m_init = false;
1127  size_t m_rsi_period;
1128  size_t m_period;
1129  series<double> s_val1;
1130  functor::RSI f_rsi;
1131  functor::min f_min;
1132  functor::max f_max;
1133  double m_val1;
1134  double m_val2;
1135  double m_val3;
1136  double m_srsi;
1137  public:
1139  StochRSI(void);
1141  parent<double>& operator()(series<double>& _ser, size_t _period = 14,
1142  size_t _rsi_period = 14);
1143  double value() { return m_srsi; }
1144  };
1145 
1146  typedef StochRSI stochastic_rsi;
1147 
1149 
1152  class T3MA : public functor::parent<double> {
1153  bool m_init = false;
1154  double m_factor;
1155  size_t m_period;
1156  series<double> s_val1;
1157  series<double> s_val2;
1158  series<double> s_val3;
1159  series<double> s_val4;
1160  series<double> s_val5;
1161  series<double> s_val6;
1162  functor::XMA f_xma1;
1163  functor::XMA f_xma2;
1164  functor::XMA f_xma3;
1165  functor::XMA f_xma4;
1166  functor::XMA f_xma5;
1167  functor::XMA f_xma6;
1168  double m_c1;
1169  double m_c2;
1170  double m_c3;
1171  double m_c4;
1172  double m_val1;
1173  double m_val2;
1174  double m_val3;
1175  double m_val4;
1176  double m_val5;
1177  double m_val6;
1178  double m_t3;
1179  public:
1181  T3MA(void);
1183  parent<double>& operator()(series<double>& _ser, size_t _period = 8, double _factor = 0.7);
1184  double value() { return m_t3; }
1185  };
1186 
1187  typedef T3MA average_t3;
1188 
1190 
1193  class KeltnerChannel : public functor::parent<double> {
1194 
1195  bool m_init = false;
1196  size_t m_period;
1197  series<double> s_val1;
1198  series<double> s_val2;
1199  series<double> s_val3;
1200  functor::SMA f_sma1;
1201  functor::SMA f_sma2;
1202  double m_val1;
1203  double m_val2;
1204  double m_val3;
1205  double m_val4;
1206  double m_kcm;
1207  double m_kcu;
1208  double m_kcl;
1209  public:
1211  KeltnerChannel(void);
1213  parent<double>& operator()(series<double>& _hi, series<double>& _lo,
1214  series<double>& _cl,
1215  size_t _period = 10);
1216  double MidChannel()const { return parent::value(0); }
1217  double UpChannel(void)const { return parent::value(1); }
1218  double LoChannel()const { return parent::value(2); }
1219  };
1220 
1222 
1224 
1227  class KeltnerBands : public functor::parent<double> {
1228 
1229  bool m_init = false;
1230  size_t m_period;
1231  double m_mult;
1232  series<double> s_val1;
1233  series<double> s_val2;
1234  series<double> s_val3;
1235  functor::XMA f_xma1;
1236  functor::SMA f_sma2;
1237  double m_val1;
1238  double m_val2;
1239  double m_val3;
1240  double m_val4;
1241  double m_kbm;
1242  double m_kbu;
1243  double m_kbl;
1244  public:
1246  KeltnerBands(void);
1248  parent<double>& operator()(series<double>& _hi, series<double>& _lo,
1249  series<double>& _cl,
1250  size_t _period = 10, double _multiplier = 2.0);
1251  double MidChannel()const { return parent::value(0); }
1252  double UpChannel(void)const { return parent::value(1); }
1253  double LoChannel()const { return parent::value(2); }
1254  };
1255 
1256  typedef KeltnerBands keltner_bands;
1257 
1258 
1260 
1263  class TCF : public functor::parent<double> {
1264 
1265  bool m_init = false;
1266  double m_factor;
1267  size_t m_period;
1268  series<double> s_val2;
1269  series<double> s_val3;
1270  series<double> s_val4;
1271  series<double> s_val5;
1272  functor::sum f_sum1;
1273  functor::sum f_sum2;
1274  functor::sum f_sum3;
1275  functor::sum f_sum4;
1276  double m_val1;
1277  double m_val2;
1278  double m_val3;
1279  double m_val4;
1280  double m_val5;
1281  double m_val6;
1282  double m_val7;
1283  double m_val8;
1284  double m_val9;
1285  double m_ptcf;
1286  double m_mtcf;
1287  public:
1289  TCF(void);
1291  parent<double>& operator()(series<double>& _ser, size_t _period = 10);
1292  double Positive()const { return parent::value(0); }
1293  double Negative(void)const { return parent::value(1); }
1294  };
1295 
1297 
1299 
1302  class TTI : public functor::parent<double> {
1303 
1304  bool m_init = false;
1305  double m_factor;
1306  size_t m_period;
1307  series<double> s_val2;
1308  series<double> s_val3;
1309  series<double> s_val4;
1310  series<double> s_val5;
1311  functor::SMA f_sma1;
1312  functor::sum f_sum2;
1313  functor::sum f_sum3;
1314  functor::sum f_sum4;
1315  double m_val1;
1316  double m_val2;
1317  double m_val3;
1318  double m_val4;
1319  double m_val5;
1320  double m_val6;
1321  double m_tti;
1322  public:
1324  TTI(void);
1326  parent<double>& operator()(series<double>& _ser, size_t _period = 30);
1327  double value() { return m_tti; }
1328  };
1329 
1330  typedef TTI trend_intensity_index;
1331 
1333 
1336  class TTF : public functor::parent<double> {
1337 
1338  bool m_init = false;
1339  double m_factor;
1340  size_t m_period;
1341  series<double> s_val1;
1342  series<double> s_val2;
1343  series<double> s_val3;
1344  series<double> s_val4;
1345  series<double> s_val5;
1346  functor::SMA f_sma1;
1347  functor::max f_max;
1348  functor::min f_min;
1349  double m_val1;
1350  double m_val2;
1351  double m_val3;
1352  double m_val4;
1353  double m_val5;
1354  double m_val6;
1355  double m_ttf;
1356  public:
1358  TTF(void);
1360  parent<double>& operator()(series<double>& _hi, series<double>& _lo,
1361  size_t _period = 15);
1362  double value() { return m_ttf; }
1363  };
1364 
1365  typedef TTF trend_trigger_factor;
1366 
1368 
1371  class TEMA : public functor::parent<double> {
1372 
1373  bool m_init = false;
1374  double m_factor;
1375  size_t m_period;
1376  series<double> s_val1;
1377  series<double> s_val2;
1378  series<double> s_val3;
1379  series<double> s_val4;
1380  series<double> s_val5;
1381  functor::XMA f_xma1;
1382  functor::XMA f_xma2;
1383  functor::XMA f_xma3;
1384  double m_val1;
1385  double m_val2;
1386  double m_val3;
1387  double m_val4;
1388  double m_val5;
1389  double m_val6;
1390  double m_tema;
1391  public:
1393  TEMA(void);
1395  parent<double>& operator()(series<double>& _ser, size_t _period = 15);
1396  double value() { return m_tema; }
1397  };
1398 
1399  typedef TEMA average_texp;
1400 
1402 
1405  class VQI : public functor::parent<double> {
1406  bool m_init = false;
1407  size_t m_shortma_period;
1408  size_t m_longma_period;
1409  series<double> s_val1;
1410  series<double> s_val2;
1411  series<double> s_val3;
1412  series<double> s_val4;
1413  functor::SMA f_sma1;
1414  functor::SMA f_sma2;
1415  double m_val1;
1416  double m_val2;
1417  double m_val3;
1418  double m_val4;
1419  double m_vqi;
1420  double m_svqi;
1421  double m_lvqi;
1422  public:
1424  VQI(void);
1426  parent<double>& operator()(series<double>& _op, series<double>& _hi,
1427  series<double>& _lo,
1428  series<double>& _cl, size_t _shortma_period = 9, size_t _longma_period = 200);
1429  double VQIndex()const { return parent::value(0); }
1430  double LongVQI(void)const { return parent::value(1); }
1431  double ShortVQI(void)const { return parent::value(2); }
1432  };
1433 
1434  typedef VQI volatility_quality_index;
1435 
1437 
1440  class TrailStop : public functor::parent<double> {
1441 
1442  bool m_init = false;
1443  double m_factor;
1444  size_t m_period;
1445  size_t m_atr_period;
1446  double m_mult;
1447  series<double> s_val1;
1448  series<double> s_val2;
1449  series<double> s_val3;
1450  series<double> s_val4;
1451  series<double> s_val5;
1452  series<double> s_val6;
1453  functor::SMA f_sma1;
1454  functor::max f_max1;
1455  functor::max f_max2;
1456  functor::min f_min1;
1457  functor::min f_min2;
1458  double m_val1;
1459  double m_val2;
1460  double m_val3;
1461  double m_val4;
1462  double m_val5;
1463  double m_val6;
1464  double m_longTS;
1465  double m_shortTS;
1466  public:
1468  TrailStop(void);
1470  parent<double>& operator()(series<double>& _hi, series<double>& _lo,
1471  series<double>& _cl, size_t _period = 10, size_t _atr_period = 20,
1472  double _atr_multiplier = 2.0);
1473  double LongTrailStop()const { return parent::value(0); }
1474  double ShortTrailStop(void)const { return parent::value(1); }
1475  };
1476 
1477  typedef TrailStop trailing_stop;
1478 
1479  }
1480 }
1481 
1482 #endif
Dynamic Momentum Index (DynMI). Functor for calculating DynMI over a given period.
Definition: TSAFunctors2.h:212
Detrended Price Oscillator (DPO). Functor for calculating DPO over a given period.
Definition: TSAFunctors2.h:487
Rate Of Change Percent (ROCP). Functor for calculating ROCP over a given period.
Definition: TSAFunctors2.h:110
Chaos Awesome Oscillator. Functor for calculating ChaosAcc over a given period.
Definition: TSAFunctors2.h:383
Namespace for the &#39;Trading System API&#39; library.
Definition: original1.TSA3Core.cpp:20
Ehlers&#39; Fisher Transform (Fisher). Functor for calculating Fisher over a given period.
Definition: TSAFunctors2.h:585
Functor for calculating the minimum value in a series over a given period.
Definition: TSAFunctors.h:73
Functor for calculating the population standard deviation of all values in a series over a given peri...
Definition: TSAFunctors.h:301
Percentage Price Oscillator (PPO). Functor for calculating PPO over a given period.
Definition: TSAFunctors2.h:891
R Squared (R2). Functor for calculating R2 over a given period.
Definition: TSAFunctors2.h:1038
Kaufman&#39;s Adaptive Moving Average (KAMA). Functor for calculating KAMA over a given period...
Definition: TSAFunctors2.h:777
Disparity Index (DispIndex). Functor for calculating DispIndex over a given period.
Definition: TSAFunctors2.h:508
Double Exponential Moving Average (DEMA). Functor for calculating DEMA over a given period...
Definition: TSAFunctors2.h:528
Double Stochastic (DStoch). Functor for calculating DStoch over a given period.
Definition: TSAFunctors2.h:551
Ehlers&#39; Relative Vigor Index (RVI). Functor for calculating RVI over a given period.
Definition: TSAFunctors2.h:634
Chande&#39;s Range Action Verification Index (RAVI). Functor for calculating RAVI over a given period...
Definition: TSAFunctors2.h:297
Ehlers&#39; Laguerre RSI (LRSI). Functor for calculating LRSI over a given period.
Definition: TSAFunctors2.h:607
Relative Momentum Index (RMI). Functor for calculating RMI over a given period.
Definition: TSAFunctors2.h:983
Stochastic Momentum Index (SMI). Functor for calculating SMI over a given period. ...
Definition: TSAFunctors2.h:1087
Tillson&#39;s T3 Average (T3MA). Functor for calculating T3MA over a given period.
Definition: TSAFunctors2.h:1152
Wilder&#39;s Moving Average (WilderMA). Functor for calculating WilderMA over a given period...
Definition: TSAFunctors2.h:167
Trend Intensity Index (TTI). Functor for calculating TTI over a given period.
Definition: TSAFunctors2.h:1302
Inertia Oscillator (Inertia). Functor for calculating Inertia over a given period.
Definition: TSAFunctors2.h:735
parent< double > & operator()(series< double > &_ser, size_t _period)
Definition: TSAFunctors2.cpp:15
Keltner Bands (KeltnerBands). Functor for calculating KeltnerBands over a given period.
Definition: TSAFunctors2.h:1227
Functor for calculating the average of all values in a series over a given period.
Definition: TSAFunctors.h:210
Polarized Fractal Efficiency (PFE). Functor for calculating PFE over a given period.
Definition: TSAFunctors2.h:914
Chande&#39;s VIDYA Moving Average. Functor for calculating VIDYA over a given period. ...
Definition: TSAFunctors2.h:335
Functor for calculating the sum of all values in a series over a given period.
Definition: TSAFunctors.h:104
sref< double > RVI(sref< double > open, sref< double > high, sref< double > low, sref< double > close, sref< size_t > period, size_t max_period)
Returns Dynamic Relative Vigour Index (RVI).
Definition: TSADSLFinancialF.cpp:83
Relative Volatility Index (RVX). Functor for calculating RVX over a given period. ...
Definition: TSAFunctors2.h:1009
Recursive Moving Trend Average (RMTA). Functor for calculating RMTA over a given period.
Definition: TSAFunctors2.h:939
Stochastic RSI (StochRSI). Functor for calculating StochRSI over a given period.
Definition: TSAFunctors2.h:1125
Volatility Quality Index (VQI). Functor for calculating VQI over a given period.
Definition: TSAFunctors2.h:1405
Chande Momentum Oscillator (CMO). Functor for calculating CMO over a given period.
Definition: TSAFunctors2.h:250
sref< double > RSI(sref< double > ser, size_t period)
Relative Strength Index.
Definition: TSADSLFinancial.cpp:446
Kalman Filter. Functor for calculating Kalman Filter over a given period.
Definition: TSAFunctors2.h:50
Hull Moving Average (HullMA). Functor for calculating HullMA over a given period. ...
Definition: TSAFunctors2.h:708
Trailing Stop (TrailStop). Functor for calculating TrailStop over a given period. ...
Definition: TSAFunctors2.h:1440
DeMark&#39;s DeMarker. Functor for calculating DeMarker over a given period.
Definition: TSAFunctors2.h:433
Exponential Moving Average (XMA), different calc from EMA. Functor for calculating XMA over a given p...
Definition: TSAFunctors2.h:146
Weighted Moving Average (WMA). Functor for calculating WMA over a given period.
Definition: TSAFunctors2.h:684
double WMA(const series< double > &data, size_t period)
Returns the weighted average value of data over given period.
Definition: TSAFunctionsScalar.cpp:325
Chande&#39;s QStick. Functor for calculating QStick over a given period.
Definition: TSAFunctors2.h:276
Trend Oscillator (TOSC). Functor for calculating TOSC over a given period.
Definition: TSAFunctors2.h:960
McGinley Dynamic MA (MDMA). Functor for calculating MDMA over a given period.
Definition: TSAFunctors2.h:873
Triple Exponential MA (TEMA). Functor for calculating TEMA over a given period.
Definition: TSAFunctors2.h:1371
Momentum. Functor for calculating Momentum over a given period.
Definition: TSAFunctors2.h:73
Rate Of Change Ratio (ROCR). Functor for calculating ROCR over a given period.
Definition: TSAFunctors2.h:128
Trend Trigger factor (TTF). Functor for calculating TTF over a given period.
Definition: TSAFunctors2.h:1336
Chaos Accelerator Oscillator. Functor for calculating ChaosAcc over a given period.
Definition: TSAFunctors2.h:354
Deiss Choppiness Index (ChopIndex). Functor for calculating ChopIndex over a given period...
Definition: TSAFunctors2.h:406
Trend Continuation Factor (TCF). Functor for calculating TCF over a given period. ...
Definition: TSAFunctors2.h:1263
Linear Regression Slope (LinRegSlope). Functor for calculating LinRegSlope over a given period...
Definition: TSAFunctors2.h:851
Rate Of Change (ROC). Functor for calculating ROC over a given period.
Definition: TSAFunctors2.h:91
Keltner Channel (KeltnerChannel). Functor for calculating KeltnerChannel over a given period...
Definition: TSAFunctors2.h:1193
Chande&#39;s TrendScore. Functor for calculating TrendScore over a given period.
Definition: TSAFunctors2.h:320
DeMark&#39;s Range Expansion Index (REI). Functor for calculating REI over a given period.
Definition: TSAFunctors2.h:458
Kaufman&#39;s Efficiency Ratio (EffRatio). Functor for calculating EffRatio over a given period...
Definition: TSAFunctors2.h:807
Schaff Trend Cycle (STC). Functor for calculating STC over a given period.
Definition: TSAFunctors2.h:1056
Linear Regression (LinReg). Functor for calculating LinReg over a given period.
Definition: TSAFunctors2.h:829
Elliot Oscillator (Elliot). Functor for calculating Elliot over a given period.
Definition: TSAFunctors2.h:661
Functor for calculating the maximum value in a series over a given period.
Definition: TSAFunctors.h:42