@ch20026103/anysis 0.0.3-alpha → 0.0.6-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cjs/analyze/Month/index.d.ts +1 -1
  2. package/dist/cjs/analyze/Month/index.test.d.ts +1 -0
  3. package/dist/cjs/analyze/Month/index.test.js +22 -0
  4. package/dist/cjs/analyze/Regression/simpleRegressoinModel.d.ts +1 -1
  5. package/dist/cjs/analyze/Slope/slope.test.js +6 -0
  6. package/dist/cjs/analyze/TimeSeries/R/index.d.ts +1 -1
  7. package/dist/cjs/index.d.ts +3 -0
  8. package/dist/cjs/index.js +7 -1
  9. package/dist/cjs/stockSkills/boll.d.ts +58 -0
  10. package/dist/cjs/stockSkills/boll.js +101 -0
  11. package/dist/cjs/stockSkills/boll.test.d.ts +1 -0
  12. package/dist/cjs/stockSkills/boll.test.js +36 -0
  13. package/dist/cjs/stockSkills/ema.d.ts +9 -0
  14. package/dist/cjs/stockSkills/ema.js +41 -0
  15. package/dist/cjs/stockSkills/ema.test.d.ts +1 -0
  16. package/dist/cjs/stockSkills/ema.test.js +11 -0
  17. package/dist/cjs/stockSkills/gold.d.ts +4 -4
  18. package/dist/cjs/stockSkills/kd.d.ts +41 -14
  19. package/dist/cjs/stockSkills/kd.js +60 -6
  20. package/dist/cjs/stockSkills/kd.test.js +34 -2
  21. package/dist/cjs/stockSkills/ma.d.ts +49 -30
  22. package/dist/cjs/stockSkills/ma.js +37 -44
  23. package/dist/cjs/stockSkills/ma.test.js +15 -20
  24. package/dist/cjs/stockSkills/macd.d.ts +62 -16
  25. package/dist/cjs/stockSkills/macd.js +92 -5
  26. package/dist/cjs/stockSkills/macd.test.js +26 -0
  27. package/dist/cjs/stockSkills/obv.d.ts +44 -0
  28. package/dist/cjs/stockSkills/obv.js +89 -0
  29. package/dist/cjs/stockSkills/obv.test.d.ts +1 -0
  30. package/dist/cjs/stockSkills/obv.test.js +20 -0
  31. package/dist/cjs/stockSkills/rsi.d.ts +8 -8
  32. package/dist/cjs/stockSkills/rsi.js +2 -2
  33. package/dist/cjs/stockSkills/utils/getWeekLine.d.ts +2 -2
  34. package/dist/cjs/stockSkills/williams.d.ts +8 -8
  35. package/dist/cjs/stockSkills/williams.js +2 -2
  36. package/dist/esm/analyze/Month/index.d.ts +1 -1
  37. package/dist/esm/analyze/Month/index.test.d.ts +1 -0
  38. package/dist/esm/analyze/Month/index.test.js +20 -0
  39. package/dist/esm/analyze/Regression/simpleRegressoinModel.d.ts +1 -1
  40. package/dist/esm/analyze/Slope/slope.test.js +6 -0
  41. package/dist/esm/analyze/TimeSeries/R/index.d.ts +1 -1
  42. package/dist/esm/index.d.ts +3 -0
  43. package/dist/esm/index.js +3 -0
  44. package/dist/esm/stockSkills/boll.d.ts +58 -0
  45. package/dist/esm/stockSkills/boll.js +99 -0
  46. package/dist/esm/stockSkills/boll.test.d.ts +1 -0
  47. package/dist/esm/stockSkills/boll.test.js +34 -0
  48. package/dist/esm/stockSkills/ema.d.ts +9 -0
  49. package/dist/esm/stockSkills/ema.js +39 -0
  50. package/dist/esm/stockSkills/ema.test.d.ts +1 -0
  51. package/dist/esm/stockSkills/ema.test.js +9 -0
  52. package/dist/esm/stockSkills/gold.d.ts +4 -4
  53. package/dist/esm/stockSkills/kd.d.ts +41 -14
  54. package/dist/esm/stockSkills/kd.js +60 -6
  55. package/dist/esm/stockSkills/kd.test.js +34 -2
  56. package/dist/esm/stockSkills/ma.d.ts +49 -30
  57. package/dist/esm/stockSkills/ma.js +37 -44
  58. package/dist/esm/stockSkills/ma.test.js +15 -20
  59. package/dist/esm/stockSkills/macd.d.ts +62 -16
  60. package/dist/esm/stockSkills/macd.js +92 -5
  61. package/dist/esm/stockSkills/macd.test.js +26 -0
  62. package/dist/esm/stockSkills/obv.d.ts +44 -0
  63. package/dist/esm/stockSkills/obv.js +87 -0
  64. package/dist/esm/stockSkills/obv.test.d.ts +1 -0
  65. package/dist/esm/stockSkills/obv.test.js +18 -0
  66. package/dist/esm/stockSkills/rsi.d.ts +8 -8
  67. package/dist/esm/stockSkills/rsi.js +2 -2
  68. package/dist/esm/stockSkills/utils/getWeekLine.d.ts +2 -2
  69. package/dist/esm/stockSkills/williams.d.ts +8 -8
  70. package/dist/esm/stockSkills/williams.js +2 -2
  71. package/dist/umd/index.js +458 -96
  72. package/package.json +15 -17
@@ -1,58 +1,77 @@
1
- declare type ListType = {
1
+ type DataType = {
2
2
  c: number;
3
- }[];
4
- declare type ResMa5 = {
5
- c: number;
6
- ma5?: number;
7
- }[];
8
- declare type ResMa10 = {
3
+ };
4
+ type ListType = DataType[];
5
+ type ResMa5 = {
9
6
  c: number;
10
- ma10?: number;
7
+ ma5: number | null;
11
8
  }[];
12
- declare type ResMa20 = {
9
+ type ResMa10 = {
13
10
  c: number;
14
- ma20?: number;
11
+ ma10: number | null;
15
12
  }[];
16
- declare type ResMa60 = {
13
+ type ResMa20 = {
17
14
  c: number;
18
- ma60?: number;
15
+ ma20: number | null;
19
16
  }[];
20
- declare type ResMaSelf = {
17
+ type ResMa60 = {
21
18
  c: number;
22
- maSelf?: number;
19
+ ma60: number | null;
23
20
  }[];
24
- declare type ResBoll = {
21
+ type ResMa = {
25
22
  c: number;
26
- ma25?: number;
27
- bollUb?: number;
28
- bollLb?: number;
23
+ ma: number | null;
29
24
  }[];
30
- declare type ResAllMa = {
25
+ type ResAllMa = {
31
26
  c: number;
32
- ma5?: number;
33
- ma10?: number;
34
- ma20?: number;
35
- ma25?: number;
36
- ma60?: number;
37
- bollUb?: number;
38
- bollLb?: number;
27
+ ma5: number | null;
28
+ ma10: number | null;
29
+ ma20: number | null;
30
+ ma25: number | null;
31
+ ma60: number | null;
39
32
  }[];
40
33
  interface MaType {
34
+ init: (data: DataType, type: number) => {
35
+ dataset: ListType;
36
+ ma: number;
37
+ type: number;
38
+ };
39
+ next: (data: DataType, preList: {
40
+ dataset: ListType;
41
+ ma: number;
42
+ type: number;
43
+ }, type: number) => {
44
+ dataset: ListType;
45
+ ma: number;
46
+ type: number;
47
+ };
41
48
  getAllMa: (list: ListType) => ResAllMa;
42
49
  getMa5: (list: ListType) => ResMa5;
43
50
  getMa10: (list: ListType) => ResMa10;
44
51
  getMa20: (list: ListType) => ResMa20;
45
52
  getMa60: (list: ListType) => ResMa60;
46
- getMaSelf: (list: ListType, self: number) => ResMaSelf;
47
- getBoll: (list: ListType) => ResBoll;
53
+ getMa: (list: ListType, self: number) => ResMa;
48
54
  }
49
55
  export default class Ma implements MaType {
56
+ init(data: DataType, type: number): {
57
+ dataset: DataType[];
58
+ ma: number;
59
+ type: number;
60
+ };
61
+ next(data: DataType, preList: {
62
+ dataset: ListType;
63
+ ma: number;
64
+ type: number;
65
+ }, type: number): {
66
+ dataset: ListType;
67
+ ma: number;
68
+ type: number;
69
+ };
50
70
  getAllMa(list: ListType): ResAllMa;
51
71
  getMa5(list: ListType): ResMa5;
52
72
  getMa10(list: ListType): ResMa10;
53
73
  getMa20(list: ListType): ResMa20;
54
74
  getMa60(list: ListType): ResMa60;
55
- getMaSelf(list: ListType, self: number): ResMaSelf;
56
- getBoll(list: ListType): ResBoll;
75
+ getMa(list: ListType, self: number): ResMa;
57
76
  }
58
77
  export {};
@@ -14,6 +14,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  var Ma = /** @class */ (function () {
15
15
  function Ma() {
16
16
  }
17
+ Object.defineProperty(Ma.prototype, "init", {
18
+ enumerable: false,
19
+ configurable: true,
20
+ writable: true,
21
+ value: function (data, type) {
22
+ return { dataset: [data], ma: 0, type: type };
23
+ }
24
+ });
25
+ Object.defineProperty(Ma.prototype, "next", {
26
+ enumerable: false,
27
+ configurable: true,
28
+ writable: true,
29
+ value: function (data, preList, type) {
30
+ preList.dataset.push(data);
31
+ if (preList.dataset.length < type) {
32
+ return { dataset: preList.dataset, ma: 0, type: type };
33
+ }
34
+ else {
35
+ if (preList.dataset.length > type) {
36
+ preList.dataset.shift();
37
+ }
38
+ var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
39
+ var ma = Math.round((sum / type) * 100) / 100;
40
+ return { dataset: preList.dataset, ma: ma, type: type };
41
+ }
42
+ }
43
+ });
17
44
  Object.defineProperty(Ma.prototype, "getAllMa", {
18
45
  enumerable: false,
19
46
  configurable: true,
@@ -24,9 +51,8 @@ var Ma = /** @class */ (function () {
24
51
  var responseMa10 = this.getMa10(list);
25
52
  var responseMa20 = this.getMa20(list);
26
53
  var responseMa60 = this.getMa60(list);
27
- var responseBoll = this.getBoll(list);
28
54
  for (var i = 0; i < list.length; i++) {
29
- res[i] = Object.assign(list[i], responseMa5[i], responseMa10[i], responseMa20[i], responseMa60[i], responseBoll[i]);
55
+ res[i] = Object.assign(list[i], responseMa5[i], responseMa10[i], responseMa20[i], responseMa60[i]);
30
56
  }
31
57
  return res;
32
58
  }
@@ -39,7 +65,7 @@ var Ma = /** @class */ (function () {
39
65
  var res = [];
40
66
  for (var i = 0; i < list.length; i++) {
41
67
  if (i < 4)
42
- res[i] = __assign(__assign({}, list[i]), { ma5: undefined });
68
+ res[i] = __assign(__assign({}, list[i]), { ma5: null });
43
69
  else {
44
70
  var sum = list
45
71
  .slice(i - 4, i + 1)
@@ -59,7 +85,7 @@ var Ma = /** @class */ (function () {
59
85
  var res = [];
60
86
  for (var i = 0; i < list.length; i++) {
61
87
  if (i < 9)
62
- res[i] = __assign(__assign({}, list[i]), { ma10: undefined });
88
+ res[i] = __assign(__assign({}, list[i]), { ma10: null });
63
89
  else {
64
90
  var sum = list
65
91
  .slice(i - 9, i + 1)
@@ -79,7 +105,7 @@ var Ma = /** @class */ (function () {
79
105
  var res = [];
80
106
  for (var i = 0; i < list.length; i++) {
81
107
  if (i < 19)
82
- res[i] = __assign(__assign({}, list[i]), { ma20: undefined });
108
+ res[i] = __assign(__assign({}, list[i]), { ma20: null });
83
109
  else {
84
110
  var sum = list
85
111
  .slice(i - 19, i + 1)
@@ -99,7 +125,7 @@ var Ma = /** @class */ (function () {
99
125
  var res = [];
100
126
  for (var i = 0; i < list.length; i++) {
101
127
  if (i < 59)
102
- res[i] = __assign(__assign({}, list[i]), { ma60: undefined });
128
+ res[i] = __assign(__assign({}, list[i]), { ma60: null });
103
129
  else {
104
130
  var sum = list
105
131
  .slice(i - 59, i + 1)
@@ -111,59 +137,26 @@ var Ma = /** @class */ (function () {
111
137
  return res;
112
138
  }
113
139
  });
114
- Object.defineProperty(Ma.prototype, "getMaSelf", {
140
+ Object.defineProperty(Ma.prototype, "getMa", {
115
141
  enumerable: false,
116
142
  configurable: true,
117
143
  writable: true,
118
144
  value: function (list, self) {
119
145
  var res = [];
120
146
  for (var i = 0; i < list.length; i++) {
121
- if (i < (self - 1))
122
- res[i] = __assign(__assign({}, list[i]), { maSelf: undefined });
147
+ if (i < self - 1)
148
+ res[i] = __assign(__assign({}, list[i]), { ma: null });
123
149
  else {
124
150
  var sum = list
125
151
  .slice(i - (self - 1), i + 1)
126
152
  .reduce(function (pre, current) { return pre + current.c; }, 0);
127
- var maSelf = Math.round((sum / self) * 100) / 100;
128
- res[i] = __assign(__assign({}, list[i]), { maSelf: maSelf });
153
+ var ma = Math.round((sum / self) * 100) / 100;
154
+ res[i] = __assign(__assign({}, list[i]), { ma: ma });
129
155
  }
130
156
  }
131
157
  return res;
132
158
  }
133
159
  });
134
- Object.defineProperty(Ma.prototype, "getBoll", {
135
- enumerable: false,
136
- configurable: true,
137
- writable: true,
138
- value: function (list) {
139
- var res = [];
140
- var _loop_1 = function (i) {
141
- if (i < 24)
142
- res[i] = __assign(__assign({}, list[i]), { ma25: undefined, bollUb: undefined, bollLb: undefined });
143
- else {
144
- // ma25
145
- var sumMa25 = list
146
- .slice(i - 24, i + 1)
147
- .reduce(function (pre, current) { return pre + current.c; }, 0);
148
- var ma25_1 = Math.round((sumMa25 / 25) * 100) / 100;
149
- // 標準差
150
- var sumBase = res
151
- .slice(i - 24, i + 1)
152
- .reduce(function (pre, current) {
153
- return ma25_1 !== undefined
154
- ? pre + Math.pow(current.c - ma25_1, 2)
155
- : pre;
156
- }, 0);
157
- var base = Math.round(Math.sqrt(sumBase / 25) * 100) / 100;
158
- res[i] = __assign(__assign({}, list[i]), { ma25: ma25_1, bollUb: ma25_1 + 2 * base, bollLb: ma25_1 - 2 * base });
159
- }
160
- };
161
- for (var i = 0; i < list.length; i++) {
162
- _loop_1(i);
163
- }
164
- return res;
165
- }
166
- });
167
160
  return Ma;
168
161
  }());
169
162
  exports.default = Ma;
@@ -3,6 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var ma_1 = require("./ma");
4
4
  var test_data_test_1 = require("./test_data.test");
5
5
  describe("test ma methods", function () {
6
+ it("test init & next", function () {
7
+ var index = test_data_test_1.default.length - 1;
8
+ var ma = new ma_1.default();
9
+ var realData = ma.getMa5(test_data_test_1.default)[index];
10
+ var init = ma.init(test_data_test_1.default[0], 5);
11
+ var res = init;
12
+ for (var i = 1; i <= index; i++) {
13
+ var item = test_data_test_1.default[i];
14
+ res = ma.next(item, res, 5);
15
+ }
16
+ expect(realData.ma5).toEqual(res.ma);
17
+ });
6
18
  it("test getMa5()", function () {
7
19
  var ma = new ma_1.default();
8
20
  expect(ma.getMa5(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
@@ -51,30 +63,16 @@ describe("test ma methods", function () {
51
63
  ma60: 134.86,
52
64
  });
53
65
  });
54
- it("test getMaSelf()", function () {
55
- var ma = new ma_1.default();
56
- expect(ma.getMaSelf(test_data_test_1.default, 20)[test_data_test_1.default.length - 1]).toEqual({
57
- c: 142,
58
- o: 138,
59
- t: 20211214,
60
- v: 16841,
61
- h: 143,
62
- l: 138,
63
- maSelf: 144.88,
64
- });
65
- });
66
- it("test getBoll()", function () {
66
+ it("test getMa()", function () {
67
67
  var ma = new ma_1.default();
68
- expect(ma.getBoll(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
68
+ expect(ma.getMa(test_data_test_1.default, 20)[test_data_test_1.default.length - 1]).toEqual({
69
69
  c: 142,
70
70
  o: 138,
71
71
  t: 20211214,
72
72
  v: 16841,
73
73
  h: 143,
74
74
  l: 138,
75
- ma25: 142.66,
76
- bollLb: 126.69999999999999,
77
- bollUb: 158.62,
75
+ ma: 144.88,
78
76
  });
79
77
  });
80
78
  it("test getAllMa()", function () {
@@ -90,9 +88,6 @@ describe("test ma methods", function () {
90
88
  ma10: 146.7,
91
89
  ma20: 144.88,
92
90
  ma60: 134.86,
93
- ma25: 142.66,
94
- bollUb: 158.62,
95
- bollLb: 126.69999999999999,
96
91
  });
97
92
  });
98
93
  });
@@ -1,44 +1,67 @@
1
- declare type ItemType = {
1
+ type ItemType = {
2
2
  h: number;
3
3
  l: number;
4
4
  c: number;
5
5
  };
6
- declare type ResEMA12Type = {
6
+ type ResEMA12Type = {
7
7
  h: number;
8
8
  l: number;
9
9
  c: number;
10
- EMA12?: number;
10
+ EMA12: number | null;
11
11
  }[];
12
- declare type ResEMA26Type = {
12
+ type ResEMA26Type = {
13
13
  h: number;
14
14
  l: number;
15
15
  c: number;
16
- EMA26?: number;
16
+ EMA26: number | null;
17
17
  }[];
18
- declare type ResDifType = {
18
+ type ResDifType = {
19
19
  h: number;
20
20
  l: number;
21
21
  c: number;
22
- DIF?: number;
22
+ DIF: number | null;
23
23
  }[];
24
- declare type ResMacd9Type = {
24
+ type ResMacd9Type = {
25
25
  h: number;
26
26
  l: number;
27
27
  c: number;
28
- MACD9?: number;
29
- OSC?: number;
28
+ MACD9: number | null;
29
+ OSC: number | null;
30
30
  }[];
31
- declare type ResAllMacdType = {
31
+ type ResAllMacdType = {
32
32
  h: number;
33
33
  l: number;
34
34
  c: number;
35
- EMA12?: number;
36
- EMA26?: number;
37
- DIF?: number;
38
- MACD9?: number;
39
- OSC?: number;
35
+ EMA12: number | null;
36
+ EMA26: number | null;
37
+ DIF: number | null;
38
+ MACD9: number | null;
39
+ OSC: number | null;
40
40
  }[];
41
41
  interface MacdType {
42
+ init: (data: ItemType) => {
43
+ dataset: ItemType[];
44
+ ema12: number | null;
45
+ ema26: number | null;
46
+ dif: number[];
47
+ macd: number | null;
48
+ osc: number | null;
49
+ };
50
+ next: (data: ItemType, preList: {
51
+ dataset: ItemType[];
52
+ ema12: number | null;
53
+ ema26: number | null;
54
+ dif: number[];
55
+ macd: number | null;
56
+ osc: number | null;
57
+ }) => {
58
+ dataset: ItemType[];
59
+ ema12: number | null;
60
+ ema26: number | null;
61
+ dif: number[];
62
+ macd: number | null;
63
+ osc: number | null;
64
+ };
42
65
  getMACD: (list: ItemType[]) => ResAllMacdType;
43
66
  getDI: (item: ItemType) => number;
44
67
  getStartEMA: (list: ItemType[]) => number;
@@ -48,6 +71,29 @@ interface MacdType {
48
71
  getMACD9: (list: ItemType[], DIF: ResDifType) => ResMacd9Type;
49
72
  }
50
73
  export default class MACD implements MacdType {
74
+ init(data: ItemType): {
75
+ dataset: ItemType[];
76
+ ema12: number | null;
77
+ ema26: number | null;
78
+ dif: number[];
79
+ macd: number | null;
80
+ osc: number | null;
81
+ };
82
+ next(data: ItemType, preList: {
83
+ dataset: ItemType[];
84
+ ema12: number | null;
85
+ ema26: number | null;
86
+ dif: number[];
87
+ macd: number | null;
88
+ osc: number | null;
89
+ }): {
90
+ dataset: ItemType[];
91
+ ema12: number | null;
92
+ ema26: number | null;
93
+ dif: number[];
94
+ macd: number | null;
95
+ osc: number | null;
96
+ };
51
97
  getMACD(list: ItemType[]): ResAllMacdType;
52
98
  getDI(item: ItemType): number;
53
99
  getStartEMA(arr: ItemType[]): number;
@@ -14,6 +14,93 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  var MACD = /** @class */ (function () {
15
15
  function MACD() {
16
16
  }
17
+ Object.defineProperty(MACD.prototype, "init", {
18
+ enumerable: false,
19
+ configurable: true,
20
+ writable: true,
21
+ value: function (data) {
22
+ return {
23
+ dataset: [data],
24
+ ema12: null,
25
+ ema26: null,
26
+ dif: [],
27
+ macd: null,
28
+ osc: null,
29
+ };
30
+ }
31
+ });
32
+ Object.defineProperty(MACD.prototype, "next", {
33
+ enumerable: false,
34
+ configurable: true,
35
+ writable: true,
36
+ value: function (data, preList) {
37
+ var _a, _b;
38
+ preList.dataset.push(data);
39
+ if (preList.dataset.length > 34)
40
+ preList.dataset.shift();
41
+ // EMA12
42
+ var ema12 = null;
43
+ if (preList.dataset.length === 12) {
44
+ ema12 = this.getStartEMA(preList.dataset);
45
+ ema12 = (ema12 * 11) / 13 + (this.getDI(data) * 2) / 13;
46
+ ema12 = Math.round(ema12 * 100) / 100;
47
+ }
48
+ else if (preList.dataset.length > 12 && preList.ema12) {
49
+ ema12 = (preList.ema12 * 11) / 13 + (this.getDI(data) * 2) / 13;
50
+ ema12 = Math.round(ema12 * 100) / 100;
51
+ }
52
+ // EMA26
53
+ var ema26 = null;
54
+ if (preList.dataset.length === 26) {
55
+ ema26 = this.getStartEMA(preList.dataset);
56
+ ema26 = (ema26 * 25) / 27 + (this.getDI(data) * 2) / 27;
57
+ ema26 = Math.round(ema26 * 100) / 100;
58
+ }
59
+ else if (preList.dataset.length > 26 && preList.ema26) {
60
+ ema26 = (preList.ema26 * 25) / 27 + (this.getDI(data) * 2) / 27;
61
+ ema26 = Math.round(ema26 * 100) / 100;
62
+ }
63
+ // DIF
64
+ var dif = null;
65
+ if (ema12 && ema26) {
66
+ dif = ema12 - ema26;
67
+ dif = Math.round(dif * 100) / 100;
68
+ (_a = preList.dif) === null || _a === void 0 ? void 0 : _a.push(dif);
69
+ if (preList.dif.length > 9)
70
+ (_b = preList.dif) === null || _b === void 0 ? void 0 : _b.shift();
71
+ }
72
+ // MACD & OSC
73
+ var macd = null;
74
+ var osc = null;
75
+ if (preList.dif.length === 9) {
76
+ if (preList.macd === null) {
77
+ macd = preList.dif.reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
78
+ for (var i = 0; i < 9; i++) {
79
+ var item = preList.dif[i];
80
+ macd = macd + ((item - macd) * 2) / 10;
81
+ macd = Math.round(macd * 100) / 100;
82
+ osc = item - macd;
83
+ osc = Math.round(osc * 100) / 100;
84
+ }
85
+ }
86
+ else {
87
+ macd = preList.macd + ((dif - preList.macd) * 2) / 10;
88
+ macd = Math.round(macd * 100) / 100;
89
+ var item = preList.dif[preList.dif.length - 1];
90
+ osc = item - macd;
91
+ osc = Math.round(osc * 100) / 100;
92
+ }
93
+ }
94
+ return {
95
+ dataset: preList.dataset,
96
+ ema12: ema12,
97
+ ema26: ema26,
98
+ dif: preList.dif,
99
+ macd: macd,
100
+ osc: osc,
101
+ };
102
+ }
103
+ });
17
104
  Object.defineProperty(MACD.prototype, "getMACD", {
18
105
  enumerable: false,
19
106
  configurable: true,
@@ -26,7 +113,7 @@ var MACD = /** @class */ (function () {
26
113
  var DIF = this.getDIF(list, EMA12, EMA26);
27
114
  var MACD9 = this.getMACD9(list, DIF);
28
115
  for (var i = 0; i < list.length; i++) {
29
- res[i] = Object.assign(list[i], DIF[i], MACD9[i]);
116
+ res[i] = Object.assign(list[i], DIF[i], MACD9[i], EMA12[i], EMA26[i]);
30
117
  }
31
118
  return res;
32
119
  }
@@ -63,7 +150,7 @@ var MACD = /** @class */ (function () {
63
150
  var res = [];
64
151
  for (var i = 0; i < list.length; i++) {
65
152
  if (i < 12)
66
- res[i] = __assign(__assign({}, list[i]), { EMA12: undefined });
153
+ res[i] = __assign(__assign({}, list[i]), { EMA12: null });
67
154
  else {
68
155
  beforeEMA12 = (beforeEMA12 * 11) / 13 + (this.getDI(list[i]) * 2) / 13;
69
156
  res[i] = __assign(__assign({}, list[i]), { EMA12: beforeEMA12 });
@@ -82,7 +169,7 @@ var MACD = /** @class */ (function () {
82
169
  var res = [];
83
170
  for (var i = 0; i < list.length; i++) {
84
171
  if (i < 26)
85
- res[i] = __assign(__assign({}, list[i]), { EMA26: undefined });
172
+ res[i] = __assign(__assign({}, list[i]), { EMA26: null });
86
173
  else {
87
174
  beforeEMA26 = (beforeEMA26 * 25) / 27 + (this.getDI(list[i]) * 2) / 27;
88
175
  res[i] = __assign(__assign({}, list[i]), { EMA26: beforeEMA26 });
@@ -100,7 +187,7 @@ var MACD = /** @class */ (function () {
100
187
  var res = [];
101
188
  for (var i = 0; i < list.length; i++) {
102
189
  if (i < 26)
103
- res[i] = __assign(__assign({}, list[i]), { DIF: undefined });
190
+ res[i] = __assign(__assign({}, list[i]), { DIF: null });
104
191
  else {
105
192
  var EMA12 = ((_a = ResEMA12 === null || ResEMA12 === void 0 ? void 0 : ResEMA12[i]) === null || _a === void 0 ? void 0 : _a["EMA12"]) && ResEMA12[i]["EMA12"];
106
193
  var EMA26 = ((_b = ResEMA26 === null || ResEMA26 === void 0 ? void 0 : ResEMA26[i]) === null || _b === void 0 ? void 0 : _b["EMA26"]) && ResEMA26[i]["EMA26"];
@@ -120,7 +207,7 @@ var MACD = /** @class */ (function () {
120
207
  var beforeMACD9 = 0;
121
208
  for (var i = 0; i < list.length; i++) {
122
209
  if (i < 26)
123
- res[i] = __assign(__assign({}, list[i]), { MACD9: undefined, OSC: undefined });
210
+ res[i] = __assign(__assign({}, list[i]), { MACD9: null, OSC: null });
124
211
  else if (i === 26) {
125
212
  var MACD9 = DIF.slice(26, 34)
126
213
  .map(function (item) { return ((item === null || item === void 0 ? void 0 : item.DIF) ? item["DIF"] : 0); })
@@ -3,6 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var macd_1 = require("./macd");
4
4
  var test_data_test_1 = require("./test_data.test");
5
5
  describe("test macd methods", function () {
6
+ it("test init & next", function () {
7
+ var _a, _b;
8
+ var index = test_data_test_1.default.length - 1;
9
+ var macd = new macd_1.default();
10
+ var init = macd.init(test_data_test_1.default[0]);
11
+ var res = init;
12
+ for (var i = 1; i <= index; i++) {
13
+ var item = test_data_test_1.default[i];
14
+ res = macd.next(item, res);
15
+ }
16
+ expect({
17
+ ema12: 144.02,
18
+ ema26: 142.23,
19
+ dif: 1.79,
20
+ macd: 3.46,
21
+ osc: -1.67,
22
+ }).toEqual({
23
+ ema12: res.ema12,
24
+ ema26: res.ema26,
25
+ dif: (_a = res.dif) === null || _a === void 0 ? void 0 : _a[((_b = res.dif) === null || _b === void 0 ? void 0 : _b.length) - 1],
26
+ macd: res.macd,
27
+ osc: res.osc,
28
+ });
29
+ });
6
30
  it("test getEMA12()", function () {
7
31
  var macd = new macd_1.default();
8
32
  expect(macd.getEMA12(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
@@ -69,6 +93,8 @@ describe("test macd methods", function () {
69
93
  DIF: 1.7905942688080358,
70
94
  MACD9: 3.461688641153529,
71
95
  OSC: -1.6710943723454932,
96
+ EMA12: 144.01967137166324,
97
+ EMA26: 142.2290771028552
72
98
  });
73
99
  });
74
100
  });
@@ -0,0 +1,44 @@
1
+ type ItemType = {
2
+ h: number;
3
+ l: number;
4
+ c: number;
5
+ v: number;
6
+ };
7
+ type ResObv = {
8
+ obv: number;
9
+ } & ItemType;
10
+ interface ObvType {
11
+ init: (data: ItemType) => {
12
+ dataset: ItemType[];
13
+ obv: number;
14
+ preClose: number;
15
+ };
16
+ next: (data: ItemType, preList: {
17
+ dataset: ItemType[];
18
+ obv: number;
19
+ preClose: number;
20
+ }) => {
21
+ dataset: ItemType[];
22
+ obv: number;
23
+ preClose: number;
24
+ };
25
+ getObv: (list: ItemType[], period: number) => ResObv[];
26
+ }
27
+ export default class Obv implements ObvType {
28
+ init(data: ItemType): {
29
+ dataset: ItemType[];
30
+ obv: number;
31
+ preClose: number;
32
+ };
33
+ next(data: ItemType, preList: {
34
+ dataset: ItemType[];
35
+ obv: number;
36
+ preClose: number;
37
+ }): {
38
+ dataset: ItemType[];
39
+ obv: number;
40
+ preClose: number;
41
+ };
42
+ getObv(list: ItemType[]): ResObv[];
43
+ }
44
+ export {};