@ch20026103/anysis 0.0.17-alpha1 → 0.0.18

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 (35) hide show
  1. package/demo/main.js +42 -11
  2. package/dist/cjs/index.d.ts +2 -0
  3. package/dist/cjs/index.js +5 -1
  4. package/dist/cjs/stockSkills/kd.d.ts +0 -18
  5. package/dist/cjs/stockSkills/kd.js +0 -65
  6. package/dist/cjs/stockSkills/kd.test.js +3 -50
  7. package/dist/cjs/stockSkills/mfi.d.ts +15 -0
  8. package/dist/cjs/stockSkills/mfi.js +166 -0
  9. package/dist/cjs/stockSkills/mfi.test.d.ts +1 -0
  10. package/dist/cjs/stockSkills/mfi.test.js +193 -0
  11. package/dist/cjs/stockSkills/obv.d.ts +4 -7
  12. package/dist/cjs/stockSkills/obv.js +2 -15
  13. package/dist/cjs/stockSkills/obv.test.js +5 -3
  14. package/dist/cjs/stockSkills/obv_ema.d.ts +15 -0
  15. package/dist/cjs/stockSkills/obv_ema.js +49 -0
  16. package/dist/cjs/stockSkills/obv_ema.test.d.ts +1 -0
  17. package/dist/cjs/stockSkills/obv_ema.test.js +23 -0
  18. package/dist/esm/index.d.ts +2 -0
  19. package/dist/esm/index.js +2 -0
  20. package/dist/esm/stockSkills/kd.d.ts +0 -18
  21. package/dist/esm/stockSkills/kd.js +0 -65
  22. package/dist/esm/stockSkills/kd.test.js +3 -50
  23. package/dist/esm/stockSkills/mfi.d.ts +15 -0
  24. package/dist/esm/stockSkills/mfi.js +164 -0
  25. package/dist/esm/stockSkills/mfi.test.d.ts +1 -0
  26. package/dist/esm/stockSkills/mfi.test.js +191 -0
  27. package/dist/esm/stockSkills/obv.d.ts +4 -7
  28. package/dist/esm/stockSkills/obv.js +2 -15
  29. package/dist/esm/stockSkills/obv.test.js +5 -3
  30. package/dist/esm/stockSkills/obv_ema.d.ts +15 -0
  31. package/dist/esm/stockSkills/obv_ema.js +47 -0
  32. package/dist/esm/stockSkills/obv_ema.test.d.ts +1 -0
  33. package/dist/esm/stockSkills/obv_ema.test.js +21 -0
  34. package/dist/umd/index.js +256 -121
  35. package/package.json +1 -1
package/dist/umd/index.js CHANGED
@@ -731,17 +731,6 @@
731
731
  return Gold;
732
732
  }());
733
733
 
734
- var __assign$5 = (undefined && undefined.__assign) || function () {
735
- __assign$5 = Object.assign || function(t) {
736
- for (var s, i = 1, n = arguments.length; i < n; i++) {
737
- s = arguments[i];
738
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
739
- t[p] = s[p];
740
- }
741
- return t;
742
- };
743
- return __assign$5.apply(this, arguments);
744
- };
745
734
  var Kd = /** @class */ (function () {
746
735
  function Kd() {
747
736
  }
@@ -807,65 +796,11 @@
807
796
  }
808
797
  }
809
798
  });
810
- Object.defineProperty(Kd.prototype, "getRSV", {
811
- enumerable: false,
812
- configurable: true,
813
- writable: true,
814
- value: function (list) {
815
- var res = [];
816
- for (var i = 0; i < list.length; i++) {
817
- if (i < 8)
818
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0 });
819
- else {
820
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
821
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
822
- var close_2 = list[i].c;
823
- var rsv = ((close_2 - low) / (hight - low)) * 100;
824
- rsv = Math.round(rsv * 100) / 100;
825
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: rsv });
826
- }
827
- }
828
- return res;
829
- }
830
- });
831
- Object.defineProperty(Kd.prototype, "getKD", {
832
- enumerable: false,
833
- configurable: true,
834
- writable: true,
835
- value: function (list) {
836
- var res = [];
837
- var yesterdayK = 50;
838
- var yesterdayD = 50;
839
- for (var i = 0; i < list.length; i++) {
840
- if (i < 8)
841
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: 0, k: 0, d: 0, "k-d": 0, j: 0 });
842
- else {
843
- var low = Math.min.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.l; }));
844
- var hight = Math.max.apply(Math, list.slice(i - 8, i + 1).map(function (item) { return item.h; }));
845
- var close_3 = list[i].c;
846
- var rsv = ((close_3 - low) / (hight - low)) * 100;
847
- rsv = Math.round(rsv * 100) / 100;
848
- var k = (2 / 3) * yesterdayK + (1 / 3) * rsv;
849
- var d = (2 / 3) * yesterdayD + (1 / 3) * k;
850
- var k_d = k - d;
851
- var j = 3 * k - 2 * d;
852
- k = Math.round(k * 100) / 100;
853
- d = Math.round(d * 100) / 100;
854
- k_d = Math.round(k_d * 100) / 100;
855
- j = Math.round(j * 100) / 100;
856
- res[i] = __assign$5(__assign$5({}, list[i]), { rsv: rsv, k: k, d: d, "k-d": k_d, j: j });
857
- yesterdayK = k;
858
- yesterdayD = d;
859
- }
860
- }
861
- return res;
862
- }
863
- });
864
799
  return Kd;
865
800
  }());
866
801
 
867
- var __assign$4 = (undefined && undefined.__assign) || function () {
868
- __assign$4 = Object.assign || function(t) {
802
+ var __assign$5 = (undefined && undefined.__assign) || function () {
803
+ __assign$5 = Object.assign || function(t) {
869
804
  for (var s, i = 1, n = arguments.length; i < n; i++) {
870
805
  s = arguments[i];
871
806
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -873,7 +808,7 @@
873
808
  }
874
809
  return t;
875
810
  };
876
- return __assign$4.apply(this, arguments);
811
+ return __assign$5.apply(this, arguments);
877
812
  };
878
813
  var Ma = /** @class */ (function () {
879
814
  function Ma() {
@@ -947,13 +882,13 @@
947
882
  var res = [];
948
883
  for (var i = 0; i < list.length; i++) {
949
884
  if (i < 4)
950
- res[i] = __assign$4(__assign$4({}, list[i]), { ma5: 0 });
885
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma5: 0 });
951
886
  else {
952
887
  var sum = list
953
888
  .slice(i - 4, i + 1)
954
889
  .reduce(function (pre, current) { return pre + current.c; }, 0);
955
890
  var ma5 = Math.round((sum / 5) * 100) / 100;
956
- res[i] = __assign$4(__assign$4({}, list[i]), { ma5: ma5 });
891
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma5: ma5 });
957
892
  }
958
893
  }
959
894
  return res;
@@ -967,13 +902,13 @@
967
902
  var res = [];
968
903
  for (var i = 0; i < list.length; i++) {
969
904
  if (i < 9)
970
- res[i] = __assign$4(__assign$4({}, list[i]), { ma10: 0 });
905
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma10: 0 });
971
906
  else {
972
907
  var sum = list
973
908
  .slice(i - 9, i + 1)
974
909
  .reduce(function (pre, current) { return pre + current.c; }, 0);
975
910
  var ma10 = Math.round((sum / 10) * 100) / 100;
976
- res[i] = __assign$4(__assign$4({}, list[i]), { ma10: ma10 });
911
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma10: ma10 });
977
912
  }
978
913
  }
979
914
  return res;
@@ -987,13 +922,13 @@
987
922
  var res = [];
988
923
  for (var i = 0; i < list.length; i++) {
989
924
  if (i < 19)
990
- res[i] = __assign$4(__assign$4({}, list[i]), { ma20: 0 });
925
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma20: 0 });
991
926
  else {
992
927
  var sum = list
993
928
  .slice(i - 19, i + 1)
994
929
  .reduce(function (pre, current) { return pre + current.c; }, 0);
995
930
  var ma20 = Math.round((sum / 20) * 100) / 100;
996
- res[i] = __assign$4(__assign$4({}, list[i]), { ma20: ma20 });
931
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma20: ma20 });
997
932
  }
998
933
  }
999
934
  return res;
@@ -1007,13 +942,13 @@
1007
942
  var res = [];
1008
943
  for (var i = 0; i < list.length; i++) {
1009
944
  if (i < 59)
1010
- res[i] = __assign$4(__assign$4({}, list[i]), { ma60: 0 });
945
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma60: 0 });
1011
946
  else {
1012
947
  var sum = list
1013
948
  .slice(i - 59, i + 1)
1014
949
  .reduce(function (pre, current) { return pre + current.c; }, 0);
1015
950
  var ma60 = Math.round((sum / 60) * 100) / 100;
1016
- res[i] = __assign$4(__assign$4({}, list[i]), { ma60: ma60 });
951
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma60: ma60 });
1017
952
  }
1018
953
  }
1019
954
  return res;
@@ -1027,13 +962,13 @@
1027
962
  var res = [];
1028
963
  for (var i = 0; i < list.length; i++) {
1029
964
  if (i < self - 1)
1030
- res[i] = __assign$4(__assign$4({}, list[i]), { ma: 0 });
965
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma: 0 });
1031
966
  else {
1032
967
  var sum = list
1033
968
  .slice(i - (self - 1), i + 1)
1034
969
  .reduce(function (pre, current) { return pre + current.c; }, 0);
1035
970
  var ma = Math.round((sum / self) * 100) / 100;
1036
- res[i] = __assign$4(__assign$4({}, list[i]), { ma: ma });
971
+ res[i] = __assign$5(__assign$5({}, list[i]), { ma: ma });
1037
972
  }
1038
973
  }
1039
974
  return res;
@@ -1042,8 +977,8 @@
1042
977
  return Ma;
1043
978
  }());
1044
979
 
1045
- var __assign$3 = (undefined && undefined.__assign) || function () {
1046
- __assign$3 = Object.assign || function(t) {
980
+ var __assign$4 = (undefined && undefined.__assign) || function () {
981
+ __assign$4 = Object.assign || function(t) {
1047
982
  for (var s, i = 1, n = arguments.length; i < n; i++) {
1048
983
  s = arguments[i];
1049
984
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -1051,7 +986,7 @@
1051
986
  }
1052
987
  return t;
1053
988
  };
1054
- return __assign$3.apply(this, arguments);
989
+ return __assign$4.apply(this, arguments);
1055
990
  };
1056
991
  var MACD = /** @class */ (function () {
1057
992
  function MACD() {
@@ -1189,10 +1124,10 @@
1189
1124
  var res = [];
1190
1125
  for (var i = 0; i < list.length; i++) {
1191
1126
  if (i < 12)
1192
- res[i] = __assign$3(__assign$3({}, list[i]), { EMA12: null });
1127
+ res[i] = __assign$4(__assign$4({}, list[i]), { EMA12: null });
1193
1128
  else {
1194
1129
  beforeEMA12 = (beforeEMA12 * 11) / 13 + (this.getDI(list[i]) * 2) / 13;
1195
- res[i] = __assign$3(__assign$3({}, list[i]), { EMA12: beforeEMA12 });
1130
+ res[i] = __assign$4(__assign$4({}, list[i]), { EMA12: beforeEMA12 });
1196
1131
  }
1197
1132
  }
1198
1133
  return res;
@@ -1208,10 +1143,10 @@
1208
1143
  var res = [];
1209
1144
  for (var i = 0; i < list.length; i++) {
1210
1145
  if (i < 26)
1211
- res[i] = __assign$3(__assign$3({}, list[i]), { EMA26: null });
1146
+ res[i] = __assign$4(__assign$4({}, list[i]), { EMA26: null });
1212
1147
  else {
1213
1148
  beforeEMA26 = (beforeEMA26 * 25) / 27 + (this.getDI(list[i]) * 2) / 27;
1214
- res[i] = __assign$3(__assign$3({}, list[i]), { EMA26: beforeEMA26 });
1149
+ res[i] = __assign$4(__assign$4({}, list[i]), { EMA26: beforeEMA26 });
1215
1150
  }
1216
1151
  }
1217
1152
  return res;
@@ -1226,12 +1161,12 @@
1226
1161
  var res = [];
1227
1162
  for (var i = 0; i < list.length; i++) {
1228
1163
  if (i < 26)
1229
- res[i] = __assign$3(__assign$3({}, list[i]), { DIF: null });
1164
+ res[i] = __assign$4(__assign$4({}, list[i]), { DIF: null });
1230
1165
  else {
1231
1166
  var EMA12 = ((_a = ResEMA12 === null || ResEMA12 === void 0 ? void 0 : ResEMA12[i]) === null || _a === void 0 ? void 0 : _a["EMA12"]) && ResEMA12[i]["EMA12"];
1232
1167
  var EMA26 = ((_b = ResEMA26 === null || ResEMA26 === void 0 ? void 0 : ResEMA26[i]) === null || _b === void 0 ? void 0 : _b["EMA26"]) && ResEMA26[i]["EMA26"];
1233
1168
  var DIF = EMA12 - EMA26;
1234
- res[i] = __assign$3(__assign$3({}, list[i]), { DIF: DIF });
1169
+ res[i] = __assign$4(__assign$4({}, list[i]), { DIF: DIF });
1235
1170
  }
1236
1171
  }
1237
1172
  return res;
@@ -1246,19 +1181,19 @@
1246
1181
  var beforeMACD9 = 0;
1247
1182
  for (var i = 0; i < list.length; i++) {
1248
1183
  if (i < 26)
1249
- res[i] = __assign$3(__assign$3({}, list[i]), { MACD9: null, OSC: null });
1184
+ res[i] = __assign$4(__assign$4({}, list[i]), { MACD9: null, OSC: null });
1250
1185
  else if (i === 26) {
1251
1186
  var MACD9 = DIF.slice(26, 34)
1252
1187
  .map(function (item) { return ((item === null || item === void 0 ? void 0 : item.DIF) ? item["DIF"] : 0); })
1253
1188
  .reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
1254
1189
  var OSC = DIF[i]["DIF"] - MACD9;
1255
- res[26] = __assign$3(__assign$3({}, list[i]), { MACD9: MACD9, OSC: OSC });
1190
+ res[26] = __assign$4(__assign$4({}, list[i]), { MACD9: MACD9, OSC: OSC });
1256
1191
  beforeMACD9 = MACD9;
1257
1192
  }
1258
1193
  else {
1259
1194
  var MACD9 = beforeMACD9 + ((DIF[i]["DIF"] - beforeMACD9) * 2) / 10;
1260
1195
  var OSC = DIF[i]["DIF"] - MACD9;
1261
- res[i] = __assign$3(__assign$3({}, list[i]), { MACD9: MACD9, OSC: OSC });
1196
+ res[i] = __assign$4(__assign$4({}, list[i]), { MACD9: MACD9, OSC: OSC });
1262
1197
  beforeMACD9 = MACD9;
1263
1198
  }
1264
1199
  }
@@ -1268,8 +1203,8 @@
1268
1203
  return MACD;
1269
1204
  }());
1270
1205
 
1271
- var __assign$2 = (undefined && undefined.__assign) || function () {
1272
- __assign$2 = Object.assign || function(t) {
1206
+ var __assign$3 = (undefined && undefined.__assign) || function () {
1207
+ __assign$3 = Object.assign || function(t) {
1273
1208
  for (var s, i = 1, n = arguments.length; i < n; i++) {
1274
1209
  s = arguments[i];
1275
1210
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -1277,7 +1212,7 @@
1277
1212
  }
1278
1213
  return t;
1279
1214
  };
1280
- return __assign$2.apply(this, arguments);
1215
+ return __assign$3.apply(this, arguments);
1281
1216
  };
1282
1217
  var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
1283
1218
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
@@ -1295,14 +1230,11 @@
1295
1230
  enumerable: false,
1296
1231
  configurable: true,
1297
1232
  writable: true,
1298
- value: function (data, type) {
1233
+ value: function (data) {
1299
1234
  return {
1300
1235
  dataset: [data],
1301
1236
  obv: data.v,
1302
- obvList: [data.v],
1303
1237
  preClose: data.c,
1304
- obvMa: 0,
1305
- type: type,
1306
1238
  };
1307
1239
  }
1308
1240
  });
@@ -1310,7 +1242,7 @@
1310
1242
  enumerable: false,
1311
1243
  configurable: true,
1312
1244
  writable: true,
1313
- value: function (data, preList, type) {
1245
+ value: function (data, preList) {
1314
1246
  var currentVolume = data.v;
1315
1247
  var currentClose = data.c;
1316
1248
  // obv
@@ -1321,20 +1253,10 @@
1321
1253
  else if (currentClose < preList.preClose) {
1322
1254
  obv -= currentVolume;
1323
1255
  }
1324
- // obv Ma
1325
- var obvList = preList.obvList;
1326
- obvList.push(obv);
1327
- if (obvList.length > type)
1328
- obvList.shift();
1329
- var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1330
- var vma = Math.round((sum / type) * 100) / 100;
1331
1256
  return {
1332
1257
  dataset: __spreadArray(__spreadArray([], preList.dataset, true), [data], false),
1333
1258
  obv: obv,
1334
1259
  preClose: currentClose,
1335
- obvList: obvList,
1336
- obvMa: vma,
1337
- type: type,
1338
1260
  };
1339
1261
  }
1340
1262
  });
@@ -1360,7 +1282,7 @@
1360
1282
  else {
1361
1283
  obv = currentVolume;
1362
1284
  }
1363
- res[i] = __assign$2(__assign$2({}, list[i]), { obv: obv });
1285
+ res[i] = __assign$3(__assign$3({}, list[i]), { obv: obv });
1364
1286
  }
1365
1287
  return res;
1366
1288
  }
@@ -1368,8 +1290,8 @@
1368
1290
  return Obv;
1369
1291
  }());
1370
1292
 
1371
- var __assign$1 = (undefined && undefined.__assign) || function () {
1372
- __assign$1 = Object.assign || function(t) {
1293
+ var __assign$2 = (undefined && undefined.__assign) || function () {
1294
+ __assign$2 = Object.assign || function(t) {
1373
1295
  for (var s, i = 1, n = arguments.length; i < n; i++) {
1374
1296
  s = arguments[i];
1375
1297
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -1377,7 +1299,7 @@
1377
1299
  }
1378
1300
  return t;
1379
1301
  };
1380
- return __assign$1.apply(this, arguments);
1302
+ return __assign$2.apply(this, arguments);
1381
1303
  };
1382
1304
  var Rsi = /** @class */ (function () {
1383
1305
  function Rsi() {
@@ -1403,7 +1325,7 @@
1403
1325
  value: function (data, preList, type) {
1404
1326
  preList.dataset.push(data);
1405
1327
  if (preList.dataset.length < type + 1) {
1406
- return __assign$1(__assign$1({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
1328
+ return __assign$2(__assign$2({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
1407
1329
  }
1408
1330
  else {
1409
1331
  // 计算初始增益和损失
@@ -1437,7 +1359,7 @@
1437
1359
  // 计算RSI
1438
1360
  var rs = avgGain / avgLoss;
1439
1361
  var rsi = 100 - 100 / (1 + rs);
1440
- return __assign$1(__assign$1({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
1362
+ return __assign$2(__assign$2({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
1441
1363
  }
1442
1364
  }
1443
1365
  });
@@ -1625,8 +1547,8 @@
1625
1547
  return Vma;
1626
1548
  }());
1627
1549
 
1628
- var __assign = (undefined && undefined.__assign) || function () {
1629
- __assign = Object.assign || function(t) {
1550
+ var __assign$1 = (undefined && undefined.__assign) || function () {
1551
+ __assign$1 = Object.assign || function(t) {
1630
1552
  for (var s, i = 1, n = arguments.length; i < n; i++) {
1631
1553
  s = arguments[i];
1632
1554
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
@@ -1634,7 +1556,7 @@
1634
1556
  }
1635
1557
  return t;
1636
1558
  };
1637
- return __assign.apply(this, arguments);
1559
+ return __assign$1.apply(this, arguments);
1638
1560
  };
1639
1561
  var Williams = /** @class */ (function () {
1640
1562
  function Williams() {
@@ -1697,7 +1619,7 @@
1697
1619
  var res = [];
1698
1620
  for (var i = 0; i < list.length; i++) {
1699
1621
  if (i < 9)
1700
- res[i] = __assign(__assign({}, list[i]), { williams9: null });
1622
+ res[i] = __assign$1(__assign$1({}, list[i]), { williams9: null });
1701
1623
  else {
1702
1624
  var maxList = list.slice(i - 8, i).map(function (item) { return item["h"]; });
1703
1625
  var minList = list.slice(i - 8, i).map(function (item) { return item["l"]; });
@@ -1705,7 +1627,7 @@
1705
1627
  var min = Math.min.apply(Math, minList);
1706
1628
  var close_2 = list[i]["c"];
1707
1629
  var williams9 = ((max - close_2) / (max - min)) * -100;
1708
- res[i] = __assign(__assign({}, list[i]), { williams9: Math.round(williams9 * 100) / 100 });
1630
+ res[i] = __assign$1(__assign$1({}, list[i]), { williams9: Math.round(williams9 * 100) / 100 });
1709
1631
  }
1710
1632
  }
1711
1633
  return res;
@@ -1719,7 +1641,7 @@
1719
1641
  var res = [];
1720
1642
  for (var i = 0; i < list.length; i++) {
1721
1643
  if (i < 18)
1722
- res[i] = __assign(__assign({}, list[i]), { williams18: null });
1644
+ res[i] = __assign$1(__assign$1({}, list[i]), { williams18: null });
1723
1645
  else {
1724
1646
  var maxList = list.slice(i - 17, i).map(function (item) { return item["h"]; });
1725
1647
  var minList = list.slice(i - 17, i).map(function (item) { return item["l"]; });
@@ -1727,7 +1649,7 @@
1727
1649
  var min = Math.min.apply(Math, minList);
1728
1650
  var close_3 = list[i]["c"];
1729
1651
  var williams18 = ((max - close_3) / (max - min)) * -100;
1730
- res[i] = __assign(__assign({}, list[i]), { williams18: Math.round(williams18 * 100) / 100 });
1652
+ res[i] = __assign$1(__assign$1({}, list[i]), { williams18: Math.round(williams18 * 100) / 100 });
1731
1653
  }
1732
1654
  }
1733
1655
  return res;
@@ -1736,6 +1658,217 @@
1736
1658
  return Williams;
1737
1659
  }());
1738
1660
 
1661
+ var ObvEma = /** @class */ (function () {
1662
+ function ObvEma() {
1663
+ }
1664
+ Object.defineProperty(ObvEma.prototype, "init", {
1665
+ enumerable: false,
1666
+ configurable: true,
1667
+ writable: true,
1668
+ value: function (obv, type) {
1669
+ return {
1670
+ obvList: [obv],
1671
+ ema: 0,
1672
+ ma: 0,
1673
+ type: type,
1674
+ };
1675
+ }
1676
+ });
1677
+ Object.defineProperty(ObvEma.prototype, "next", {
1678
+ enumerable: false,
1679
+ configurable: true,
1680
+ writable: true,
1681
+ value: function (obv, preList, type) {
1682
+ var obvList = preList.obvList;
1683
+ obvList.push(obv);
1684
+ var ma = 0;
1685
+ var ema = 0;
1686
+ if (obvList.length === type) {
1687
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1688
+ ma = Math.round((sum / type) * 100) / 100;
1689
+ ema = ma;
1690
+ }
1691
+ else if (obvList.length > type) {
1692
+ obvList.shift();
1693
+ var sum = obvList.reduce(function (pre, current) { return pre + current; }, 0);
1694
+ ma = Math.round((sum / type) * 100) / 100;
1695
+ ema = (obv * 2 + (type - 1) * preList.ema) / (type + 1);
1696
+ }
1697
+ return {
1698
+ obvList: obvList,
1699
+ ema: ema,
1700
+ ma: ma,
1701
+ type: type,
1702
+ };
1703
+ }
1704
+ });
1705
+ return ObvEma;
1706
+ }());
1707
+
1708
+ var __assign = (undefined && undefined.__assign) || function () {
1709
+ __assign = Object.assign || function(t) {
1710
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
1711
+ s = arguments[i];
1712
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
1713
+ t[p] = s[p];
1714
+ }
1715
+ return t;
1716
+ };
1717
+ return __assign.apply(this, arguments);
1718
+ };
1719
+ var Mfi = /** @class */ (function () {
1720
+ function Mfi() {
1721
+ }
1722
+ // 計算典型價格 (Typical Price)
1723
+ Object.defineProperty(Mfi.prototype, "getTypicalPrice", {
1724
+ enumerable: false,
1725
+ configurable: true,
1726
+ writable: true,
1727
+ value: function (data) {
1728
+ return (data.h + data.l + data.c) / 3;
1729
+ }
1730
+ });
1731
+ // 計算原始資金流量 (Raw Money Flow)
1732
+ Object.defineProperty(Mfi.prototype, "getRawMoneyFlow", {
1733
+ enumerable: false,
1734
+ configurable: true,
1735
+ writable: true,
1736
+ value: function (data) {
1737
+ return this.getTypicalPrice(data) * data.v;
1738
+ }
1739
+ });
1740
+ Object.defineProperty(Mfi.prototype, "init", {
1741
+ enumerable: false,
1742
+ configurable: true,
1743
+ writable: true,
1744
+ value: function (data, type) {
1745
+ return {
1746
+ dataset: [data],
1747
+ mfi: null,
1748
+ type: type,
1749
+ sumPositiveMF: 0,
1750
+ sumNegativeMF: 0,
1751
+ };
1752
+ }
1753
+ });
1754
+ Object.defineProperty(Mfi.prototype, "next", {
1755
+ enumerable: false,
1756
+ configurable: true,
1757
+ writable: true,
1758
+ value: function (data, preList, type) {
1759
+ preList.dataset.push(data);
1760
+ // 資料不足,不計算 MFI
1761
+ if (preList.dataset.length < type + 1) {
1762
+ return __assign(__assign({}, preList), { mfi: null, type: type, sumPositiveMF: 0, sumNegativeMF: 0 });
1763
+ }
1764
+ var sumPositiveMF = preList.sumPositiveMF;
1765
+ var sumNegativeMF = preList.sumNegativeMF;
1766
+ if (preList.dataset.length === type + 1) {
1767
+ // 第一次達到計算條件,初始化計算
1768
+ sumPositiveMF = 0;
1769
+ sumNegativeMF = 0;
1770
+ for (var i = 1; i <= type; i++) {
1771
+ var currentTP = this.getTypicalPrice(preList.dataset[i]);
1772
+ var prevTP = this.getTypicalPrice(preList.dataset[i - 1]);
1773
+ var rawMF = this.getRawMoneyFlow(preList.dataset[i]);
1774
+ if (currentTP > prevTP) {
1775
+ sumPositiveMF += rawMF;
1776
+ }
1777
+ else if (currentTP < prevTP) {
1778
+ sumNegativeMF += rawMF;
1779
+ }
1780
+ }
1781
+ }
1782
+ else {
1783
+ // 增量更新:移除最舊的影響,加上最新的影響
1784
+ // 移除最舊的資料影響
1785
+ var oldestTP = this.getTypicalPrice(preList.dataset[0]);
1786
+ var secondOldestTP = this.getTypicalPrice(preList.dataset[1]);
1787
+ var oldestRawMF = this.getRawMoneyFlow(preList.dataset[1]);
1788
+ if (secondOldestTP > oldestTP) {
1789
+ sumPositiveMF -= oldestRawMF;
1790
+ }
1791
+ else if (secondOldestTP < oldestTP) {
1792
+ sumNegativeMF -= oldestRawMF;
1793
+ }
1794
+ // 移除最舊的資料
1795
+ preList.dataset.shift();
1796
+ // 加上最新的資料影響
1797
+ var newTP = this.getTypicalPrice(preList.dataset[preList.dataset.length - 1]);
1798
+ var prevTP = this.getTypicalPrice(preList.dataset[preList.dataset.length - 2]);
1799
+ var newRawMF = this.getRawMoneyFlow(preList.dataset[preList.dataset.length - 1]);
1800
+ if (newTP > prevTP) {
1801
+ sumPositiveMF += newRawMF;
1802
+ }
1803
+ else if (newTP < prevTP) {
1804
+ sumNegativeMF += newRawMF;
1805
+ }
1806
+ }
1807
+ // 計算 MFI
1808
+ var mfi;
1809
+ if (sumNegativeMF === 0) {
1810
+ mfi = 100;
1811
+ }
1812
+ else {
1813
+ var moneyFlowRatio = sumPositiveMF / sumNegativeMF;
1814
+ mfi = 100 - (100 / (1 + moneyFlowRatio));
1815
+ }
1816
+ return {
1817
+ dataset: preList.dataset,
1818
+ type: type,
1819
+ mfi: mfi,
1820
+ sumPositiveMF: sumPositiveMF,
1821
+ sumNegativeMF: sumNegativeMF
1822
+ };
1823
+ }
1824
+ });
1825
+ Object.defineProperty(Mfi.prototype, "calculateMFI", {
1826
+ enumerable: false,
1827
+ configurable: true,
1828
+ writable: true,
1829
+ value: function (prices, period) {
1830
+ if (period === void 0) { period = 14; }
1831
+ if (prices.length < period + 1) {
1832
+ return [];
1833
+ }
1834
+ var mfis = [];
1835
+ // 從 period 開始,確保有足夠的資料進行比較
1836
+ for (var endIdx = period; endIdx < prices.length; endIdx++) {
1837
+ var sumPositiveMF = 0;
1838
+ var sumNegativeMF = 0;
1839
+ // 計算 period 個交易日的資金流量
1840
+ // 從 endIdx - period + 1 到 endIdx,共 period 個資料點
1841
+ // 但比較是從 endIdx - period + 2 開始(因為要跟前一天比)
1842
+ for (var i = endIdx - period + 1; i <= endIdx; i++) {
1843
+ // 確保 i-1 >= 0,避免溢位
1844
+ if (i === 0)
1845
+ continue;
1846
+ var currentTP = this.getTypicalPrice(prices[i]);
1847
+ var prevTP = this.getTypicalPrice(prices[i - 1]);
1848
+ var rawMF = this.getRawMoneyFlow(prices[i]);
1849
+ if (currentTP > prevTP) {
1850
+ sumPositiveMF += rawMF;
1851
+ }
1852
+ else if (currentTP < prevTP) {
1853
+ sumNegativeMF += rawMF;
1854
+ }
1855
+ }
1856
+ // 計算 MFI
1857
+ if (sumNegativeMF === 0) {
1858
+ mfis.push(100);
1859
+ }
1860
+ else {
1861
+ var moneyFlowRatio = sumPositiveMF / sumNegativeMF;
1862
+ var mfi = 100 - (100 / (1 + moneyFlowRatio));
1863
+ mfis.push(mfi);
1864
+ }
1865
+ }
1866
+ return mfis;
1867
+ }
1868
+ });
1869
+ return Mfi;
1870
+ }());
1871
+
1739
1872
  function add(a, b) {
1740
1873
  return a + b;
1741
1874
  }
@@ -1779,7 +1912,9 @@
1779
1912
  exports.Kd = Kd;
1780
1913
  exports.Ma = Ma;
1781
1914
  exports.Macd = MACD;
1915
+ exports.Mfi = Mfi;
1782
1916
  exports.Obv = Obv;
1917
+ exports.ObvEma = ObvEma;
1783
1918
  exports.Rsi = Rsi;
1784
1919
  exports.SwingExtremes = SwingExtremes;
1785
1920
  exports.Vma = Vma;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ch20026103/anysis",
3
- "version": "0.0.17-alpha1",
3
+ "version": "0.0.18",
4
4
  "description": "provide many analyze methods in the library.",
5
5
  "keywords": [],
6
6
  "bugs": "git@github.com:cosmic1330/anysis/issues",