@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.
Files changed (33) hide show
  1. package/demo/main.js +13 -9
  2. package/dist/cjs/analyze/SwingExtremes/index.d.ts +3 -3
  3. package/dist/cjs/analyze/SwingExtremes/index.js +60 -19
  4. package/dist/cjs/analyze/SwingExtremes/index.test.js +1 -1
  5. package/dist/cjs/index.d.ts +3 -1
  6. package/dist/cjs/index.js +2 -2
  7. package/dist/cjs/stockSkills/boll.d.ts +4 -4
  8. package/dist/cjs/stockSkills/ema.d.ts +32 -0
  9. package/dist/cjs/stockSkills/ema.js +38 -0
  10. package/dist/cjs/stockSkills/ema.test.js +11 -0
  11. package/dist/cjs/stockSkills/gold.d.ts +12 -11
  12. package/dist/cjs/stockSkills/gold.js +1 -14
  13. package/dist/cjs/stockSkills/gold.test.js +8 -10
  14. package/dist/cjs/stockSkills/rsi.d.ts +26 -29
  15. package/dist/cjs/stockSkills/rsi.js +79 -101
  16. package/dist/cjs/stockSkills/rsi.test.js +9 -20
  17. package/dist/esm/analyze/SwingExtremes/index.d.ts +3 -3
  18. package/dist/esm/analyze/SwingExtremes/index.js +60 -19
  19. package/dist/esm/analyze/SwingExtremes/index.test.js +1 -1
  20. package/dist/esm/index.d.ts +3 -1
  21. package/dist/esm/index.js +1 -1
  22. package/dist/esm/stockSkills/boll.d.ts +4 -4
  23. package/dist/esm/stockSkills/ema.d.ts +32 -0
  24. package/dist/esm/stockSkills/ema.js +38 -0
  25. package/dist/esm/stockSkills/ema.test.js +11 -0
  26. package/dist/esm/stockSkills/gold.d.ts +12 -11
  27. package/dist/esm/stockSkills/gold.js +1 -14
  28. package/dist/esm/stockSkills/gold.test.js +8 -10
  29. package/dist/esm/stockSkills/rsi.d.ts +26 -29
  30. package/dist/esm/stockSkills/rsi.js +79 -101
  31. package/dist/esm/stockSkills/rsi.test.js +9 -20
  32. package/dist/umd/index.js +178 -134
  33. 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
- var prevGradient = prices[i] - prices[i - 1];
133
- var nextGradient = prices[i + 1] - prices[i];
134
- if (prevGradient > 0 && nextGradient < 0) {
135
- peaks.push(i);
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
- var peaks = [];
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
- var prevGradient = prices[i] - prices[i - 1];
144
- var nextGradient = prices[i + 1] - prices[i];
145
- if (prevGradient < 0 && nextGradient > 0) {
146
- peaks.push(i);
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 peaks;
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 (list) {
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, "getAllRsi", {
1389
+ Object.defineProperty(Rsi.prototype, "init", {
1324
1390
  enumerable: false,
1325
1391
  configurable: true,
1326
1392
  writable: true,
1327
- value: function (list) {
1328
- var res = [];
1329
- var rsi6 = this.getRsi6(list);
1330
- var rsi12 = this.getRsi12(list);
1331
- for (var i = 0; i < list.length; i++) {
1332
- res[i] = Object.assign(list[i], rsi6[i], rsi12[i]);
1333
- }
1334
- return res;
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, "getRsi6", {
1403
+ Object.defineProperty(Rsi.prototype, "next", {
1338
1404
  enumerable: false,
1339
1405
  configurable: true,
1340
1406
  writable: true,
1341
- value: function (list) {
1342
- var res = [];
1343
- // 前5筆
1344
- for (var i = 0; i < 5; i++) {
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
- // 第6筆Rsi
1348
- var beforeUpAvg = this.getStartUpAvg(list, 6);
1349
- var beforeDownAvg = this.getStartDownAvg(list, 6);
1350
- var firstRsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
1351
- res[5] = __assign$1(__assign$1({}, list[5]), { rsi6: firstRsi6 });
1352
- // else
1353
- for (var i = 6; i < list.length; i++) {
1354
- var minusU = 0;
1355
- var minusD = 0;
1356
- var minusC = list[i]["c"] - list[i - 1]["c"];
1357
- if (minusC > 0) {
1358
- minusU = minusC;
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
- minusD = minusC;
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
- beforeUpAvg = (beforeUpAvg * 5) / 6 + minusU / 6;
1364
- beforeDownAvg = (beforeDownAvg * 5) / 6 + Math.abs(minusD) / 6;
1365
- var rsi6 = this.getRsi(beforeUpAvg, beforeDownAvg);
1366
- res[i] = __assign$1(__assign$1({}, list[i]), { rsi6: Math.round(rsi6 * 100) / 100 });
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, "getRsi12", {
1448
+ Object.defineProperty(Rsi.prototype, "calculateRSI", {
1372
1449
  enumerable: false,
1373
1450
  configurable: true,
1374
1451
  writable: true,
1375
- value: function (list) {
1376
- var res = [];
1377
- // 前11筆
1378
- for (var i = 0; i < 11; i++) {
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
- // 第12筆Rsi
1382
- var beforeUpAvg = this.getStartUpAvg(list, 12);
1383
- var beforeDownAvg = this.getStartDownAvg(list, 12);
1384
- var firstRsi12 = this.getRsi(beforeUpAvg, beforeDownAvg);
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
- return res;
1403
- }
1404
- });
1405
- Object.defineProperty(Rsi.prototype, "getStartUpAvg", {
1406
- enumerable: false,
1407
- configurable: true,
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
- return sum / count;
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
- return Math.abs(sum / count);
1435
- }
1436
- });
1437
- Object.defineProperty(Rsi.prototype, "getRsi", {
1438
- enumerable: false,
1439
- configurable: true,
1440
- writable: true,
1441
- value: function (UpAvg, DownAvg) {
1442
- var res = 0;
1443
- if (UpAvg + DownAvg !== 0) {
1444
- res = (UpAvg / (UpAvg + DownAvg)) * 100;
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 res;
1490
+ return rsis;
1447
1491
  }
1448
1492
  });
1449
1493
  return Rsi;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ch20026103/anysis",
3
- "version": "0.0.13-alpha",
3
+ "version": "0.0.15-alpha",
4
4
  "description": "provide many analyze methods in the library.",
5
5
  "keywords": [],
6
6
  "bugs": "git@github.com:cosmic1330/anysis/issues",