@ch20026103/anysis 0.0.3-alpha → 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/slope.test.js +6 -0
- package/dist/cjs/analyze/TimeSeries/R/index.d.ts +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +5 -1
- 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 +31 -4
- package/dist/cjs/stockSkills/kd.js +58 -4
- package/dist/cjs/stockSkills/kd.test.js +34 -2
- package/dist/cjs/stockSkills/ma.d.ts +38 -9
- package/dist/cjs/stockSkills/ma.js +28 -1
- package/dist/cjs/stockSkills/ma.test.js +12 -0
- 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/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/slope.test.js +6 -0
- package/dist/esm/analyze/TimeSeries/R/index.d.ts +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- 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 +31 -4
- package/dist/esm/stockSkills/kd.js +58 -4
- package/dist/esm/stockSkills/kd.test.js +34 -2
- package/dist/esm/stockSkills/ma.d.ts +38 -9
- package/dist/esm/stockSkills/ma.js +28 -1
- package/dist/esm/stockSkills/ma.test.js +12 -0
- 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/utils/getWeekLine.d.ts +2 -2
- package/dist/esm/stockSkills/williams.d.ts +4 -4
- package/dist/umd/index.js +349 -53
- package/package.json +15 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var index_1 = require("./index");
|
|
4
|
+
describe("test setStartMonthInYear", function () {
|
|
5
|
+
it("test 3", function () {
|
|
6
|
+
var res = (0, index_1.setStartMonthInYear)(3);
|
|
7
|
+
expect(res).toEqual([
|
|
8
|
+
"March",
|
|
9
|
+
"April",
|
|
10
|
+
"May",
|
|
11
|
+
"June",
|
|
12
|
+
"July",
|
|
13
|
+
"August",
|
|
14
|
+
"September",
|
|
15
|
+
"October",
|
|
16
|
+
"November",
|
|
17
|
+
"December",
|
|
18
|
+
"January",
|
|
19
|
+
"February",
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -26,4 +26,10 @@ describe("test Slope methods", function () {
|
|
|
26
26
|
var slope = (0, index_1.default)(x, y);
|
|
27
27
|
expect(slope).toEqual(0);
|
|
28
28
|
});
|
|
29
|
+
it("test 1,4,6,8,10,12", function () {
|
|
30
|
+
var x = [1, 2, 3, 4, 5, 6];
|
|
31
|
+
var y = [1, 4, 6, 8, 10, 12];
|
|
32
|
+
var slope = (0, index_1.default)(x, y);
|
|
33
|
+
expect(slope).toEqual(2.142857142857143);
|
|
34
|
+
});
|
|
29
35
|
});
|
|
@@ -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/cjs/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export { default as Kd } from "./stockSkills/kd.js";
|
|
|
7
7
|
export { default as Ma } from "./stockSkills/ma.js";
|
|
8
8
|
export { default as Macd } from "./stockSkills/macd.js";
|
|
9
9
|
export { default as Rsi } from "./stockSkills/rsi.js";
|
|
10
|
+
export { default as Obv } from "./stockSkills/obv.js";
|
|
11
|
+
export { default as Ema } from "./stockSkills/ema.js";
|
|
10
12
|
export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
|
|
11
13
|
export { default as getWeekLine } from "./stockSkills/utils/getWeekLine.js";
|
|
12
14
|
export { default as Williams } from "./stockSkills/williams.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.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.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副檔名**
|
|
@@ -26,6 +26,10 @@ var macd_js_1 = require("./stockSkills/macd.js");
|
|
|
26
26
|
Object.defineProperty(exports, "Macd", { enumerable: true, get: function () { return macd_js_1.default; } });
|
|
27
27
|
var rsi_js_1 = require("./stockSkills/rsi.js");
|
|
28
28
|
Object.defineProperty(exports, "Rsi", { enumerable: true, get: function () { return rsi_js_1.default; } });
|
|
29
|
+
var obv_js_1 = require("./stockSkills/obv.js");
|
|
30
|
+
Object.defineProperty(exports, "Obv", { enumerable: true, get: function () { return obv_js_1.default; } });
|
|
31
|
+
var ema_js_1 = require("./stockSkills/ema.js");
|
|
32
|
+
Object.defineProperty(exports, "Ema", { enumerable: true, get: function () { return ema_js_1.default; } });
|
|
29
33
|
var dateFormat_js_1 = require("./stockSkills/utils/dateFormat.js");
|
|
30
34
|
Object.defineProperty(exports, "dateFormat", { enumerable: true, get: function () { return dateFormat_js_1.default; } });
|
|
31
35
|
var getWeekLine_js_1 = require("./stockSkills/utils/getWeekLine.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,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var Ema = /** @class */ (function () {
|
|
4
|
+
function Ema() {
|
|
5
|
+
}
|
|
6
|
+
Object.defineProperty(Ema.prototype, "getStartEma", {
|
|
7
|
+
enumerable: false,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: function (list, period) {
|
|
11
|
+
if (list.length < period)
|
|
12
|
+
throw new Error("list.length < period");
|
|
13
|
+
var sum = 0;
|
|
14
|
+
for (var i = 0; i < period; i++) {
|
|
15
|
+
sum += list[i];
|
|
16
|
+
}
|
|
17
|
+
var initialEMA = sum / period;
|
|
18
|
+
return initialEMA;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(Ema.prototype, "getEma", {
|
|
22
|
+
enumerable: false,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: function (list, period) {
|
|
26
|
+
var res = [];
|
|
27
|
+
var ema = this.getStartEma(list.slice(0, period), period);
|
|
28
|
+
for (var i = 0; i < list.length; i++) {
|
|
29
|
+
if (i < period) {
|
|
30
|
+
res.push(undefined);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
ema = (list[i] * 2 + (period - 1) * ema) / (period + 1);
|
|
34
|
+
res.push(ema);
|
|
35
|
+
}
|
|
36
|
+
return res;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return Ema;
|
|
40
|
+
}());
|
|
41
|
+
exports.default = Ema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var ema_1 = require("./ema");
|
|
4
|
+
var test_data_test_1 = require("./test_data.test");
|
|
5
|
+
describe("test ema methods", function () {
|
|
6
|
+
it("test getEma5()", function () {
|
|
7
|
+
var ema = new ema_1.default();
|
|
8
|
+
var res = ema.getEma(test_data_test_1.default.map(function (item) { return item.c; }), 5);
|
|
9
|
+
expect(res[test_data_test_1.default.length - 1]).toEqual(141.83482746491333);
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -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;
|
|
@@ -2,16 +2,17 @@ interface KdType {
|
|
|
2
2
|
getRSV: (list: ListType) => ResRSV;
|
|
3
3
|
getKD: (list: ListType) => ResKD;
|
|
4
4
|
}
|
|
5
|
-
|
|
5
|
+
type DataType = {
|
|
6
6
|
c: number;
|
|
7
7
|
h: number;
|
|
8
8
|
l: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
9
|
+
};
|
|
10
|
+
type ListType = DataType[];
|
|
11
|
+
type ResRSV = {
|
|
11
12
|
c: number;
|
|
12
13
|
rsv?: number;
|
|
13
14
|
}[];
|
|
14
|
-
|
|
15
|
+
type ResKD = {
|
|
15
16
|
c: number;
|
|
16
17
|
rsv?: number;
|
|
17
18
|
k?: number;
|
|
@@ -19,6 +20,32 @@ declare type ResKD = {
|
|
|
19
20
|
"k-d"?: number;
|
|
20
21
|
}[];
|
|
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
|
+
};
|
|
22
49
|
getRSV(list: ListType): ({
|
|
23
50
|
rsv: undefined;
|
|
24
51
|
c: number;
|
|
@@ -14,6 +14,60 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
var Kd = /** @class */ (function () {
|
|
15
15
|
function Kd() {
|
|
16
16
|
}
|
|
17
|
+
Object.defineProperty(Kd.prototype, "init", {
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: function (data) {
|
|
22
|
+
return {
|
|
23
|
+
dataset: [data],
|
|
24
|
+
rsv: undefined,
|
|
25
|
+
k: undefined,
|
|
26
|
+
d: undefined,
|
|
27
|
+
"k-d": undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(Kd.prototype, "next", {
|
|
32
|
+
enumerable: false,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: function (data, preList, type) {
|
|
36
|
+
preList.dataset.push(data);
|
|
37
|
+
if (preList.dataset.length < type) {
|
|
38
|
+
return {
|
|
39
|
+
dataset: preList.dataset,
|
|
40
|
+
rsv: undefined,
|
|
41
|
+
k: undefined,
|
|
42
|
+
d: undefined,
|
|
43
|
+
"k-d": undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
if (preList.dataset.length > type) {
|
|
48
|
+
preList.dataset.shift();
|
|
49
|
+
}
|
|
50
|
+
var low = Math.min.apply(Math, preList.dataset.map(function (item) { return item.l; }));
|
|
51
|
+
var hight = Math.max.apply(Math, preList.dataset.map(function (item) { return item.h; }));
|
|
52
|
+
var close_1 = data.c;
|
|
53
|
+
var rsv = ((close_1 - low) / (hight - low)) * 100;
|
|
54
|
+
rsv = Math.round(rsv * 100) / 100;
|
|
55
|
+
var k = (2 / 3) * (preList.k ? preList.k : 50) + (1 / 3) * rsv;
|
|
56
|
+
var d = (2 / 3) * (preList.d ? preList.d : 50) + (1 / 3) * k;
|
|
57
|
+
var k_d = k - d;
|
|
58
|
+
k = Math.round(k * 100) / 100;
|
|
59
|
+
d = Math.round(d * 100) / 100;
|
|
60
|
+
k_d = Math.round(k_d * 100) / 100;
|
|
61
|
+
return {
|
|
62
|
+
dataset: preList.dataset,
|
|
63
|
+
rsv: rsv,
|
|
64
|
+
k: k,
|
|
65
|
+
d: d,
|
|
66
|
+
"k-d": k_d,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
17
71
|
Object.defineProperty(Kd.prototype, "getRSV", {
|
|
18
72
|
enumerable: false,
|
|
19
73
|
configurable: true,
|
|
@@ -26,8 +80,8 @@ var Kd = /** @class */ (function () {
|
|
|
26
80
|
else {
|
|
27
81
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
28
82
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
29
|
-
var
|
|
30
|
-
var rsv = ((
|
|
83
|
+
var close_2 = list[i].c;
|
|
84
|
+
var rsv = ((close_2 - low) / (hight - low)) * 100;
|
|
31
85
|
rsv = Math.round(rsv * 100) / 100;
|
|
32
86
|
res[i] = __assign(__assign({}, list[i]), { rsv: rsv });
|
|
33
87
|
}
|
|
@@ -49,8 +103,8 @@ var Kd = /** @class */ (function () {
|
|
|
49
103
|
else {
|
|
50
104
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
51
105
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
52
|
-
var
|
|
53
|
-
var rsv = ((
|
|
106
|
+
var close_3 = list[i].c;
|
|
107
|
+
var rsv = ((close_3 - low) / (hight - low)) * 100;
|
|
54
108
|
rsv = Math.round(rsv * 100) / 100;
|
|
55
109
|
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
56
110
|
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|
|
@@ -3,6 +3,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var kd_1 = require("./kd");
|
|
4
4
|
var test_data_test_1 = require("./test_data.test");
|
|
5
5
|
describe("test kd methods", function () {
|
|
6
|
+
it("test init", function () {
|
|
7
|
+
var index = test_data_test_1.data_9904.length - 1;
|
|
8
|
+
var kd = new kd_1.default();
|
|
9
|
+
var realData = kd.getKD(test_data_test_1.data_9904)[index];
|
|
10
|
+
var init = kd.init(test_data_test_1.data_9904[0]);
|
|
11
|
+
var res = init;
|
|
12
|
+
for (var i = 1; i <= index; i++) {
|
|
13
|
+
var item = test_data_test_1.data_9904[i];
|
|
14
|
+
res = kd.next(item, res, 9);
|
|
15
|
+
}
|
|
16
|
+
expect({
|
|
17
|
+
dataset: {
|
|
18
|
+
c: realData.c,
|
|
19
|
+
h: realData.h,
|
|
20
|
+
l: realData.l,
|
|
21
|
+
},
|
|
22
|
+
rsv: realData.rsv,
|
|
23
|
+
"k-d": realData["k-d"],
|
|
24
|
+
k: realData.k,
|
|
25
|
+
d: realData.d,
|
|
26
|
+
}).toEqual({
|
|
27
|
+
dataset: {
|
|
28
|
+
c: res.dataset[res.dataset.length - 1].c,
|
|
29
|
+
h: res.dataset[res.dataset.length - 1].h,
|
|
30
|
+
l: res.dataset[res.dataset.length - 1].l,
|
|
31
|
+
},
|
|
32
|
+
rsv: res.rsv,
|
|
33
|
+
"k-d": res["k-d"],
|
|
34
|
+
k: res.k,
|
|
35
|
+
d: res.d,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
6
38
|
it("test getRSV()", function () {
|
|
7
39
|
var kd = new kd_1.default();
|
|
8
40
|
expect(kd.getRSV(test_data_test_1.data_9904)[test_data_test_1.data_9904.length - 1]).toEqual({
|
|
@@ -15,7 +47,7 @@ describe("test kd methods", function () {
|
|
|
15
47
|
rsv: 90.63,
|
|
16
48
|
});
|
|
17
49
|
});
|
|
18
|
-
it("test
|
|
50
|
+
it("test getKD()", function () {
|
|
19
51
|
var kd = new kd_1.default();
|
|
20
52
|
expect(kd.getKD(test_data_test_1.data_9904)[test_data_test_1.data_9904.length - 1]).toEqual({
|
|
21
53
|
o: 26.4,
|
|
@@ -27,7 +59,7 @@ describe("test kd methods", function () {
|
|
|
27
59
|
rsv: 90.63,
|
|
28
60
|
k: 64.41,
|
|
29
61
|
d: 45.25,
|
|
30
|
-
|
|
62
|
+
"k-d": 19.16,
|
|
31
63
|
});
|
|
32
64
|
});
|
|
33
65
|
});
|
|
@@ -1,33 +1,34 @@
|
|
|
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 = {
|
|
17
18
|
c: number;
|
|
18
19
|
ma60?: number;
|
|
19
20
|
}[];
|
|
20
|
-
|
|
21
|
+
type ResMaSelf = {
|
|
21
22
|
c: number;
|
|
22
23
|
maSelf?: number;
|
|
23
24
|
}[];
|
|
24
|
-
|
|
25
|
+
type ResBoll = {
|
|
25
26
|
c: number;
|
|
26
27
|
ma25?: number;
|
|
27
28
|
bollUb?: number;
|
|
28
29
|
bollLb?: number;
|
|
29
30
|
}[];
|
|
30
|
-
|
|
31
|
+
type ResAllMa = {
|
|
31
32
|
c: number;
|
|
32
33
|
ma5?: number;
|
|
33
34
|
ma10?: number;
|
|
@@ -38,6 +39,20 @@ declare type ResAllMa = {
|
|
|
38
39
|
bollLb?: number;
|
|
39
40
|
}[];
|
|
40
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
|
+
};
|
|
41
56
|
getAllMa: (list: ListType) => ResAllMa;
|
|
42
57
|
getMa5: (list: ListType) => ResMa5;
|
|
43
58
|
getMa10: (list: ListType) => ResMa10;
|
|
@@ -47,6 +62,20 @@ interface MaType {
|
|
|
47
62
|
getBoll: (list: ListType) => ResBoll;
|
|
48
63
|
}
|
|
49
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
|
+
};
|
|
50
79
|
getAllMa(list: ListType): ResAllMa;
|
|
51
80
|
getMa5(list: ListType): ResMa5;
|
|
52
81
|
getMa10(list: ListType): ResMa10;
|
|
@@ -14,6 +14,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
var Ma = /** @class */ (function () {
|
|
15
15
|
function Ma() {
|
|
16
16
|
}
|
|
17
|
+
Object.defineProperty(Ma.prototype, "init", {
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: function (data, type) {
|
|
22
|
+
return { dataset: [data], ma: 0, type: type };
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(Ma.prototype, "next", {
|
|
26
|
+
enumerable: false,
|
|
27
|
+
configurable: true,
|
|
28
|
+
writable: true,
|
|
29
|
+
value: function (data, preList, type) {
|
|
30
|
+
preList.dataset.push(data);
|
|
31
|
+
if (preList.dataset.length < type) {
|
|
32
|
+
return { dataset: preList.dataset, ma: 0, type: type };
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (preList.dataset.length > type) {
|
|
36
|
+
preList.dataset.shift();
|
|
37
|
+
}
|
|
38
|
+
var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
39
|
+
var ma = Math.round((sum / type) * 100) / 100;
|
|
40
|
+
return { dataset: preList.dataset, ma: ma, type: type };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
17
44
|
Object.defineProperty(Ma.prototype, "getAllMa", {
|
|
18
45
|
enumerable: false,
|
|
19
46
|
configurable: true,
|
|
@@ -118,7 +145,7 @@ var Ma = /** @class */ (function () {
|
|
|
118
145
|
value: function (list, self) {
|
|
119
146
|
var res = [];
|
|
120
147
|
for (var i = 0; i < list.length; i++) {
|
|
121
|
-
if (i <
|
|
148
|
+
if (i < self - 1)
|
|
122
149
|
res[i] = __assign(__assign({}, list[i]), { maSelf: undefined });
|
|
123
150
|
else {
|
|
124
151
|
var sum = list
|
|
@@ -3,6 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var ma_1 = require("./ma");
|
|
4
4
|
var test_data_test_1 = require("./test_data.test");
|
|
5
5
|
describe("test ma methods", function () {
|
|
6
|
+
it("test init & next", function () {
|
|
7
|
+
var index = test_data_test_1.default.length - 1;
|
|
8
|
+
var ma = new ma_1.default();
|
|
9
|
+
var realData = ma.getMa5(test_data_test_1.default)[index];
|
|
10
|
+
var init = ma.init(test_data_test_1.default[0], 5);
|
|
11
|
+
var res = init;
|
|
12
|
+
for (var i = 1; i <= index; i++) {
|
|
13
|
+
var item = test_data_test_1.default[i];
|
|
14
|
+
res = ma.next(item, res, 5);
|
|
15
|
+
}
|
|
16
|
+
expect(realData.ma5).toEqual(res.ma);
|
|
17
|
+
});
|
|
6
18
|
it("test getMa5()", function () {
|
|
7
19
|
var ma = new ma_1.default();
|
|
8
20
|
expect(ma.getMa5(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
type ItemType = {
|
|
2
2
|
h: number;
|
|
3
3
|
l: number;
|
|
4
4
|
c: number;
|
|
5
5
|
};
|
|
6
|
-
|
|
6
|
+
type ResEMA12Type = {
|
|
7
7
|
h: number;
|
|
8
8
|
l: number;
|
|
9
9
|
c: number;
|
|
10
10
|
EMA12?: number;
|
|
11
11
|
}[];
|
|
12
|
-
|
|
12
|
+
type ResEMA26Type = {
|
|
13
13
|
h: number;
|
|
14
14
|
l: number;
|
|
15
15
|
c: number;
|
|
16
16
|
EMA26?: number;
|
|
17
17
|
}[];
|
|
18
|
-
|
|
18
|
+
type ResDifType = {
|
|
19
19
|
h: number;
|
|
20
20
|
l: number;
|
|
21
21
|
c: number;
|
|
22
22
|
DIF?: number;
|
|
23
23
|
}[];
|
|
24
|
-
|
|
24
|
+
type ResMacd9Type = {
|
|
25
25
|
h: number;
|
|
26
26
|
l: number;
|
|
27
27
|
c: number;
|
|
28
28
|
MACD9?: number;
|
|
29
29
|
OSC?: number;
|
|
30
30
|
}[];
|
|
31
|
-
|
|
31
|
+
type ResAllMacdType = {
|
|
32
32
|
h: number;
|
|
33
33
|
l: number;
|
|
34
34
|
c: number;
|
|
@@ -39,6 +39,29 @@ declare type ResAllMacdType = {
|
|
|
39
39
|
OSC?: number;
|
|
40
40
|
}[];
|
|
41
41
|
interface MacdType {
|
|
42
|
+
init: (data: ItemType) => {
|
|
43
|
+
dataset: ItemType[];
|
|
44
|
+
ema12?: number;
|
|
45
|
+
ema26?: number;
|
|
46
|
+
dif: number[];
|
|
47
|
+
macd?: number;
|
|
48
|
+
osc?: number;
|
|
49
|
+
};
|
|
50
|
+
next: (data: ItemType, preList: {
|
|
51
|
+
dataset: ItemType[];
|
|
52
|
+
ema12?: number;
|
|
53
|
+
ema26?: number;
|
|
54
|
+
dif: number[];
|
|
55
|
+
macd?: number;
|
|
56
|
+
osc?: number;
|
|
57
|
+
}) => {
|
|
58
|
+
dataset: ItemType[];
|
|
59
|
+
ema12?: number;
|
|
60
|
+
ema26?: number;
|
|
61
|
+
dif: number[];
|
|
62
|
+
macd?: number;
|
|
63
|
+
osc?: number;
|
|
64
|
+
};
|
|
42
65
|
getMACD: (list: ItemType[]) => ResAllMacdType;
|
|
43
66
|
getDI: (item: ItemType) => number;
|
|
44
67
|
getStartEMA: (list: ItemType[]) => number;
|
|
@@ -48,6 +71,29 @@ interface MacdType {
|
|
|
48
71
|
getMACD9: (list: ItemType[], DIF: ResDifType) => ResMacd9Type;
|
|
49
72
|
}
|
|
50
73
|
export default class MACD implements MacdType {
|
|
74
|
+
init(data: ItemType): {
|
|
75
|
+
dataset: ItemType[];
|
|
76
|
+
ema12?: number;
|
|
77
|
+
ema26?: number;
|
|
78
|
+
dif: number[];
|
|
79
|
+
macd?: number;
|
|
80
|
+
osc?: number;
|
|
81
|
+
};
|
|
82
|
+
next(data: ItemType, preList: {
|
|
83
|
+
dataset: ItemType[];
|
|
84
|
+
ema12?: number;
|
|
85
|
+
ema26?: number;
|
|
86
|
+
dif: number[];
|
|
87
|
+
macd?: number;
|
|
88
|
+
osc?: number;
|
|
89
|
+
}): {
|
|
90
|
+
dataset: ItemType[];
|
|
91
|
+
ema12: number | undefined;
|
|
92
|
+
ema26: number | undefined;
|
|
93
|
+
dif: number[];
|
|
94
|
+
macd: number | undefined;
|
|
95
|
+
osc: number | undefined;
|
|
96
|
+
};
|
|
51
97
|
getMACD(list: ItemType[]): ResAllMacdType;
|
|
52
98
|
getDI(item: ItemType): number;
|
|
53
99
|
getStartEMA(arr: ItemType[]): number;
|