@ch20026103/anysis 0.0.13-alpha → 0.0.14-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 +14 -10
- 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/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/umd/index.js +99 -33
- package/package.json +1 -1
package/demo/main.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
/* eslint @typescript-eslint/no-var-requires: "off" */
|
|
2
2
|
const axios = require("axios");
|
|
3
|
-
const {
|
|
4
|
-
|
|
3
|
+
const {
|
|
4
|
+
Gold,
|
|
5
|
+
SwingExtremesType,
|
|
6
|
+
SwingExtremes,
|
|
7
|
+
} = require("../dist/cjs/index.js");
|
|
8
|
+
|
|
9
|
+
const gold = new Gold();
|
|
5
10
|
function DemoDay(stockId) {
|
|
6
11
|
axios
|
|
7
12
|
.get(
|
|
@@ -11,14 +16,13 @@ function DemoDay(stockId) {
|
|
|
11
16
|
res = res.data.replace(/^\(|\);$/g, "");
|
|
12
17
|
let parse = JSON.parse(res);
|
|
13
18
|
let data = parse.ta;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
console.log(williams18Data);
|
|
19
|
+
const sortArray = [];
|
|
20
|
+
const hightPoints = SwingExtremes(data.map((data) => data.h), SwingExtremesType.Peak, 1);
|
|
21
|
+
const lowerPoints = SwingExtremes(data.map((data) => data.l), SwingExtremesType.Trough, 1);
|
|
22
|
+
console.log(hightPoints.map((item) => data[item]));
|
|
23
|
+
sortArray.push(...hightPoints);
|
|
24
|
+
sortArray.push(...lowerPoints);
|
|
25
|
+
sortArray.sort((a, b) => a - b);
|
|
22
26
|
})
|
|
23
27
|
.catch((error) => {
|
|
24
28
|
console.error(error);
|
|
@@ -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 {};
|
|
@@ -6,56 +6,97 @@ var SwingExtremesType;
|
|
|
6
6
|
SwingExtremesType["Peak"] = "Peak";
|
|
7
7
|
SwingExtremesType["Trough"] = "Trough";
|
|
8
8
|
})(SwingExtremesType = exports.SwingExtremesType || (exports.SwingExtremesType = {}));
|
|
9
|
-
function findPeaksByGradient(prices) {
|
|
9
|
+
function findPeaksByGradient(prices, level) {
|
|
10
|
+
if (level === void 0) { level = 1; }
|
|
10
11
|
var peaks = [];
|
|
11
12
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (level === 1) {
|
|
14
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
15
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
16
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
17
|
+
peaks.push(i);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else if (level === 2) {
|
|
21
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
22
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
23
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
24
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
25
|
+
if (prevGradient > 0 &&
|
|
26
|
+
prev2Gradient > 0 &&
|
|
27
|
+
nextGradient < 0 &&
|
|
28
|
+
next2Gradient < 0) {
|
|
29
|
+
peaks.push(i);
|
|
30
|
+
}
|
|
16
31
|
}
|
|
17
32
|
}
|
|
18
33
|
return peaks;
|
|
19
34
|
}
|
|
20
35
|
exports.findPeaksByGradient = findPeaksByGradient;
|
|
21
|
-
function findTroughByGradient(prices) {
|
|
22
|
-
|
|
36
|
+
function findTroughByGradient(prices, level) {
|
|
37
|
+
if (level === void 0) { level = 1; }
|
|
38
|
+
var troughs = [];
|
|
23
39
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
40
|
+
if (level === 1) {
|
|
41
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
42
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
43
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
44
|
+
troughs.push(i);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (level === 2) {
|
|
48
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
49
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
50
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
51
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
52
|
+
if (prevGradient < 0 &&
|
|
53
|
+
prev2Gradient < 0 &&
|
|
54
|
+
nextGradient > 0 &&
|
|
55
|
+
next2Gradient > 0) {
|
|
56
|
+
troughs.push(i);
|
|
57
|
+
}
|
|
28
58
|
}
|
|
29
59
|
}
|
|
30
|
-
return
|
|
60
|
+
return troughs;
|
|
31
61
|
}
|
|
32
62
|
exports.findTroughByGradient = findTroughByGradient;
|
|
33
|
-
function SwingExtremes(y, type) {
|
|
63
|
+
function SwingExtremes(y, type, level) {
|
|
64
|
+
if (level === void 0) { level = 1; }
|
|
34
65
|
if (type === SwingExtremesType.Peak) {
|
|
35
66
|
var result = [];
|
|
36
|
-
var indexs = findPeaksByGradient(y);
|
|
67
|
+
var indexs = findPeaksByGradient(y, level);
|
|
37
68
|
result.push(indexs[0]);
|
|
38
69
|
for (var i = 1; i < indexs.length; i++) {
|
|
39
|
-
if (y[indexs[i]] > y[result[result.length - 1]]
|
|
70
|
+
if (y[indexs[i]] > y[result[result.length - 1]] &&
|
|
71
|
+
y[indexs[i]] > y[result[result.length - 2]]) {
|
|
40
72
|
result[result.length - 1] = indexs[i];
|
|
41
73
|
}
|
|
42
|
-
else
|
|
74
|
+
else if (y[indexs[i + 1]] < y[i] &&
|
|
75
|
+
y[indexs[i]] > y[result[result.length - 1]]) {
|
|
76
|
+
result.pop();
|
|
43
77
|
result.push(indexs[i]);
|
|
44
78
|
}
|
|
79
|
+
else
|
|
80
|
+
result.push(indexs[i]);
|
|
45
81
|
}
|
|
46
82
|
return result;
|
|
47
83
|
}
|
|
48
84
|
if (type === SwingExtremesType.Trough) {
|
|
49
85
|
var result = [];
|
|
50
|
-
var indexs = findTroughByGradient(y);
|
|
86
|
+
var indexs = findTroughByGradient(y, level);
|
|
51
87
|
result.push(indexs[0]);
|
|
52
88
|
for (var i = 1; i < indexs.length; i++) {
|
|
53
|
-
if (y[indexs[i]] < y[result[result.length - 1]]
|
|
89
|
+
if (y[indexs[i]] < y[result[result.length - 1]] &&
|
|
90
|
+
y[indexs[i]] < y[result[result.length - 2]]) {
|
|
54
91
|
result[result.length - 1] = indexs[i];
|
|
55
92
|
}
|
|
56
|
-
else
|
|
93
|
+
else if (y[indexs[i + 1]] > y[i] &&
|
|
94
|
+
y[indexs[i]] < y[result[result.length - 1]]) {
|
|
95
|
+
result.pop();
|
|
57
96
|
result.push(indexs[i]);
|
|
58
97
|
}
|
|
98
|
+
else
|
|
99
|
+
result.push(indexs[i]);
|
|
59
100
|
}
|
|
60
101
|
return result;
|
|
61
102
|
}
|
|
@@ -17,7 +17,7 @@ describe("test SwingExtremes", function () {
|
|
|
17
17
|
});
|
|
18
18
|
it("test SwingExtremes Peak", function () {
|
|
19
19
|
var res = (0, index_1.SwingExtremes)(prices, index_1.SwingExtremesType.Peak);
|
|
20
|
-
expect(res).toEqual([6, 10, 13]);
|
|
20
|
+
expect(res).toEqual([1, 6, 10, 13]);
|
|
21
21
|
});
|
|
22
22
|
it("test SwingExtremes Trough", function () {
|
|
23
23
|
var res = (0, index_1.SwingExtremes)(prices, index_1.SwingExtremesType.Trough);
|
package/dist/cjs/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/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.Williams = exports.Vma = exports.getWeekLine = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.
|
|
3
|
+
exports.parseLsusbOutput = exports.isJSON = exports.calculateDivisionFactor = exports.minus = exports.add = exports.Williams = exports.Vma = exports.getWeekLine = exports.dateFormat = exports.Rsi = exports.Obv = exports.Macd = exports.Ma = exports.Kd = exports.Gold = exports.Ema = exports.Boll = exports.calcSeasonalIndicesNoTrend = exports.weightMovingAverages = exports.movingAverages = exports.exponentialSmoothing = exports.findTroughByGradient = exports.findPeaksByGradient = exports.SwingExtremesType = exports.SwingExtremes = exports.slope = exports.simpleRegressionModel = exports.Angle = void 0;
|
|
4
4
|
/*
|
|
5
5
|
請注意,在 src/index.ts 中,我的導入包含文件擴展名(.js)。
|
|
6
6
|
如果需要支持 Node.js 和構建工具(ex: webpack),則不需要這樣做。 **因為commonJs默認js副檔名**
|
|
@@ -14,9 +14,9 @@ var index_js_2 = require("./analyze/Slope/index.js");
|
|
|
14
14
|
Object.defineProperty(exports, "slope", { enumerable: true, get: function () { return index_js_2.default; } });
|
|
15
15
|
var index_js_3 = require("./analyze/SwingExtremes/index.js");
|
|
16
16
|
Object.defineProperty(exports, "SwingExtremes", { enumerable: true, get: function () { return index_js_3.SwingExtremes; } });
|
|
17
|
+
Object.defineProperty(exports, "SwingExtremesType", { enumerable: true, get: function () { return index_js_3.SwingExtremesType; } });
|
|
17
18
|
Object.defineProperty(exports, "findPeaksByGradient", { enumerable: true, get: function () { return index_js_3.findPeaksByGradient; } });
|
|
18
19
|
Object.defineProperty(exports, "findTroughByGradient", { enumerable: true, get: function () { return index_js_3.findTroughByGradient; } });
|
|
19
|
-
Object.defineProperty(exports, "SwingExtremesType", { enumerable: true, get: function () { return index_js_3.SwingExtremesType; } });
|
|
20
20
|
var index_js_4 = require("./analyze/TimeSeries/R/index.js");
|
|
21
21
|
Object.defineProperty(exports, "exponentialSmoothing", { enumerable: true, get: function () { return index_js_4.exponentialSmoothing; } });
|
|
22
22
|
Object.defineProperty(exports, "movingAverages", { enumerable: true, get: function () { return index_js_4.movingAverages; } });
|
|
@@ -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
|
}
|
|
@@ -3,6 +3,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var Ema = /** @class */ (function () {
|
|
4
4
|
function Ema() {
|
|
5
5
|
}
|
|
6
|
+
Object.defineProperty(Ema.prototype, "init", {
|
|
7
|
+
enumerable: false,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: function (data, type) {
|
|
11
|
+
return { dataset: [data], ema: 0, type: type };
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(Ema.prototype, "next", {
|
|
15
|
+
enumerable: false,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: function (data, preList, type) {
|
|
19
|
+
preList.dataset.push(data);
|
|
20
|
+
if (preList.dataset.length < type) {
|
|
21
|
+
return {
|
|
22
|
+
dataset: preList.dataset,
|
|
23
|
+
ema: 0,
|
|
24
|
+
type: type,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
else if (preList.dataset.length === type) {
|
|
28
|
+
var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
29
|
+
return {
|
|
30
|
+
dataset: preList.dataset,
|
|
31
|
+
ema: sum / type,
|
|
32
|
+
type: type,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (preList.dataset.length > type) {
|
|
37
|
+
preList.dataset.shift();
|
|
38
|
+
}
|
|
39
|
+
var ema = (data.c * 2 + (type - 1) * preList.ema) / (type + 1);
|
|
40
|
+
return { dataset: preList.dataset, ema: ema, type: type };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
6
44
|
Object.defineProperty(Ema.prototype, "getStartEma", {
|
|
7
45
|
enumerable: false,
|
|
8
46
|
configurable: true,
|
|
@@ -3,6 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
var ema_1 = require("./ema");
|
|
4
4
|
var test_data_test_1 = require("./test_data.test");
|
|
5
5
|
describe("test ema methods", function () {
|
|
6
|
+
it("test init & next", function () {
|
|
7
|
+
var index = test_data_test_1.default.length - 1;
|
|
8
|
+
var ema = new ema_1.default();
|
|
9
|
+
var init = ema.init(test_data_test_1.default[0], 5);
|
|
10
|
+
var res = init;
|
|
11
|
+
for (var i = 1; i <= index; i++) {
|
|
12
|
+
var item = test_data_test_1.default[i];
|
|
13
|
+
res = ema.next(item, res, 5);
|
|
14
|
+
}
|
|
15
|
+
expect(res.ema).toEqual(141.83482746491333);
|
|
16
|
+
});
|
|
6
17
|
it("test getEma5()", function () {
|
|
7
18
|
var ema = new ema_1.default();
|
|
8
19
|
var res = ema.getEma(test_data_test_1.default.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 {};
|
|
@@ -184,21 +184,8 @@ var Gold = /** @class */ (function () {
|
|
|
184
184
|
enumerable: false,
|
|
185
185
|
configurable: true,
|
|
186
186
|
writable: true,
|
|
187
|
-
value: function (
|
|
188
|
-
var hightPoints = this.findHighPoint(list);
|
|
189
|
-
var lowPoints = this.findLowPoint(list);
|
|
190
|
-
var lastHightPointDate = Object.keys(hightPoints).slice(-1)[0] !==
|
|
191
|
-
list[list.length - 1].t.toString()
|
|
192
|
-
? Object.keys(hightPoints).slice(-1)[0]
|
|
193
|
-
: Object.keys(hightPoints).slice(-2)[0];
|
|
194
|
-
var lastLowPointDate = Object.keys(lowPoints).slice(-1)[0] !== list[list.length - 1].t.toString()
|
|
195
|
-
? Object.keys(lowPoints).slice(-1)[0]
|
|
196
|
-
: Object.keys(lowPoints).slice(-2)[0];
|
|
197
|
-
var highestPoint = hightPoints[lastHightPointDate].h;
|
|
198
|
-
var lowestPoint = lowPoints[lastLowPointDate].l;
|
|
187
|
+
value: function (highestPoint, lowestPoint) {
|
|
199
188
|
var res = {
|
|
200
|
-
highestPointDate: parseInt(lastHightPointDate),
|
|
201
|
-
lowestPointDate: parseInt(lastLowPointDate),
|
|
202
189
|
lowestPoint: lowestPoint,
|
|
203
190
|
highestPoint: highestPoint,
|
|
204
191
|
superStrong: Math.round((highestPoint - (highestPoint - lowestPoint) * 0.191) * 100) / 100,
|
|
@@ -29,17 +29,15 @@ describe("test Gold methods", function () {
|
|
|
29
29
|
});
|
|
30
30
|
it("test getGold(", function () {
|
|
31
31
|
var gold = new gold_1.default();
|
|
32
|
-
var allGold = gold.getGold(
|
|
32
|
+
var allGold = gold.getGold(139, 89.1);
|
|
33
33
|
expect(allGold).toEqual({
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
middle:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
superWeak: 139.83,
|
|
42
|
-
weak: 145.65,
|
|
34
|
+
lowestPoint: 89.1,
|
|
35
|
+
highestPoint: 139,
|
|
36
|
+
superStrong: 129.47,
|
|
37
|
+
strong: 119.94,
|
|
38
|
+
middle: 114.05,
|
|
39
|
+
weak: 108.16,
|
|
40
|
+
superWeak: 98.63,
|
|
43
41
|
});
|
|
44
42
|
});
|
|
45
43
|
});
|
|
@@ -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
|
});
|
package/dist/umd/index.js
CHANGED
|
@@ -126,54 +126,95 @@
|
|
|
126
126
|
SwingExtremesType["Peak"] = "Peak";
|
|
127
127
|
SwingExtremesType["Trough"] = "Trough";
|
|
128
128
|
})(exports.SwingExtremesType || (exports.SwingExtremesType = {}));
|
|
129
|
-
function findPeaksByGradient(prices) {
|
|
129
|
+
function findPeaksByGradient(prices, level) {
|
|
130
|
+
if (level === void 0) { level = 1; }
|
|
130
131
|
var peaks = [];
|
|
131
132
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
if (level === 1) {
|
|
134
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
135
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
136
|
+
if (prevGradient > 0 && nextGradient < 0) {
|
|
137
|
+
peaks.push(i);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (level === 2) {
|
|
141
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
142
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
143
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
144
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
145
|
+
if (prevGradient > 0 &&
|
|
146
|
+
prev2Gradient > 0 &&
|
|
147
|
+
nextGradient < 0 &&
|
|
148
|
+
next2Gradient < 0) {
|
|
149
|
+
peaks.push(i);
|
|
150
|
+
}
|
|
136
151
|
}
|
|
137
152
|
}
|
|
138
153
|
return peaks;
|
|
139
154
|
}
|
|
140
|
-
function findTroughByGradient(prices) {
|
|
141
|
-
|
|
155
|
+
function findTroughByGradient(prices, level) {
|
|
156
|
+
if (level === void 0) { level = 1; }
|
|
157
|
+
var troughs = [];
|
|
142
158
|
for (var i = 1; i < prices.length - 1; i++) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
if (level === 1) {
|
|
160
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
161
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
162
|
+
if (prevGradient < 0 && nextGradient > 0) {
|
|
163
|
+
troughs.push(i);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else if (level === 2) {
|
|
167
|
+
var prevGradient = prices[i] - prices[i - 1];
|
|
168
|
+
var prev2Gradient = prices[i] - prices[i - 2];
|
|
169
|
+
var nextGradient = prices[i + 1] - prices[i];
|
|
170
|
+
var next2Gradient = prices[i + 2] - prices[i];
|
|
171
|
+
if (prevGradient < 0 &&
|
|
172
|
+
prev2Gradient < 0 &&
|
|
173
|
+
nextGradient > 0 &&
|
|
174
|
+
next2Gradient > 0) {
|
|
175
|
+
troughs.push(i);
|
|
176
|
+
}
|
|
147
177
|
}
|
|
148
178
|
}
|
|
149
|
-
return
|
|
179
|
+
return troughs;
|
|
150
180
|
}
|
|
151
|
-
function SwingExtremes(y, type) {
|
|
181
|
+
function SwingExtremes(y, type, level) {
|
|
182
|
+
if (level === void 0) { level = 1; }
|
|
152
183
|
if (type === exports.SwingExtremesType.Peak) {
|
|
153
184
|
var result = [];
|
|
154
|
-
var indexs = findPeaksByGradient(y);
|
|
185
|
+
var indexs = findPeaksByGradient(y, level);
|
|
155
186
|
result.push(indexs[0]);
|
|
156
187
|
for (var i = 1; i < indexs.length; i++) {
|
|
157
|
-
if (y[indexs[i]] > y[result[result.length - 1]]
|
|
188
|
+
if (y[indexs[i]] > y[result[result.length - 1]] &&
|
|
189
|
+
y[indexs[i]] > y[result[result.length - 2]]) {
|
|
158
190
|
result[result.length - 1] = indexs[i];
|
|
159
191
|
}
|
|
160
|
-
else
|
|
192
|
+
else if (y[indexs[i + 1]] < y[i] &&
|
|
193
|
+
y[indexs[i]] > y[result[result.length - 1]]) {
|
|
194
|
+
result.pop();
|
|
161
195
|
result.push(indexs[i]);
|
|
162
196
|
}
|
|
197
|
+
else
|
|
198
|
+
result.push(indexs[i]);
|
|
163
199
|
}
|
|
164
200
|
return result;
|
|
165
201
|
}
|
|
166
202
|
if (type === exports.SwingExtremesType.Trough) {
|
|
167
203
|
var result = [];
|
|
168
|
-
var indexs = findTroughByGradient(y);
|
|
204
|
+
var indexs = findTroughByGradient(y, level);
|
|
169
205
|
result.push(indexs[0]);
|
|
170
206
|
for (var i = 1; i < indexs.length; i++) {
|
|
171
|
-
if (y[indexs[i]] < y[result[result.length - 1]]
|
|
207
|
+
if (y[indexs[i]] < y[result[result.length - 1]] &&
|
|
208
|
+
y[indexs[i]] < y[result[result.length - 2]]) {
|
|
172
209
|
result[result.length - 1] = indexs[i];
|
|
173
210
|
}
|
|
174
|
-
else
|
|
211
|
+
else if (y[indexs[i + 1]] > y[i] &&
|
|
212
|
+
y[indexs[i]] < y[result[result.length - 1]]) {
|
|
213
|
+
result.pop();
|
|
175
214
|
result.push(indexs[i]);
|
|
176
215
|
}
|
|
216
|
+
else
|
|
217
|
+
result.push(indexs[i]);
|
|
177
218
|
}
|
|
178
219
|
return result;
|
|
179
220
|
}
|
|
@@ -365,6 +406,44 @@
|
|
|
365
406
|
var Ema = /** @class */ (function () {
|
|
366
407
|
function Ema() {
|
|
367
408
|
}
|
|
409
|
+
Object.defineProperty(Ema.prototype, "init", {
|
|
410
|
+
enumerable: false,
|
|
411
|
+
configurable: true,
|
|
412
|
+
writable: true,
|
|
413
|
+
value: function (data, type) {
|
|
414
|
+
return { dataset: [data], ema: 0, type: type };
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
Object.defineProperty(Ema.prototype, "next", {
|
|
418
|
+
enumerable: false,
|
|
419
|
+
configurable: true,
|
|
420
|
+
writable: true,
|
|
421
|
+
value: function (data, preList, type) {
|
|
422
|
+
preList.dataset.push(data);
|
|
423
|
+
if (preList.dataset.length < type) {
|
|
424
|
+
return {
|
|
425
|
+
dataset: preList.dataset,
|
|
426
|
+
ema: 0,
|
|
427
|
+
type: type,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
else if (preList.dataset.length === type) {
|
|
431
|
+
var sum = preList.dataset.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
432
|
+
return {
|
|
433
|
+
dataset: preList.dataset,
|
|
434
|
+
ema: sum / type,
|
|
435
|
+
type: type,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
if (preList.dataset.length > type) {
|
|
440
|
+
preList.dataset.shift();
|
|
441
|
+
}
|
|
442
|
+
var ema = (data.c * 2 + (type - 1) * preList.ema) / (type + 1);
|
|
443
|
+
return { dataset: preList.dataset, ema: ema, type: type };
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
});
|
|
368
447
|
Object.defineProperty(Ema.prototype, "getStartEma", {
|
|
369
448
|
enumerable: false,
|
|
370
449
|
configurable: true,
|
|
@@ -657,21 +736,8 @@
|
|
|
657
736
|
enumerable: false,
|
|
658
737
|
configurable: true,
|
|
659
738
|
writable: true,
|
|
660
|
-
value: function (
|
|
661
|
-
var hightPoints = this.findHighPoint(list);
|
|
662
|
-
var lowPoints = this.findLowPoint(list);
|
|
663
|
-
var lastHightPointDate = Object.keys(hightPoints).slice(-1)[0] !==
|
|
664
|
-
list[list.length - 1].t.toString()
|
|
665
|
-
? Object.keys(hightPoints).slice(-1)[0]
|
|
666
|
-
: Object.keys(hightPoints).slice(-2)[0];
|
|
667
|
-
var lastLowPointDate = Object.keys(lowPoints).slice(-1)[0] !== list[list.length - 1].t.toString()
|
|
668
|
-
? Object.keys(lowPoints).slice(-1)[0]
|
|
669
|
-
: Object.keys(lowPoints).slice(-2)[0];
|
|
670
|
-
var highestPoint = hightPoints[lastHightPointDate].h;
|
|
671
|
-
var lowestPoint = lowPoints[lastLowPointDate].l;
|
|
739
|
+
value: function (highestPoint, lowestPoint) {
|
|
672
740
|
var res = {
|
|
673
|
-
highestPointDate: parseInt(lastHightPointDate),
|
|
674
|
-
lowestPointDate: parseInt(lastLowPointDate),
|
|
675
741
|
lowestPoint: lowestPoint,
|
|
676
742
|
highestPoint: highestPoint,
|
|
677
743
|
superStrong: Math.round((highestPoint - (highestPoint - lowestPoint) * 0.191) * 100) / 100,
|