@ch20026103/anysis 0.0.5-alpha → 0.0.6-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/stockSkills/boll.d.ts +58 -0
- package/dist/cjs/stockSkills/boll.js +101 -0
- package/dist/cjs/stockSkills/boll.test.d.ts +1 -0
- package/dist/cjs/stockSkills/boll.test.js +36 -0
- package/dist/cjs/stockSkills/ema.d.ts +2 -2
- package/dist/cjs/stockSkills/ema.js +1 -1
- package/dist/cjs/stockSkills/kd.d.ts +22 -22
- package/dist/cjs/stockSkills/kd.js +10 -10
- package/dist/cjs/stockSkills/ma.d.ts +13 -23
- package/dist/cjs/stockSkills/ma.js +9 -43
- package/dist/cjs/stockSkills/ma.test.js +3 -20
- package/dist/cjs/stockSkills/macd.d.ts +34 -34
- package/dist/cjs/stockSkills/macd.js +15 -15
- package/dist/cjs/stockSkills/macd.test.js +2 -0
- package/dist/cjs/stockSkills/rsi.d.ts +4 -4
- package/dist/cjs/stockSkills/rsi.js +2 -2
- package/dist/cjs/stockSkills/williams.d.ts +4 -4
- package/dist/cjs/stockSkills/williams.js +2 -2
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/stockSkills/boll.d.ts +58 -0
- package/dist/esm/stockSkills/boll.js +99 -0
- package/dist/esm/stockSkills/boll.test.d.ts +1 -0
- package/dist/esm/stockSkills/boll.test.js +34 -0
- package/dist/esm/stockSkills/ema.d.ts +2 -2
- package/dist/esm/stockSkills/ema.js +1 -1
- package/dist/esm/stockSkills/kd.d.ts +22 -22
- package/dist/esm/stockSkills/kd.js +10 -10
- package/dist/esm/stockSkills/ma.d.ts +13 -23
- package/dist/esm/stockSkills/ma.js +9 -43
- package/dist/esm/stockSkills/ma.test.js +3 -20
- package/dist/esm/stockSkills/macd.d.ts +34 -34
- package/dist/esm/stockSkills/macd.js +15 -15
- package/dist/esm/stockSkills/macd.test.js +2 -0
- package/dist/esm/stockSkills/rsi.d.ts +4 -4
- package/dist/esm/stockSkills/rsi.js +2 -2
- package/dist/esm/stockSkills/williams.d.ts +4 -4
- package/dist/esm/stockSkills/williams.js +2 -2
- package/dist/umd/index.js +180 -114
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -12,5 +12,6 @@ export { default as Ema } from "./stockSkills/ema.js";
|
|
|
12
12
|
export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
|
|
13
13
|
export { default as getWeekLine } from "./stockSkills/utils/getWeekLine.js";
|
|
14
14
|
export { default as Williams } from "./stockSkills/williams.js";
|
|
15
|
+
export { default as Boll } from "./stockSkills/boll.js";
|
|
15
16
|
export { add } from "./test/add.js";
|
|
16
17
|
export { minus } from "./test/minus.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.minus = exports.add = exports.Williams = exports.getWeekLine = exports.dateFormat = exports.Ema = exports.Obv = exports.Rsi = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.slope = exports.simpleRegressionModel = void 0;
|
|
3
|
+
exports.minus = exports.add = exports.Boll = exports.Williams = exports.getWeekLine = exports.dateFormat = exports.Ema = exports.Obv = exports.Rsi = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.slope = exports.simpleRegressionModel = void 0;
|
|
4
4
|
/*
|
|
5
5
|
請注意,在 src/index.ts 中,我的導入包含文件擴展名(.js)。
|
|
6
6
|
如果需要支持 Node.js 和構建工具(ex: webpack),則不需要這樣做。 **因為commonJs默認js副檔名**
|
|
@@ -36,6 +36,8 @@ var getWeekLine_js_1 = require("./stockSkills/utils/getWeekLine.js");
|
|
|
36
36
|
Object.defineProperty(exports, "getWeekLine", { enumerable: true, get: function () { return getWeekLine_js_1.default; } });
|
|
37
37
|
var williams_js_1 = require("./stockSkills/williams.js");
|
|
38
38
|
Object.defineProperty(exports, "Williams", { enumerable: true, get: function () { return williams_js_1.default; } });
|
|
39
|
+
var boll_js_1 = require("./stockSkills/boll.js");
|
|
40
|
+
Object.defineProperty(exports, "Boll", { enumerable: true, get: function () { return boll_js_1.default; } });
|
|
39
41
|
var add_js_1 = require("./test/add.js");
|
|
40
42
|
Object.defineProperty(exports, "add", { enumerable: true, get: function () { return add_js_1.add; } });
|
|
41
43
|
var minus_js_1 = require("./test/minus.js");
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
type ItemType = {
|
|
2
|
+
c: number;
|
|
3
|
+
};
|
|
4
|
+
type ListType = ItemType[];
|
|
5
|
+
type ResBoll = {
|
|
6
|
+
c: number;
|
|
7
|
+
bollMa: number | null;
|
|
8
|
+
bollUb: number | null;
|
|
9
|
+
bollLb: number | null;
|
|
10
|
+
}[];
|
|
11
|
+
interface BollType {
|
|
12
|
+
init: (data: ItemType) => {
|
|
13
|
+
dataset: ListType;
|
|
14
|
+
bollMa: number | null;
|
|
15
|
+
bollUb: number | null;
|
|
16
|
+
bollLb: number | null;
|
|
17
|
+
};
|
|
18
|
+
next: (data: ItemType, preList: {
|
|
19
|
+
dataset: ListType;
|
|
20
|
+
bollMa: number | null;
|
|
21
|
+
bollUb: number | null;
|
|
22
|
+
bollLb: number | null;
|
|
23
|
+
}, type: number) => {
|
|
24
|
+
dataset: ListType;
|
|
25
|
+
bollMa: number | null;
|
|
26
|
+
bollUb: number | null;
|
|
27
|
+
bollLb: number | null;
|
|
28
|
+
};
|
|
29
|
+
getBoll: (list: ListType, type: number) => ResBoll;
|
|
30
|
+
}
|
|
31
|
+
export default class Boll implements BollType {
|
|
32
|
+
init(data: ItemType): {
|
|
33
|
+
dataset: ListType;
|
|
34
|
+
bollMa: number | null;
|
|
35
|
+
bollUb: number | null;
|
|
36
|
+
bollLb: number | null;
|
|
37
|
+
};
|
|
38
|
+
next(data: ItemType, preList: {
|
|
39
|
+
dataset: ListType;
|
|
40
|
+
bollMa: number | null;
|
|
41
|
+
bollUb: number | null;
|
|
42
|
+
bollLb: number | null;
|
|
43
|
+
}, type: number): {
|
|
44
|
+
dataset: ListType;
|
|
45
|
+
type: number;
|
|
46
|
+
bollMa: null;
|
|
47
|
+
bollUb: null;
|
|
48
|
+
bollLb: null;
|
|
49
|
+
} | {
|
|
50
|
+
dataset: ListType;
|
|
51
|
+
type: number;
|
|
52
|
+
bollMa: number;
|
|
53
|
+
bollUb: number;
|
|
54
|
+
bollLb: number;
|
|
55
|
+
};
|
|
56
|
+
getBoll(list: ListType, type: number): ResBoll;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
var Boll = /** @class */ (function () {
|
|
15
|
+
function Boll() {
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(Boll.prototype, "init", {
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: function (data) {
|
|
22
|
+
return {
|
|
23
|
+
dataset: [data],
|
|
24
|
+
bollMa: null,
|
|
25
|
+
bollUb: null,
|
|
26
|
+
bollLb: null,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(Boll.prototype, "next", {
|
|
31
|
+
enumerable: false,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true,
|
|
34
|
+
value: function (data, preList, type) {
|
|
35
|
+
preList.dataset.push(data);
|
|
36
|
+
if (preList.dataset.length < type) {
|
|
37
|
+
return {
|
|
38
|
+
dataset: preList.dataset,
|
|
39
|
+
type: type,
|
|
40
|
+
bollMa: null,
|
|
41
|
+
bollUb: null,
|
|
42
|
+
bollLb: null,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
if (preList.dataset.length > type) {
|
|
47
|
+
preList.dataset.shift();
|
|
48
|
+
}
|
|
49
|
+
var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
50
|
+
var bollMa_1 = Math.round((sum / type) * 100) / 100;
|
|
51
|
+
var difference = preList.dataset.reduce(function (pre, current) {
|
|
52
|
+
return bollMa_1 !== null ? pre + Math.pow(current.c - bollMa_1, 2) : pre;
|
|
53
|
+
}, 0);
|
|
54
|
+
var std = Math.round(Math.sqrt(difference / type) * 100) / 100;
|
|
55
|
+
return {
|
|
56
|
+
dataset: preList.dataset,
|
|
57
|
+
type: type,
|
|
58
|
+
bollMa: bollMa_1,
|
|
59
|
+
bollUb: bollMa_1 + 2 * std,
|
|
60
|
+
bollLb: bollMa_1 - 2 * std,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
Object.defineProperty(Boll.prototype, "getBoll", {
|
|
66
|
+
enumerable: false,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: function (list, type) {
|
|
70
|
+
var res = [];
|
|
71
|
+
var _loop_1 = function (i) {
|
|
72
|
+
if (i < type)
|
|
73
|
+
res[i] = __assign(__assign({}, list[i]), { bollMa: null, bollUb: null, bollLb: null });
|
|
74
|
+
else {
|
|
75
|
+
// bollMa
|
|
76
|
+
var sumMa = list
|
|
77
|
+
.slice(i - (type - 1), i + 1)
|
|
78
|
+
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
79
|
+
console.log("sumMa", sumMa);
|
|
80
|
+
var bollMa_2 = Math.round((sumMa / type) * 100) / 100;
|
|
81
|
+
// 標準差
|
|
82
|
+
var difference = res
|
|
83
|
+
.slice(i - (type - 1), i + 1)
|
|
84
|
+
.reduce(function (pre, current) {
|
|
85
|
+
return bollMa_2 !== null
|
|
86
|
+
? pre + Math.pow(current.c - bollMa_2, 2)
|
|
87
|
+
: pre;
|
|
88
|
+
}, 0);
|
|
89
|
+
var std = Math.round(Math.sqrt(difference / type) * 100) / 100;
|
|
90
|
+
res[i] = __assign(__assign({}, list[i]), { bollMa: bollMa_2, bollUb: bollMa_2 + 2 * std, bollLb: bollMa_2 - 2 * std });
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
for (var i = 0; i < list.length; i++) {
|
|
94
|
+
_loop_1(i);
|
|
95
|
+
}
|
|
96
|
+
return res;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return Boll;
|
|
100
|
+
}());
|
|
101
|
+
exports.default = Boll;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var boll_1 = require("./boll");
|
|
4
|
+
var test_data_test_1 = require("./test_data.test");
|
|
5
|
+
describe("test boll methods", function () {
|
|
6
|
+
it("test init & next", function () {
|
|
7
|
+
var index = test_data_test_1.default.length - 1;
|
|
8
|
+
var boll = new boll_1.default();
|
|
9
|
+
var init = boll.init(test_data_test_1.default[0]);
|
|
10
|
+
var res = init;
|
|
11
|
+
for (var i = 1; i <= index; i++) {
|
|
12
|
+
var item = test_data_test_1.default[i];
|
|
13
|
+
res = boll.next(item, res, 25);
|
|
14
|
+
}
|
|
15
|
+
expect({
|
|
16
|
+
bollMa: res.bollMa,
|
|
17
|
+
bollLb: res.bollLb,
|
|
18
|
+
bollUb: res.bollUb,
|
|
19
|
+
}).toEqual({ bollMa: 142.66, bollLb: 126.69999999999999, bollUb: 158.62 });
|
|
20
|
+
});
|
|
21
|
+
it("test getBoll()", function () {
|
|
22
|
+
var boll = new boll_1.default();
|
|
23
|
+
var res = boll.getBoll(test_data_test_1.default, 25);
|
|
24
|
+
expect(res[test_data_test_1.default.length - 1]).toEqual({
|
|
25
|
+
c: 142,
|
|
26
|
+
o: 138,
|
|
27
|
+
t: 20211214,
|
|
28
|
+
v: 16841,
|
|
29
|
+
h: 143,
|
|
30
|
+
l: 138,
|
|
31
|
+
bollMa: 142.66,
|
|
32
|
+
bollLb: 126.69999999999999,
|
|
33
|
+
bollUb: 158.62,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
interface EmaType {
|
|
2
2
|
getStartEma: (list: number[], period: number) => number;
|
|
3
|
-
getEma: (list: number[], period: number) => (number |
|
|
3
|
+
getEma: (list: number[], period: number) => (number | null)[];
|
|
4
4
|
}
|
|
5
5
|
export default class Ema implements EmaType {
|
|
6
6
|
getStartEma(list: number[], period: number): number;
|
|
7
|
-
getEma(list: number[], period: number): (number |
|
|
7
|
+
getEma(list: number[], period: number): (number | null)[];
|
|
8
8
|
}
|
|
9
9
|
export {};
|
|
@@ -27,7 +27,7 @@ var Ema = /** @class */ (function () {
|
|
|
27
27
|
var ema = this.getStartEma(list.slice(0, period), period);
|
|
28
28
|
for (var i = 0; i < list.length; i++) {
|
|
29
29
|
if (i < period) {
|
|
30
|
-
res.push(
|
|
30
|
+
res.push(null);
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
33
|
ema = (list[i] * 2 + (period - 1) * ema) / (period + 1);
|
|
@@ -10,35 +10,35 @@ type DataType = {
|
|
|
10
10
|
type ListType = DataType[];
|
|
11
11
|
type ResRSV = {
|
|
12
12
|
c: number;
|
|
13
|
-
rsv
|
|
13
|
+
rsv: number | null;
|
|
14
14
|
}[];
|
|
15
15
|
type ResKD = {
|
|
16
16
|
c: number;
|
|
17
|
-
rsv
|
|
18
|
-
k
|
|
19
|
-
d
|
|
20
|
-
"k-d"
|
|
17
|
+
rsv: number | null;
|
|
18
|
+
k: number | null;
|
|
19
|
+
d: number | null;
|
|
20
|
+
"k-d": number | null;
|
|
21
21
|
}[];
|
|
22
22
|
export default class Kd implements KdType {
|
|
23
23
|
init(data: DataType): {
|
|
24
24
|
dataset: ListType;
|
|
25
|
-
rsv
|
|
26
|
-
k
|
|
27
|
-
d
|
|
28
|
-
"k-d"
|
|
25
|
+
rsv: number | null;
|
|
26
|
+
k: number | null;
|
|
27
|
+
d: number | null;
|
|
28
|
+
"k-d": number | null;
|
|
29
29
|
};
|
|
30
30
|
next(data: DataType, preList: {
|
|
31
31
|
dataset: ListType;
|
|
32
|
-
rsv
|
|
33
|
-
k
|
|
34
|
-
d
|
|
35
|
-
"k-d"
|
|
32
|
+
rsv: number | null;
|
|
33
|
+
k: number | null;
|
|
34
|
+
d: number | null;
|
|
35
|
+
"k-d": number | null;
|
|
36
36
|
}, type: number): {
|
|
37
37
|
dataset: ListType;
|
|
38
|
-
rsv:
|
|
39
|
-
k:
|
|
40
|
-
d:
|
|
41
|
-
"k-d":
|
|
38
|
+
rsv: null;
|
|
39
|
+
k: null;
|
|
40
|
+
d: null;
|
|
41
|
+
"k-d": null;
|
|
42
42
|
} | {
|
|
43
43
|
dataset: ListType;
|
|
44
44
|
rsv: number;
|
|
@@ -47,7 +47,7 @@ export default class Kd implements KdType {
|
|
|
47
47
|
"k-d": number;
|
|
48
48
|
};
|
|
49
49
|
getRSV(list: ListType): ({
|
|
50
|
-
rsv:
|
|
50
|
+
rsv: null;
|
|
51
51
|
c: number;
|
|
52
52
|
h: number;
|
|
53
53
|
l: number;
|
|
@@ -58,10 +58,10 @@ export default class Kd implements KdType {
|
|
|
58
58
|
l: number;
|
|
59
59
|
})[];
|
|
60
60
|
getKD(list: ListType): ({
|
|
61
|
-
rsv:
|
|
62
|
-
k:
|
|
63
|
-
d:
|
|
64
|
-
"k-d":
|
|
61
|
+
rsv: null;
|
|
62
|
+
k: null;
|
|
63
|
+
d: null;
|
|
64
|
+
"k-d": null;
|
|
65
65
|
c: number;
|
|
66
66
|
h: number;
|
|
67
67
|
l: number;
|
|
@@ -21,10 +21,10 @@ var Kd = /** @class */ (function () {
|
|
|
21
21
|
value: function (data) {
|
|
22
22
|
return {
|
|
23
23
|
dataset: [data],
|
|
24
|
-
rsv:
|
|
25
|
-
k:
|
|
26
|
-
d:
|
|
27
|
-
"k-d":
|
|
24
|
+
rsv: null,
|
|
25
|
+
k: null,
|
|
26
|
+
d: null,
|
|
27
|
+
"k-d": null,
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
});
|
|
@@ -37,10 +37,10 @@ var Kd = /** @class */ (function () {
|
|
|
37
37
|
if (preList.dataset.length < type) {
|
|
38
38
|
return {
|
|
39
39
|
dataset: preList.dataset,
|
|
40
|
-
rsv:
|
|
41
|
-
k:
|
|
42
|
-
d:
|
|
43
|
-
"k-d":
|
|
40
|
+
rsv: null,
|
|
41
|
+
k: null,
|
|
42
|
+
d: null,
|
|
43
|
+
"k-d": null,
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
else {
|
|
@@ -76,7 +76,7 @@ var Kd = /** @class */ (function () {
|
|
|
76
76
|
var res = [];
|
|
77
77
|
for (var i = 0; i < list.length; i++) {
|
|
78
78
|
if (i < 8)
|
|
79
|
-
res[i] = __assign(__assign({}, list[i]), { rsv:
|
|
79
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: null });
|
|
80
80
|
else {
|
|
81
81
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
82
82
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
@@ -99,7 +99,7 @@ var Kd = /** @class */ (function () {
|
|
|
99
99
|
var yesterdayD = 50;
|
|
100
100
|
for (var i = 0; i < list.length; i++) {
|
|
101
101
|
if (i < 8)
|
|
102
|
-
res[i] = __assign(__assign({}, list[i]), { rsv:
|
|
102
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: null, k: null, d: null, "k-d": null });
|
|
103
103
|
else {
|
|
104
104
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
105
105
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
@@ -4,39 +4,31 @@ type DataType = {
|
|
|
4
4
|
type ListType = DataType[];
|
|
5
5
|
type ResMa5 = {
|
|
6
6
|
c: number;
|
|
7
|
-
ma5
|
|
7
|
+
ma5: number | null;
|
|
8
8
|
}[];
|
|
9
9
|
type ResMa10 = {
|
|
10
10
|
c: number;
|
|
11
|
-
ma10
|
|
11
|
+
ma10: number | null;
|
|
12
12
|
}[];
|
|
13
13
|
type ResMa20 = {
|
|
14
14
|
c: number;
|
|
15
|
-
ma20
|
|
15
|
+
ma20: number | null;
|
|
16
16
|
}[];
|
|
17
17
|
type ResMa60 = {
|
|
18
18
|
c: number;
|
|
19
|
-
ma60
|
|
19
|
+
ma60: number | null;
|
|
20
20
|
}[];
|
|
21
|
-
type
|
|
21
|
+
type ResMa = {
|
|
22
22
|
c: number;
|
|
23
|
-
|
|
24
|
-
}[];
|
|
25
|
-
type ResBoll = {
|
|
26
|
-
c: number;
|
|
27
|
-
ma25?: number;
|
|
28
|
-
bollUb?: number;
|
|
29
|
-
bollLb?: number;
|
|
23
|
+
ma: number | null;
|
|
30
24
|
}[];
|
|
31
25
|
type ResAllMa = {
|
|
32
26
|
c: number;
|
|
33
|
-
ma5
|
|
34
|
-
ma10
|
|
35
|
-
ma20
|
|
36
|
-
ma25
|
|
37
|
-
ma60
|
|
38
|
-
bollUb?: number;
|
|
39
|
-
bollLb?: number;
|
|
27
|
+
ma5: number | null;
|
|
28
|
+
ma10: number | null;
|
|
29
|
+
ma20: number | null;
|
|
30
|
+
ma25: number | null;
|
|
31
|
+
ma60: number | null;
|
|
40
32
|
}[];
|
|
41
33
|
interface MaType {
|
|
42
34
|
init: (data: DataType, type: number) => {
|
|
@@ -58,8 +50,7 @@ interface MaType {
|
|
|
58
50
|
getMa10: (list: ListType) => ResMa10;
|
|
59
51
|
getMa20: (list: ListType) => ResMa20;
|
|
60
52
|
getMa60: (list: ListType) => ResMa60;
|
|
61
|
-
|
|
62
|
-
getBoll: (list: ListType) => ResBoll;
|
|
53
|
+
getMa: (list: ListType, self: number) => ResMa;
|
|
63
54
|
}
|
|
64
55
|
export default class Ma implements MaType {
|
|
65
56
|
init(data: DataType, type: number): {
|
|
@@ -81,7 +72,6 @@ export default class Ma implements MaType {
|
|
|
81
72
|
getMa10(list: ListType): ResMa10;
|
|
82
73
|
getMa20(list: ListType): ResMa20;
|
|
83
74
|
getMa60(list: ListType): ResMa60;
|
|
84
|
-
|
|
85
|
-
getBoll(list: ListType): ResBoll;
|
|
75
|
+
getMa(list: ListType, self: number): ResMa;
|
|
86
76
|
}
|
|
87
77
|
export {};
|
|
@@ -51,9 +51,8 @@ var Ma = /** @class */ (function () {
|
|
|
51
51
|
var responseMa10 = this.getMa10(list);
|
|
52
52
|
var responseMa20 = this.getMa20(list);
|
|
53
53
|
var responseMa60 = this.getMa60(list);
|
|
54
|
-
var responseBoll = this.getBoll(list);
|
|
55
54
|
for (var i = 0; i < list.length; i++) {
|
|
56
|
-
res[i] = Object.assign(list[i], responseMa5[i], responseMa10[i], responseMa20[i], responseMa60[i]
|
|
55
|
+
res[i] = Object.assign(list[i], responseMa5[i], responseMa10[i], responseMa20[i], responseMa60[i]);
|
|
57
56
|
}
|
|
58
57
|
return res;
|
|
59
58
|
}
|
|
@@ -66,7 +65,7 @@ var Ma = /** @class */ (function () {
|
|
|
66
65
|
var res = [];
|
|
67
66
|
for (var i = 0; i < list.length; i++) {
|
|
68
67
|
if (i < 4)
|
|
69
|
-
res[i] = __assign(__assign({}, list[i]), { ma5:
|
|
68
|
+
res[i] = __assign(__assign({}, list[i]), { ma5: null });
|
|
70
69
|
else {
|
|
71
70
|
var sum = list
|
|
72
71
|
.slice(i - 4, i + 1)
|
|
@@ -86,7 +85,7 @@ var Ma = /** @class */ (function () {
|
|
|
86
85
|
var res = [];
|
|
87
86
|
for (var i = 0; i < list.length; i++) {
|
|
88
87
|
if (i < 9)
|
|
89
|
-
res[i] = __assign(__assign({}, list[i]), { ma10:
|
|
88
|
+
res[i] = __assign(__assign({}, list[i]), { ma10: null });
|
|
90
89
|
else {
|
|
91
90
|
var sum = list
|
|
92
91
|
.slice(i - 9, i + 1)
|
|
@@ -106,7 +105,7 @@ var Ma = /** @class */ (function () {
|
|
|
106
105
|
var res = [];
|
|
107
106
|
for (var i = 0; i < list.length; i++) {
|
|
108
107
|
if (i < 19)
|
|
109
|
-
res[i] = __assign(__assign({}, list[i]), { ma20:
|
|
108
|
+
res[i] = __assign(__assign({}, list[i]), { ma20: null });
|
|
110
109
|
else {
|
|
111
110
|
var sum = list
|
|
112
111
|
.slice(i - 19, i + 1)
|
|
@@ -126,7 +125,7 @@ var Ma = /** @class */ (function () {
|
|
|
126
125
|
var res = [];
|
|
127
126
|
for (var i = 0; i < list.length; i++) {
|
|
128
127
|
if (i < 59)
|
|
129
|
-
res[i] = __assign(__assign({}, list[i]), { ma60:
|
|
128
|
+
res[i] = __assign(__assign({}, list[i]), { ma60: null });
|
|
130
129
|
else {
|
|
131
130
|
var sum = list
|
|
132
131
|
.slice(i - 59, i + 1)
|
|
@@ -138,7 +137,7 @@ var Ma = /** @class */ (function () {
|
|
|
138
137
|
return res;
|
|
139
138
|
}
|
|
140
139
|
});
|
|
141
|
-
Object.defineProperty(Ma.prototype, "
|
|
140
|
+
Object.defineProperty(Ma.prototype, "getMa", {
|
|
142
141
|
enumerable: false,
|
|
143
142
|
configurable: true,
|
|
144
143
|
writable: true,
|
|
@@ -146,51 +145,18 @@ var Ma = /** @class */ (function () {
|
|
|
146
145
|
var res = [];
|
|
147
146
|
for (var i = 0; i < list.length; i++) {
|
|
148
147
|
if (i < self - 1)
|
|
149
|
-
res[i] = __assign(__assign({}, list[i]), {
|
|
148
|
+
res[i] = __assign(__assign({}, list[i]), { ma: null });
|
|
150
149
|
else {
|
|
151
150
|
var sum = list
|
|
152
151
|
.slice(i - (self - 1), i + 1)
|
|
153
152
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
154
|
-
var
|
|
155
|
-
res[i] = __assign(__assign({}, list[i]), {
|
|
153
|
+
var ma = Math.round((sum / self) * 100) / 100;
|
|
154
|
+
res[i] = __assign(__assign({}, list[i]), { ma: ma });
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
157
|
return res;
|
|
159
158
|
}
|
|
160
159
|
});
|
|
161
|
-
Object.defineProperty(Ma.prototype, "getBoll", {
|
|
162
|
-
enumerable: false,
|
|
163
|
-
configurable: true,
|
|
164
|
-
writable: true,
|
|
165
|
-
value: function (list) {
|
|
166
|
-
var res = [];
|
|
167
|
-
var _loop_1 = function (i) {
|
|
168
|
-
if (i < 24)
|
|
169
|
-
res[i] = __assign(__assign({}, list[i]), { ma25: undefined, bollUb: undefined, bollLb: undefined });
|
|
170
|
-
else {
|
|
171
|
-
// ma25
|
|
172
|
-
var sumMa25 = list
|
|
173
|
-
.slice(i - 24, i + 1)
|
|
174
|
-
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
175
|
-
var ma25_1 = Math.round((sumMa25 / 25) * 100) / 100;
|
|
176
|
-
// 標準差
|
|
177
|
-
var sumBase = res
|
|
178
|
-
.slice(i - 24, i + 1)
|
|
179
|
-
.reduce(function (pre, current) {
|
|
180
|
-
return ma25_1 !== undefined
|
|
181
|
-
? pre + Math.pow(current.c - ma25_1, 2)
|
|
182
|
-
: pre;
|
|
183
|
-
}, 0);
|
|
184
|
-
var base = Math.round(Math.sqrt(sumBase / 25) * 100) / 100;
|
|
185
|
-
res[i] = __assign(__assign({}, list[i]), { ma25: ma25_1, bollUb: ma25_1 + 2 * base, bollLb: ma25_1 - 2 * base });
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
for (var i = 0; i < list.length; i++) {
|
|
189
|
-
_loop_1(i);
|
|
190
|
-
}
|
|
191
|
-
return res;
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
160
|
return Ma;
|
|
195
161
|
}());
|
|
196
162
|
exports.default = Ma;
|
|
@@ -63,30 +63,16 @@ describe("test ma methods", function () {
|
|
|
63
63
|
ma60: 134.86,
|
|
64
64
|
});
|
|
65
65
|
});
|
|
66
|
-
it("test
|
|
66
|
+
it("test getMa()", function () {
|
|
67
67
|
var ma = new ma_1.default();
|
|
68
|
-
expect(ma.
|
|
68
|
+
expect(ma.getMa(test_data_test_1.default, 20)[test_data_test_1.default.length - 1]).toEqual({
|
|
69
69
|
c: 142,
|
|
70
70
|
o: 138,
|
|
71
71
|
t: 20211214,
|
|
72
72
|
v: 16841,
|
|
73
73
|
h: 143,
|
|
74
74
|
l: 138,
|
|
75
|
-
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
it("test getBoll()", function () {
|
|
79
|
-
var ma = new ma_1.default();
|
|
80
|
-
expect(ma.getBoll(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
|
|
81
|
-
c: 142,
|
|
82
|
-
o: 138,
|
|
83
|
-
t: 20211214,
|
|
84
|
-
v: 16841,
|
|
85
|
-
h: 143,
|
|
86
|
-
l: 138,
|
|
87
|
-
ma25: 142.66,
|
|
88
|
-
bollLb: 126.69999999999999,
|
|
89
|
-
bollUb: 158.62,
|
|
75
|
+
ma: 144.88,
|
|
90
76
|
});
|
|
91
77
|
});
|
|
92
78
|
it("test getAllMa()", function () {
|
|
@@ -102,9 +88,6 @@ describe("test ma methods", function () {
|
|
|
102
88
|
ma10: 146.7,
|
|
103
89
|
ma20: 144.88,
|
|
104
90
|
ma60: 134.86,
|
|
105
|
-
ma25: 142.66,
|
|
106
|
-
bollUb: 158.62,
|
|
107
|
-
bollLb: 126.69999999999999,
|
|
108
91
|
});
|
|
109
92
|
});
|
|
110
93
|
});
|