@@ -42,42 +42,49 @@ void IWma::_calculate(const Indicator& ind) {
42
42
return ;
43
43
}
44
44
45
- size_t startIdx = m_discard;
46
- size_t outIdx = m_discard;
47
- size_t trailingIdx = startIdx - 1 ;
48
-
49
- value_t tempReal = 0.0 , periodSum = 0.0 , periodSub = 0.0 ;
50
- size_t inIdx = ind.discard ();
51
- size_t i = 1 ;
52
- while (inIdx < startIdx) {
53
- tempReal = src[inIdx++];
54
- periodSub += tempReal;
55
- periodSum += tempReal * i;
56
- i++;
45
+ value_t subsum = 0.0 , sum = 0.0 ;
46
+ for (size_t i = ind.discard (), end = m_discard + 1 , count = 1 ; i < end; i++, count++) {
47
+ subsum += src[i];
48
+ sum += src[i] * count;
57
49
}
58
50
59
- size_t endIdx = total - 1 ;
60
- value_t trailingValue = 0 .;
61
51
value_t divider = n * (n + 1 ) / 2.0 ;
62
- while (inIdx <= endIdx) {
63
- tempReal = src[inIdx++];
64
- periodSub += tempReal;
65
- periodSub -= trailingValue;
66
- periodSum += tempReal * n;
67
- // HKU_INFO("{}: {}, {} ", inIdx - 1, periodSum, divider);
68
- trailingValue = src[trailingIdx++];
69
- dst[outIdx++] = periodSum / divider;
70
- periodSum -= periodSub;
52
+ dst[m_discard] = sum / divider;
53
+
54
+ size_t trailingIdx = ind.discard ();
55
+ for (size_t i = m_discard + 1 ; i < total; i++) {
56
+ value_t tmp = src[i];
57
+ sum -= subsum;
58
+ subsum += tmp;
59
+ subsum -= src[trailingIdx++];
60
+ sum += tmp * n;
61
+ dst[i] = sum / divider;
71
62
}
72
63
}
73
64
74
65
void IWma::_dyn_run_one_step (const Indicator& ind, size_t curPos, size_t step) {
66
+ if (step < 1 ) {
67
+ _set (Null<value_t >(), curPos);
68
+ return ;
69
+ }
70
+
71
+ if (step == 1 ) {
72
+ _set (ind[curPos], curPos);
73
+ return ;
74
+ }
75
+
75
76
size_t start = _get_step_start (curPos, step, ind.discard ());
76
- price_t sum = 0.0 ;
77
- for (size_t i = start; i <= curPos; i++) {
78
- sum += ind[i];
77
+ if (curPos + 1 - start < step) {
78
+ _set (Null<value_t >(), curPos);
79
+ return ;
80
+ }
81
+
82
+ value_t sum = 0.0 ;
83
+ size_t n = 1 ;
84
+ for (size_t i = start; i <= curPos; i++, n++) {
85
+ sum += (ind[i] * n);
79
86
}
80
- _set (sum / (curPos - start + 1 ), curPos);
87
+ _set (sum / (step * (step + 1 ) / 2 . ), curPos);
81
88
}
82
89
83
90
Indicator HKU_API WMA (int n) {
@@ -86,10 +93,10 @@ Indicator HKU_API WMA(int n) {
86
93
return Indicator (p);
87
94
}
88
95
89
- // Indicator HKU_API MA (const IndParam& n) {
90
- // IndicatorImpPtr p = make_shared<IWma>();
91
- // p->setIndParam("n", n);
92
- // return Indicator(p);
93
- // }
96
+ Indicator HKU_API WMA (const IndParam& n) {
97
+ IndicatorImpPtr p = make_shared<IWma>();
98
+ p->setIndParam (" n" , n);
99
+ return Indicator (p);
100
+ }
94
101
95
102
} /* namespace hku */
0 commit comments