@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
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,
|
|
@@ -1320,130 +1386,108 @@
|
|
|
1320
1386
|
var Rsi = /** @class */ (function () {
|
|
1321
1387
|
function Rsi() {
|
|
1322
1388
|
}
|
|
1323
|
-
Object.defineProperty(Rsi.prototype, "
|
|
1389
|
+
Object.defineProperty(Rsi.prototype, "init", {
|
|
1324
1390
|
enumerable: false,
|
|
1325
1391
|
configurable: true,
|
|
1326
1392
|
writable: true,
|
|
1327
|
-
value: function (
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1393
|
+
value: function (data, type) {
|
|
1394
|
+
return {
|
|
1395
|
+
dataset: [data],
|
|
1396
|
+
rsi: 0,
|
|
1397
|
+
type: type,
|
|
1398
|
+
avgGain: 0,
|
|
1399
|
+
avgLoss: 0,
|
|
1400
|
+
};
|
|
1335
1401
|
}
|
|
1336
1402
|
});
|
|
1337
|
-
Object.defineProperty(Rsi.prototype, "
|
|
1403
|
+
Object.defineProperty(Rsi.prototype, "next", {
|
|
1338
1404
|
enumerable: false,
|
|
1339
1405
|
configurable: true,
|
|
1340
1406
|
writable: true,
|
|
1341
|
-
value: function (
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
res[i] = __assign$1(__assign$1({}, list[i]), { rsi6: null });
|
|
1407
|
+
value: function (data, preList, type) {
|
|
1408
|
+
preList.dataset.push(data);
|
|
1409
|
+
if (preList.dataset.length < type + 1) {
|
|
1410
|
+
return __assign$1(__assign$1({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
|
|
1346
1411
|
}
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1412
|
+
else {
|
|
1413
|
+
// 计算初始增益和损失
|
|
1414
|
+
var avgGain = 0;
|
|
1415
|
+
var avgLoss = 0;
|
|
1416
|
+
if (preList.dataset.length === type + 1) {
|
|
1417
|
+
var gains = 0;
|
|
1418
|
+
var losses = 0;
|
|
1419
|
+
for (var i = 1; i <= type; i++) {
|
|
1420
|
+
var change = preList.dataset[i].c - preList.dataset[i - 1].c;
|
|
1421
|
+
if (change > 0) {
|
|
1422
|
+
gains += change;
|
|
1423
|
+
}
|
|
1424
|
+
else {
|
|
1425
|
+
losses -= change;
|
|
1426
|
+
}
|
|
1427
|
+
}
|
|
1428
|
+
avgGain = gains / type;
|
|
1429
|
+
avgLoss = losses / type;
|
|
1359
1430
|
}
|
|
1360
|
-
else {
|
|
1361
|
-
|
|
1431
|
+
else if (preList.dataset.length > type + 1) {
|
|
1432
|
+
preList.dataset.shift();
|
|
1433
|
+
// 更新平均增益和平均损失
|
|
1434
|
+
var change = preList.dataset[preList.dataset.length - 1].c -
|
|
1435
|
+
preList.dataset[preList.dataset.length - 2].c;
|
|
1436
|
+
avgGain =
|
|
1437
|
+
(preList.avgGain * (type - 1) + (change > 0 ? change : 0)) / type;
|
|
1438
|
+
avgLoss =
|
|
1439
|
+
(preList.avgLoss * (type - 1) + (change < 0 ? -change : 0)) / type;
|
|
1362
1440
|
}
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
var
|
|
1366
|
-
|
|
1441
|
+
// 计算RSI
|
|
1442
|
+
var rs = avgGain / avgLoss;
|
|
1443
|
+
var rsi = 100 - 100 / (1 + rs);
|
|
1444
|
+
return __assign$1(__assign$1({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
|
|
1367
1445
|
}
|
|
1368
|
-
return res;
|
|
1369
1446
|
}
|
|
1370
1447
|
});
|
|
1371
|
-
Object.defineProperty(Rsi.prototype, "
|
|
1448
|
+
Object.defineProperty(Rsi.prototype, "calculateRSI", {
|
|
1372
1449
|
enumerable: false,
|
|
1373
1450
|
configurable: true,
|
|
1374
1451
|
writable: true,
|
|
1375
|
-
value: function (
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
res[i] = __assign$1(__assign$1({}, list[i]), { rsi12: null });
|
|
1452
|
+
value: function (prices, period) {
|
|
1453
|
+
if (period === void 0) { period = 5; }
|
|
1454
|
+
if (prices.length < period + 1) {
|
|
1455
|
+
return [];
|
|
1380
1456
|
}
|
|
1381
|
-
//
|
|
1382
|
-
var
|
|
1383
|
-
var
|
|
1384
|
-
|
|
1385
|
-
res[11] = __assign$1(__assign$1({}, list[11]), { rsi12: firstRsi12 });
|
|
1386
|
-
// else
|
|
1387
|
-
for (var i = 12; i < list.length; i++) {
|
|
1388
|
-
var minusU = 0;
|
|
1389
|
-
var minusD = 0;
|
|
1390
|
-
var minusC = list[i]["c"] - list[i - 1]["c"];
|
|
1391
|
-
if (minusC > 0) {
|
|
1392
|
-
minusU = minusC;
|
|
1393
|
-
}
|
|
1394
|
-
else {
|
|
1395
|
-
minusD = minusC;
|
|
1396
|
-
}
|
|
1397
|
-
beforeUpAvg = (beforeUpAvg * 11) / 12 + minusU / 12;
|
|
1398
|
-
beforeDownAvg = (beforeDownAvg * 11) / 12 + Math.abs(minusD) / 12;
|
|
1399
|
-
var rsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
|
|
1400
|
-
res[i] = __assign$1(__assign$1({}, list[i]), { rsi12: Math.round(rsi12 * 100) / 100 });
|
|
1457
|
+
// 计算价格变化
|
|
1458
|
+
var changes = [];
|
|
1459
|
+
for (var i = 1; i < prices.length; i++) {
|
|
1460
|
+
changes.push(prices[i].c - prices[i - 1].c);
|
|
1401
1461
|
}
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
writable: true,
|
|
1409
|
-
value: function (list, count) {
|
|
1410
|
-
var start = list.slice(0, 5);
|
|
1411
|
-
var sum = 0;
|
|
1412
|
-
for (var i = 1; i < start.length; i++) {
|
|
1413
|
-
var minus = start[i]["c"] - start[i - 1]["c"];
|
|
1414
|
-
if (minus > 0) {
|
|
1415
|
-
sum += minus;
|
|
1462
|
+
// 计算增益和损失
|
|
1463
|
+
var gains = 0;
|
|
1464
|
+
var losses = 0;
|
|
1465
|
+
for (var i = 0; i < period; i++) {
|
|
1466
|
+
if (changes[i] > 0) {
|
|
1467
|
+
gains += changes[i];
|
|
1416
1468
|
}
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
}
|
|
1420
|
-
});
|
|
1421
|
-
Object.defineProperty(Rsi.prototype, "getStartDownAvg", {
|
|
1422
|
-
enumerable: false,
|
|
1423
|
-
configurable: true,
|
|
1424
|
-
writable: true,
|
|
1425
|
-
value: function (list, count) {
|
|
1426
|
-
var start = list.slice(0, 5);
|
|
1427
|
-
var sum = 0;
|
|
1428
|
-
for (var i = 1; i < start.length; i++) {
|
|
1429
|
-
var minus = start[i]["c"] - start[i - 1]["c"];
|
|
1430
|
-
if (minus < 0) {
|
|
1431
|
-
sum += minus;
|
|
1469
|
+
else {
|
|
1470
|
+
losses -= changes[i];
|
|
1432
1471
|
}
|
|
1433
1472
|
}
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
var
|
|
1443
|
-
|
|
1444
|
-
|
|
1473
|
+
// 计算初始平均增益和平均损失
|
|
1474
|
+
var avgGain = gains / period;
|
|
1475
|
+
var avgLoss = losses / period;
|
|
1476
|
+
// 计算RSI
|
|
1477
|
+
var rsis = [];
|
|
1478
|
+
var rs = avgGain / avgLoss;
|
|
1479
|
+
var rsi = 100 - 100 / (1 + rs);
|
|
1480
|
+
rsis.push(rsi);
|
|
1481
|
+
for (var i = period; i < changes.length; i++) {
|
|
1482
|
+
// 更新平均增益和平均损失
|
|
1483
|
+
var change = changes[i];
|
|
1484
|
+
avgGain = (avgGain * (period - 1) + (change > 0 ? change : 0)) / period;
|
|
1485
|
+
avgLoss = (avgLoss * (period - 1) + (change < 0 ? -change : 0)) / period;
|
|
1486
|
+
var rs_1 = avgGain / avgLoss;
|
|
1487
|
+
var rsi_1 = 100 - 100 / (1 + rs_1);
|
|
1488
|
+
rsis.push(rsi_1);
|
|
1445
1489
|
}
|
|
1446
|
-
return
|
|
1490
|
+
return rsis;
|
|
1447
1491
|
}
|
|
1448
1492
|
});
|
|
1449
1493
|
return Rsi;
|