@ch20026103/anysis 0.0.17-alpha1 → 0.0.17-alpha2

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.
@@ -18,6 +18,7 @@ export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
18
18
  export { default as Week } from "./stockSkills/week.js";
19
19
  export { default as Vma } from "./stockSkills/vma.js";
20
20
  export { default as Williams } from "./stockSkills/williams.js";
21
+ export { default as ObvEma } from "./stockSkills/obv_ema.js";
21
22
  export { add } from "./test/add.js";
22
23
  export { minus } from "./test/minus.js";
23
24
  export { default as calculateDivisionFactor } from "./utils/calculateDivisionFactor.js";
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.Williams = exports.Vma = exports.Week = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.findTroughByGradient = exports.findPeaksByGradient = exports.SwingExtremesType = exports.SwingExtremes = exports.slope = exports.simpleRegressionModel = exports.Angle = void 0;
3
+ exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.ObvEma = exports.Williams = exports.Vma = exports.Week = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.findTroughByGradient = exports.findPeaksByGradient = exports.SwingExtremesType = exports.SwingExtremes = exports.slope = exports.simpleRegressionModel = exports.Angle = void 0;
4
4
  /*
5
5
  請注意,在 src/index.ts 中,我的導入包含文件擴展名(.js)。
6
6
  如果需要支持 Node.js 和構建工具(ex: webpack),則不需要這樣做。 **因為commonJs默認js副檔名**
@@ -47,6 +47,8 @@ var vma_js_1 = require("./stockSkills/vma.js");
47
47
  Object.defineProperty(exports, "Vma", { enumerable: true, get: function () { return vma_js_1.default; } });
48
48
  var williams_js_1 = require("./stockSkills/williams.js");
49
49
  Object.defineProperty(exports, "Williams", { enumerable: true, get: function () { return williams_js_1.default; } });
50
+ var obv_ema_js_1 = require("./stockSkills/obv_ema.js");
51
+ Object.defineProperty(exports, "ObvEma", { enumerable: true, get: function () { return obv_ema_js_1.default; } });
50
52
  var add_js_1 = require("./test/add.js");
51
53
  Object.defineProperty(exports, "add", { enumerable: true, get: function () { return add_js_1.add; } });
52
54
  var minus_js_1 = require("./test/minus.js");
@@ -1,18 +1,4 @@
1
1
  import { StockListType, StockType } from "./types";
2
- type ResRSV = {
3
- c: number;
4
- rsv: number;
5
- [key: string]: unknown;
6
- };
7
- type ResKD = {
8
- c: number;
9
- rsv: number;
10
- k: number;
11
- d: number;
12
- "k-d": number;
13
- j: number;
14
- [key: string]: unknown;
15
- };
16
2
  export type KdResType = {
17
3
  dataset: StockListType;
18
4
  rsv: number;
@@ -25,13 +11,9 @@ export type KdResType = {
25
11
  interface KdClassType {
26
12
  init: (data: StockType, type: number) => KdResType;
27
13
  next: (data: StockType, preList: KdResType, type: number) => KdResType;
28
- getRSV: (list: StockListType) => ResRSV[];
29
- getKD: (list: StockListType) => ResKD[];
30
14
  }
31
15
  export default class Kd implements KdClassType {
32
16
  init(data: StockType, type: number): KdResType;
33
17
  next(data: StockType, preList: KdResType, type: number): KdResType;
34
- getRSV(list: StockListType): ResRSV[];
35
- getKD(list: StockListType): ResKD[];
36
18
  }
37
19
  export {};
@@ -1,15 +1,4 @@
1
1
  "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
2
  Object.defineProperty(exports, "__esModule", { value: true });
14
3
  var Kd = /** @class */ (function () {
15
4
  function Kd() {
@@ -76,60 +65,6 @@ var Kd = /** @class */ (function () {
76
65
  }
77
66
  }
78
67
  });
79
- Object.defineProperty(Kd.prototype, "getRSV", {
80
- enumerable: false,
81
- configurable: true,
82
- writable: true,
83
- value: function (list) {
84
- var res = [];
85
- for (var i = 0; i < list.length; i++) {
86
- if (i < 8)
87
- res[i] = __assign(__assign({}, list[i]), { rsv: 0 });
88
- else {
89
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
90
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
91
- var close_2 = list[i].c;
92
- var rsv = ((close_2 - low) / (hight - low)) * 100;
93
- rsv = Math.round(rsv * 100) / 100;
94
- res[i] = __assign(__assign({}, list[i]), { rsv: rsv });
95
- }
96
- }
97
- return res;
98
- }
99
- });
100
- Object.defineProperty(Kd.prototype, "getKD", {
101
- enumerable: false,
102
- configurable: true,
103
- writable: true,
104
- value: function (list) {
105
- var res = [];
106
- var yesterdayK = 50;
107
- var yesterdayD = 50;
108
- for (var i = 0; i < list.length; i++) {
109
- if (i < 8)
110
- res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
111
- else {
112
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
113
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
114
- var close_3 = list[i].c;
115
- var rsv = ((close_3 - low) / (hight - low)) * 100;
116
- rsv = Math.round(rsv * 100) / 100;
117
- var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
118
- var d = (2 / 3) * yesterdayD + (1 / 3) * k;
119
- var k_d = k - d;
120
- var j = 3 * k - 2 * d;
121
- k = Math.round(k * 100) / 100;
122
- d = Math.round(d * 100) / 100;
123
- k_d = Math.round(k_d * 100) / 100;
124
- j = Math.round(j * 100) / 100;
125
- res[i] = __assign(__assign({}, list[i]), { rsv: rsv, k: k, d: d, "k-d": k_d, j: j });
126
- yesterdayK = k;
127
- yesterdayD = d;
128
- }
129
- }
130
- return res;
131
- }
132
- });
133
68
  return Kd;
134
69
  }());
135
70
  exports.default = Kd;
@@ -6,61 +6,14 @@ describe("test kd methods", function () {
6
6
  it("test init", function () {
7
7
  var index = test_data_test_1.data_9904.length - 1;
8
8
  var kd = new kd_1.default();
9
- var realData = kd.getKD(test_data_test_1.data_9904)[index];
10
9
  var init = kd.init(test_data_test_1.data_9904[0], 9);
11
10
  var res = init;
12
11
  for (var i = 1; i <= index; i++) {
13
12
  var item = test_data_test_1.data_9904[i];
14
13
  res = kd.next(item, res, 9);
15
14
  }
16
- expect({
17
- dataset: {
18
- c: realData.c,
19
- h: realData.h,
20
- l: realData.l,
21
- },
22
- rsv: realData.rsv,
23
- "k-d": realData["k-d"],
24
- k: realData.k,
25
- d: realData.d,
26
- }).toEqual({
27
- dataset: {
28
- c: res.dataset[res.dataset.length - 1].c,
29
- h: res.dataset[res.dataset.length - 1].h,
30
- l: res.dataset[res.dataset.length - 1].l,
31
- },
32
- rsv: res.rsv,
33
- "k-d": res["k-d"],
34
- k: res.k,
35
- d: res.d,
36
- });
37
- });
38
- it("test getRSV()", function () {
39
- var kd = new kd_1.default();
40
- expect(kd.getRSV(test_data_test_1.data_9904)[test_data_test_1.data_9904.length - 1]).toEqual({
41
- o: 26.4,
42
- l: 34.3,
43
- h: 34.8,
44
- c: 34.65,
45
- v: 12765,
46
- t: 20230216,
47
- rsv: 90.63,
48
- });
49
- });
50
- it("test getKD()", function () {
51
- var kd = new kd_1.default();
52
- expect(kd.getKD(test_data_test_1.data_9904)[test_data_test_1.data_9904.length - 1]).toEqual({
53
- o: 26.4,
54
- l: 34.3,
55
- h: 34.8,
56
- c: 34.65,
57
- v: 12765,
58
- t: 20230216,
59
- rsv: 90.63,
60
- k: 64.41,
61
- d: 45.25,
62
- "k-d": 19.16,
63
- j: 6.93,
64
- });
15
+ expect(res.k).toEqual(64.41);
16
+ expect(res.d).toEqual(45.25);
17
+ expect(res.j).toEqual(102.73);
65
18
  });
66
19
  });
@@ -7,19 +7,16 @@ type ResObv = {
7
7
  export type ObvResType = {
8
8
  dataset: StockListType;
9
9
  obv: number;
10
- obvList: number[];
11
10
  preClose: number;
12
- obvMa: number;
13
- type: number;
14
11
  };
15
12
  interface ObvType {
16
- init: (data: NewStockType, type: number) => ObvResType;
17
- next: (data: NewStockType, preList: ObvResType, type: number) => ObvResType;
13
+ init: (data: NewStockType) => ObvResType;
14
+ next: (data: NewStockType, preList: ObvResType) => ObvResType;
18
15
  getObv: (list: NewStockListType, period: number) => ResObv[];
19
16
  }
20
17
  export default class Obv implements ObvType {
21
- init(data: NewStockType, type: number): ObvResType;
22
- next(data: NewStockType, preList: ObvResType, type: number): ObvResType;
18
+ init(data: NewStockType): ObvResType;
19
+ next(data: NewStockType, preList: ObvResType): ObvResType;
23
20
  getObv(list: NewStockListType): ResObv[];
24
21
  }
25
22
  export {};
@@ -27,14 +27,11 @@ var Obv = /** @class */ (function () {
27
27
  enumerable: false,
28
28
  configurable: true,
29
29
  writable: true,
30
- value: function (data, type) {
30
+ value: function (data) {
31
31
  return {
32
32
  dataset: [data],
33
33
  obv: data.v,
34
- obvList: [data.v],
35
34
  preClose: data.c,
36
- obvMa: 0,
37
- type: type,
38
35
  };
39
36
  }
40
37
  });
@@ -42,7 +39,7 @@ var Obv = /** @class */ (function () {
42
39
  enumerable: false,
43
40
  configurable: true,
44
41
  writable: true,
45
- value: function (data, preList, type) {
42
+ value: function (data, preList) {
46
43
  var currentVolume = data.v;
47
44
  var currentClose = data.c;
48
45
  // obv
@@ -53,20 +50,10 @@ var Obv = /** @class */ (function () {
53
50
  else if (currentClose < preList.preClose) {
54
51
  obv -= currentVolume;
55
52
  }
56
- // obv Ma
57
- var obvList = preList.obvList;
58
- obvList.push(obv);
59
- if (obvList.length > type)
60
- obvList.shift();
61
- var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
62
- var vma = Math.round((sum / type) * 100) / 100;
63
53
  return {
64
54
  dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
65
55
  obv: obv,
66
56
  preClose: currentClose,
67
- obvList: obvList,
68
- obvMa: vma,
69
- type: type,
70
57
  };
71
58
  }
72
59
  });
@@ -5,13 +5,15 @@ var test_data_test_1 = require("./test_data.test");
5
5
  describe("test obv methods", function () {
6
6
  it("test init", function () {
7
7
  var obv = new obv_1.default();
8
- var init = obv.init(test_data_test_1.data_9904[0], 5);
8
+ var init = obv.init(test_data_test_1.data_9904[0]);
9
9
  var res = init;
10
10
  for (var i = 1; i < test_data_test_1.data_9904.length; i++) {
11
11
  var item = test_data_test_1.data_9904[i];
12
- res = obv.next(item, res, 5);
12
+ res = obv.next(item, res);
13
13
  }
14
- expect({ obv: res.obv, obvMa: res.obvMa }).toEqual({ obv: 504538, obvMa: 494302.2 });
14
+ expect({ obv: res.obv }).toEqual({
15
+ obv: 504538,
16
+ });
15
17
  });
16
18
  it("test getObv()", function () {
17
19
  var kd = new obv_1.default();
@@ -0,0 +1,15 @@
1
+ export type ObvEmaResType = {
2
+ obvList: number[];
3
+ ema: number;
4
+ ma: number;
5
+ type: number;
6
+ };
7
+ interface ObvEmaType {
8
+ init: (obv: number, type: number) => ObvEmaResType;
9
+ next: (obv: number, preList: ObvEmaResType, type: number) => ObvEmaResType;
10
+ }
11
+ export default class ObvEma implements ObvEmaType {
12
+ init(obv: number, type: number): ObvEmaResType;
13
+ next(obv: number, preList: ObvEmaResType, type: number): ObvEmaResType;
14
+ }
15
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var ObvEma = /** @class */ (function () {
4
+ function ObvEma() {
5
+ }
6
+ Object.defineProperty(ObvEma.prototype, "init", {
7
+ enumerable: false,
8
+ configurable: true,
9
+ writable: true,
10
+ value: function (obv, type) {
11
+ return {
12
+ obvList: [obv],
13
+ ema: 0,
14
+ ma: 0,
15
+ type: type,
16
+ };
17
+ }
18
+ });
19
+ Object.defineProperty(ObvEma.prototype, "next", {
20
+ enumerable: false,
21
+ configurable: true,
22
+ writable: true,
23
+ value: function (obv, preList, type) {
24
+ var obvList = preList.obvList;
25
+ obvList.push(obv);
26
+ var ma = 0;
27
+ var ema = 0;
28
+ if (obvList.length === type) {
29
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
30
+ ma = Math.round((sum / type) * 100) / 100;
31
+ ema = ma;
32
+ }
33
+ else if (obvList.length > type) {
34
+ obvList.shift();
35
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
36
+ ma = Math.round((sum / type) * 100) / 100;
37
+ ema = (obv * 2 + (type - 1) * preList.ema) / (type + 1);
38
+ }
39
+ return {
40
+ obvList: obvList,
41
+ ema: ema,
42
+ ma: ma,
43
+ type: type,
44
+ };
45
+ }
46
+ });
47
+ return ObvEma;
48
+ }());
49
+ exports.default = ObvEma;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var obv_1 = require("./obv");
4
+ var obv_ema_1 = require("./obv_ema");
5
+ var test_data_test_1 = require("./test_data.test");
6
+ describe("ObvEma", function () {
7
+ it("test init", function () {
8
+ var obv = new obv_1.default();
9
+ var obvEma = new obv_ema_1.default();
10
+ var obvData = obv.init(test_data_test_1.data_9904[0]);
11
+ var emaData = obvEma.init(obvData.obv, 5);
12
+ for (var i = 1; i < test_data_test_1.data_9904.length; i++) {
13
+ var item = test_data_test_1.data_9904[i];
14
+ obvData = obv.next(item, obvData);
15
+ emaData = obvEma.next(obvData.obv, emaData, 5);
16
+ }
17
+ expect({ obv: obvData.obv, ma: emaData.ma, ema: emaData.ema }).toEqual({
18
+ obv: 504538,
19
+ ma: 494302.2,
20
+ ema: 496758.8736585481,
21
+ });
22
+ });
23
+ });
@@ -18,6 +18,7 @@ export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
18
18
  export { default as Week } from "./stockSkills/week.js";
19
19
  export { default as Vma } from "./stockSkills/vma.js";
20
20
  export { default as Williams } from "./stockSkills/williams.js";
21
+ export { default as ObvEma } from "./stockSkills/obv_ema.js";
21
22
  export { add } from "./test/add.js";
22
23
  export { minus } from "./test/minus.js";
23
24
  export { default as calculateDivisionFactor } from "./utils/calculateDivisionFactor.js";
package/dist/esm/index.js CHANGED
@@ -21,6 +21,7 @@ export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
21
21
  export { default as Week } from "./stockSkills/week.js";
22
22
  export { default as Vma } from "./stockSkills/vma.js";
23
23
  export { default as Williams } from "./stockSkills/williams.js";
24
+ export { default as ObvEma } from "./stockSkills/obv_ema.js";
24
25
  export { add } from "./test/add.js";
25
26
  export { minus } from "./test/minus.js";
26
27
  export { default as calculateDivisionFactor } from "./utils/calculateDivisionFactor.js";
@@ -1,18 +1,4 @@
1
1
  import { StockListType, StockType } from "./types";
2
- type ResRSV = {
3
- c: number;
4
- rsv: number;
5
- [key: string]: unknown;
6
- };
7
- type ResKD = {
8
- c: number;
9
- rsv: number;
10
- k: number;
11
- d: number;
12
- "k-d": number;
13
- j: number;
14
- [key: string]: unknown;
15
- };
16
2
  export type KdResType = {
17
3
  dataset: StockListType;
18
4
  rsv: number;
@@ -25,13 +11,9 @@ export type KdResType = {
25
11
  interface KdClassType {
26
12
  init: (data: StockType, type: number) => KdResType;
27
13
  next: (data: StockType, preList: KdResType, type: number) => KdResType;
28
- getRSV: (list: StockListType) => ResRSV[];
29
- getKD: (list: StockListType) => ResKD[];
30
14
  }
31
15
  export default class Kd implements KdClassType {
32
16
  init(data: StockType, type: number): KdResType;
33
17
  next(data: StockType, preList: KdResType, type: number): KdResType;
34
- getRSV(list: StockListType): ResRSV[];
35
- getKD(list: StockListType): ResKD[];
36
18
  }
37
19
  export {};
@@ -1,14 +1,3 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
1
  var Kd = /** @class */ (function () {
13
2
  function Kd() {
14
3
  }
@@ -74,60 +63,6 @@ var Kd = /** @class */ (function () {
74
63
  }
75
64
  }
76
65
  });
77
- Object.defineProperty(Kd.prototype, "getRSV", {
78
- enumerable: false,
79
- configurable: true,
80
- writable: true,
81
- value: function (list) {
82
- var res = [];
83
- for (var i = 0; i < list.length; i++) {
84
- if (i < 8)
85
- res[i] = __assign(__assign({}, list[i]), { rsv: 0 });
86
- else {
87
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
88
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
89
- var close_2 = list[i].c;
90
- var rsv = ((close_2 - low) / (hight - low)) * 100;
91
- rsv = Math.round(rsv * 100) / 100;
92
- res[i] = __assign(__assign({}, list[i]), { rsv: rsv });
93
- }
94
- }
95
- return res;
96
- }
97
- });
98
- Object.defineProperty(Kd.prototype, "getKD", {
99
- enumerable: false,
100
- configurable: true,
101
- writable: true,
102
- value: function (list) {
103
- var res = [];
104
- var yesterdayK = 50;
105
- var yesterdayD = 50;
106
- for (var i = 0; i < list.length; i++) {
107
- if (i < 8)
108
- res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
109
- else {
110
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
111
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
112
- var close_3 = list[i].c;
113
- var rsv = ((close_3 - low) / (hight - low)) * 100;
114
- rsv = Math.round(rsv * 100) / 100;
115
- var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
116
- var d = (2 / 3) * yesterdayD + (1 / 3) * k;
117
- var k_d = k - d;
118
- var j = 3 * k - 2 * d;
119
- k = Math.round(k * 100) / 100;
120
- d = Math.round(d * 100) / 100;
121
- k_d = Math.round(k_d * 100) / 100;
122
- j = Math.round(j * 100) / 100;
123
- res[i] = __assign(__assign({}, list[i]), { rsv: rsv, k: k, d: d, "k-d": k_d, j: j });
124
- yesterdayK = k;
125
- yesterdayD = d;
126
- }
127
- }
128
- return res;
129
- }
130
- });
131
66
  return Kd;
132
67
  }());
133
68
  export default Kd;
@@ -4,61 +4,14 @@ describe("test kd methods", function () {
4
4
  it("test init", function () {
5
5
  var index = data.length - 1;
6
6
  var kd = new Kd();
7
- var realData = kd.getKD(data)[index];
8
7
  var init = kd.init(data[0], 9);
9
8
  var res = init;
10
9
  for (var i = 1; i <= index; i++) {
11
10
  var item = data[i];
12
11
  res = kd.next(item, res, 9);
13
12
  }
14
- expect({
15
- dataset: {
16
- c: realData.c,
17
- h: realData.h,
18
- l: realData.l,
19
- },
20
- rsv: realData.rsv,
21
- "k-d": realData["k-d"],
22
- k: realData.k,
23
- d: realData.d,
24
- }).toEqual({
25
- dataset: {
26
- c: res.dataset[res.dataset.length - 1].c,
27
- h: res.dataset[res.dataset.length - 1].h,
28
- l: res.dataset[res.dataset.length - 1].l,
29
- },
30
- rsv: res.rsv,
31
- "k-d": res["k-d"],
32
- k: res.k,
33
- d: res.d,
34
- });
35
- });
36
- it("test getRSV()", function () {
37
- var kd = new Kd();
38
- expect(kd.getRSV(data)[data.length - 1]).toEqual({
39
- o: 26.4,
40
- l: 34.3,
41
- h: 34.8,
42
- c: 34.65,
43
- v: 12765,
44
- t: 20230216,
45
- rsv: 90.63,
46
- });
47
- });
48
- it("test getKD()", function () {
49
- var kd = new Kd();
50
- expect(kd.getKD(data)[data.length - 1]).toEqual({
51
- o: 26.4,
52
- l: 34.3,
53
- h: 34.8,
54
- c: 34.65,
55
- v: 12765,
56
- t: 20230216,
57
- rsv: 90.63,
58
- k: 64.41,
59
- d: 45.25,
60
- "k-d": 19.16,
61
- j: 6.93,
62
- });
13
+ expect(res.k).toEqual(64.41);
14
+ expect(res.d).toEqual(45.25);
15
+ expect(res.j).toEqual(102.73);
63
16
  });
64
17
  });
@@ -7,19 +7,16 @@ type ResObv = {
7
7
  export type ObvResType = {
8
8
  dataset: StockListType;
9
9
  obv: number;
10
- obvList: number[];
11
10
  preClose: number;
12
- obvMa: number;
13
- type: number;
14
11
  };
15
12
  interface ObvType {
16
- init: (data: NewStockType, type: number) => ObvResType;
17
- next: (data: NewStockType, preList: ObvResType, type: number) => ObvResType;
13
+ init: (data: NewStockType) => ObvResType;
14
+ next: (data: NewStockType, preList: ObvResType) => ObvResType;
18
15
  getObv: (list: NewStockListType, period: number) => ResObv[];
19
16
  }
20
17
  export default class Obv implements ObvType {
21
- init(data: NewStockType, type: number): ObvResType;
22
- next(data: NewStockType, preList: ObvResType, type: number): ObvResType;
18
+ init(data: NewStockType): ObvResType;
19
+ next(data: NewStockType, preList: ObvResType): ObvResType;
23
20
  getObv(list: NewStockListType): ResObv[];
24
21
  }
25
22
  export {};
@@ -25,14 +25,11 @@ var Obv = /** @class */ (function () {
25
25
  enumerable: false,
26
26
  configurable: true,
27
27
  writable: true,
28
- value: function (data, type) {
28
+ value: function (data) {
29
29
  return {
30
30
  dataset: [data],
31
31
  obv: data.v,
32
- obvList: [data.v],
33
32
  preClose: data.c,
34
- obvMa: 0,
35
- type: type,
36
33
  };
37
34
  }
38
35
  });
@@ -40,7 +37,7 @@ var Obv = /** @class */ (function () {
40
37
  enumerable: false,
41
38
  configurable: true,
42
39
  writable: true,
43
- value: function (data, preList, type) {
40
+ value: function (data, preList) {
44
41
  var currentVolume = data.v;
45
42
  var currentClose = data.c;
46
43
  // obv
@@ -51,20 +48,10 @@ var Obv = /** @class */ (function () {
51
48
  else if (currentClose < preList.preClose) {
52
49
  obv -= currentVolume;
53
50
  }
54
- // obv Ma
55
- var obvList = preList.obvList;
56
- obvList.push(obv);
57
- if (obvList.length > type)
58
- obvList.shift();
59
- var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
60
- var vma = Math.round((sum / type) * 100) / 100;
61
51
  return {
62
52
  dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
63
53
  obv: obv,
64
54
  preClose: currentClose,
65
- obvList: obvList,
66
- obvMa: vma,
67
- type: type,
68
55
  };
69
56
  }
70
57
  });
@@ -3,13 +3,15 @@ import { data_9904 as data } from "./test_data.test";
3
3
  describe("test obv methods", function () {
4
4
  it("test init", function () {
5
5
  var obv = new Obv();
6
- var init = obv.init(data[0], 5);
6
+ var init = obv.init(data[0]);
7
7
  var res = init;
8
8
  for (var i = 1; i < data.length; i++) {
9
9
  var item = data[i];
10
- res = obv.next(item, res, 5);
10
+ res = obv.next(item, res);
11
11
  }
12
- expect({ obv: res.obv, obvMa: res.obvMa }).toEqual({ obv: 504538, obvMa: 494302.2 });
12
+ expect({ obv: res.obv }).toEqual({
13
+ obv: 504538,
14
+ });
13
15
  });
14
16
  it("test getObv()", function () {
15
17
  var kd = new Obv();
@@ -0,0 +1,15 @@
1
+ export type ObvEmaResType = {
2
+ obvList: number[];
3
+ ema: number;
4
+ ma: number;
5
+ type: number;
6
+ };
7
+ interface ObvEmaType {
8
+ init: (obv: number, type: number) => ObvEmaResType;
9
+ next: (obv: number, preList: ObvEmaResType, type: number) => ObvEmaResType;
10
+ }
11
+ export default class ObvEma implements ObvEmaType {
12
+ init(obv: number, type: number): ObvEmaResType;
13
+ next(obv: number, preList: ObvEmaResType, type: number): ObvEmaResType;
14
+ }
15
+ export {};
@@ -0,0 +1,47 @@
1
+ var ObvEma = /** @class */ (function () {
2
+ function ObvEma() {
3
+ }
4
+ Object.defineProperty(ObvEma.prototype, "init", {
5
+ enumerable: false,
6
+ configurable: true,
7
+ writable: true,
8
+ value: function (obv, type) {
9
+ return {
10
+ obvList: [obv],
11
+ ema: 0,
12
+ ma: 0,
13
+ type: type,
14
+ };
15
+ }
16
+ });
17
+ Object.defineProperty(ObvEma.prototype, "next", {
18
+ enumerable: false,
19
+ configurable: true,
20
+ writable: true,
21
+ value: function (obv, preList, type) {
22
+ var obvList = preList.obvList;
23
+ obvList.push(obv);
24
+ var ma = 0;
25
+ var ema = 0;
26
+ if (obvList.length === type) {
27
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
28
+ ma = Math.round((sum / type) * 100) / 100;
29
+ ema = ma;
30
+ }
31
+ else if (obvList.length > type) {
32
+ obvList.shift();
33
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
34
+ ma = Math.round((sum / type) * 100) / 100;
35
+ ema = (obv * 2 + (type - 1) * preList.ema) / (type + 1);
36
+ }
37
+ return {
38
+ obvList: obvList,
39
+ ema: ema,
40
+ ma: ma,
41
+ type: type,
42
+ };
43
+ }
44
+ });
45
+ return ObvEma;
46
+ }());
47
+ export default ObvEma;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import Obv from "./obv";
2
+ import ObvEma from "./obv_ema";
3
+ import { data_9904 as data } from "./test_data.test";
4
+ describe("ObvEma", function () {
5
+ it("test init", function () {
6
+ var obv = new Obv();
7
+ var obvEma = new ObvEma();
8
+ var obvData = obv.init(data[0]);
9
+ var emaData = obvEma.init(obvData.obv, 5);
10
+ for (var i = 1; i < data.length; i++) {
11
+ var item = data[i];
12
+ obvData = obv.next(item, obvData);
13
+ emaData = obvEma.next(obvData.obv, emaData, 5);
14
+ }
15
+ expect({ obv: obvData.obv, ma: emaData.ma, ema: emaData.ema }).toEqual({
16
+ obv: 504538,
17
+ ma: 494302.2,
18
+ ema: 496758.8736585481,
19
+ });
20
+ });
21
+ });
package/dist/umd/index.js CHANGED
@@ -282,8 +282,8 @@
282
282
  return nextYearForecast;
283
283
  }
284
284
 
285
- var __assign$7 = (undefined && undefined.__assign) || function () {
286
- __assign$7 = Object.assign || function(t) {
285
+ var __assign$6 = (undefined && undefined.__assign) || function () {
286
+ __assign$6 = Object.assign || function(t) {
287
287
  for (var s, i = 1, n = arguments.length; i < n; i++) {
288
288
  s = arguments[i];
289
289
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -291,7 +291,7 @@
291
291
  }
292
292
  return t;
293
293
  };
294
- return __assign$7.apply(this, arguments);
294
+ return __assign$6.apply(this, arguments);
295
295
  };
296
296
  var Boll = /** @class */ (function () {
297
297
  function Boll() {
@@ -352,7 +352,7 @@
352
352
  var res = [];
353
353
  var _loop_1 = function (i) {
354
354
  if (i < type)
355
- res[i] = __assign$7(__assign$7({}, list[i]), { bollMa: 0, bollUb: 0, bollLb: 0 });
355
+ res[i] = __assign$6(__assign$6({}, list[i]), { bollMa: 0, bollUb: 0, bollLb: 0 });
356
356
  else {
357
357
  // bollMa
358
358
  var sumMa = list
@@ -366,7 +366,7 @@
366
366
  return bollMa_2 !== 0 ? pre + Math.pow(current.c - bollMa_2, 2) : pre;
367
367
  }, 0);
368
368
  var std = Math.round(Math.sqrt(difference / type) * 100) / 100;
369
- res[i] = __assign$7(__assign$7({}, list[i]), { bollMa: bollMa_2, bollUb: bollMa_2 + 2 * std, bollLb: bollMa_2 - 2 * std });
369
+ res[i] = __assign$6(__assign$6({}, list[i]), { bollMa: bollMa_2, bollUb: bollMa_2 + 2 * std, bollLb: bollMa_2 - 2 * std });
370
370
  }
371
371
  };
372
372
  for (var i = 0; i < list.length; i++) {
@@ -455,8 +455,8 @@
455
455
  return Ema;
456
456
  }());
457
457
 
458
- var __assign$6 = (undefined && undefined.__assign) || function () {
459
- __assign$6 = Object.assign || function(t) {
458
+ var __assign$5 = (undefined && undefined.__assign) || function () {
459
+ __assign$5 = Object.assign || function(t) {
460
460
  for (var s, i = 1, n = arguments.length; i < n; i++) {
461
461
  s = arguments[i];
462
462
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -464,13 +464,13 @@
464
464
  }
465
465
  return t;
466
466
  };
467
- return __assign$6.apply(this, arguments);
467
+ return __assign$5.apply(this, arguments);
468
468
  };
469
469
  function addDetail(obj, list, detail) {
470
470
  if (detail)
471
- return __assign$6(__assign$6({}, obj), { detail: list });
471
+ return __assign$5(__assign$5({}, obj), { detail: list });
472
472
  else
473
- return __assign$6({}, obj);
473
+ return __assign$5({}, obj);
474
474
  }
475
475
  function getWeekLine(list, detail) {
476
476
  var res = [];
@@ -731,17 +731,6 @@
731
731
  return Gold;
732
732
  }());
733
733
 
734
- var __assign$5 = (undefined && undefined.__assign) || function () {
735
- __assign$5 = Object.assign || function(t) {
736
- for (var s, i = 1, n = arguments.length; i < n; i++) {
737
- s = arguments[i];
738
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
739
- t[p] = s[p];
740
- }
741
- return t;
742
- };
743
- return __assign$5.apply(this, arguments);
744
- };
745
734
  var Kd = /** @class */ (function () {
746
735
  function Kd() {
747
736
  }
@@ -807,60 +796,6 @@
807
796
  }
808
797
  }
809
798
  });
810
- Object.defineProperty(Kd.prototype, "getRSV", {
811
- enumerable: false,
812
- configurable: true,
813
- writable: true,
814
- value: function (list) {
815
- var res = [];
816
- for (var i = 0; i < list.length; i++) {
817
- if (i < 8)
818
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0 });
819
- else {
820
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
821
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
822
- var close_2 = list[i].c;
823
- var rsv = ((close_2 - low) / (hight - low)) * 100;
824
- rsv = Math.round(rsv * 100) / 100;
825
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: rsv });
826
- }
827
- }
828
- return res;
829
- }
830
- });
831
- Object.defineProperty(Kd.prototype, "getKD", {
832
- enumerable: false,
833
- configurable: true,
834
- writable: true,
835
- value: function (list) {
836
- var res = [];
837
- var yesterdayK = 50;
838
- var yesterdayD = 50;
839
- for (var i = 0; i < list.length; i++) {
840
- if (i < 8)
841
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
842
- else {
843
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
844
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
845
- var close_3 = list[i].c;
846
- var rsv = ((close_3 - low) / (hight - low)) * 100;
847
- rsv = Math.round(rsv * 100) / 100;
848
- var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
849
- var d = (2 / 3) * yesterdayD + (1 / 3) * k;
850
- var k_d = k - d;
851
- var j = 3 * k - 2 * d;
852
- k = Math.round(k * 100) / 100;
853
- d = Math.round(d * 100) / 100;
854
- k_d = Math.round(k_d * 100) / 100;
855
- j = Math.round(j * 100) / 100;
856
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: rsv, k: k, d: d, "k-d": k_d, j: j });
857
- yesterdayK = k;
858
- yesterdayD = d;
859
- }
860
- }
861
- return res;
862
- }
863
- });
864
799
  return Kd;
865
800
  }());
866
801
 
@@ -1295,14 +1230,11 @@
1295
1230
  enumerable: false,
1296
1231
  configurable: true,
1297
1232
  writable: true,
1298
- value: function (data, type) {
1233
+ value: function (data) {
1299
1234
  return {
1300
1235
  dataset: [data],
1301
1236
  obv: data.v,
1302
- obvList: [data.v],
1303
1237
  preClose: data.c,
1304
- obvMa: 0,
1305
- type: type,
1306
1238
  };
1307
1239
  }
1308
1240
  });
@@ -1310,7 +1242,7 @@
1310
1242
  enumerable: false,
1311
1243
  configurable: true,
1312
1244
  writable: true,
1313
- value: function (data, preList, type) {
1245
+ value: function (data, preList) {
1314
1246
  var currentVolume = data.v;
1315
1247
  var currentClose = data.c;
1316
1248
  // obv
@@ -1321,20 +1253,10 @@
1321
1253
  else if (currentClose < preList.preClose) {
1322
1254
  obv -= currentVolume;
1323
1255
  }
1324
- // obv Ma
1325
- var obvList = preList.obvList;
1326
- obvList.push(obv);
1327
- if (obvList.length > type)
1328
- obvList.shift();
1329
- var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1330
- var vma = Math.round((sum / type) * 100) / 100;
1331
1256
  return {
1332
1257
  dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
1333
1258
  obv: obv,
1334
1259
  preClose: currentClose,
1335
- obvList: obvList,
1336
- obvMa: vma,
1337
- type: type,
1338
1260
  };
1339
1261
  }
1340
1262
  });
@@ -1736,6 +1658,53 @@
1736
1658
  return Williams;
1737
1659
  }());
1738
1660
 
1661
+ var ObvEma = /** @class */ (function () {
1662
+ function ObvEma() {
1663
+ }
1664
+ Object.defineProperty(ObvEma.prototype, "init", {
1665
+ enumerable: false,
1666
+ configurable: true,
1667
+ writable: true,
1668
+ value: function (obv, type) {
1669
+ return {
1670
+ obvList: [obv],
1671
+ ema: 0,
1672
+ ma: 0,
1673
+ type: type,
1674
+ };
1675
+ }
1676
+ });
1677
+ Object.defineProperty(ObvEma.prototype, "next", {
1678
+ enumerable: false,
1679
+ configurable: true,
1680
+ writable: true,
1681
+ value: function (obv, preList, type) {
1682
+ var obvList = preList.obvList;
1683
+ obvList.push(obv);
1684
+ var ma = 0;
1685
+ var ema = 0;
1686
+ if (obvList.length === type) {
1687
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1688
+ ma = Math.round((sum / type) * 100) / 100;
1689
+ ema = ma;
1690
+ }
1691
+ else if (obvList.length > type) {
1692
+ obvList.shift();
1693
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1694
+ ma = Math.round((sum / type) * 100) / 100;
1695
+ ema = (obv * 2 + (type - 1) * preList.ema) / (type + 1);
1696
+ }
1697
+ return {
1698
+ obvList: obvList,
1699
+ ema: ema,
1700
+ ma: ma,
1701
+ type: type,
1702
+ };
1703
+ }
1704
+ });
1705
+ return ObvEma;
1706
+ }());
1707
+
1739
1708
  function add(a, b) {
1740
1709
  return a + b;
1741
1710
  }
@@ -1780,6 +1749,7 @@
1780
1749
  exports.Ma = Ma;
1781
1750
  exports.Macd = MACD;
1782
1751
  exports.Obv = Obv;
1752
+ exports.ObvEma = ObvEma;
1783
1753
  exports.Rsi = Rsi;
1784
1754
  exports.SwingExtremes = SwingExtremes;
1785
1755
  exports.Vma = Vma;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ch20026103/anysis",
3
- "version": "0.0.17-alpha1",
3
+ "version": "0.0.17-alpha2",
4
4
  "description": "provide many analyze methods in the library.",
5
5
  "keywords": [],
6
6
  "bugs": "git@github.com:cosmic1330/anysis/issues",
@@ -12,21 +12,6 @@
12
12
  "module": "dist/esm/index.js",
13
13
  "browser": "dist/umd/index.js",
14
14
  "types": "dist/esm/index.d.ts",
15
- "scripts": {
16
- "build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
17
- "build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
18
- "build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
19
- "build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
20
- "clean": "rimraf dist",
21
- "lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
22
- "prepare": "pnpm exec husky install",
23
- "prettier": "pnpm exec prettier --write .",
24
- "prepublishOnly": "pnpm build",
25
- "published": "npm publish",
26
- "unpublished": "npm unpublish --force --registry http://localhost:4873 ",
27
- "test": "vitest",
28
- "demo": "node demo/main.js"
29
- },
30
15
  "lint-staged": {
31
16
  "*.{js,jsx,ts,tsx,mjs}": [
32
17
  "pnpm lint"
@@ -57,5 +42,18 @@
57
42
  },
58
43
  "vota": {
59
44
  "node": "16.11.0"
45
+ },
46
+ "scripts": {
47
+ "build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
48
+ "build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
49
+ "build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
50
+ "build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
51
+ "clean": "rimraf dist",
52
+ "lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
53
+ "prettier": "pnpm exec prettier --write .",
54
+ "published": "npm publish",
55
+ "unpublished": "npm unpublish --force --registry http://localhost:4873 ",
56
+ "test": "vitest",
57
+ "demo": "node demo/main.js"
60
58
  }
61
- }
59
+ }