@ch20026103/anysis 0.0.16-beta2 → 0.0.17-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/demo/main.js +2 -7
- package/dist/cjs/stockSkills/kd.d.ts +2 -0
- package/dist/cjs/stockSkills/kd.js +9 -2
- package/dist/cjs/stockSkills/kd.test.js +1 -0
- package/dist/cjs/stockSkills/types.d.ts +1 -1
- package/dist/cjs/stockSkills/week.d.ts +1 -1
- package/dist/cjs/stockSkills/week.js +29 -30
- package/dist/cjs/stockSkills/week.test.js +84 -22
- package/dist/esm/stockSkills/kd.d.ts +2 -0
- package/dist/esm/stockSkills/kd.js +9 -2
- package/dist/esm/stockSkills/kd.test.js +1 -0
- package/dist/esm/stockSkills/types.d.ts +1 -1
- package/dist/esm/stockSkills/week.d.ts +1 -1
- package/dist/esm/stockSkills/week.js +29 -30
- package/dist/esm/stockSkills/week.test.js +85 -23
- package/dist/umd/index.js +40 -34
- package/package.json +17 -15
package/demo/main.js
CHANGED
|
@@ -14,15 +14,10 @@ function DemoDay(stockId) {
|
|
|
14
14
|
res = res.data.replace(/^\(|\);$/g, "");
|
|
15
15
|
let parse = JSON.parse(res);
|
|
16
16
|
let data = parse.ta;
|
|
17
|
-
let weekData = week.init(data[0]);
|
|
18
17
|
|
|
18
|
+
let kdData = kd.init(data[0], 9);
|
|
19
19
|
for (let i = 1; i < data.length; i++) {
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
let kdData = kd.init(weekData.week[0], 9);
|
|
24
|
-
for (let i = 0; i < weekData.week.length; i++) {
|
|
25
|
-
kdData = kd.next(weekData.week[i], kdData, 9);
|
|
20
|
+
kdData = kd.next(data[i], kdData, 9);
|
|
26
21
|
}
|
|
27
22
|
console.log(kdData);
|
|
28
23
|
})
|
|
@@ -10,6 +10,7 @@ type ResKD = {
|
|
|
10
10
|
k: number;
|
|
11
11
|
d: number;
|
|
12
12
|
"k-d": number;
|
|
13
|
+
j: number;
|
|
13
14
|
[key: string]: unknown;
|
|
14
15
|
};
|
|
15
16
|
export type KdResType = {
|
|
@@ -18,6 +19,7 @@ export type KdResType = {
|
|
|
18
19
|
k: number;
|
|
19
20
|
d: number;
|
|
20
21
|
"k-d": number;
|
|
22
|
+
j: number;
|
|
21
23
|
type: number;
|
|
22
24
|
};
|
|
23
25
|
interface KdClassType {
|
|
@@ -25,6 +25,7 @@ var Kd = /** @class */ (function () {
|
|
|
25
25
|
k: 0,
|
|
26
26
|
d: 0,
|
|
27
27
|
"k-d": 0,
|
|
28
|
+
j: 0,
|
|
28
29
|
type: type,
|
|
29
30
|
};
|
|
30
31
|
}
|
|
@@ -42,6 +43,7 @@ var Kd = /** @class */ (function () {
|
|
|
42
43
|
k: 0,
|
|
43
44
|
d: 0,
|
|
44
45
|
"k-d": 0,
|
|
46
|
+
j: 0,
|
|
45
47
|
type: type,
|
|
46
48
|
};
|
|
47
49
|
}
|
|
@@ -57,15 +59,18 @@ var Kd = /** @class */ (function () {
|
|
|
57
59
|
var k = (2 / 3) * (preList.k ? preList.k : 50) + (1 / 3) * rsv;
|
|
58
60
|
var d = (2 / 3) * (preList.d ? preList.d : 50) + (1 / 3) * k;
|
|
59
61
|
var k_d = k - d;
|
|
62
|
+
var j = 3 * d - 2 * k;
|
|
60
63
|
k = Math.round(k * 100) / 100;
|
|
61
64
|
d = Math.round(d * 100) / 100;
|
|
62
65
|
k_d = Math.round(k_d * 100) / 100;
|
|
66
|
+
j = Math.round(j * 100) / 100;
|
|
63
67
|
return {
|
|
64
68
|
dataset: preList.dataset,
|
|
65
69
|
rsv: rsv,
|
|
66
70
|
k: k,
|
|
67
71
|
d: d,
|
|
68
72
|
"k-d": k_d,
|
|
73
|
+
j: j,
|
|
69
74
|
type: type,
|
|
70
75
|
};
|
|
71
76
|
}
|
|
@@ -102,7 +107,7 @@ var Kd = /** @class */ (function () {
|
|
|
102
107
|
var yesterdayD = 50;
|
|
103
108
|
for (var i = 0; i < list.length; i++) {
|
|
104
109
|
if (i < 8)
|
|
105
|
-
res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0 });
|
|
110
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
|
|
106
111
|
else {
|
|
107
112
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
108
113
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
@@ -112,10 +117,12 @@ var Kd = /** @class */ (function () {
|
|
|
112
117
|
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
113
118
|
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|
|
114
119
|
var k_d = k - d;
|
|
120
|
+
var j = 3 * d - 2 * k;
|
|
115
121
|
k = Math.round(k * 100) / 100;
|
|
116
122
|
d = Math.round(d * 100) / 100;
|
|
117
123
|
k_d = Math.round(k_d * 100) / 100;
|
|
118
|
-
|
|
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 });
|
|
119
126
|
yesterdayK = k;
|
|
120
127
|
yesterdayD = d;
|
|
121
128
|
}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
-
if (ar || !(i in from)) {
|
|
5
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
-
ar[i] = from[i];
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
var Week = /** @class */ (function () {
|
|
13
4
|
function Week() {
|
|
@@ -25,30 +16,38 @@ var Week = /** @class */ (function () {
|
|
|
25
16
|
configurable: true,
|
|
26
17
|
writable: true,
|
|
27
18
|
value: function (data, preList) {
|
|
28
|
-
var year = data.t
|
|
29
|
-
.toString()
|
|
30
|
-
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3");
|
|
31
|
-
var day = new Date(year).getDay();
|
|
32
|
-
if (day === 6 || day === 0)
|
|
33
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
34
19
|
preList.dataset.push(data);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
preList.dataset = [data];
|
|
20
|
+
var index = 0;
|
|
21
|
+
if (preList.dataset.length === 1)
|
|
22
|
+
return preList;
|
|
23
|
+
for (var i = 1; i < preList.dataset.length; i++) {
|
|
24
|
+
var pre_day = new Date(preList.dataset[i - 1].t
|
|
25
|
+
.toString()
|
|
26
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
27
|
+
var curr_day = new Date(preList.dataset[i].t
|
|
28
|
+
.toString()
|
|
29
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
30
|
+
if (pre_day > curr_day) {
|
|
31
|
+
index = i;
|
|
32
|
+
break;
|
|
49
33
|
}
|
|
50
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
51
34
|
}
|
|
35
|
+
// 以index拆分数组
|
|
36
|
+
var week = preList.dataset.slice(0, index);
|
|
37
|
+
var dataset = preList.dataset.slice(index);
|
|
38
|
+
if (week.length > 0) {
|
|
39
|
+
var weekData = {
|
|
40
|
+
o: week[0]["o"],
|
|
41
|
+
c: week[week.length - 1]["c"],
|
|
42
|
+
t: week[week.length - 1]["t"],
|
|
43
|
+
h: Math.max.apply(Math, week.map(function (item) { return item.h; })),
|
|
44
|
+
l: Math.min.apply(Math, week.map(function (item) { return item.l; })),
|
|
45
|
+
v: week.reduce(function (pre, current) { return pre + current.v; }, 0),
|
|
46
|
+
};
|
|
47
|
+
preList.week.push(weekData);
|
|
48
|
+
}
|
|
49
|
+
preList.dataset = dataset;
|
|
50
|
+
return preList;
|
|
52
51
|
}
|
|
53
52
|
});
|
|
54
53
|
return Week;
|
|
@@ -1,57 +1,119 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
var week_1 = require("./week");
|
|
4
|
-
describe(
|
|
4
|
+
describe("Week", function () {
|
|
5
5
|
var week;
|
|
6
6
|
beforeEach(function () {
|
|
7
7
|
week = new week_1.default();
|
|
8
8
|
});
|
|
9
|
-
describe(
|
|
10
|
-
it(
|
|
11
|
-
var data = {
|
|
9
|
+
describe("init", function () {
|
|
10
|
+
it("應該正確初始化數據", function () {
|
|
11
|
+
var data = {
|
|
12
|
+
o: 100,
|
|
13
|
+
c: 101,
|
|
14
|
+
h: 102,
|
|
15
|
+
l: 99,
|
|
16
|
+
t: 20230501,
|
|
17
|
+
v: 1000,
|
|
18
|
+
};
|
|
12
19
|
var result = week.init(data);
|
|
13
20
|
expect(result).toEqual({ dataset: [data], week: [] });
|
|
14
21
|
});
|
|
15
22
|
});
|
|
16
|
-
describe(
|
|
17
|
-
it(
|
|
18
|
-
var initialData = {
|
|
19
|
-
|
|
23
|
+
describe("next", function () {
|
|
24
|
+
it("應該正確處理非週末的數據", function () {
|
|
25
|
+
var initialData = {
|
|
26
|
+
o: 100,
|
|
27
|
+
c: 101,
|
|
28
|
+
h: 102,
|
|
29
|
+
l: 99,
|
|
30
|
+
t: 20230501,
|
|
31
|
+
v: 1000,
|
|
32
|
+
};
|
|
33
|
+
var nextData = {
|
|
34
|
+
o: 101,
|
|
35
|
+
c: 102,
|
|
36
|
+
h: 103,
|
|
37
|
+
l: 100,
|
|
38
|
+
t: 20230502,
|
|
39
|
+
v: 1100,
|
|
40
|
+
};
|
|
20
41
|
var initialResult = week.init(initialData);
|
|
21
42
|
var result = week.next(nextData, initialResult);
|
|
22
43
|
expect(result.dataset).toHaveLength(2);
|
|
23
44
|
expect(result.week).toHaveLength(0);
|
|
24
45
|
});
|
|
25
|
-
it(
|
|
26
|
-
var initialData = {
|
|
46
|
+
it("應該在週五時生成週數據", function () {
|
|
47
|
+
var initialData = {
|
|
48
|
+
o: 100,
|
|
49
|
+
c: 101,
|
|
50
|
+
h: 102,
|
|
51
|
+
l: 99,
|
|
52
|
+
t: 20230501,
|
|
53
|
+
v: 1000,
|
|
54
|
+
};
|
|
27
55
|
var result = week.init(initialData);
|
|
28
|
-
for (var i =
|
|
29
|
-
var nextData = {
|
|
56
|
+
for (var i = 1; i <= 9; i++) {
|
|
57
|
+
var nextData = {
|
|
58
|
+
o: 100 + i,
|
|
59
|
+
c: 101 + i,
|
|
60
|
+
h: 102 + i,
|
|
61
|
+
l: 99 + i,
|
|
62
|
+
t: 20230501 + i,
|
|
63
|
+
v: 1000 + i * 100,
|
|
64
|
+
};
|
|
30
65
|
result = week.next(nextData, result);
|
|
31
66
|
}
|
|
32
|
-
expect(result.dataset).toHaveLength(
|
|
67
|
+
expect(result.dataset).toHaveLength(4);
|
|
33
68
|
expect(result.week).toHaveLength(1);
|
|
34
69
|
expect(result.week[0]).toEqual({
|
|
35
70
|
o: 100,
|
|
36
71
|
c: 106,
|
|
72
|
+
t: 20230506,
|
|
37
73
|
h: 107,
|
|
38
74
|
l: 99,
|
|
39
|
-
|
|
40
|
-
v: 6400
|
|
75
|
+
v: 7500,
|
|
41
76
|
});
|
|
42
77
|
});
|
|
43
|
-
it(
|
|
44
|
-
var initialData = {
|
|
45
|
-
|
|
78
|
+
it("應該忽略週末數據", function () {
|
|
79
|
+
var initialData = {
|
|
80
|
+
o: 100,
|
|
81
|
+
c: 101,
|
|
82
|
+
h: 102,
|
|
83
|
+
l: 99,
|
|
84
|
+
t: 20230505,
|
|
85
|
+
v: 1000,
|
|
86
|
+
};
|
|
87
|
+
var weekendData = {
|
|
88
|
+
o: 101,
|
|
89
|
+
c: 102,
|
|
90
|
+
h: 103,
|
|
91
|
+
l: 100,
|
|
92
|
+
t: 20230506,
|
|
93
|
+
v: 1100,
|
|
94
|
+
};
|
|
46
95
|
var initialResult = week.init(initialData);
|
|
47
96
|
var result = week.next(weekendData, initialResult);
|
|
48
97
|
expect(result).toEqual(initialResult);
|
|
49
98
|
});
|
|
50
|
-
it(
|
|
51
|
-
var fridayData = {
|
|
52
|
-
|
|
99
|
+
it("應該在新的一週開始時重置數據集", function () {
|
|
100
|
+
var fridayData = {
|
|
101
|
+
o: 100,
|
|
102
|
+
c: 101,
|
|
103
|
+
h: 102,
|
|
104
|
+
l: 99,
|
|
105
|
+
t: 20230505,
|
|
106
|
+
v: 1000,
|
|
107
|
+
};
|
|
108
|
+
var mondayData = {
|
|
109
|
+
o: 101,
|
|
110
|
+
c: 102,
|
|
111
|
+
h: 103,
|
|
112
|
+
l: 100,
|
|
113
|
+
t: 20230508,
|
|
114
|
+
v: 1100,
|
|
115
|
+
};
|
|
53
116
|
var result = week.init(fridayData);
|
|
54
|
-
result = week.next(fridayData, result);
|
|
55
117
|
result = week.next(mondayData, result);
|
|
56
118
|
expect(result.dataset).toHaveLength(1);
|
|
57
119
|
expect(result.dataset[0]).toEqual(mondayData);
|
|
@@ -10,6 +10,7 @@ type ResKD = {
|
|
|
10
10
|
k: number;
|
|
11
11
|
d: number;
|
|
12
12
|
"k-d": number;
|
|
13
|
+
j: number;
|
|
13
14
|
[key: string]: unknown;
|
|
14
15
|
};
|
|
15
16
|
export type KdResType = {
|
|
@@ -18,6 +19,7 @@ export type KdResType = {
|
|
|
18
19
|
k: number;
|
|
19
20
|
d: number;
|
|
20
21
|
"k-d": number;
|
|
22
|
+
j: number;
|
|
21
23
|
type: number;
|
|
22
24
|
};
|
|
23
25
|
interface KdClassType {
|
|
@@ -23,6 +23,7 @@ var Kd = /** @class */ (function () {
|
|
|
23
23
|
k: 0,
|
|
24
24
|
d: 0,
|
|
25
25
|
"k-d": 0,
|
|
26
|
+
j: 0,
|
|
26
27
|
type: type,
|
|
27
28
|
};
|
|
28
29
|
}
|
|
@@ -40,6 +41,7 @@ var Kd = /** @class */ (function () {
|
|
|
40
41
|
k: 0,
|
|
41
42
|
d: 0,
|
|
42
43
|
"k-d": 0,
|
|
44
|
+
j: 0,
|
|
43
45
|
type: type,
|
|
44
46
|
};
|
|
45
47
|
}
|
|
@@ -55,15 +57,18 @@ var Kd = /** @class */ (function () {
|
|
|
55
57
|
var k = (2 / 3) * (preList.k ? preList.k : 50) + (1 / 3) * rsv;
|
|
56
58
|
var d = (2 / 3) * (preList.d ? preList.d : 50) + (1 / 3) * k;
|
|
57
59
|
var k_d = k - d;
|
|
60
|
+
var j = 3 * d - 2 * k;
|
|
58
61
|
k = Math.round(k * 100) / 100;
|
|
59
62
|
d = Math.round(d * 100) / 100;
|
|
60
63
|
k_d = Math.round(k_d * 100) / 100;
|
|
64
|
+
j = Math.round(j * 100) / 100;
|
|
61
65
|
return {
|
|
62
66
|
dataset: preList.dataset,
|
|
63
67
|
rsv: rsv,
|
|
64
68
|
k: k,
|
|
65
69
|
d: d,
|
|
66
70
|
"k-d": k_d,
|
|
71
|
+
j: j,
|
|
67
72
|
type: type,
|
|
68
73
|
};
|
|
69
74
|
}
|
|
@@ -100,7 +105,7 @@ var Kd = /** @class */ (function () {
|
|
|
100
105
|
var yesterdayD = 50;
|
|
101
106
|
for (var i = 0; i < list.length; i++) {
|
|
102
107
|
if (i < 8)
|
|
103
|
-
res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0 });
|
|
108
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
|
|
104
109
|
else {
|
|
105
110
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
106
111
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
@@ -110,10 +115,12 @@ var Kd = /** @class */ (function () {
|
|
|
110
115
|
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
111
116
|
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|
|
112
117
|
var k_d = k - d;
|
|
118
|
+
var j = 3 * d - 2 * k;
|
|
113
119
|
k = Math.round(k * 100) / 100;
|
|
114
120
|
d = Math.round(d * 100) / 100;
|
|
115
121
|
k_d = Math.round(k_d * 100) / 100;
|
|
116
|
-
|
|
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 });
|
|
117
124
|
yesterdayK = k;
|
|
118
125
|
yesterdayD = d;
|
|
119
126
|
}
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
-
if (ar || !(i in from)) {
|
|
4
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
-
ar[i] = from[i];
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
-
};
|
|
10
1
|
var Week = /** @class */ (function () {
|
|
11
2
|
function Week() {
|
|
12
3
|
}
|
|
@@ -23,30 +14,38 @@ var Week = /** @class */ (function () {
|
|
|
23
14
|
configurable: true,
|
|
24
15
|
writable: true,
|
|
25
16
|
value: function (data, preList) {
|
|
26
|
-
var year = data.t
|
|
27
|
-
.toString()
|
|
28
|
-
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3");
|
|
29
|
-
var day = new Date(year).getDay();
|
|
30
|
-
if (day === 6 || day === 0)
|
|
31
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
32
17
|
preList.dataset.push(data);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
preList.dataset = [data];
|
|
18
|
+
var index = 0;
|
|
19
|
+
if (preList.dataset.length === 1)
|
|
20
|
+
return preList;
|
|
21
|
+
for (var i = 1; i < preList.dataset.length; i++) {
|
|
22
|
+
var pre_day = new Date(preList.dataset[i - 1].t
|
|
23
|
+
.toString()
|
|
24
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
25
|
+
var curr_day = new Date(preList.dataset[i].t
|
|
26
|
+
.toString()
|
|
27
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
28
|
+
if (pre_day > curr_day) {
|
|
29
|
+
index = i;
|
|
30
|
+
break;
|
|
47
31
|
}
|
|
48
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
49
32
|
}
|
|
33
|
+
// 以index拆分数组
|
|
34
|
+
var week = preList.dataset.slice(0, index);
|
|
35
|
+
var dataset = preList.dataset.slice(index);
|
|
36
|
+
if (week.length > 0) {
|
|
37
|
+
var weekData = {
|
|
38
|
+
o: week[0]["o"],
|
|
39
|
+
c: week[week.length - 1]["c"],
|
|
40
|
+
t: week[week.length - 1]["t"],
|
|
41
|
+
h: Math.max.apply(Math, week.map(function (item) { return item.h; })),
|
|
42
|
+
l: Math.min.apply(Math, week.map(function (item) { return item.l; })),
|
|
43
|
+
v: week.reduce(function (pre, current) { return pre + current.v; }, 0),
|
|
44
|
+
};
|
|
45
|
+
preList.week.push(weekData);
|
|
46
|
+
}
|
|
47
|
+
preList.dataset = dataset;
|
|
48
|
+
return preList;
|
|
50
49
|
}
|
|
51
50
|
});
|
|
52
51
|
return Week;
|
|
@@ -1,55 +1,117 @@
|
|
|
1
|
-
import Week from
|
|
2
|
-
describe(
|
|
1
|
+
import Week from "./week";
|
|
2
|
+
describe("Week", function () {
|
|
3
3
|
var week;
|
|
4
4
|
beforeEach(function () {
|
|
5
5
|
week = new Week();
|
|
6
6
|
});
|
|
7
|
-
describe(
|
|
8
|
-
it(
|
|
9
|
-
var data = {
|
|
7
|
+
describe("init", function () {
|
|
8
|
+
it("應該正確初始化數據", function () {
|
|
9
|
+
var data = {
|
|
10
|
+
o: 100,
|
|
11
|
+
c: 101,
|
|
12
|
+
h: 102,
|
|
13
|
+
l: 99,
|
|
14
|
+
t: 20230501,
|
|
15
|
+
v: 1000,
|
|
16
|
+
};
|
|
10
17
|
var result = week.init(data);
|
|
11
18
|
expect(result).toEqual({ dataset: [data], week: [] });
|
|
12
19
|
});
|
|
13
20
|
});
|
|
14
|
-
describe(
|
|
15
|
-
it(
|
|
16
|
-
var initialData = {
|
|
17
|
-
|
|
21
|
+
describe("next", function () {
|
|
22
|
+
it("應該正確處理非週末的數據", function () {
|
|
23
|
+
var initialData = {
|
|
24
|
+
o: 100,
|
|
25
|
+
c: 101,
|
|
26
|
+
h: 102,
|
|
27
|
+
l: 99,
|
|
28
|
+
t: 20230501,
|
|
29
|
+
v: 1000,
|
|
30
|
+
};
|
|
31
|
+
var nextData = {
|
|
32
|
+
o: 101,
|
|
33
|
+
c: 102,
|
|
34
|
+
h: 103,
|
|
35
|
+
l: 100,
|
|
36
|
+
t: 20230502,
|
|
37
|
+
v: 1100,
|
|
38
|
+
};
|
|
18
39
|
var initialResult = week.init(initialData);
|
|
19
40
|
var result = week.next(nextData, initialResult);
|
|
20
41
|
expect(result.dataset).toHaveLength(2);
|
|
21
42
|
expect(result.week).toHaveLength(0);
|
|
22
43
|
});
|
|
23
|
-
it(
|
|
24
|
-
var initialData = {
|
|
44
|
+
it("應該在週五時生成週數據", function () {
|
|
45
|
+
var initialData = {
|
|
46
|
+
o: 100,
|
|
47
|
+
c: 101,
|
|
48
|
+
h: 102,
|
|
49
|
+
l: 99,
|
|
50
|
+
t: 20230501,
|
|
51
|
+
v: 1000,
|
|
52
|
+
};
|
|
25
53
|
var result = week.init(initialData);
|
|
26
|
-
for (var i =
|
|
27
|
-
var nextData = {
|
|
54
|
+
for (var i = 1; i <= 9; i++) {
|
|
55
|
+
var nextData = {
|
|
56
|
+
o: 100 + i,
|
|
57
|
+
c: 101 + i,
|
|
58
|
+
h: 102 + i,
|
|
59
|
+
l: 99 + i,
|
|
60
|
+
t: 20230501 + i,
|
|
61
|
+
v: 1000 + i * 100,
|
|
62
|
+
};
|
|
28
63
|
result = week.next(nextData, result);
|
|
29
64
|
}
|
|
30
|
-
expect(result.dataset).toHaveLength(
|
|
65
|
+
expect(result.dataset).toHaveLength(4);
|
|
31
66
|
expect(result.week).toHaveLength(1);
|
|
32
67
|
expect(result.week[0]).toEqual({
|
|
33
68
|
o: 100,
|
|
34
69
|
c: 106,
|
|
70
|
+
t: 20230506,
|
|
35
71
|
h: 107,
|
|
36
72
|
l: 99,
|
|
37
|
-
|
|
38
|
-
v: 6400
|
|
73
|
+
v: 7500,
|
|
39
74
|
});
|
|
40
75
|
});
|
|
41
|
-
it(
|
|
42
|
-
var initialData = {
|
|
43
|
-
|
|
76
|
+
it("應該忽略週末數據", function () {
|
|
77
|
+
var initialData = {
|
|
78
|
+
o: 100,
|
|
79
|
+
c: 101,
|
|
80
|
+
h: 102,
|
|
81
|
+
l: 99,
|
|
82
|
+
t: 20230505,
|
|
83
|
+
v: 1000,
|
|
84
|
+
};
|
|
85
|
+
var weekendData = {
|
|
86
|
+
o: 101,
|
|
87
|
+
c: 102,
|
|
88
|
+
h: 103,
|
|
89
|
+
l: 100,
|
|
90
|
+
t: 20230506,
|
|
91
|
+
v: 1100,
|
|
92
|
+
};
|
|
44
93
|
var initialResult = week.init(initialData);
|
|
45
94
|
var result = week.next(weekendData, initialResult);
|
|
46
95
|
expect(result).toEqual(initialResult);
|
|
47
96
|
});
|
|
48
|
-
it(
|
|
49
|
-
var fridayData = {
|
|
50
|
-
|
|
97
|
+
it("應該在新的一週開始時重置數據集", function () {
|
|
98
|
+
var fridayData = {
|
|
99
|
+
o: 100,
|
|
100
|
+
c: 101,
|
|
101
|
+
h: 102,
|
|
102
|
+
l: 99,
|
|
103
|
+
t: 20230505,
|
|
104
|
+
v: 1000,
|
|
105
|
+
};
|
|
106
|
+
var mondayData = {
|
|
107
|
+
o: 101,
|
|
108
|
+
c: 102,
|
|
109
|
+
h: 103,
|
|
110
|
+
l: 100,
|
|
111
|
+
t: 20230508,
|
|
112
|
+
v: 1100,
|
|
113
|
+
};
|
|
51
114
|
var result = week.init(fridayData);
|
|
52
|
-
result = week.next(fridayData, result);
|
|
53
115
|
result = week.next(mondayData, result);
|
|
54
116
|
expect(result.dataset).toHaveLength(1);
|
|
55
117
|
expect(result.dataset[0]).toEqual(mondayData);
|
package/dist/umd/index.js
CHANGED
|
@@ -756,6 +756,7 @@
|
|
|
756
756
|
k: 0,
|
|
757
757
|
d: 0,
|
|
758
758
|
"k-d": 0,
|
|
759
|
+
j: 0,
|
|
759
760
|
type: type,
|
|
760
761
|
};
|
|
761
762
|
}
|
|
@@ -773,6 +774,7 @@
|
|
|
773
774
|
k: 0,
|
|
774
775
|
d: 0,
|
|
775
776
|
"k-d": 0,
|
|
777
|
+
j: 0,
|
|
776
778
|
type: type,
|
|
777
779
|
};
|
|
778
780
|
}
|
|
@@ -788,15 +790,18 @@
|
|
|
788
790
|
var k = (2 / 3) * (preList.k ? preList.k : 50) + (1 / 3) * rsv;
|
|
789
791
|
var d = (2 / 3) * (preList.d ? preList.d : 50) + (1 / 3) * k;
|
|
790
792
|
var k_d = k - d;
|
|
793
|
+
var j = 3 * d - 2 * k;
|
|
791
794
|
k = Math.round(k * 100) / 100;
|
|
792
795
|
d = Math.round(d * 100) / 100;
|
|
793
796
|
k_d = Math.round(k_d * 100) / 100;
|
|
797
|
+
j = Math.round(j * 100) / 100;
|
|
794
798
|
return {
|
|
795
799
|
dataset: preList.dataset,
|
|
796
800
|
rsv: rsv,
|
|
797
801
|
k: k,
|
|
798
802
|
d: d,
|
|
799
803
|
"k-d": k_d,
|
|
804
|
+
j: j,
|
|
800
805
|
type: type,
|
|
801
806
|
};
|
|
802
807
|
}
|
|
@@ -833,7 +838,7 @@
|
|
|
833
838
|
var yesterdayD = 50;
|
|
834
839
|
for (var i = 0; i < list.length; i++) {
|
|
835
840
|
if (i < 8)
|
|
836
|
-
res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0 });
|
|
841
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
|
|
837
842
|
else {
|
|
838
843
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
839
844
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
@@ -843,10 +848,12 @@
|
|
|
843
848
|
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
844
849
|
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|
|
845
850
|
var k_d = k - d;
|
|
851
|
+
var j = 3 * d - 2 * k;
|
|
846
852
|
k = Math.round(k * 100) / 100;
|
|
847
853
|
d = Math.round(d * 100) / 100;
|
|
848
854
|
k_d = Math.round(k_d * 100) / 100;
|
|
849
|
-
|
|
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 });
|
|
850
857
|
yesterdayK = k;
|
|
851
858
|
yesterdayD = d;
|
|
852
859
|
}
|
|
@@ -1272,7 +1279,7 @@
|
|
|
1272
1279
|
};
|
|
1273
1280
|
return __assign$2.apply(this, arguments);
|
|
1274
1281
|
};
|
|
1275
|
-
var __spreadArray
|
|
1282
|
+
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
1276
1283
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
1277
1284
|
if (ar || !(i in from)) {
|
|
1278
1285
|
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
@@ -1322,7 +1329,7 @@
|
|
|
1322
1329
|
var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
|
|
1323
1330
|
var vma = Math.round((sum / type) * 100) / 100;
|
|
1324
1331
|
return {
|
|
1325
|
-
dataset: __spreadArray
|
|
1332
|
+
dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
|
|
1326
1333
|
obv: obv,
|
|
1327
1334
|
preClose: currentClose,
|
|
1328
1335
|
obvList: obvList,
|
|
@@ -1532,15 +1539,6 @@
|
|
|
1532
1539
|
}
|
|
1533
1540
|
}
|
|
1534
1541
|
|
|
1535
|
-
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
1536
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
1537
|
-
if (ar || !(i in from)) {
|
|
1538
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
1539
|
-
ar[i] = from[i];
|
|
1540
|
-
}
|
|
1541
|
-
}
|
|
1542
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
1543
|
-
};
|
|
1544
1542
|
var Week = /** @class */ (function () {
|
|
1545
1543
|
function Week() {
|
|
1546
1544
|
}
|
|
@@ -1557,30 +1555,38 @@
|
|
|
1557
1555
|
configurable: true,
|
|
1558
1556
|
writable: true,
|
|
1559
1557
|
value: function (data, preList) {
|
|
1560
|
-
var year = data.t
|
|
1561
|
-
.toString()
|
|
1562
|
-
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3");
|
|
1563
|
-
var day = new Date(year).getDay();
|
|
1564
|
-
if (day === 6 || day === 0)
|
|
1565
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
1566
1558
|
preList.dataset.push(data);
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
preList.dataset = [data];
|
|
1559
|
+
var index = 0;
|
|
1560
|
+
if (preList.dataset.length === 1)
|
|
1561
|
+
return preList;
|
|
1562
|
+
for (var i = 1; i < preList.dataset.length; i++) {
|
|
1563
|
+
var pre_day = new Date(preList.dataset[i - 1].t
|
|
1564
|
+
.toString()
|
|
1565
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
1566
|
+
var curr_day = new Date(preList.dataset[i].t
|
|
1567
|
+
.toString()
|
|
1568
|
+
.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3")).getDay();
|
|
1569
|
+
if (pre_day > curr_day) {
|
|
1570
|
+
index = i;
|
|
1571
|
+
break;
|
|
1581
1572
|
}
|
|
1582
|
-
return { dataset: preList.dataset, week: preList.week };
|
|
1583
1573
|
}
|
|
1574
|
+
// 以index拆分数组
|
|
1575
|
+
var week = preList.dataset.slice(0, index);
|
|
1576
|
+
var dataset = preList.dataset.slice(index);
|
|
1577
|
+
if (week.length > 0) {
|
|
1578
|
+
var weekData = {
|
|
1579
|
+
o: week[0]["o"],
|
|
1580
|
+
c: week[week.length - 1]["c"],
|
|
1581
|
+
t: week[week.length - 1]["t"],
|
|
1582
|
+
h: Math.max.apply(Math, week.map(function (item) { return item.h; })),
|
|
1583
|
+
l: Math.min.apply(Math, week.map(function (item) { return item.l; })),
|
|
1584
|
+
v: week.reduce(function (pre, current) { return pre + current.v; }, 0),
|
|
1585
|
+
};
|
|
1586
|
+
preList.week.push(weekData);
|
|
1587
|
+
}
|
|
1588
|
+
preList.dataset = dataset;
|
|
1589
|
+
return preList;
|
|
1584
1590
|
}
|
|
1585
1591
|
});
|
|
1586
1592
|
return Week;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ch20026103/anysis",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17-alpha",
|
|
4
4
|
"description": "provide many analyze methods in the library.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"bugs": "git@github.com:cosmic1330/anysis/issues",
|
|
@@ -12,6 +12,21 @@
|
|
|
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
|
+
},
|
|
15
30
|
"lint-staged": {
|
|
16
31
|
"*.{js,jsx,ts,tsx,mjs}": [
|
|
17
32
|
"pnpm lint"
|
|
@@ -42,18 +57,5 @@
|
|
|
42
57
|
},
|
|
43
58
|
"vota": {
|
|
44
59
|
"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"
|
|
58
60
|
}
|
|
59
|
-
}
|
|
61
|
+
}
|