@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
|
@@ -14,6 +14,93 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
var MACD = /** @class */ (function () {
|
|
15
15
|
function MACD() {
|
|
16
16
|
}
|
|
17
|
+
Object.defineProperty(MACD.prototype, "init", {
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: function (data) {
|
|
22
|
+
return {
|
|
23
|
+
dataset: [data],
|
|
24
|
+
ema12: undefined,
|
|
25
|
+
ema26: undefined,
|
|
26
|
+
dif: [],
|
|
27
|
+
macd: undefined,
|
|
28
|
+
osc: undefined,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(MACD.prototype, "next", {
|
|
33
|
+
enumerable: false,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: function (data, preList) {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
preList.dataset.push(data);
|
|
39
|
+
if (preList.dataset.length > 34)
|
|
40
|
+
preList.dataset.shift();
|
|
41
|
+
// EMA12
|
|
42
|
+
var ema12 = undefined;
|
|
43
|
+
if (preList.dataset.length === 12) {
|
|
44
|
+
ema12 = this.getStartEMA(preList.dataset);
|
|
45
|
+
ema12 = (ema12 * 11) / 13 + (this.getDI(data) * 2) / 13;
|
|
46
|
+
ema12 = Math.round(ema12 * 100) / 100;
|
|
47
|
+
}
|
|
48
|
+
else if (preList.dataset.length > 12 && preList.ema12) {
|
|
49
|
+
ema12 = (preList.ema12 * 11) / 13 + (this.getDI(data) * 2) / 13;
|
|
50
|
+
ema12 = Math.round(ema12 * 100) / 100;
|
|
51
|
+
}
|
|
52
|
+
// EMA26
|
|
53
|
+
var ema26 = undefined;
|
|
54
|
+
if (preList.dataset.length === 26) {
|
|
55
|
+
ema26 = this.getStartEMA(preList.dataset);
|
|
56
|
+
ema26 = (ema26 * 25) / 27 + (this.getDI(data) * 2) / 27;
|
|
57
|
+
ema26 = Math.round(ema26 * 100) / 100;
|
|
58
|
+
}
|
|
59
|
+
else if (preList.dataset.length > 26 && preList.ema26) {
|
|
60
|
+
ema26 = (preList.ema26 * 25) / 27 + (this.getDI(data) * 2) / 27;
|
|
61
|
+
ema26 = Math.round(ema26 * 100) / 100;
|
|
62
|
+
}
|
|
63
|
+
// DIF
|
|
64
|
+
var dif = undefined;
|
|
65
|
+
if (ema12 && ema26) {
|
|
66
|
+
dif = ema12 - ema26;
|
|
67
|
+
dif = Math.round(dif * 100) / 100;
|
|
68
|
+
(_a = preList.dif) === null || _a === void 0 ? void 0 : _a.push(dif);
|
|
69
|
+
if (preList.dif.length > 9)
|
|
70
|
+
(_b = preList.dif) === null || _b === void 0 ? void 0 : _b.shift();
|
|
71
|
+
}
|
|
72
|
+
// MACD & OSC
|
|
73
|
+
var macd = undefined;
|
|
74
|
+
var osc = undefined;
|
|
75
|
+
if (preList.dif.length === 9) {
|
|
76
|
+
if (preList.macd === undefined) {
|
|
77
|
+
macd = preList.dif.reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
|
|
78
|
+
for (var i = 0; i < 9; i++) {
|
|
79
|
+
var item = preList.dif[i];
|
|
80
|
+
macd = macd + ((item - macd) * 2) / 10;
|
|
81
|
+
macd = Math.round(macd * 100) / 100;
|
|
82
|
+
osc = item - macd;
|
|
83
|
+
osc = Math.round(osc * 100) / 100;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
macd = preList.macd + ((dif - preList.macd) * 2) / 10;
|
|
88
|
+
macd = Math.round(macd * 100) / 100;
|
|
89
|
+
var item = preList.dif[preList.dif.length - 1];
|
|
90
|
+
osc = item - macd;
|
|
91
|
+
osc = Math.round(osc * 100) / 100;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
dataset: preList.dataset,
|
|
96
|
+
ema12: ema12,
|
|
97
|
+
ema26: ema26,
|
|
98
|
+
dif: preList.dif,
|
|
99
|
+
macd: macd,
|
|
100
|
+
osc: osc,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
});
|
|
17
104
|
Object.defineProperty(MACD.prototype, "getMACD", {
|
|
18
105
|
enumerable: false,
|
|
19
106
|
configurable: true,
|
|
@@ -3,6 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var macd_1 = require("./macd");
|
|
4
4
|
var test_data_test_1 = require("./test_data.test");
|
|
5
5
|
describe("test macd methods", function () {
|
|
6
|
+
it("test init & next", function () {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
var index = test_data_test_1.default.length - 1;
|
|
9
|
+
var macd = new macd_1.default();
|
|
10
|
+
var init = macd.init(test_data_test_1.default[0]);
|
|
11
|
+
var res = init;
|
|
12
|
+
for (var i = 1; i <= index; i++) {
|
|
13
|
+
var item = test_data_test_1.default[i];
|
|
14
|
+
res = macd.next(item, res);
|
|
15
|
+
}
|
|
16
|
+
expect({
|
|
17
|
+
ema12: 144.02,
|
|
18
|
+
ema26: 142.23,
|
|
19
|
+
dif: 1.79,
|
|
20
|
+
macd: 3.46,
|
|
21
|
+
osc: -1.67,
|
|
22
|
+
}).toEqual({
|
|
23
|
+
ema12: res.ema12,
|
|
24
|
+
ema26: res.ema26,
|
|
25
|
+
dif: (_a = res.dif) === null || _a === void 0 ? void 0 : _a[((_b = res.dif) === null || _b === void 0 ? void 0 : _b.length) - 1],
|
|
26
|
+
macd: res.macd,
|
|
27
|
+
osc: res.osc,
|
|
28
|
+
});
|
|
29
|
+
});
|
|
6
30
|
it("test getEMA12()", function () {
|
|
7
31
|
var macd = new macd_1.default();
|
|
8
32
|
expect(macd.getEMA12(test_data_test_1.default)[test_data_test_1.default.length - 1]).toEqual({
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
type ItemType = {
|
|
2
|
+
h: number;
|
|
3
|
+
l: number;
|
|
4
|
+
c: number;
|
|
5
|
+
v: number;
|
|
6
|
+
};
|
|
7
|
+
type ResObv = {
|
|
8
|
+
obv: number;
|
|
9
|
+
} & ItemType;
|
|
10
|
+
interface ObvType {
|
|
11
|
+
init: (data: ItemType) => {
|
|
12
|
+
dataset: ItemType[];
|
|
13
|
+
obv: number;
|
|
14
|
+
preClose: number;
|
|
15
|
+
};
|
|
16
|
+
next: (data: ItemType, preList: {
|
|
17
|
+
dataset: ItemType[];
|
|
18
|
+
obv: number;
|
|
19
|
+
preClose: number;
|
|
20
|
+
}) => {
|
|
21
|
+
dataset: ItemType[];
|
|
22
|
+
obv: number;
|
|
23
|
+
preClose: number;
|
|
24
|
+
};
|
|
25
|
+
getObv: (list: ItemType[], period: number) => ResObv[];
|
|
26
|
+
}
|
|
27
|
+
export default class Obv implements ObvType {
|
|
28
|
+
init(data: ItemType): {
|
|
29
|
+
dataset: ItemType[];
|
|
30
|
+
obv: number;
|
|
31
|
+
preClose: number;
|
|
32
|
+
};
|
|
33
|
+
next(data: ItemType, preList: {
|
|
34
|
+
dataset: ItemType[];
|
|
35
|
+
obv: number;
|
|
36
|
+
preClose: number;
|
|
37
|
+
}): {
|
|
38
|
+
dataset: ItemType[];
|
|
39
|
+
obv: number;
|
|
40
|
+
preClose: number;
|
|
41
|
+
};
|
|
42
|
+
getObv(list: ItemType[]): ResObv[];
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
+
if (ar || !(i in from)) {
|
|
16
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
+
ar[i] = from[i];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
var Obv = /** @class */ (function () {
|
|
24
|
+
function Obv() {
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(Obv.prototype, "init", {
|
|
27
|
+
enumerable: false,
|
|
28
|
+
configurable: true,
|
|
29
|
+
writable: true,
|
|
30
|
+
value: function (data) {
|
|
31
|
+
return {
|
|
32
|
+
dataset: [data],
|
|
33
|
+
obv: data.v,
|
|
34
|
+
preClose: data.c,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(Obv.prototype, "next", {
|
|
39
|
+
enumerable: false,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true,
|
|
42
|
+
value: function (data, preList) {
|
|
43
|
+
var currentVolume = data.v;
|
|
44
|
+
var currentClose = data.c;
|
|
45
|
+
// obv
|
|
46
|
+
var obv = preList.obv;
|
|
47
|
+
if (currentClose > preList.preClose) {
|
|
48
|
+
obv += currentVolume;
|
|
49
|
+
}
|
|
50
|
+
else if (currentClose < preList.preClose) {
|
|
51
|
+
obv -= currentVolume;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
|
|
55
|
+
obv: obv,
|
|
56
|
+
preClose: currentClose,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(Obv.prototype, "getObv", {
|
|
61
|
+
enumerable: false,
|
|
62
|
+
configurable: true,
|
|
63
|
+
writable: true,
|
|
64
|
+
value: function (list) {
|
|
65
|
+
var res = [];
|
|
66
|
+
var obv = 0;
|
|
67
|
+
for (var i = 0; i < list.length; i++) {
|
|
68
|
+
var currentVolume = list[i].v;
|
|
69
|
+
var currentClose = list[i].c;
|
|
70
|
+
if (i > 0) {
|
|
71
|
+
// obv
|
|
72
|
+
if (currentClose > list[i - 1].c) {
|
|
73
|
+
obv += currentVolume;
|
|
74
|
+
}
|
|
75
|
+
else if (currentClose < list[i - 1].c) {
|
|
76
|
+
obv -= currentVolume;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
obv = currentVolume;
|
|
81
|
+
}
|
|
82
|
+
res[i] = __assign(__assign({}, list[i]), { obv: obv });
|
|
83
|
+
}
|
|
84
|
+
return res;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return Obv;
|
|
88
|
+
}());
|
|
89
|
+
exports.default = Obv;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var obv_1 = require("./obv");
|
|
4
|
+
var test_data_test_1 = require("./test_data.test");
|
|
5
|
+
describe("test obv methods", function () {
|
|
6
|
+
it("test init", function () {
|
|
7
|
+
var obv = new obv_1.default();
|
|
8
|
+
var init = obv.init(test_data_test_1.data_9904[0]);
|
|
9
|
+
var res = init;
|
|
10
|
+
for (var i = 1; i < test_data_test_1.data_9904.length; i++) {
|
|
11
|
+
var item = test_data_test_1.data_9904[i];
|
|
12
|
+
res = obv.next(item, res);
|
|
13
|
+
}
|
|
14
|
+
expect(res.obv).toEqual(504538);
|
|
15
|
+
});
|
|
16
|
+
it("test getObv()", function () {
|
|
17
|
+
var kd = new obv_1.default();
|
|
18
|
+
expect(kd.getObv(test_data_test_1.data_9904)[test_data_test_1.data_9904.length - 1].obv).toEqual(504538);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
type ListType = {
|
|
2
2
|
c: number;
|
|
3
3
|
}[];
|
|
4
|
-
|
|
4
|
+
type ResRsi6Type = {
|
|
5
5
|
c: number;
|
|
6
6
|
rsi6?: number;
|
|
7
7
|
}[];
|
|
8
|
-
|
|
8
|
+
type ResRsi12Type = {
|
|
9
9
|
c: number;
|
|
10
10
|
rsi12?: number;
|
|
11
11
|
}[];
|
|
12
|
-
|
|
12
|
+
type ResAllRsiType = {
|
|
13
13
|
c: number;
|
|
14
14
|
rsi6?: number;
|
|
15
15
|
rsi12?: number;
|
|
@@ -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
|
+
});
|
|
@@ -24,4 +24,10 @@ describe("test Slope methods", function () {
|
|
|
24
24
|
var slope = Slope(x, y);
|
|
25
25
|
expect(slope).toEqual(0);
|
|
26
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
|
+
});
|
|
27
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
|
@@ -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/esm/index.js
CHANGED
|
@@ -12,6 +12,8 @@ export { default as Kd } from "./stockSkills/kd.js";
|
|
|
12
12
|
export { default as Ma } from "./stockSkills/ma.js";
|
|
13
13
|
export { default as Macd } from "./stockSkills/macd.js";
|
|
14
14
|
export { default as Rsi } from "./stockSkills/rsi.js";
|
|
15
|
+
export { default as Obv } from "./stockSkills/obv.js";
|
|
16
|
+
export { default as Ema } from "./stockSkills/ema.js";
|
|
15
17
|
export { default as dateFormat } from "./stockSkills/utils/dateFormat.js";
|
|
16
18
|
export { default as getWeekLine } from "./stockSkills/utils/getWeekLine.js";
|
|
17
19
|
export { default as Williams } from "./stockSkills/williams.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;
|
|
@@ -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;
|
|
@@ -12,6 +12,60 @@ var __assign = (this && this.__assign) || function () {
|
|
|
12
12
|
var Kd = /** @class */ (function () {
|
|
13
13
|
function Kd() {
|
|
14
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
|
+
});
|
|
15
69
|
Object.defineProperty(Kd.prototype, "getRSV", {
|
|
16
70
|
enumerable: false,
|
|
17
71
|
configurable: true,
|
|
@@ -24,8 +78,8 @@ var Kd = /** @class */ (function () {
|
|
|
24
78
|
else {
|
|
25
79
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
26
80
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
27
|
-
var
|
|
28
|
-
var rsv = ((
|
|
81
|
+
var close_2 = list[i].c;
|
|
82
|
+
var rsv = ((close_2 - low) / (hight - low)) * 100;
|
|
29
83
|
rsv = Math.round(rsv * 100) / 100;
|
|
30
84
|
res[i] = __assign(__assign({}, list[i]), { rsv: rsv });
|
|
31
85
|
}
|
|
@@ -47,8 +101,8 @@ var Kd = /** @class */ (function () {
|
|
|
47
101
|
else {
|
|
48
102
|
var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
|
|
49
103
|
var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
|
|
50
|
-
var
|
|
51
|
-
var rsv = ((
|
|
104
|
+
var close_3 = list[i].c;
|
|
105
|
+
var rsv = ((close_3 - low) / (hight - low)) * 100;
|
|
52
106
|
rsv = Math.round(rsv * 100) / 100;
|
|
53
107
|
var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
|
|
54
108
|
var d = (2 / 3) * yesterdayD + (1 / 3) * k;
|