@ch20026103/anysis 0.0.14-alpha → 0.0.16-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 (49) hide show
  1. package/demo/main.js +19 -12
  2. package/dist/cjs/stockSkills/boll.d.ts +25 -50
  3. package/dist/cjs/stockSkills/boll.js +9 -11
  4. package/dist/cjs/stockSkills/ema.d.ts +11 -33
  5. package/dist/cjs/stockSkills/gold.d.ts +12 -32
  6. package/dist/cjs/stockSkills/kd.d.ts +29 -72
  7. package/dist/cjs/stockSkills/kd.js +14 -11
  8. package/dist/cjs/stockSkills/kd.test.js +1 -1
  9. package/dist/cjs/stockSkills/ma.d.ts +39 -60
  10. package/dist/cjs/stockSkills/ma.js +16 -7
  11. package/dist/cjs/stockSkills/macd.d.ts +32 -63
  12. package/dist/cjs/stockSkills/macd.js +21 -24
  13. package/dist/cjs/stockSkills/obv.d.ts +16 -49
  14. package/dist/cjs/stockSkills/obv.js +3 -1
  15. package/dist/cjs/stockSkills/rsi.d.ts +12 -31
  16. package/dist/cjs/stockSkills/rsi.js +79 -101
  17. package/dist/cjs/stockSkills/rsi.test.js +9 -20
  18. package/dist/cjs/stockSkills/types.d.ts +10 -0
  19. package/dist/cjs/stockSkills/types.js +2 -0
  20. package/dist/cjs/stockSkills/utils/getWeekLine.d.ts +4 -16
  21. package/dist/cjs/stockSkills/utils/getWeekLine.js +3 -0
  22. package/dist/cjs/stockSkills/utils/getWeekLine.test.js +1 -0
  23. package/dist/cjs/stockSkills/vma.d.ts +11 -26
  24. package/dist/cjs/stockSkills/williams.d.ts +20 -32
  25. package/dist/esm/stockSkills/boll.d.ts +25 -50
  26. package/dist/esm/stockSkills/boll.js +9 -11
  27. package/dist/esm/stockSkills/ema.d.ts +11 -33
  28. package/dist/esm/stockSkills/gold.d.ts +12 -32
  29. package/dist/esm/stockSkills/kd.d.ts +29 -72
  30. package/dist/esm/stockSkills/kd.js +14 -11
  31. package/dist/esm/stockSkills/kd.test.js +1 -1
  32. package/dist/esm/stockSkills/ma.d.ts +39 -60
  33. package/dist/esm/stockSkills/ma.js +16 -7
  34. package/dist/esm/stockSkills/macd.d.ts +32 -63
  35. package/dist/esm/stockSkills/macd.js +21 -24
  36. package/dist/esm/stockSkills/obv.d.ts +16 -49
  37. package/dist/esm/stockSkills/obv.js +3 -1
  38. package/dist/esm/stockSkills/rsi.d.ts +12 -31
  39. package/dist/esm/stockSkills/rsi.js +79 -101
  40. package/dist/esm/stockSkills/rsi.test.js +9 -20
  41. package/dist/esm/stockSkills/types.d.ts +10 -0
  42. package/dist/esm/stockSkills/types.js +1 -0
  43. package/dist/esm/stockSkills/utils/getWeekLine.d.ts +4 -16
  44. package/dist/esm/stockSkills/utils/getWeekLine.js +3 -0
  45. package/dist/esm/stockSkills/utils/getWeekLine.test.js +1 -0
  46. package/dist/esm/stockSkills/vma.d.ts +11 -26
  47. package/dist/esm/stockSkills/williams.d.ts +20 -32
  48. package/dist/umd/index.js +145 -155
  49. package/package.json +17 -15
@@ -19,7 +19,12 @@ var Ma = /** @class */ (function () {
19
19
  configurable: true,
20
20
  writable: true,
21
21
  value: function (data, type) {
22
- return { dataset: [data], ma: 0, type: type, exclusionValue: { "d+1": 0, d: 0, "d-1": 0 } };
22
+ return {
23
+ dataset: [data],
24
+ ma: 0,
25
+ type: type,
26
+ exclusionValue: { "d+1": 0, d: 0, "d-1": 0 },
27
+ };
23
28
  }
24
29
  });
25
30
  Object.defineProperty(Ma.prototype, "next", {
@@ -37,7 +42,11 @@ var Ma = /** @class */ (function () {
37
42
  };
38
43
  }
39
44
  else {
40
- var exclusionValue = { "d+1": preList.dataset[1].c, d: preList.dataset[0].c, "d-1": 0 };
45
+ var exclusionValue = {
46
+ "d+1": preList.dataset[1].c,
47
+ d: preList.dataset[0].c,
48
+ "d-1": 0,
49
+ };
41
50
  if (preList.dataset.length > type) {
42
51
  exclusionValue["d-1"] = exclusionValue.d;
43
52
  preList.dataset.shift();
@@ -74,7 +83,7 @@ var Ma = /** @class */ (function () {
74
83
  var res = [];
75
84
  for (var i = 0; i < list.length; i++) {
76
85
  if (i < 4)
77
- res[i] = __assign(__assign({}, list[i]), { ma5: null });
86
+ res[i] = __assign(__assign({}, list[i]), { ma5: 0 });
78
87
  else {
79
88
  var sum = list
80
89
  .slice(i - 4, i + 1)
@@ -94,7 +103,7 @@ var Ma = /** @class */ (function () {
94
103
  var res = [];
95
104
  for (var i = 0; i < list.length; i++) {
96
105
  if (i < 9)
97
- res[i] = __assign(__assign({}, list[i]), { ma10: null });
106
+ res[i] = __assign(__assign({}, list[i]), { ma10: 0 });
98
107
  else {
99
108
  var sum = list
100
109
  .slice(i - 9, i + 1)
@@ -114,7 +123,7 @@ var Ma = /** @class */ (function () {
114
123
  var res = [];
115
124
  for (var i = 0; i < list.length; i++) {
116
125
  if (i < 19)
117
- res[i] = __assign(__assign({}, list[i]), { ma20: null });
126
+ res[i] = __assign(__assign({}, list[i]), { ma20: 0 });
118
127
  else {
119
128
  var sum = list
120
129
  .slice(i - 19, i + 1)
@@ -134,7 +143,7 @@ var Ma = /** @class */ (function () {
134
143
  var res = [];
135
144
  for (var i = 0; i < list.length; i++) {
136
145
  if (i < 59)
137
- res[i] = __assign(__assign({}, list[i]), { ma60: null });
146
+ res[i] = __assign(__assign({}, list[i]), { ma60: 0 });
138
147
  else {
139
148
  var sum = list
140
149
  .slice(i - 59, i + 1)
@@ -154,7 +163,7 @@ var Ma = /** @class */ (function () {
154
163
  var res = [];
155
164
  for (var i = 0; i < list.length; i++) {
156
165
  if (i < self - 1)
157
- res[i] = __assign(__assign({}, list[i]), { ma: null });
166
+ res[i] = __assign(__assign({}, list[i]), { ma: 0 });
158
167
  else {
159
168
  var sum = list
160
169
  .slice(i - (self - 1), i + 1)
@@ -1,8 +1,4 @@
1
- type ItemType = {
2
- h: number;
3
- l: number;
4
- c: number;
5
- };
1
+ import { StockListType, StockType } from "./types";
6
2
  type ResEMA12Type = {
7
3
  h: number;
8
4
  l: number;
@@ -38,68 +34,41 @@ type ResAllMacdType = {
38
34
  MACD9: number | null;
39
35
  OSC: number | null;
40
36
  }[];
37
+ export type MacdResType = {
38
+ dataset: StockListType;
39
+ ema12: number;
40
+ ema26: number;
41
+ dif: number[];
42
+ macd: number;
43
+ osc: number;
44
+ };
41
45
  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
- };
65
- getMACD: (list: ItemType[]) => ResAllMacdType;
66
- getDI: (item: ItemType) => number;
67
- getStartEMA: (list: ItemType[]) => number;
68
- getEMA12: (list: ItemType[]) => ResEMA12Type;
69
- getEMA26: (list: ItemType[]) => ResEMA26Type;
70
- getDIF: (list: ItemType[], ResEMA12: ResEMA12Type, ResEMA26: ResEMA26Type) => ResDifType;
71
- getMACD9: (list: ItemType[], DIF: ResDifType) => ResMacd9Type;
46
+ init: (data: StockType) => MacdResType;
47
+ next: (data: StockType, preList: MacdResType) => MacdResType;
48
+ getMACD: (list: StockType[]) => ResAllMacdType;
49
+ getDI: (item: StockType) => number;
50
+ getStartEMA: (list: StockType[]) => number;
51
+ getEMA12: (list: StockType[]) => ResEMA12Type;
52
+ getEMA26: (list: StockType[]) => ResEMA26Type;
53
+ getDIF: (list: StockType[], ResEMA12: ResEMA12Type, ResEMA26: ResEMA26Type) => ResDifType;
54
+ getMACD9: (list: StockType[], DIF: ResDifType) => ResMacd9Type;
72
55
  }
73
56
  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;
57
+ init(data: StockType): MacdResType;
58
+ next(data: StockType, preList: MacdResType): {
59
+ dataset: StockListType;
60
+ ema12: number;
61
+ ema26: number;
93
62
  dif: number[];
94
- macd: number | null;
95
- osc: number | null;
63
+ macd: number;
64
+ osc: number;
96
65
  };
97
- getMACD(list: ItemType[]): ResAllMacdType;
98
- getDI(item: ItemType): number;
99
- getStartEMA(arr: ItemType[]): number;
100
- getEMA12(list: ItemType[]): ResEMA12Type;
101
- getEMA26(list: ItemType[]): ResEMA26Type;
102
- getDIF(list: ItemType[], ResEMA12: ResEMA12Type, ResEMA26: ResEMA26Type): ResDifType;
103
- getMACD9(list: ItemType[], DIF: ResDifType): ResMacd9Type;
66
+ getMACD(list: StockType[]): ResAllMacdType;
67
+ getDI(item: StockType): number;
68
+ getStartEMA(arr: StockType[]): number;
69
+ getEMA12(list: StockType[]): ResEMA12Type;
70
+ getEMA26(list: StockType[]): ResEMA26Type;
71
+ getDIF(list: StockType[], ResEMA12: ResEMA12Type, ResEMA26: ResEMA26Type): ResDifType;
72
+ getMACD9(list: StockType[], DIF: ResDifType): ResMacd9Type;
104
73
  }
105
74
  export {};
@@ -21,11 +21,11 @@ var MACD = /** @class */ (function () {
21
21
  value: function (data) {
22
22
  return {
23
23
  dataset: [data],
24
- ema12: null,
25
- ema26: null,
24
+ ema12: 0,
25
+ ema26: 0,
26
26
  dif: [],
27
- macd: null,
28
- osc: null,
27
+ macd: 0,
28
+ osc: 0,
29
29
  };
30
30
  }
31
31
  });
@@ -39,7 +39,7 @@ var MACD = /** @class */ (function () {
39
39
  if (preList.dataset.length > 34)
40
40
  preList.dataset.shift();
41
41
  // EMA12
42
- var ema12 = null;
42
+ var ema12 = 0;
43
43
  if (preList.dataset.length === 12) {
44
44
  ema12 = this.getStartEMA(preList.dataset);
45
45
  ema12 = (ema12 * 11) / 13 + (this.getDI(data) * 2) / 13;
@@ -50,7 +50,7 @@ var MACD = /** @class */ (function () {
50
50
  ema12 = Math.round(ema12 * 100) / 100;
51
51
  }
52
52
  // EMA26
53
- var ema26 = null;
53
+ var ema26 = 0;
54
54
  if (preList.dataset.length === 26) {
55
55
  ema26 = this.getStartEMA(preList.dataset);
56
56
  ema26 = (ema26 * 25) / 27 + (this.getDI(data) * 2) / 27;
@@ -61,36 +61,33 @@ var MACD = /** @class */ (function () {
61
61
  ema26 = Math.round(ema26 * 100) / 100;
62
62
  }
63
63
  // DIF
64
- var dif = null;
64
+ var dif = 0;
65
65
  if (ema12 && ema26) {
66
66
  dif = ema12 - ema26;
67
67
  dif = Math.round(dif * 100) / 100;
68
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
69
  }
72
70
  // MACD & OSC
73
- var macd = null;
74
- var osc = null;
71
+ var macd = 0;
72
+ var osc = 0;
75
73
  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;
74
+ macd = preList.dif.reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
75
+ for (var i = 0; i < 9; i++) {
76
+ var item = preList.dif[i];
77
+ macd = macd + ((item - macd) * 2) / 10;
88
78
  macd = Math.round(macd * 100) / 100;
89
- var item = preList.dif[preList.dif.length - 1];
90
79
  osc = item - macd;
91
80
  osc = Math.round(osc * 100) / 100;
92
81
  }
93
82
  }
83
+ else if (preList.dif.length > 9) {
84
+ macd = preList.macd + ((dif - preList.macd) * 2) / 10;
85
+ macd = Math.round(macd * 100) / 100;
86
+ var item = preList.dif[preList.dif.length - 1];
87
+ osc = item - macd;
88
+ osc = Math.round(osc * 100) / 100;
89
+ (_b = preList.dif) === null || _b === void 0 ? void 0 : _b.shift();
90
+ }
94
91
  return {
95
92
  dataset: preList.dataset,
96
93
  ema12: ema12,
@@ -1,56 +1,23 @@
1
- type ItemType = {
2
- h: number;
3
- l: number;
4
- c: number;
5
- v: number;
6
- };
1
+ import { StockListType, StockType } from "./types";
7
2
  type ResObv = {
8
3
  obv: number;
9
- } & ItemType;
4
+ } & StockType;
5
+ export type ObvResType = {
6
+ dataset: StockListType;
7
+ obv: number;
8
+ obvList: number[];
9
+ preClose: number;
10
+ obvMa: number;
11
+ type: number;
12
+ };
10
13
  interface ObvType {
11
- init: (data: ItemType, type: number) => {
12
- dataset: ItemType[];
13
- obv: number;
14
- obvList: number[];
15
- preClose: number;
16
- obvMa: number;
17
- };
18
- next: (data: ItemType, preList: {
19
- dataset: ItemType[];
20
- obv: number;
21
- obvList: number[];
22
- preClose: number;
23
- obvMa: number;
24
- }, type: number) => {
25
- dataset: ItemType[];
26
- obv: number;
27
- obvList: number[];
28
- preClose: number;
29
- obvMa: number;
30
- };
31
- getObv: (list: ItemType[], period: number) => ResObv[];
14
+ init: (data: StockType, type: number) => ObvResType;
15
+ next: (data: StockType, preList: ObvResType, type: number) => ObvResType;
16
+ getObv: (list: StockType[], period: number) => ResObv[];
32
17
  }
33
18
  export default class Obv implements ObvType {
34
- init(data: ItemType, type: number): {
35
- dataset: ItemType[];
36
- obv: number;
37
- obvList: number[];
38
- preClose: number;
39
- obvMa: number;
40
- };
41
- next(data: ItemType, preList: {
42
- dataset: ItemType[];
43
- obv: number;
44
- obvList: number[];
45
- preClose: number;
46
- obvMa: number;
47
- }, type: number): {
48
- dataset: ItemType[];
49
- obv: number;
50
- preClose: number;
51
- obvList: number[];
52
- obvMa: number;
53
- };
54
- getObv(list: ItemType[]): ResObv[];
19
+ init(data: StockType, type: number): ObvResType;
20
+ next(data: StockType, preList: ObvResType, type: number): ObvResType;
21
+ getObv(list: StockType[]): ResObv[];
55
22
  }
56
23
  export {};
@@ -34,6 +34,7 @@ var Obv = /** @class */ (function () {
34
34
  obvList: [data.v],
35
35
  preClose: data.c,
36
36
  obvMa: 0,
37
+ type: type,
37
38
  };
38
39
  }
39
40
  });
@@ -64,7 +65,8 @@ var Obv = /** @class */ (function () {
64
65
  obv: obv,
65
66
  preClose: currentClose,
66
67
  obvList: obvList,
67
- obvMa: vma
68
+ obvMa: vma,
69
+ type: type,
68
70
  };
69
71
  }
70
72
  });
@@ -1,32 +1,13 @@
1
- type ListType = {
2
- c: number;
3
- }[];
4
- type ResRsi6Type = {
5
- c: number;
6
- rsi6: number | null;
7
- }[];
8
- type ResRsi12Type = {
9
- c: number;
10
- rsi12: number | null;
11
- }[];
12
- type ResAllRsiType = {
13
- c: number;
14
- rsi6: number | null;
15
- rsi12: number | null;
16
- }[];
17
- interface RsiType {
18
- getRsi6: (list: ListType) => ResRsi6Type;
19
- getRsi12: (list: ListType) => ResRsi12Type;
20
- getStartUpAvg: (list: ListType, count: number) => number;
21
- getStartDownAvg: (list: ListType, count: number) => number;
22
- getRsi: (UpAvg: number, DownAvg: number) => number;
1
+ import { StockListType, StockType } from "./types";
2
+ export type RsiResType = {
3
+ dataset: StockListType;
4
+ rsi: number;
5
+ type: number;
6
+ avgGain: number;
7
+ avgLoss: number;
8
+ };
9
+ export default class Rsi {
10
+ init(data: StockType, type: number): RsiResType;
11
+ next(data: StockType, preList: RsiResType, type: number): RsiResType;
12
+ calculateRSI(prices: StockListType, period?: number): number[];
23
13
  }
24
- export default class Rsi implements RsiType {
25
- getAllRsi(list: ListType): ResAllRsiType;
26
- getRsi6(list: ListType): ResRsi6Type;
27
- getRsi12(list: ListType): ResRsi12Type;
28
- getStartUpAvg(list: ListType, count: number): number;
29
- getStartDownAvg(list: ListType, count: number): number;
30
- getRsi(UpAvg: number, DownAvg: number): number;
31
- }
32
- export {};
@@ -14,130 +14,108 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  var Rsi = /** @class */ (function () {
15
15
  function Rsi() {
16
16
  }
17
- Object.defineProperty(Rsi.prototype, "getAllRsi", {
17
+ Object.defineProperty(Rsi.prototype, "init", {
18
18
  enumerable: false,
19
19
  configurable: true,
20
20
  writable: true,
21
- value: function (list) {
22
- var res = [];
23
- var rsi6 = this.getRsi6(list);
24
- var rsi12 = this.getRsi12(list);
25
- for (var i = 0; i < list.length; i++) {
26
- res[i] = Object.assign(list[i], rsi6[i], rsi12[i]);
27
- }
28
- return res;
21
+ value: function (data, type) {
22
+ return {
23
+ dataset: [data],
24
+ rsi: 0,
25
+ type: type,
26
+ avgGain: 0,
27
+ avgLoss: 0,
28
+ };
29
29
  }
30
30
  });
31
- Object.defineProperty(Rsi.prototype, "getRsi6", {
31
+ Object.defineProperty(Rsi.prototype, "next", {
32
32
  enumerable: false,
33
33
  configurable: true,
34
34
  writable: true,
35
- value: function (list) {
36
- var res = [];
37
- // 前5筆
38
- for (var i = 0; i < 5; i++) {
39
- res[i] = __assign(__assign({}, list[i]), { rsi6: null });
35
+ value: function (data, preList, type) {
36
+ preList.dataset.push(data);
37
+ if (preList.dataset.length < type + 1) {
38
+ return __assign(__assign({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
40
39
  }
41
- // 第6筆Rsi
42
- var beforeUpAvg = this.getStartUpAvg(list, 6);
43
- var beforeDownAvg = this.getStartDownAvg(list, 6);
44
- var firstRsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
45
- res[5] = __assign(__assign({}, list[5]), { rsi6: firstRsi6 });
46
- // else
47
- for (var i = 6; i < list.length; i++) {
48
- var minusU = 0;
49
- var minusD = 0;
50
- var minusC = list[i]["c"] - list[i - 1]["c"];
51
- if (minusC > 0) {
52
- minusU = minusC;
40
+ else {
41
+ // 计算初始增益和损失
42
+ var avgGain = 0;
43
+ var avgLoss = 0;
44
+ if (preList.dataset.length === type + 1) {
45
+ var gains = 0;
46
+ var losses = 0;
47
+ for (var i = 1; i <= type; i++) {
48
+ var change = preList.dataset[i].c - preList.dataset[i - 1].c;
49
+ if (change > 0) {
50
+ gains += change;
51
+ }
52
+ else {
53
+ losses -= change;
54
+ }
55
+ }
56
+ avgGain = gains / type;
57
+ avgLoss = losses / type;
53
58
  }
54
- else {
55
- minusD = minusC;
59
+ else if (preList.dataset.length > type + 1) {
60
+ preList.dataset.shift();
61
+ // 更新平均增益和平均损失
62
+ var change = preList.dataset[preList.dataset.length - 1].c -
63
+ preList.dataset[preList.dataset.length - 2].c;
64
+ avgGain =
65
+ (preList.avgGain * (type - 1) + (change > 0 ? change : 0)) / type;
66
+ avgLoss =
67
+ (preList.avgLoss * (type - 1) + (change < 0 ? -change : 0)) / type;
56
68
  }
57
- beforeUpAvg = (beforeUpAvg * 5) / 6 + minusU / 6;
58
- beforeDownAvg = (beforeDownAvg * 5) / 6 + Math.abs(minusD) / 6;
59
- var rsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
60
- res[i] = __assign(__assign({}, list[i]), { rsi6: Math.round(rsi6 * 100) / 100 });
69
+ // 计算RSI
70
+ var rs = avgGain / avgLoss;
71
+ var rsi = 100 - 100 / (1 + rs);
72
+ return __assign(__assign({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
61
73
  }
62
- return res;
63
74
  }
64
75
  });
65
- Object.defineProperty(Rsi.prototype, "getRsi12", {
76
+ Object.defineProperty(Rsi.prototype, "calculateRSI", {
66
77
  enumerable: false,
67
78
  configurable: true,
68
79
  writable: true,
69
- value: function (list) {
70
- var res = [];
71
- // 前11筆
72
- for (var i = 0; i < 11; i++) {
73
- res[i] = __assign(__assign({}, list[i]), { rsi12: null });
80
+ value: function (prices, period) {
81
+ if (period === void 0) { period = 5; }
82
+ if (prices.length < period + 1) {
83
+ return [];
74
84
  }
75
- // 第12筆Rsi
76
- var beforeUpAvg = this.getStartUpAvg(list, 12);
77
- var beforeDownAvg = this.getStartDownAvg(list, 12);
78
- var firstRsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
79
- res[11] = __assign(__assign({}, list[11]), { rsi12: firstRsi12 });
80
- // else
81
- for (var i = 12; i < list.length; i++) {
82
- var minusU = 0;
83
- var minusD = 0;
84
- var minusC = list[i]["c"] - list[i - 1]["c"];
85
- if (minusC > 0) {
86
- minusU = minusC;
87
- }
88
- else {
89
- minusD = minusC;
90
- }
91
- beforeUpAvg = (beforeUpAvg * 11) / 12 + minusU / 12;
92
- beforeDownAvg = (beforeDownAvg * 11) / 12 + Math.abs(minusD) / 12;
93
- var rsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
94
- res[i] = __assign(__assign({}, list[i]), { rsi12: Math.round(rsi12 * 100) / 100 });
85
+ // 计算价格变化
86
+ var changes = [];
87
+ for (var i = 1; i < prices.length; i++) {
88
+ changes.push(prices[i].c - prices[i - 1].c);
95
89
  }
96
- return res;
97
- }
98
- });
99
- Object.defineProperty(Rsi.prototype, "getStartUpAvg", {
100
- enumerable: false,
101
- configurable: true,
102
- writable: true,
103
- value: function (list, count) {
104
- var start = list.slice(0, 5);
105
- var sum = 0;
106
- for (var i = 1; i < start.length; i++) {
107
- var minus = start[i]["c"] - start[i - 1]["c"];
108
- if (minus > 0) {
109
- sum += minus;
90
+ // 计算增益和损失
91
+ var gains = 0;
92
+ var losses = 0;
93
+ for (var i = 0; i < period; i++) {
94
+ if (changes[i] > 0) {
95
+ gains += changes[i];
110
96
  }
111
- }
112
- return sum / count;
113
- }
114
- });
115
- Object.defineProperty(Rsi.prototype, "getStartDownAvg", {
116
- enumerable: false,
117
- configurable: true,
118
- writable: true,
119
- value: function (list, count) {
120
- var start = list.slice(0, 5);
121
- var sum = 0;
122
- for (var i = 1; i < start.length; i++) {
123
- var minus = start[i]["c"] - start[i - 1]["c"];
124
- if (minus < 0) {
125
- sum += minus;
97
+ else {
98
+ losses -= changes[i];
126
99
  }
127
100
  }
128
- return Math.abs(sum / count);
129
- }
130
- });
131
- Object.defineProperty(Rsi.prototype, "getRsi", {
132
- enumerable: false,
133
- configurable: true,
134
- writable: true,
135
- value: function (UpAvg, DownAvg) {
136
- var res = 0;
137
- if (UpAvg + DownAvg !== 0) {
138
- res = (UpAvg / (UpAvg + DownAvg)) * 100;
101
+ // 计算初始平均增益和平均损失
102
+ var avgGain = gains / period;
103
+ var avgLoss = losses / period;
104
+ // 计算RSI
105
+ var rsis = [];
106
+ var rs = avgGain / avgLoss;
107
+ var rsi = 100 - 100 / (1 + rs);
108
+ rsis.push(rsi);
109
+ for (var i = period; i < changes.length; i++) {
110
+ // 更新平均增益和平均损失
111
+ var change = changes[i];
112
+ avgGain = (avgGain * (period - 1) + (change > 0 ? change : 0)) / period;
113
+ avgLoss = (avgLoss * (period - 1) + (change < 0 ? -change : 0)) / period;
114
+ var rs_1 = avgGain / avgLoss;
115
+ var rsi_1 = 100 - 100 / (1 + rs_1);
116
+ rsis.push(rsi_1);
139
117
  }
140
- return res;
118
+ return rsis;
141
119
  }
142
120
  });
143
121
  return Rsi;
@@ -3,28 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var rsi_1 = require("./rsi");
4
4
  var test_data_test_1 = require("./test_data.test");
5
5
  describe("test rsi methods", function () {
6
- it("test getRsi6()", function () {
6
+ it("test init & next", function () {
7
7
  var rsi = new rsi_1.default();
8
- expect(rsi.getRsi6(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
9
- c: 142,
10
- o: 138,
11
- t: 20211214,
12
- v: 16841,
13
- h: 143,
14
- l: 138,
15
- rsi6: 45.12,
16
- });
8
+ var result = rsi.init(test_data_test_1.default[0], 5);
9
+ for (var i = 1; i < test_data_test_1.default.length; i++) {
10
+ result = rsi.next(test_data_test_1.default[i], result, 5);
11
+ }
12
+ expect(result === null || result === void 0 ? void 0 : result.rsi).toEqual(44.72040034947733);
17
13
  });
18
- it("test getRsi12()", function () {
14
+ it("test calculateRSI()", function () {
19
15
  var rsi = new rsi_1.default();
20
- expect(rsi.getRsi12(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
21
- c: 142,
22
- o: 138,
23
- t: 20211214,
24
- v: 16841,
25
- h: 143,
26
- l: 138,
27
- rsi12: 49.47,
28
- });
16
+ var result = rsi.calculateRSI(test_data_test_1.default, 5);
17
+ expect(result === null || result === void 0 ? void 0 : result[(result === null || result === void 0 ? void 0 : result.length) - 1]).toEqual(44.72040034947733);
29
18
  });
30
19
  });
@@ -0,0 +1,10 @@
1
+ export type StockType = {
2
+ c: number;
3
+ v: number;
4
+ l: number;
5
+ h: number;
6
+ o: number;
7
+ t: number;
8
+ [key: string]: unknown;
9
+ };
10
+ export type StockListType = StockType[];