@ch20026103/anysis 0.0.2 → 0.0.5-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/analyze/Month/index.d.ts +1 -1
- package/dist/cjs/analyze/Month/index.test.d.ts +1 -0
- package/dist/cjs/analyze/Month/index.test.js +22 -0
- package/dist/cjs/analyze/Regression/simpleRegressoinModel.d.ts +1 -1
- package/dist/cjs/analyze/Slope/index.d.ts +1 -0
- package/dist/cjs/analyze/Slope/index.js +13 -0
- package/dist/cjs/analyze/Slope/slope.test.d.ts +1 -0
- package/dist/cjs/analyze/Slope/slope.test.js +35 -0
- package/dist/cjs/analyze/TimeSeries/R/index.d.ts +1 -1
- package/dist/cjs/index.d.ts +9 -5
- package/dist/cjs/index.js +23 -15
- package/dist/cjs/stockSkills/ema.d.ts +9 -0
- package/dist/cjs/stockSkills/ema.js +41 -0
- package/dist/cjs/stockSkills/ema.test.d.ts +1 -0
- package/dist/cjs/stockSkills/ema.test.js +11 -0
- package/dist/cjs/stockSkills/gold.d.ts +4 -4
- package/dist/cjs/stockSkills/kd.d.ts +78 -0
- package/dist/cjs/stockSkills/kd.js +125 -0
- package/dist/cjs/stockSkills/kd.test.d.ts +1 -0
- package/dist/cjs/stockSkills/kd.test.js +65 -0
- package/dist/cjs/stockSkills/ma.d.ts +49 -7
- package/dist/cjs/stockSkills/ma.js +69 -1
- package/dist/cjs/stockSkills/ma.test.js +41 -4
- package/dist/cjs/stockSkills/macd.d.ts +52 -6
- package/dist/cjs/stockSkills/macd.js +87 -0
- package/dist/cjs/stockSkills/macd.test.js +24 -0
- package/dist/cjs/stockSkills/obv.d.ts +44 -0
- package/dist/cjs/stockSkills/obv.js +89 -0
- package/dist/cjs/stockSkills/obv.test.d.ts +1 -0
- package/dist/cjs/stockSkills/obv.test.js +20 -0
- package/dist/cjs/stockSkills/rsi.d.ts +4 -4
- package/dist/cjs/stockSkills/test_data.test.d.ts +8 -0
- package/dist/cjs/stockSkills/test_data.test.js +626 -0
- package/dist/cjs/stockSkills/utils/getWeekLine.d.ts +2 -2
- package/dist/cjs/stockSkills/williams.d.ts +4 -4
- package/dist/esm/analyze/Month/index.d.ts +1 -1
- package/dist/esm/analyze/Month/index.test.d.ts +1 -0
- package/dist/esm/analyze/Month/index.test.js +20 -0
- package/dist/esm/analyze/Regression/simpleRegressoinModel.d.ts +1 -1
- package/dist/esm/analyze/Slope/index.d.ts +1 -0
- package/dist/esm/analyze/Slope/index.js +10 -0
- package/dist/esm/analyze/Slope/slope.test.d.ts +1 -0
- package/dist/esm/analyze/Slope/slope.test.js +33 -0
- package/dist/esm/analyze/TimeSeries/R/index.d.ts +1 -1
- package/dist/esm/index.d.ts +9 -5
- package/dist/esm/index.js +9 -5
- package/dist/esm/stockSkills/ema.d.ts +9 -0
- package/dist/esm/stockSkills/ema.js +39 -0
- package/dist/esm/stockSkills/ema.test.d.ts +1 -0
- package/dist/esm/stockSkills/ema.test.js +9 -0
- package/dist/esm/stockSkills/gold.d.ts +4 -4
- package/dist/esm/stockSkills/kd.d.ts +78 -0
- package/dist/esm/stockSkills/kd.js +123 -0
- package/dist/esm/stockSkills/kd.test.d.ts +1 -0
- package/dist/esm/stockSkills/kd.test.js +63 -0
- package/dist/esm/stockSkills/ma.d.ts +49 -7
- package/dist/esm/stockSkills/ma.js +69 -1
- package/dist/esm/stockSkills/ma.test.js +41 -4
- package/dist/esm/stockSkills/macd.d.ts +52 -6
- package/dist/esm/stockSkills/macd.js +87 -0
- package/dist/esm/stockSkills/macd.test.js +24 -0
- package/dist/esm/stockSkills/obv.d.ts +44 -0
- package/dist/esm/stockSkills/obv.js +87 -0
- package/dist/esm/stockSkills/obv.test.d.ts +1 -0
- package/dist/esm/stockSkills/obv.test.js +18 -0
- package/dist/esm/stockSkills/rsi.d.ts +4 -4
- package/dist/esm/stockSkills/test_data.test.d.ts +8 -0
- package/dist/esm/stockSkills/test_data.test.js +625 -0
- package/dist/esm/stockSkills/utils/getWeekLine.d.ts +2 -2
- package/dist/esm/stockSkills/williams.d.ts +4 -4
- package/dist/umd/index.js +901 -482
- package/package.json +15 -17
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
type ListType = {
|
|
2
2
|
h: number;
|
|
3
3
|
l: number;
|
|
4
4
|
c: number;
|
|
5
5
|
}[];
|
|
6
|
-
|
|
6
|
+
type ResWilliams9Type = {
|
|
7
7
|
c: number;
|
|
8
8
|
williams9?: number;
|
|
9
9
|
}[];
|
|
10
|
-
|
|
10
|
+
type ResWilliams18Type = {
|
|
11
11
|
c: number;
|
|
12
12
|
williams18?: number;
|
|
13
13
|
}[];
|
|
14
|
-
|
|
14
|
+
type ResAllWilliamsType = {
|
|
15
15
|
c: number;
|
|
16
16
|
williams18?: number;
|
|
17
17
|
williams9?: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { setStartMonthInYear } from "./index";
|
|
2
|
+
describe("test setStartMonthInYear", function () {
|
|
3
|
+
it("test 3", function () {
|
|
4
|
+
var res = setStartMonthInYear(3);
|
|
5
|
+
expect(res).toEqual([
|
|
6
|
+
"March",
|
|
7
|
+
"April",
|
|
8
|
+
"May",
|
|
9
|
+
"June",
|
|
10
|
+
"July",
|
|
11
|
+
"August",
|
|
12
|
+
"September",
|
|
13
|
+
"October",
|
|
14
|
+
"November",
|
|
15
|
+
"December",
|
|
16
|
+
"January",
|
|
17
|
+
"February",
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function Slope(x: number[], y: number[]): number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default function Slope(x, y) {
|
|
2
|
+
// 計算 x 和 y 的平均值
|
|
3
|
+
var x_mean = x.reduce(function (acc, cur) { return acc + cur; }) / x.length;
|
|
4
|
+
var y_mean = y.reduce(function (acc, cur) { return acc + cur; }) / y.length;
|
|
5
|
+
// 計算斜率
|
|
6
|
+
var numerator = x.reduce(function (acc, cur, i) { return acc + (cur - x_mean) * (y[i] - y_mean); }, 0);
|
|
7
|
+
var denominator = x.reduce(function (acc, cur) { return acc + Math.pow((cur - x_mean), 2); }, 0);
|
|
8
|
+
var slope = numerator / denominator;
|
|
9
|
+
return slope;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Slope from "./index";
|
|
2
|
+
describe("test Slope methods", function () {
|
|
3
|
+
it("test 123456", function () {
|
|
4
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
5
|
+
var y = [1, 2, 3, 4, 5, 6];
|
|
6
|
+
var slope = Slope(x, y);
|
|
7
|
+
expect(slope).toEqual(1);
|
|
8
|
+
});
|
|
9
|
+
it("test -123456", function () {
|
|
10
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
11
|
+
var y = [-1, -2, -3, -4, -5, -6];
|
|
12
|
+
var slope = Slope(x, y);
|
|
13
|
+
expect(slope).toEqual(-1);
|
|
14
|
+
});
|
|
15
|
+
it("test 654321", function () {
|
|
16
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
17
|
+
var y = [6, 5, 4, 3, 2, 1];
|
|
18
|
+
var slope = Slope(x, y);
|
|
19
|
+
expect(slope).toEqual(-1);
|
|
20
|
+
});
|
|
21
|
+
it("test 222222", function () {
|
|
22
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
23
|
+
var y = [2, 2, 2, 2, 2, 2];
|
|
24
|
+
var slope = Slope(x, y);
|
|
25
|
+
expect(slope).toEqual(0);
|
|
26
|
+
});
|
|
27
|
+
it("test 1,4,6,8,10,12", function () {
|
|
28
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
29
|
+
var y = [1, 4, 6, 8, 10, 12];
|
|
30
|
+
var slope = Slope(x, y);
|
|
31
|
+
expect(slope).toEqual(2.142857142857143);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare function movingAverages(arr: number[], periods: number): number[];
|
|
2
2
|
export declare function weightMovingAverages(arr: number[], periods: number[]): number[];
|
|
3
|
-
|
|
3
|
+
type ExponentialSmoothingOptions = {
|
|
4
4
|
initialForecast: number;
|
|
5
5
|
};
|
|
6
6
|
export declare function exponentialSmoothing(arr: number[], alpha: number, options?: Partial<ExponentialSmoothingOptions>): number[];
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
2
|
-
export {
|
|
2
|
+
export { default as slope } from "./analyze/Slope/index.js";
|
|
3
|
+
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
3
4
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
5
|
+
export { default as Gold } from "./stockSkills/gold.js";
|
|
6
|
+
export { default as Kd } from "./stockSkills/kd.js";
|
|
6
7
|
export { default as Ma } from "./stockSkills/ma.js";
|
|
7
8
|
export { default as Macd } from "./stockSkills/macd.js";
|
|
8
9
|
export { default as Rsi } from "./stockSkills/rsi.js";
|
|
9
|
-
export { default as
|
|
10
|
-
export { default as
|
|
10
|
+
export { default as Obv } from "./stockSkills/obv.js";
|
|
11
|
+
export { default as Ema } from "./stockSkills/ema.js";
|
|
11
12
|
export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
|
|
12
13
|
export { default as getWeekLine } from "./stockSkills/utils/getWeekLine.js";
|
|
14
|
+
export { default as Williams } from "./stockSkills/williams.js";
|
|
15
|
+
export { add } from "./test/add.js";
|
|
16
|
+
export { minus } from "./test/minus.js";
|
package/dist/esm/index.js
CHANGED
|
@@ -4,14 +4,18 @@
|
|
|
4
4
|
但如果要支持 ES 模塊的瀏覽器 ,則需要文件擴展名(.js)。
|
|
5
5
|
*/
|
|
6
6
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
7
|
-
export {
|
|
7
|
+
export { default as slope } from "./analyze/Slope/index.js";
|
|
8
|
+
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
8
9
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
10
|
+
export { default as Gold } from "./stockSkills/gold.js";
|
|
11
|
+
export { default as Kd } from "./stockSkills/kd.js";
|
|
11
12
|
export { default as Ma } from "./stockSkills/ma.js";
|
|
12
13
|
export { default as Macd } from "./stockSkills/macd.js";
|
|
13
14
|
export { default as Rsi } from "./stockSkills/rsi.js";
|
|
14
|
-
export { default as
|
|
15
|
-
export { default as
|
|
15
|
+
export { default as Obv } from "./stockSkills/obv.js";
|
|
16
|
+
export { default as Ema } from "./stockSkills/ema.js";
|
|
16
17
|
export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
|
|
17
18
|
export { default as getWeekLine } from "./stockSkills/utils/getWeekLine.js";
|
|
19
|
+
export { default as Williams } from "./stockSkills/williams.js";
|
|
20
|
+
export { add } from "./test/add.js";
|
|
21
|
+
export { minus } from "./test/minus.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface EmaType {
|
|
2
|
+
getStartEma: (list: number[], period: number) => number;
|
|
3
|
+
getEma: (list: number[], period: number) => (number | undefined)[];
|
|
4
|
+
}
|
|
5
|
+
export default class Ema implements EmaType {
|
|
6
|
+
getStartEma(list: number[], period: number): number;
|
|
7
|
+
getEma(list: number[], period: number): (number | undefined)[];
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
var Ema = /** @class */ (function () {
|
|
2
|
+
function Ema() {
|
|
3
|
+
}
|
|
4
|
+
Object.defineProperty(Ema.prototype, "getStartEma", {
|
|
5
|
+
enumerable: false,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true,
|
|
8
|
+
value: function (list, period) {
|
|
9
|
+
if (list.length < period)
|
|
10
|
+
throw new Error("list.length < period");
|
|
11
|
+
var sum = 0;
|
|
12
|
+
for (var i = 0; i < period; i++) {
|
|
13
|
+
sum += list[i];
|
|
14
|
+
}
|
|
15
|
+
var initialEMA = sum / period;
|
|
16
|
+
return initialEMA;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(Ema.prototype, "getEma", {
|
|
20
|
+
enumerable: false,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: function (list, period) {
|
|
24
|
+
var res = [];
|
|
25
|
+
var ema = this.getStartEma(list.slice(0, period), period);
|
|
26
|
+
for (var i = 0; i < list.length; i++) {
|
|
27
|
+
if (i < period) {
|
|
28
|
+
res.push(undefined);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
ema = (list[i] * 2 + (period - 1) * ema) / (period + 1);
|
|
32
|
+
res.push(ema);
|
|
33
|
+
}
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return Ema;
|
|
38
|
+
}());
|
|
39
|
+
export default Ema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import Ema from "./ema";
|
|
2
|
+
import data from "./test_data.test";
|
|
3
|
+
describe("test ema methods", function () {
|
|
4
|
+
it("test getEma5()", function () {
|
|
5
|
+
var ema = new Ema();
|
|
6
|
+
var res = ema.getEma(data.map(function (item) { return item.c; }), 5);
|
|
7
|
+
expect(res[data.length - 1]).toEqual(141.83482746491333);
|
|
8
|
+
});
|
|
9
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
type ResGoldType = {
|
|
2
2
|
highestPointDate: number;
|
|
3
3
|
lowestPointDate: number;
|
|
4
4
|
lowestPoint: number;
|
|
@@ -9,14 +9,14 @@ declare type ResGoldType = {
|
|
|
9
9
|
weak: number;
|
|
10
10
|
superWeak: number;
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
type ListType = {
|
|
13
13
|
h: number;
|
|
14
14
|
t: number;
|
|
15
15
|
o: number;
|
|
16
16
|
c: number;
|
|
17
17
|
l: number;
|
|
18
18
|
}[];
|
|
19
|
-
|
|
19
|
+
type ResHightestType = {
|
|
20
20
|
[key: string]: {
|
|
21
21
|
h: number;
|
|
22
22
|
t: number;
|
|
@@ -25,7 +25,7 @@ declare type ResHightestType = {
|
|
|
25
25
|
l: number;
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
-
|
|
28
|
+
type ResLowestType = {
|
|
29
29
|
[key: string]: {
|
|
30
30
|
h: number;
|
|
31
31
|
t: number;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
interface KdType {
|
|
2
|
+
getRSV: (list: ListType) => ResRSV;
|
|
3
|
+
getKD: (list: ListType) => ResKD;
|
|
4
|
+
}
|
|
5
|
+
type DataType = {
|
|
6
|
+
c: number;
|
|
7
|
+
h: number;
|
|
8
|
+
l: number;
|
|
9
|
+
};
|
|
10
|
+
type ListType = DataType[];
|
|
11
|
+
type ResRSV = {
|
|
12
|
+
c: number;
|
|
13
|
+
rsv?: number;
|
|
14
|
+
}[];
|
|
15
|
+
type ResKD = {
|
|
16
|
+
c: number;
|
|
17
|
+
rsv?: number;
|
|
18
|
+
k?: number;
|
|
19
|
+
d?: number;
|
|
20
|
+
"k-d"?: number;
|
|
21
|
+
}[];
|
|
22
|
+
export default class Kd implements KdType {
|
|
23
|
+
init(data: DataType): {
|
|
24
|
+
dataset: ListType;
|
|
25
|
+
rsv?: number;
|
|
26
|
+
k?: number;
|
|
27
|
+
d?: number;
|
|
28
|
+
"k-d"?: number;
|
|
29
|
+
};
|
|
30
|
+
next(data: DataType, preList: {
|
|
31
|
+
dataset: ListType;
|
|
32
|
+
rsv?: number;
|
|
33
|
+
k?: number;
|
|
34
|
+
d?: number;
|
|
35
|
+
"k-d"?: number;
|
|
36
|
+
}, type: number): {
|
|
37
|
+
dataset: ListType;
|
|
38
|
+
rsv: undefined;
|
|
39
|
+
k: undefined;
|
|
40
|
+
d: undefined;
|
|
41
|
+
"k-d": undefined;
|
|
42
|
+
} | {
|
|
43
|
+
dataset: ListType;
|
|
44
|
+
rsv: number;
|
|
45
|
+
k: number;
|
|
46
|
+
d: number;
|
|
47
|
+
"k-d": number;
|
|
48
|
+
};
|
|
49
|
+
getRSV(list: ListType): ({
|
|
50
|
+
rsv: undefined;
|
|
51
|
+
c: number;
|
|
52
|
+
h: number;
|
|
53
|
+
l: number;
|
|
54
|
+
} | {
|
|
55
|
+
rsv: number;
|
|
56
|
+
c: number;
|
|
57
|
+
h: number;
|
|
58
|
+
l: number;
|
|
59
|
+
})[];
|
|
60
|
+
getKD(list: ListType): ({
|
|
61
|
+
rsv: undefined;
|
|
62
|
+
k: undefined;
|
|
63
|
+
d: undefined;
|
|
64
|
+
"k-d": undefined;
|
|
65
|
+
c: number;
|
|
66
|
+
h: number;
|
|
67
|
+
l: number;
|
|
68
|
+
} | {
|
|
69
|
+
rsv: number;
|
|
70
|
+
k: number;
|
|
71
|
+
d: number;
|
|
72
|
+
"k-d": number;
|
|
73
|
+
c: number;
|
|
74
|
+
h: number;
|
|
75
|
+
l: number;
|
|
76
|
+
})[];
|
|
77
|
+
}
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
var Kd = /** @class */ (function () {
|
|
13
|
+
function Kd() {
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(Kd.prototype, "init", {
|
|
16
|
+
enumerable: false,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true,
|
|
19
|
+
value: function (data) {
|
|
20
|
+
return {
|
|
21
|
+
dataset: [data],
|
|
22
|
+
rsv: undefined,
|
|
23
|
+
k: undefined,
|
|
24
|
+
d: undefined,
|
|
25
|
+
"k-d": undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(Kd.prototype, "next", {
|
|
30
|
+
enumerable: false,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: function (data, preList, type) {
|
|
34
|
+
preList.dataset.push(data);
|
|
35
|
+
if (preList.dataset.length < type) {
|
|
36
|
+
return {
|
|
37
|
+
dataset: preList.dataset,
|
|
38
|
+
rsv: undefined,
|
|
39
|
+
k: undefined,
|
|
40
|
+
d: undefined,
|
|
41
|
+
"k-d": undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (preList.dataset.length > type) {
|
|
46
|
+
preList.dataset.shift();
|
|
47
|
+
}
|
|
48
|
+
var low = Math.min.apply(Math, preList.dataset.map(function (item) { return item.l; }));
|
|
49
|
+
var hight = Math.max.apply(Math, preList.dataset.map(function (item) { return item.h; }));
|
|
50
|
+
var close_1 = data.c;
|
|
51
|
+
var rsv = ((close_1 - low) / (hight - low)) * 100;
|
|
52
|
+
rsv = Math.round(rsv * 100) / 100;
|
|
53
|
+
var k = (2 / 3) * (preList.k ? preList.k : 50) + (1 / 3) * rsv;
|
|
54
|
+
var d = (2 / 3) * (preList.d ? preList.d : 50) + (1 / 3) * k;
|
|
55
|
+
var k_d = k - d;
|
|
56
|
+
k = Math.round(k * 100) / 100;
|
|
57
|
+
d = Math.round(d * 100) / 100;
|
|
58
|
+
k_d = Math.round(k_d * 100) / 100;
|
|
59
|
+
return {
|
|
60
|
+
dataset: preList.dataset,
|
|
61
|
+
rsv: rsv,
|
|
62
|
+
k: k,
|
|
63
|
+
d: d,
|
|
64
|
+
"k-d": k_d,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
Object.defineProperty(Kd.prototype, "getRSV", {
|
|
70
|
+
enumerable: false,
|
|
71
|
+
configurable: true,
|
|
72
|
+
writable: true,
|
|
73
|
+
value: function (list) {
|
|
74
|
+
var res = [];
|
|
75
|
+
for (var i = 0; i < list.length; i++) {
|
|
76
|
+
if (i < 8)
|
|
77
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: undefined });
|
|
78
|
+
else {
|
|
79
|
+
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
80
|
+
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
81
|
+
var close_2 = list[i].c;
|
|
82
|
+
var rsv = ((close_2 - low) / (hight - low)) * 100;
|
|
83
|
+
rsv = Math.round(rsv * 100) / 100;
|
|
84
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: rsv });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return res;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(Kd.prototype, "getKD", {
|
|
91
|
+
enumerable: false,
|
|
92
|
+
configurable: true,
|
|
93
|
+
writable: true,
|
|
94
|
+
value: function (list) {
|
|
95
|
+
var res = [];
|
|
96
|
+
var yesterdayK = 50;
|
|
97
|
+
var yesterdayD = 50;
|
|
98
|
+
for (var i = 0; i < list.length; i++) {
|
|
99
|
+
if (i < 8)
|
|
100
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: undefined, k: undefined, d: undefined, "k-d": undefined });
|
|
101
|
+
else {
|
|
102
|
+
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
103
|
+
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
104
|
+
var close_3 = list[i].c;
|
|
105
|
+
var rsv = ((close_3 - low) / (hight - low)) * 100;
|
|
106
|
+
rsv = Math.round(rsv * 100) / 100;
|
|
107
|
+
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
108
|
+
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|
|
109
|
+
var k_d = k - d;
|
|
110
|
+
k = Math.round(k * 100) / 100;
|
|
111
|
+
d = Math.round(d * 100) / 100;
|
|
112
|
+
k_d = Math.round(k_d * 100) / 100;
|
|
113
|
+
res[i] = __assign(__assign({}, list[i]), { rsv: rsv, k: k, d: d, "k-d": k_d });
|
|
114
|
+
yesterdayK = k;
|
|
115
|
+
yesterdayD = d;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return res;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return Kd;
|
|
122
|
+
}());
|
|
123
|
+
export default Kd;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import Kd from "./kd";
|
|
2
|
+
import { data_9904 as data } from "./test_data.test";
|
|
3
|
+
describe("test kd methods", function () {
|
|
4
|
+
it("test init", function () {
|
|
5
|
+
var index = data.length - 1;
|
|
6
|
+
var kd = new Kd();
|
|
7
|
+
var realData = kd.getKD(data)[index];
|
|
8
|
+
var init = kd.init(data[0]);
|
|
9
|
+
var res = init;
|
|
10
|
+
for (var i = 1; i <= index; i++) {
|
|
11
|
+
var item = data[i];
|
|
12
|
+
res = kd.next(item, res, 9);
|
|
13
|
+
}
|
|
14
|
+
expect({
|
|
15
|
+
dataset: {
|
|
16
|
+
c: realData.c,
|
|
17
|
+
h: realData.h,
|
|
18
|
+
l: realData.l,
|
|
19
|
+
},
|
|
20
|
+
rsv: realData.rsv,
|
|
21
|
+
"k-d": realData["k-d"],
|
|
22
|
+
k: realData.k,
|
|
23
|
+
d: realData.d,
|
|
24
|
+
}).toEqual({
|
|
25
|
+
dataset: {
|
|
26
|
+
c: res.dataset[res.dataset.length - 1].c,
|
|
27
|
+
h: res.dataset[res.dataset.length - 1].h,
|
|
28
|
+
l: res.dataset[res.dataset.length - 1].l,
|
|
29
|
+
},
|
|
30
|
+
rsv: res.rsv,
|
|
31
|
+
"k-d": res["k-d"],
|
|
32
|
+
k: res.k,
|
|
33
|
+
d: res.d,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it("test getRSV()", function () {
|
|
37
|
+
var kd = new Kd();
|
|
38
|
+
expect(kd.getRSV(data)[data.length - 1]).toEqual({
|
|
39
|
+
o: 26.4,
|
|
40
|
+
l: 34.3,
|
|
41
|
+
h: 34.8,
|
|
42
|
+
c: 34.65,
|
|
43
|
+
v: 12765,
|
|
44
|
+
t: 20230216,
|
|
45
|
+
rsv: 90.63,
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it("test getKD()", function () {
|
|
49
|
+
var kd = new Kd();
|
|
50
|
+
expect(kd.getKD(data)[data.length - 1]).toEqual({
|
|
51
|
+
o: 26.4,
|
|
52
|
+
l: 34.3,
|
|
53
|
+
h: 34.8,
|
|
54
|
+
c: 34.65,
|
|
55
|
+
v: 12765,
|
|
56
|
+
t: 20230216,
|
|
57
|
+
rsv: 90.63,
|
|
58
|
+
k: 64.41,
|
|
59
|
+
d: 45.25,
|
|
60
|
+
"k-d": 19.16,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -1,45 +1,87 @@
|
|
|
1
|
-
|
|
1
|
+
type DataType = {
|
|
2
2
|
c: number;
|
|
3
|
-
}
|
|
4
|
-
|
|
3
|
+
};
|
|
4
|
+
type ListType = DataType[];
|
|
5
|
+
type ResMa5 = {
|
|
5
6
|
c: number;
|
|
6
7
|
ma5?: number;
|
|
7
8
|
}[];
|
|
8
|
-
|
|
9
|
+
type ResMa10 = {
|
|
9
10
|
c: number;
|
|
10
11
|
ma10?: number;
|
|
11
12
|
}[];
|
|
12
|
-
|
|
13
|
+
type ResMa20 = {
|
|
13
14
|
c: number;
|
|
14
15
|
ma20?: number;
|
|
15
16
|
}[];
|
|
16
|
-
|
|
17
|
+
type ResMa60 = {
|
|
18
|
+
c: number;
|
|
19
|
+
ma60?: number;
|
|
20
|
+
}[];
|
|
21
|
+
type ResMaSelf = {
|
|
22
|
+
c: number;
|
|
23
|
+
maSelf?: number;
|
|
24
|
+
}[];
|
|
25
|
+
type ResBoll = {
|
|
17
26
|
c: number;
|
|
18
27
|
ma25?: number;
|
|
19
28
|
bollUb?: number;
|
|
20
29
|
bollLb?: number;
|
|
21
30
|
}[];
|
|
22
|
-
|
|
31
|
+
type ResAllMa = {
|
|
23
32
|
c: number;
|
|
24
33
|
ma5?: number;
|
|
25
34
|
ma10?: number;
|
|
26
35
|
ma20?: number;
|
|
27
36
|
ma25?: number;
|
|
37
|
+
ma60?: number;
|
|
28
38
|
bollUb?: number;
|
|
29
39
|
bollLb?: number;
|
|
30
40
|
}[];
|
|
31
41
|
interface MaType {
|
|
42
|
+
init: (data: DataType, type: number) => {
|
|
43
|
+
dataset: ListType;
|
|
44
|
+
ma: number;
|
|
45
|
+
type: number;
|
|
46
|
+
};
|
|
47
|
+
next: (data: DataType, preList: {
|
|
48
|
+
dataset: ListType;
|
|
49
|
+
ma: number;
|
|
50
|
+
type: number;
|
|
51
|
+
}, type: number) => {
|
|
52
|
+
dataset: ListType;
|
|
53
|
+
ma: number;
|
|
54
|
+
type: number;
|
|
55
|
+
};
|
|
32
56
|
getAllMa: (list: ListType) => ResAllMa;
|
|
33
57
|
getMa5: (list: ListType) => ResMa5;
|
|
34
58
|
getMa10: (list: ListType) => ResMa10;
|
|
35
59
|
getMa20: (list: ListType) => ResMa20;
|
|
60
|
+
getMa60: (list: ListType) => ResMa60;
|
|
61
|
+
getMaSelf: (list: ListType, self: number) => ResMaSelf;
|
|
36
62
|
getBoll: (list: ListType) => ResBoll;
|
|
37
63
|
}
|
|
38
64
|
export default class Ma implements MaType {
|
|
65
|
+
init(data: DataType, type: number): {
|
|
66
|
+
dataset: DataType[];
|
|
67
|
+
ma: number;
|
|
68
|
+
type: number;
|
|
69
|
+
};
|
|
70
|
+
next(data: DataType, preList: {
|
|
71
|
+
dataset: ListType;
|
|
72
|
+
ma: number;
|
|
73
|
+
type: number;
|
|
74
|
+
}, type: number): {
|
|
75
|
+
dataset: ListType;
|
|
76
|
+
ma: number;
|
|
77
|
+
type: number;
|
|
78
|
+
};
|
|
39
79
|
getAllMa(list: ListType): ResAllMa;
|
|
40
80
|
getMa5(list: ListType): ResMa5;
|
|
41
81
|
getMa10(list: ListType): ResMa10;
|
|
42
82
|
getMa20(list: ListType): ResMa20;
|
|
83
|
+
getMa60(list: ListType): ResMa60;
|
|
84
|
+
getMaSelf(list: ListType, self: number): ResMaSelf;
|
|
43
85
|
getBoll(list: ListType): ResBoll;
|
|
44
86
|
}
|
|
45
87
|
export {};
|