@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.
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/stockSkills/kd.d.ts +0 -18
- package/dist/cjs/stockSkills/kd.js +0 -65
- package/dist/cjs/stockSkills/kd.test.js +3 -50
- package/dist/cjs/stockSkills/obv.d.ts +4 -7
- package/dist/cjs/stockSkills/obv.js +2 -15
- package/dist/cjs/stockSkills/obv.test.js +5 -3
- package/dist/cjs/stockSkills/obv_ema.d.ts +15 -0
- package/dist/cjs/stockSkills/obv_ema.js +49 -0
- package/dist/cjs/stockSkills/obv_ema.test.d.ts +1 -0
- package/dist/cjs/stockSkills/obv_ema.test.js +23 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/stockSkills/kd.d.ts +0 -18
- package/dist/esm/stockSkills/kd.js +0 -65
- package/dist/esm/stockSkills/kd.test.js +3 -50
- package/dist/esm/stockSkills/obv.d.ts +4 -7
- package/dist/esm/stockSkills/obv.js +2 -15
- package/dist/esm/stockSkills/obv.test.js +5 -3
- package/dist/esm/stockSkills/obv_ema.d.ts +15 -0
- package/dist/esm/stockSkills/obv_ema.js +47 -0
- package/dist/esm/stockSkills/obv_ema.test.d.ts +1 -0
- package/dist/esm/stockSkills/obv_ema.test.js +21 -0
- package/dist/umd/index.js +60 -90
- package/package.json +15 -17
package/dist/cjs/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
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
|
|
17
|
-
next: (data: NewStockType, preList: 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
|
|
22
|
-
next(data: NewStockType, preList: 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
|
|
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
|
|
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]
|
|
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
|
|
12
|
+
res = obv.next(item, res);
|
|
13
13
|
}
|
|
14
|
-
expect({ obv: res.obv
|
|
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
|
+
});
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -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
|
-
|
|
16
|
-
|
|
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
|
|
17
|
-
next: (data: NewStockType, preList: 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
|
|
22
|
-
next(data: NewStockType, preList: 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
|
|
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
|
|
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]
|
|
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
|
|
10
|
+
res = obv.next(item, res);
|
|
11
11
|
}
|
|
12
|
-
expect({ obv: res.obv
|
|
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$
|
|
286
|
-
__assign$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
459
|
-
__assign$
|
|
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$
|
|
467
|
+
return __assign$5.apply(this, arguments);
|
|
468
468
|
};
|
|
469
469
|
function addDetail(obj, list, detail) {
|
|
470
470
|
if (detail)
|
|
471
|
-
return __assign$
|
|
471
|
+
return __assign$5(__assign$5({}, obj), { detail: list });
|
|
472
472
|
else
|
|
473
|
-
return __assign$
|
|
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
|
|
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
|
|
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-
|
|
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
|
+
}
|