@ch20026103/anysis 0.0.13-alpha → 0.0.15-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 +13 -9
- package/dist/cjs/analyze/SwingExtremes/index.d.ts +3 -3
- package/dist/cjs/analyze/SwingExtremes/index.js +60 -19
- package/dist/cjs/analyze/SwingExtremes/index.test.js +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/stockSkills/boll.d.ts +4 -4
- package/dist/cjs/stockSkills/ema.d.ts +32 -0
- package/dist/cjs/stockSkills/ema.js +38 -0
- package/dist/cjs/stockSkills/ema.test.js +11 -0
- package/dist/cjs/stockSkills/gold.d.ts +12 -11
- package/dist/cjs/stockSkills/gold.js +1 -14
- package/dist/cjs/stockSkills/gold.test.js +8 -10
- package/dist/cjs/stockSkills/rsi.d.ts +26 -29
- package/dist/cjs/stockSkills/rsi.js +79 -101
- package/dist/cjs/stockSkills/rsi.test.js +9 -20
- package/dist/esm/analyze/SwingExtremes/index.d.ts +3 -3
- package/dist/esm/analyze/SwingExtremes/index.js +60 -19
- package/dist/esm/analyze/SwingExtremes/index.test.js +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/stockSkills/boll.d.ts +4 -4
- package/dist/esm/stockSkills/ema.d.ts +32 -0
- package/dist/esm/stockSkills/ema.js +38 -0
- package/dist/esm/stockSkills/ema.test.js +11 -0
- package/dist/esm/stockSkills/gold.d.ts +12 -11
- package/dist/esm/stockSkills/gold.js +1 -14
- package/dist/esm/stockSkills/gold.test.js +8 -10
- package/dist/esm/stockSkills/rsi.d.ts +26 -29
- package/dist/esm/stockSkills/rsi.js +79 -101
- package/dist/esm/stockSkills/rsi.test.js +9 -20
- package/dist/umd/index.js +178 -134
- package/package.json +1 -1
|
@@ -14,130 +14,108 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
var Rsi = /** @class */ (function () {
|
|
15
15
|
function Rsi() {
|
|
16
16
|
}
|
|
17
|
-
Object.defineProperty(Rsi.prototype, "
|
|
17
|
+
Object.defineProperty(Rsi.prototype, "init", {
|
|
18
18
|
enumerable: false,
|
|
19
19
|
configurable: true,
|
|
20
20
|
writable: true,
|
|
21
|
-
value: function (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
value: function (data, type) {
|
|
22
|
+
return {
|
|
23
|
+
dataset: [data],
|
|
24
|
+
rsi: 0,
|
|
25
|
+
type: type,
|
|
26
|
+
avgGain: 0,
|
|
27
|
+
avgLoss: 0,
|
|
28
|
+
};
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
-
Object.defineProperty(Rsi.prototype, "
|
|
31
|
+
Object.defineProperty(Rsi.prototype, "next", {
|
|
32
32
|
enumerable: false,
|
|
33
33
|
configurable: true,
|
|
34
34
|
writable: true,
|
|
35
|
-
value: function (
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
res[i] = __assign(__assign({}, list[i]), { rsi6: null });
|
|
35
|
+
value: function (data, preList, type) {
|
|
36
|
+
preList.dataset.push(data);
|
|
37
|
+
if (preList.dataset.length < type + 1) {
|
|
38
|
+
return __assign(__assign({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
|
|
40
39
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
40
|
+
else {
|
|
41
|
+
// 计算初始增益和损失
|
|
42
|
+
var avgGain = 0;
|
|
43
|
+
var avgLoss = 0;
|
|
44
|
+
if (preList.dataset.length === type + 1) {
|
|
45
|
+
var gains = 0;
|
|
46
|
+
var losses = 0;
|
|
47
|
+
for (var i = 1; i <= type; i++) {
|
|
48
|
+
var change = preList.dataset[i].c - preList.dataset[i - 1].c;
|
|
49
|
+
if (change > 0) {
|
|
50
|
+
gains += change;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
losses -= change;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
avgGain = gains / type;
|
|
57
|
+
avgLoss = losses / type;
|
|
53
58
|
}
|
|
54
|
-
else {
|
|
55
|
-
|
|
59
|
+
else if (preList.dataset.length > type + 1) {
|
|
60
|
+
preList.dataset.shift();
|
|
61
|
+
// 更新平均增益和平均损失
|
|
62
|
+
var change = preList.dataset[preList.dataset.length - 1].c -
|
|
63
|
+
preList.dataset[preList.dataset.length - 2].c;
|
|
64
|
+
avgGain =
|
|
65
|
+
(preList.avgGain * (type - 1) + (change > 0 ? change : 0)) / type;
|
|
66
|
+
avgLoss =
|
|
67
|
+
(preList.avgLoss * (type - 1) + (change < 0 ? -change : 0)) / type;
|
|
56
68
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var
|
|
60
|
-
|
|
69
|
+
// 计算RSI
|
|
70
|
+
var rs = avgGain / avgLoss;
|
|
71
|
+
var rsi = 100 - 100 / (1 + rs);
|
|
72
|
+
return __assign(__assign({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
|
|
61
73
|
}
|
|
62
|
-
return res;
|
|
63
74
|
}
|
|
64
75
|
});
|
|
65
|
-
Object.defineProperty(Rsi.prototype, "
|
|
76
|
+
Object.defineProperty(Rsi.prototype, "calculateRSI", {
|
|
66
77
|
enumerable: false,
|
|
67
78
|
configurable: true,
|
|
68
79
|
writable: true,
|
|
69
|
-
value: function (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
res[i] = __assign(__assign({}, list[i]), { rsi12: null });
|
|
80
|
+
value: function (prices, period) {
|
|
81
|
+
if (period === void 0) { period = 5; }
|
|
82
|
+
if (prices.length < period + 1) {
|
|
83
|
+
return [];
|
|
74
84
|
}
|
|
75
|
-
//
|
|
76
|
-
var
|
|
77
|
-
var
|
|
78
|
-
|
|
79
|
-
res[11] = __assign(__assign({}, list[11]), { rsi12: firstRsi12 });
|
|
80
|
-
// else
|
|
81
|
-
for (var i = 12; i < list.length; i++) {
|
|
82
|
-
var minusU = 0;
|
|
83
|
-
var minusD = 0;
|
|
84
|
-
var minusC = list[i]["c"] - list[i - 1]["c"];
|
|
85
|
-
if (minusC > 0) {
|
|
86
|
-
minusU = minusC;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
minusD = minusC;
|
|
90
|
-
}
|
|
91
|
-
beforeUpAvg = (beforeUpAvg * 11) / 12 + minusU / 12;
|
|
92
|
-
beforeDownAvg = (beforeDownAvg * 11) / 12 + Math.abs(minusD) / 12;
|
|
93
|
-
var rsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
|
|
94
|
-
res[i] = __assign(__assign({}, list[i]), { rsi12: Math.round(rsi12 * 100) / 100 });
|
|
85
|
+
// 计算价格变化
|
|
86
|
+
var changes = [];
|
|
87
|
+
for (var i = 1; i < prices.length; i++) {
|
|
88
|
+
changes.push(prices[i].c - prices[i - 1].c);
|
|
95
89
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
writable: true,
|
|
103
|
-
value: function (list, count) {
|
|
104
|
-
var start = list.slice(0, 5);
|
|
105
|
-
var sum = 0;
|
|
106
|
-
for (var i = 1; i < start.length; i++) {
|
|
107
|
-
var minus = start[i]["c"] - start[i - 1]["c"];
|
|
108
|
-
if (minus > 0) {
|
|
109
|
-
sum += minus;
|
|
90
|
+
// 计算增益和损失
|
|
91
|
+
var gains = 0;
|
|
92
|
+
var losses = 0;
|
|
93
|
+
for (var i = 0; i < period; i++) {
|
|
94
|
+
if (changes[i] > 0) {
|
|
95
|
+
gains += changes[i];
|
|
110
96
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
Object.defineProperty(Rsi.prototype, "getStartDownAvg", {
|
|
116
|
-
enumerable: false,
|
|
117
|
-
configurable: true,
|
|
118
|
-
writable: true,
|
|
119
|
-
value: function (list, count) {
|
|
120
|
-
var start = list.slice(0, 5);
|
|
121
|
-
var sum = 0;
|
|
122
|
-
for (var i = 1; i < start.length; i++) {
|
|
123
|
-
var minus = start[i]["c"] - start[i - 1]["c"];
|
|
124
|
-
if (minus < 0) {
|
|
125
|
-
sum += minus;
|
|
97
|
+
else {
|
|
98
|
+
losses -= changes[i];
|
|
126
99
|
}
|
|
127
100
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
var
|
|
137
|
-
|
|
138
|
-
|
|
101
|
+
// 计算初始平均增益和平均损失
|
|
102
|
+
var avgGain = gains / period;
|
|
103
|
+
var avgLoss = losses / period;
|
|
104
|
+
// 计算RSI
|
|
105
|
+
var rsis = [];
|
|
106
|
+
var rs = avgGain / avgLoss;
|
|
107
|
+
var rsi = 100 - 100 / (1 + rs);
|
|
108
|
+
rsis.push(rsi);
|
|
109
|
+
for (var i = period; i < changes.length; i++) {
|
|
110
|
+
// 更新平均增益和平均损失
|
|
111
|
+
var change = changes[i];
|
|
112
|
+
avgGain = (avgGain * (period - 1) + (change > 0 ? change : 0)) / period;
|
|
113
|
+
avgLoss = (avgLoss * (period - 1) + (change < 0 ? -change : 0)) / period;
|
|
114
|
+
var rs_1 = avgGain / avgLoss;
|
|
115
|
+
var rsi_1 = 100 - 100 / (1 + rs_1);
|
|
116
|
+
rsis.push(rsi_1);
|
|
139
117
|
}
|
|
140
|
-
return
|
|
118
|
+
return rsis;
|
|
141
119
|
}
|
|
142
120
|
});
|
|
143
121
|
return Rsi;
|
|
@@ -3,28 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var rsi_1 = require("./rsi");
|
|
4
4
|
var test_data_test_1 = require("./test_data.test");
|
|
5
5
|
describe("test rsi methods", function () {
|
|
6
|
-
it("test
|
|
6
|
+
it("test init & next", function () {
|
|
7
7
|
var rsi = new rsi_1.default();
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
h: 143,
|
|
14
|
-
l: 138,
|
|
15
|
-
rsi6: 45.12,
|
|
16
|
-
});
|
|
8
|
+
var result = rsi.init(test_data_test_1.default[0], 5);
|
|
9
|
+
for (var i = 1; i < test_data_test_1.default.length; i++) {
|
|
10
|
+
result = rsi.next(test_data_test_1.default[i], result, 5);
|
|
11
|
+
}
|
|
12
|
+
expect(result === null || result === void 0 ? void 0 : result.rsi).toEqual(44.72040034947733);
|
|
17
13
|
});
|
|
18
|
-
it("test
|
|
14
|
+
it("test calculateRSI()", function () {
|
|
19
15
|
var rsi = new rsi_1.default();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
o: 138,
|
|
23
|
-
t: 20211214,
|
|
24
|
-
v: 16841,
|
|
25
|
-
h: 143,
|
|
26
|
-
l: 138,
|
|
27
|
-
rsi12: 49.47,
|
|
28
|
-
});
|
|
16
|
+
var result = rsi.calculateRSI(test_data_test_1.default, 5);
|
|
17
|
+
expect(result === null || result === void 0 ? void 0 : result[(result === null || result === void 0 ? void 0 : result.length) - 1]).toEqual(44.72040034947733);
|
|
29
18
|
});
|
|
30
19
|
});
|
|
@@ -3,7 +3,7 @@ export declare enum SwingExtremesType {
|
|
|
3
3
|
Trough = "Trough"
|
|
4
4
|
}
|
|
5
5
|
type Index = number;
|
|
6
|
-
export declare function findPeaksByGradient(prices: number[]): Index[];
|
|
7
|
-
export declare function findTroughByGradient(prices: number[]): Index[];
|
|
8
|
-
export declare function SwingExtremes(y: number[], type: SwingExtremesType): Index[];
|
|
6
|
+
export declare function findPeaksByGradient(prices: number[], level?: number): Index[];
|
|
7
|
+
export declare function findTroughByGradient(prices: number[], level?: number): Index[];
|
|
8
|
+
export declare function SwingExtremes(y: number[], type: SwingExtremesType, level?: number): Index[];
|
|
9
9
|
export {};
|
|
@@ -3,54 +3,95 @@ export var SwingExtremesType;
|
|
|
3
3
|
SwingExtremesType["Peak"] = "Peak";
|
|
4
4
|
SwingExtremesType["Trough"] = "Trough";
|
|
5
5
|
})(SwingExtremesType || (SwingExtremesType = {}));
|
|
6
|
-
export function findPeaksByGradient(prices) {
|
|
6
|
+
export function findPeaksByGradient(prices, level) {
|
|
7
|
+
if (level === void 0) { level = 1; }
|
|
7
8
|
var peaks = [];
|
|
8
9
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
if (level === 1) {
|
|
11
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
12
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
13
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
14
|
+
peaks.push(i);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else if (level === 2) {
|
|
18
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
19
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
20
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
21
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
22
|
+
if (prevGradient > 0 &&
|
|
23
|
+
prev2Gradient > 0 &&
|
|
24
|
+
nextGradient < 0 &&
|
|
25
|
+
next2Gradient < 0) {
|
|
26
|
+
peaks.push(i);
|
|
27
|
+
}
|
|
13
28
|
}
|
|
14
29
|
}
|
|
15
30
|
return peaks;
|
|
16
31
|
}
|
|
17
|
-
export function findTroughByGradient(prices) {
|
|
18
|
-
|
|
32
|
+
export function findTroughByGradient(prices, level) {
|
|
33
|
+
if (level === void 0) { level = 1; }
|
|
34
|
+
var troughs = [];
|
|
19
35
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
36
|
+
if (level === 1) {
|
|
37
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
38
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
39
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
40
|
+
troughs.push(i);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (level === 2) {
|
|
44
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
45
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
46
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
47
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
48
|
+
if (prevGradient < 0 &&
|
|
49
|
+
prev2Gradient < 0 &&
|
|
50
|
+
nextGradient > 0 &&
|
|
51
|
+
next2Gradient > 0) {
|
|
52
|
+
troughs.push(i);
|
|
53
|
+
}
|
|
24
54
|
}
|
|
25
55
|
}
|
|
26
|
-
return
|
|
56
|
+
return troughs;
|
|
27
57
|
}
|
|
28
|
-
export function SwingExtremes(y, type) {
|
|
58
|
+
export function SwingExtremes(y, type, level) {
|
|
59
|
+
if (level === void 0) { level = 1; }
|
|
29
60
|
if (type === SwingExtremesType.Peak) {
|
|
30
61
|
var result = [];
|
|
31
|
-
var indexs = findPeaksByGradient(y);
|
|
62
|
+
var indexs = findPeaksByGradient(y, level);
|
|
32
63
|
result.push(indexs[0]);
|
|
33
64
|
for (var i = 1; i < indexs.length; i++) {
|
|
34
|
-
if (y[indexs[i]] > y[result[result.length - 1]]
|
|
65
|
+
if (y[indexs[i]] > y[result[result.length - 1]] &&
|
|
66
|
+
y[indexs[i]] > y[result[result.length - 2]]) {
|
|
35
67
|
result[result.length - 1] = indexs[i];
|
|
36
68
|
}
|
|
37
|
-
else
|
|
69
|
+
else if (y[indexs[i + 1]] < y[i] &&
|
|
70
|
+
y[indexs[i]] > y[result[result.length - 1]]) {
|
|
71
|
+
result.pop();
|
|
38
72
|
result.push(indexs[i]);
|
|
39
73
|
}
|
|
74
|
+
else
|
|
75
|
+
result.push(indexs[i]);
|
|
40
76
|
}
|
|
41
77
|
return result;
|
|
42
78
|
}
|
|
43
79
|
if (type === SwingExtremesType.Trough) {
|
|
44
80
|
var result = [];
|
|
45
|
-
var indexs = findTroughByGradient(y);
|
|
81
|
+
var indexs = findTroughByGradient(y, level);
|
|
46
82
|
result.push(indexs[0]);
|
|
47
83
|
for (var i = 1; i < indexs.length; i++) {
|
|
48
|
-
if (y[indexs[i]] < y[result[result.length - 1]]
|
|
84
|
+
if (y[indexs[i]] < y[result[result.length - 1]] &&
|
|
85
|
+
y[indexs[i]] < y[result[result.length - 2]]) {
|
|
49
86
|
result[result.length - 1] = indexs[i];
|
|
50
87
|
}
|
|
51
|
-
else
|
|
88
|
+
else if (y[indexs[i + 1]] > y[i] &&
|
|
89
|
+
y[indexs[i]] < y[result[result.length - 1]]) {
|
|
90
|
+
result.pop();
|
|
52
91
|
result.push(indexs[i]);
|
|
53
92
|
}
|
|
93
|
+
else
|
|
94
|
+
result.push(indexs[i]);
|
|
54
95
|
}
|
|
55
96
|
return result;
|
|
56
97
|
}
|
|
@@ -15,7 +15,7 @@ describe("test SwingExtremes", function () {
|
|
|
15
15
|
});
|
|
16
16
|
it("test SwingExtremes Peak", function () {
|
|
17
17
|
var res = SwingExtremes(prices, SwingExtremesType.Peak);
|
|
18
|
-
expect(res).toEqual([6, 10, 13]);
|
|
18
|
+
expect(res).toEqual([1, 6, 10, 13]);
|
|
19
19
|
});
|
|
20
20
|
it("test SwingExtremes Trough", function () {
|
|
21
21
|
var res = SwingExtremes(prices, SwingExtremesType.Trough);
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
export { default as Angle } from "./analyze/Angle/index.js";
|
|
2
2
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
3
3
|
export { default as slope } from "./analyze/Slope/index.js";
|
|
4
|
-
export { SwingExtremes, findPeaksByGradient, findTroughByGradient,
|
|
4
|
+
export { SwingExtremes, SwingExtremesType, findPeaksByGradient, findTroughByGradient, } from "./analyze/SwingExtremes/index.js";
|
|
5
5
|
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
6
6
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
7
7
|
export { default as Boll } from "./stockSkills/boll.js";
|
|
8
|
+
export type { BollResType } from "./stockSkills/boll.js";
|
|
8
9
|
export { default as Ema } from "./stockSkills/ema.js";
|
|
9
10
|
export { default as Gold } from "./stockSkills/gold.js";
|
|
11
|
+
export type { GetGoldResType } from "./stockSkills/gold.js";
|
|
10
12
|
export { default as Kd } from "./stockSkills/kd.js";
|
|
11
13
|
export { default as Ma } from "./stockSkills/ma.js";
|
|
12
14
|
export { default as Macd } from "./stockSkills/macd.js";
|
package/dist/esm/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
export { default as Angle } from "./analyze/Angle/index.js";
|
|
7
7
|
export { default as simpleRegressionModel } from "./analyze/Regression/simpleRegressoinModel.js";
|
|
8
8
|
export { default as slope } from "./analyze/Slope/index.js";
|
|
9
|
-
export { SwingExtremes, findPeaksByGradient, findTroughByGradient,
|
|
9
|
+
export { SwingExtremes, SwingExtremesType, findPeaksByGradient, findTroughByGradient, } from "./analyze/SwingExtremes/index.js";
|
|
10
10
|
export { exponentialSmoothing, movingAverages, weightMovingAverages, } from "./analyze/TimeSeries/R/index.js";
|
|
11
11
|
export { calcSeasonalIndicesNoTrend } from "./analyze/TimeSeries/RS/index.js";
|
|
12
12
|
export { default as Boll } from "./stockSkills/boll.js";
|
|
@@ -3,8 +3,8 @@ type ItemType = {
|
|
|
3
3
|
[key: string]: unknown;
|
|
4
4
|
};
|
|
5
5
|
type ListType = ItemType[];
|
|
6
|
-
type
|
|
7
|
-
|
|
6
|
+
export type BollResType = {
|
|
7
|
+
[key: string]: unknown;
|
|
8
8
|
bollMa: number | null;
|
|
9
9
|
bollUb: number | null;
|
|
10
10
|
bollLb: number | null;
|
|
@@ -27,7 +27,7 @@ interface BollType {
|
|
|
27
27
|
bollUb: number | null;
|
|
28
28
|
bollLb: number | null;
|
|
29
29
|
};
|
|
30
|
-
getBoll: (list: ListType, type: number) =>
|
|
30
|
+
getBoll: (list: ListType, type: number) => BollResType;
|
|
31
31
|
}
|
|
32
32
|
export default class Boll implements BollType {
|
|
33
33
|
init(data: ItemType): {
|
|
@@ -54,6 +54,6 @@ export default class Boll implements BollType {
|
|
|
54
54
|
bollUb: number;
|
|
55
55
|
bollLb: number;
|
|
56
56
|
};
|
|
57
|
-
getBoll(list: ListType, type: number):
|
|
57
|
+
getBoll(list: ListType, type: number): BollResType;
|
|
58
58
|
}
|
|
59
59
|
export {};
|
|
@@ -1,8 +1,40 @@
|
|
|
1
|
+
type ItemType = {
|
|
2
|
+
c: number;
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
};
|
|
5
|
+
type ListType = ItemType[];
|
|
1
6
|
interface EmaType {
|
|
7
|
+
init: (data: ItemType, type: number) => {
|
|
8
|
+
dataset: ListType;
|
|
9
|
+
ema: number;
|
|
10
|
+
type: number;
|
|
11
|
+
};
|
|
12
|
+
next: (data: ItemType, preList: {
|
|
13
|
+
dataset: ListType;
|
|
14
|
+
ema: number;
|
|
15
|
+
type: number;
|
|
16
|
+
}, type: number) => {
|
|
17
|
+
dataset: ListType;
|
|
18
|
+
ema: number;
|
|
19
|
+
type: number;
|
|
20
|
+
};
|
|
2
21
|
getStartEma: (list: number[], period: number) => number;
|
|
3
22
|
getEma: (list: number[], period: number) => (number | null)[];
|
|
4
23
|
}
|
|
5
24
|
export default class Ema implements EmaType {
|
|
25
|
+
init(data: ItemType, type: number): {
|
|
26
|
+
dataset: ListType;
|
|
27
|
+
ema: number;
|
|
28
|
+
type: number;
|
|
29
|
+
};
|
|
30
|
+
next(data: ItemType, preList: {
|
|
31
|
+
dataset: ListType;
|
|
32
|
+
ema: number;
|
|
33
|
+
}, type: number): {
|
|
34
|
+
dataset: ListType;
|
|
35
|
+
ema: number;
|
|
36
|
+
type: number;
|
|
37
|
+
};
|
|
6
38
|
getStartEma(list: number[], period: number): number;
|
|
7
39
|
getEma(list: number[], period: number): (number | null)[];
|
|
8
40
|
}
|
|
@@ -1,6 +1,44 @@
|
|
|
1
1
|
var Ema = /** @class */ (function () {
|
|
2
2
|
function Ema() {
|
|
3
3
|
}
|
|
4
|
+
Object.defineProperty(Ema.prototype, "init", {
|
|
5
|
+
enumerable: false,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true,
|
|
8
|
+
value: function (data, type) {
|
|
9
|
+
return { dataset: [data], ema: 0, type: type };
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(Ema.prototype, "next", {
|
|
13
|
+
enumerable: false,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true,
|
|
16
|
+
value: function (data, preList, type) {
|
|
17
|
+
preList.dataset.push(data);
|
|
18
|
+
if (preList.dataset.length < type) {
|
|
19
|
+
return {
|
|
20
|
+
dataset: preList.dataset,
|
|
21
|
+
ema: 0,
|
|
22
|
+
type: type,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
else if (preList.dataset.length === type) {
|
|
26
|
+
var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
27
|
+
return {
|
|
28
|
+
dataset: preList.dataset,
|
|
29
|
+
ema: sum / type,
|
|
30
|
+
type: type,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
if (preList.dataset.length > type) {
|
|
35
|
+
preList.dataset.shift();
|
|
36
|
+
}
|
|
37
|
+
var ema = (data.c * 2 + (type - 1) * preList.ema) / (type + 1);
|
|
38
|
+
return { dataset: preList.dataset, ema: ema, type: type };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
4
42
|
Object.defineProperty(Ema.prototype, "getStartEma", {
|
|
5
43
|
enumerable: false,
|
|
6
44
|
configurable: true,
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import Ema from "./ema";
|
|
2
2
|
import data from "./test_data.test";
|
|
3
3
|
describe("test ema methods", function () {
|
|
4
|
+
it("test init & next", function () {
|
|
5
|
+
var index = data.length - 1;
|
|
6
|
+
var ema = new Ema();
|
|
7
|
+
var init = ema.init(data[0], 5);
|
|
8
|
+
var res = init;
|
|
9
|
+
for (var i = 1; i <= index; i++) {
|
|
10
|
+
var item = data[i];
|
|
11
|
+
res = ema.next(item, res, 5);
|
|
12
|
+
}
|
|
13
|
+
expect(res.ema).toEqual(141.83482746491333);
|
|
14
|
+
});
|
|
4
15
|
it("test getEma5()", function () {
|
|
5
16
|
var ema = new Ema();
|
|
6
17
|
var res = ema.getEma(data.map(function (item) { return item.c; }), 5);
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
type
|
|
2
|
-
highestPointDate: number;
|
|
3
|
-
lowestPointDate: number;
|
|
1
|
+
export type GetGoldResType = {
|
|
4
2
|
lowestPoint: number;
|
|
5
3
|
highestPoint: number;
|
|
6
4
|
superStrong: number;
|
|
@@ -15,33 +13,36 @@ type ListType = {
|
|
|
15
13
|
o: number;
|
|
16
14
|
c: number;
|
|
17
15
|
l: number;
|
|
16
|
+
[key: string]: unknown;
|
|
18
17
|
}[];
|
|
19
|
-
type
|
|
18
|
+
type FindHightestResType = {
|
|
20
19
|
[key: string]: {
|
|
21
20
|
h: number;
|
|
22
21
|
t: number;
|
|
23
22
|
o: number;
|
|
24
23
|
c: number;
|
|
25
24
|
l: number;
|
|
25
|
+
[key: string]: unknown;
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
-
type
|
|
28
|
+
type FindLowestResType = {
|
|
29
29
|
[key: string]: {
|
|
30
30
|
h: number;
|
|
31
31
|
t: number;
|
|
32
32
|
o: number;
|
|
33
33
|
c: number;
|
|
34
34
|
l: number;
|
|
35
|
+
[key: string]: unknown;
|
|
35
36
|
};
|
|
36
37
|
};
|
|
37
38
|
interface GoldType {
|
|
38
|
-
findHighPoint: (list: ListType) =>
|
|
39
|
-
findLowPoint: (list: ListType) =>
|
|
40
|
-
getGold: (
|
|
39
|
+
findHighPoint: (list: ListType) => FindHightestResType;
|
|
40
|
+
findLowPoint: (list: ListType) => FindLowestResType;
|
|
41
|
+
getGold: (highestPoint: number, lowestPoint: number) => GetGoldResType;
|
|
41
42
|
}
|
|
42
43
|
export default class Gold implements GoldType {
|
|
43
|
-
findHighPoint(list: ListType):
|
|
44
|
-
findLowPoint(list: ListType):
|
|
45
|
-
getGold(
|
|
44
|
+
findHighPoint(list: ListType): FindHightestResType;
|
|
45
|
+
findLowPoint(list: ListType): FindLowestResType;
|
|
46
|
+
getGold(highestPoint: number, lowestPoint: number): GetGoldResType;
|
|
46
47
|
}
|
|
47
48
|
export {};
|
|
@@ -182,21 +182,8 @@ var Gold = /** @class */ (function () {
|
|
|
182
182
|
enumerable: false,
|
|
183
183
|
configurable: true,
|
|
184
184
|
writable: true,
|
|
185
|
-
value: function (
|
|
186
|
-
var hightPoints = this.findHighPoint(list);
|
|
187
|
-
var lowPoints = this.findLowPoint(list);
|
|
188
|
-
var lastHightPointDate = Object.keys(hightPoints).slice(-1)[0] !==
|
|
189
|
-
list[list.length - 1].t.toString()
|
|
190
|
-
? Object.keys(hightPoints).slice(-1)[0]
|
|
191
|
-
: Object.keys(hightPoints).slice(-2)[0];
|
|
192
|
-
var lastLowPointDate = Object.keys(lowPoints).slice(-1)[0] !== list[list.length - 1].t.toString()
|
|
193
|
-
? Object.keys(lowPoints).slice(-1)[0]
|
|
194
|
-
: Object.keys(lowPoints).slice(-2)[0];
|
|
195
|
-
var highestPoint = hightPoints[lastHightPointDate].h;
|
|
196
|
-
var lowestPoint = lowPoints[lastLowPointDate].l;
|
|
185
|
+
value: function (highestPoint, lowestPoint) {
|
|
197
186
|
var res = {
|
|
198
|
-
highestPointDate: parseInt(lastHightPointDate),
|
|
199
|
-
lowestPointDate: parseInt(lastLowPointDate),
|
|
200
187
|
lowestPoint: lowestPoint,
|
|
201
188
|
highestPoint: highestPoint,
|
|
202
189
|
superStrong: Math.round((highestPoint - (highestPoint - lowestPoint) * 0.191) * 100) / 100,
|
|
@@ -27,17 +27,15 @@ describe("test Gold methods", function () {
|
|
|
27
27
|
});
|
|
28
28
|
it("test getGold(", function () {
|
|
29
29
|
var gold = new Gold();
|
|
30
|
-
var allGold = gold.getGold(
|
|
30
|
+
var allGold = gold.getGold(139, 89.1);
|
|
31
31
|
expect(allGold).toEqual({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
middle:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
superWeak: 139.83,
|
|
40
|
-
weak: 145.65,
|
|
32
|
+
lowestPoint: 89.1,
|
|
33
|
+
highestPoint: 139,
|
|
34
|
+
superStrong: 129.47,
|
|
35
|
+
strong: 119.94,
|
|
36
|
+
middle: 114.05,
|
|
37
|
+
weak: 108.16,
|
|
38
|
+
superWeak: 98.63,
|
|
41
39
|
});
|
|
42
40
|
});
|
|
43
41
|
});
|