@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
@@ -12,130 +12,108 @@ var __assign = (this && this.__assign) || function () {
12
12
  var Rsi = /** @class */ (function () {
13
13
  function Rsi() {
14
14
  }
15
- Object.defineProperty(Rsi.prototype, "getAllRsi", {
15
+ Object.defineProperty(Rsi.prototype, "init", {
16
16
  enumerable: false,
17
17
  configurable: true,
18
18
  writable: true,
19
- value: function (list) {
20
- var res = [];
21
- var rsi6 = this.getRsi6(list);
22
- var rsi12 = this.getRsi12(list);
23
- for (var i = 0; i < list.length; i++) {
24
- res[i] = Object.assign(list[i], rsi6[i], rsi12[i]);
25
- }
26
- return res;
19
+ value: function (data, type) {
20
+ return {
21
+ dataset: [data],
22
+ rsi: 0,
23
+ type: type,
24
+ avgGain: 0,
25
+ avgLoss: 0,
26
+ };
27
27
  }
28
28
  });
29
- Object.defineProperty(Rsi.prototype, "getRsi6", {
29
+ Object.defineProperty(Rsi.prototype, "next", {
30
30
  enumerable: false,
31
31
  configurable: true,
32
32
  writable: true,
33
- value: function (list) {
34
- var res = [];
35
- // 前5筆
36
- for (var i = 0; i < 5; i++) {
37
- res[i] = __assign(__assign({}, list[i]), { rsi6: null });
33
+ value: function (data, preList, type) {
34
+ preList.dataset.push(data);
35
+ if (preList.dataset.length < type + 1) {
36
+ return __assign(__assign({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
38
37
  }
39
- // 第6筆Rsi
40
- var beforeUpAvg = this.getStartUpAvg(list, 6);
41
- var beforeDownAvg = this.getStartDownAvg(list, 6);
42
- var firstRsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
43
- res[5] = __assign(__assign({}, list[5]), { rsi6: firstRsi6 });
44
- // else
45
- for (var i = 6; i < list.length; i++) {
46
- var minusU = 0;
47
- var minusD = 0;
48
- var minusC = list[i]["c"] - list[i - 1]["c"];
49
- if (minusC > 0) {
50
- minusU = minusC;
38
+ else {
39
+ // 计算初始增益和损失
40
+ var avgGain = 0;
41
+ var avgLoss = 0;
42
+ if (preList.dataset.length === type + 1) {
43
+ var gains = 0;
44
+ var losses = 0;
45
+ for (var i = 1; i <= type; i++) {
46
+ var change = preList.dataset[i].c - preList.dataset[i - 1].c;
47
+ if (change > 0) {
48
+ gains += change;
49
+ }
50
+ else {
51
+ losses -= change;
52
+ }
53
+ }
54
+ avgGain = gains / type;
55
+ avgLoss = losses / type;
51
56
  }
52
- else {
53
- minusD = minusC;
57
+ else if (preList.dataset.length > type + 1) {
58
+ preList.dataset.shift();
59
+ // 更新平均增益和平均损失
60
+ var change = preList.dataset[preList.dataset.length - 1].c -
61
+ preList.dataset[preList.dataset.length - 2].c;
62
+ avgGain =
63
+ (preList.avgGain * (type - 1) + (change > 0 ? change : 0)) / type;
64
+ avgLoss =
65
+ (preList.avgLoss * (type - 1) + (change < 0 ? -change : 0)) / type;
54
66
  }
55
- beforeUpAvg = (beforeUpAvg * 5) / 6 + minusU / 6;
56
- beforeDownAvg = (beforeDownAvg * 5) / 6 + Math.abs(minusD) / 6;
57
- var rsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
58
- res[i] = __assign(__assign({}, list[i]), { rsi6: Math.round(rsi6 * 100) / 100 });
67
+ // 计算RSI
68
+ var rs = avgGain / avgLoss;
69
+ var rsi = 100 - 100 / (1 + rs);
70
+ return __assign(__assign({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
59
71
  }
60
- return res;
61
72
  }
62
73
  });
63
- Object.defineProperty(Rsi.prototype, "getRsi12", {
74
+ Object.defineProperty(Rsi.prototype, "calculateRSI", {
64
75
  enumerable: false,
65
76
  configurable: true,
66
77
  writable: true,
67
- value: function (list) {
68
- var res = [];
69
- // 前11筆
70
- for (var i = 0; i < 11; i++) {
71
- res[i] = __assign(__assign({}, list[i]), { rsi12: null });
78
+ value: function (prices, period) {
79
+ if (period === void 0) { period = 5; }
80
+ if (prices.length < period + 1) {
81
+ return [];
72
82
  }
73
- // 第12筆Rsi
74
- var beforeUpAvg = this.getStartUpAvg(list, 12);
75
- var beforeDownAvg = this.getStartDownAvg(list, 12);
76
- var firstRsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
77
- res[11] = __assign(__assign({}, list[11]), { rsi12: firstRsi12 });
78
- // else
79
- for (var i = 12; i < list.length; i++) {
80
- var minusU = 0;
81
- var minusD = 0;
82
- var minusC = list[i]["c"] - list[i - 1]["c"];
83
- if (minusC > 0) {
84
- minusU = minusC;
85
- }
86
- else {
87
- minusD = minusC;
88
- }
89
- beforeUpAvg = (beforeUpAvg * 11) / 12 + minusU / 12;
90
- beforeDownAvg = (beforeDownAvg * 11) / 12 + Math.abs(minusD) / 12;
91
- var rsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
92
- res[i] = __assign(__assign({}, list[i]), { rsi12: Math.round(rsi12 * 100) / 100 });
83
+ // 计算价格变化
84
+ var changes = [];
85
+ for (var i = 1; i < prices.length; i++) {
86
+ changes.push(prices[i].c - prices[i - 1].c);
93
87
  }
94
- return res;
95
- }
96
- });
97
- Object.defineProperty(Rsi.prototype, "getStartUpAvg", {
98
- enumerable: false,
99
- configurable: true,
100
- writable: true,
101
- value: function (list, count) {
102
- var start = list.slice(0, 5);
103
- var sum = 0;
104
- for (var i = 1; i < start.length; i++) {
105
- var minus = start[i]["c"] - start[i - 1]["c"];
106
- if (minus > 0) {
107
- sum += minus;
88
+ // 计算增益和损失
89
+ var gains = 0;
90
+ var losses = 0;
91
+ for (var i = 0; i < period; i++) {
92
+ if (changes[i] > 0) {
93
+ gains += changes[i];
108
94
  }
109
- }
110
- return sum / count;
111
- }
112
- });
113
- Object.defineProperty(Rsi.prototype, "getStartDownAvg", {
114
- enumerable: false,
115
- configurable: true,
116
- writable: true,
117
- value: function (list, count) {
118
- var start = list.slice(0, 5);
119
- var sum = 0;
120
- for (var i = 1; i < start.length; i++) {
121
- var minus = start[i]["c"] - start[i - 1]["c"];
122
- if (minus < 0) {
123
- sum += minus;
95
+ else {
96
+ losses -= changes[i];
124
97
  }
125
98
  }
126
- return Math.abs(sum / count);
127
- }
128
- });
129
- Object.defineProperty(Rsi.prototype, "getRsi", {
130
- enumerable: false,
131
- configurable: true,
132
- writable: true,
133
- value: function (UpAvg, DownAvg) {
134
- var res = 0;
135
- if (UpAvg + DownAvg !== 0) {
136
- res = (UpAvg / (UpAvg + DownAvg)) * 100;
99
+ // 计算初始平均增益和平均损失
100
+ var avgGain = gains / period;
101
+ var avgLoss = losses / period;
102
+ // 计算RSI
103
+ var rsis = [];
104
+ var rs = avgGain / avgLoss;
105
+ var rsi = 100 - 100 / (1 + rs);
106
+ rsis.push(rsi);
107
+ for (var i = period; i < changes.length; i++) {
108
+ // 更新平均增益和平均损失
109
+ var change = changes[i];
110
+ avgGain = (avgGain * (period - 1) + (change > 0 ? change : 0)) / period;
111
+ avgLoss = (avgLoss * (period - 1) + (change < 0 ? -change : 0)) / period;
112
+ var rs_1 = avgGain / avgLoss;
113
+ var rsi_1 = 100 - 100 / (1 + rs_1);
114
+ rsis.push(rsi_1);
137
115
  }
138
- return res;
116
+ return rsis;
139
117
  }
140
118
  });
141
119
  return Rsi;
@@ -1,28 +1,17 @@
1
1
  import Rsi from "./rsi";
2
2
  import data from "./test_data.test";
3
3
  describe("test rsi methods", function () {
4
- it("test getRsi6()", function () {
4
+ it("test init & next", function () {
5
5
  var rsi = new Rsi();
6
- expect(rsi.getRsi6(data)[data.length - 1]).toEqual({
7
- c: 142,
8
- o: 138,
9
- t: 20211214,
10
- v: 16841,
11
- h: 143,
12
- l: 138,
13
- rsi6: 45.12,
14
- });
6
+ var result = rsi.init(data[0], 5);
7
+ for (var i = 1; i < data.length; i++) {
8
+ result = rsi.next(data[i], result, 5);
9
+ }
10
+ expect(result === null || result === void 0 ? void 0 : result.rsi).toEqual(44.72040034947733);
15
11
  });
16
- it("test getRsi12()", function () {
12
+ it("test calculateRSI()", function () {
17
13
  var rsi = new Rsi();
18
- expect(rsi.getRsi12(data)[data.length - 1]).toEqual({
19
- c: 142,
20
- o: 138,
21
- t: 20211214,
22
- v: 16841,
23
- h: 143,
24
- l: 138,
25
- rsi12: 49.47,
26
- });
14
+ var result = rsi.calculateRSI(data, 5);
15
+ expect(result === null || result === void 0 ? void 0 : result[(result === null || result === void 0 ? void 0 : result.length) - 1]).toEqual(44.72040034947733);
27
16
  });
28
17
  });
@@ -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[];
@@ -0,0 +1 @@
1
+ export {};
@@ -1,17 +1,5 @@
1
- type ListType = {
2
- h: number;
3
- t: number;
4
- o: number;
5
- c: number;
6
- l: number;
7
- }[];
1
+ import { StockListType, StockType } from "../types";
8
2
  export type ResType = {
9
- h: number;
10
- t: number;
11
- o: number;
12
- c: number;
13
- l: number;
14
- detail?: ListType;
15
- };
16
- export default function getWeekLine(list: ListType, detail: boolean): ResType[];
17
- export {};
3
+ detail?: StockListType;
4
+ } & StockType;
5
+ export default function getWeekLine(list: StockListType, detail: boolean): ResType[];
@@ -34,6 +34,7 @@ export default function getWeekLine(list, detail) {
34
34
  t: collectWeekData[collectWeekData.length - 1]["t"],
35
35
  h: Math.max.apply(Math, collectWeekData.map(function (item) { return item.h; })),
36
36
  l: Math.min.apply(Math, collectWeekData.map(function (item) { return item.l; })),
37
+ v: collectWeekData.reduce(function (pre, current) { return pre + current.v; }, 0),
37
38
  };
38
39
  res.push(addDetail(obj, collectWeekData, detail));
39
40
  collectWeekData = [];
@@ -47,6 +48,7 @@ export default function getWeekLine(list, detail) {
47
48
  t: collectWeekData[collectWeekData.length - 1]["t"],
48
49
  h: Math.max.apply(Math, collectWeekData.map(function (item) { return item.h; })),
49
50
  l: Math.min.apply(Math, collectWeekData.map(function (item) { return item.l; })),
51
+ v: collectWeekData.reduce(function (pre, current) { return pre + current.v; }, 0),
50
52
  };
51
53
  res.push(addDetail(obj, collectWeekData, detail));
52
54
  }
@@ -62,6 +64,7 @@ export default function getWeekLine(list, detail) {
62
64
  t: collectWeekData[collectWeekData.length - 1]["t"],
63
65
  h: Math.max.apply(Math, collectWeekData.map(function (item) { return item.h; })),
64
66
  l: Math.min.apply(Math, collectWeekData.map(function (item) { return item.l; })),
67
+ v: collectWeekData.reduce(function (pre, current) { return pre + current.v; }, 0),
65
68
  };
66
69
  res.push(addDetail(obj, collectWeekData, detail));
67
70
  }
@@ -9,6 +9,7 @@ describe("test getWeekLine methods", function () {
9
9
  l: 137,
10
10
  o: 155,
11
11
  t: 20211210,
12
+ v: 78444,
12
13
  });
13
14
  });
14
15
  });
@@ -1,36 +1,21 @@
1
- type DataType = {
2
- v: number;
3
- [key: string]: unknown;
1
+ import { StockListType, StockType } from "./types";
2
+ export type VmaResType = {
3
+ dataset: StockListType;
4
+ vma: number;
5
+ type: number;
4
6
  };
5
- type ListType = DataType[];
6
7
  interface VmaType {
7
- init: (data: DataType, type: number) => {
8
- dataset: ListType;
9
- vma: number;
10
- type: number;
11
- };
12
- next: (data: DataType, preList: {
13
- dataset: ListType;
14
- vma: number;
15
- type: number;
16
- }, type: number) => {
17
- dataset: ListType;
18
- vma: number;
19
- type: number;
20
- };
8
+ init: (data: StockType, type: number) => VmaResType;
9
+ next: (data: StockType, preList: VmaResType, type: number) => VmaResType;
21
10
  }
22
11
  export default class Vma implements VmaType {
23
- init(data: DataType, type: number): {
24
- dataset: DataType[];
12
+ init(data: StockType, type: number): {
13
+ dataset: StockType[];
25
14
  vma: number;
26
15
  type: number;
27
16
  };
28
- next(data: DataType, preList: {
29
- dataset: ListType;
30
- vma: number;
31
- type: number;
32
- }, type: number): {
33
- dataset: ListType;
17
+ next(data: StockType, preList: VmaResType, type: number): {
18
+ dataset: StockListType;
34
19
  vma: number;
35
20
  type: number;
36
21
  };
@@ -1,9 +1,4 @@
1
- type DataType = {
2
- h: number;
3
- l: number;
4
- c: number;
5
- };
6
- type ListType = DataType[];
1
+ import { StockListType, StockType } from "./types";
7
2
  type ResWilliams9Type = {
8
3
  c: number;
9
4
  williams9: number | null;
@@ -17,42 +12,35 @@ type ResAllWilliamsType = {
17
12
  williams18: number | null;
18
13
  williams9: number | null;
19
14
  }[];
15
+ export type WilliamsResType = {
16
+ dataset: StockListType;
17
+ williams: number;
18
+ type: number;
19
+ };
20
20
  interface WilliamsType {
21
- init: (data: DataType, type: number) => {
22
- dataset: ListType;
23
- williams: number;
24
- type: number;
25
- };
26
- next: (data: DataType, preList: {
27
- dataset: ListType;
21
+ init: (data: StockType, type: number) => WilliamsResType;
22
+ next: (data: StockType, preList: {
23
+ dataset: StockListType;
28
24
  williams: number;
29
25
  type: number;
30
- }, type: number) => {
31
- dataset: ListType;
32
- williams: number;
33
- type: number;
34
- };
35
- getWilliams9: (list: ListType) => ResWilliams9Type;
36
- getWilliams18: (list: ListType) => ResWilliams18Type;
37
- getAllWillams(list: ListType): ResAllWilliamsType;
26
+ }, type: number) => WilliamsResType;
27
+ getWilliams9: (list: StockListType) => ResWilliams9Type;
28
+ getWilliams18: (list: StockListType) => ResWilliams18Type;
29
+ getAllWillams(list: StockListType): ResAllWilliamsType;
38
30
  }
39
31
  export default class Williams implements WilliamsType {
40
- init(data: DataType, type: number): {
41
- dataset: DataType[];
32
+ init(data: StockType, type: number): {
33
+ dataset: StockType[];
42
34
  williams: number;
43
35
  type: number;
44
36
  };
45
- next(data: DataType, preList: {
46
- dataset: ListType;
47
- williams: number;
48
- type: number;
49
- }, type: number): {
50
- dataset: ListType;
37
+ next(data: StockType, preList: WilliamsResType, type: number): {
38
+ dataset: StockListType;
51
39
  williams: number;
52
40
  type: number;
53
41
  };
54
- getAllWillams(list: ListType): ResAllWilliamsType;
55
- getWilliams9(list: ListType): ResWilliams9Type;
56
- getWilliams18(list: ListType): ResWilliams18Type;
42
+ getAllWillams(list: StockListType): ResAllWilliamsType;
43
+ getWilliams9(list: StockListType): ResWilliams9Type;
44
+ getWilliams18(list: StockListType): ResWilliams18Type;
57
45
  }
58
46
  export {};