@ch20026103/anysis 0.0.17-alpha2 → 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.
- package/demo/main.js +42 -11
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/stockSkills/mfi.d.ts +15 -0
- package/dist/cjs/stockSkills/mfi.js +166 -0
- package/dist/cjs/stockSkills/mfi.test.d.ts +1 -0
- package/dist/cjs/stockSkills/mfi.test.js +193 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/stockSkills/mfi.d.ts +15 -0
- package/dist/esm/stockSkills/mfi.js +164 -0
- package/dist/esm/stockSkills/mfi.test.d.ts +1 -0
- package/dist/esm/stockSkills/mfi.test.js +191 -0
- package/dist/umd/index.js +216 -51
- package/package.json +17 -15
package/dist/umd/index.js
CHANGED
|
@@ -282,8 +282,8 @@
|
|
|
282
282
|
return nextYearForecast;
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
-
var __assign$
|
|
286
|
-
__assign$
|
|
285
|
+
var __assign$7 = (undefined && undefined.__assign) || function () {
|
|
286
|
+
__assign$7 = Object.assign || function(t) {
|
|
287
287
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
288
288
|
s = arguments[i];
|
|
289
289
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
}
|
|
292
292
|
return t;
|
|
293
293
|
};
|
|
294
|
-
return __assign$
|
|
294
|
+
return __assign$7.apply(this, arguments);
|
|
295
295
|
};
|
|
296
296
|
var Boll = /** @class */ (function () {
|
|
297
297
|
function Boll() {
|
|
@@ -352,7 +352,7 @@
|
|
|
352
352
|
var res = [];
|
|
353
353
|
var _loop_1 = function (i) {
|
|
354
354
|
if (i < type)
|
|
355
|
-
res[i] = __assign$
|
|
355
|
+
res[i] = __assign$7(__assign$7({}, list[i]), { bollMa: 0, bollUb: 0, bollLb: 0 });
|
|
356
356
|
else {
|
|
357
357
|
// bollMa
|
|
358
358
|
var sumMa = list
|
|
@@ -366,7 +366,7 @@
|
|
|
366
366
|
return bollMa_2 !== 0 ? pre + Math.pow(current.c - bollMa_2, 2) : pre;
|
|
367
367
|
}, 0);
|
|
368
368
|
var std = Math.round(Math.sqrt(difference / type) * 100) / 100;
|
|
369
|
-
res[i] = __assign$
|
|
369
|
+
res[i] = __assign$7(__assign$7({}, list[i]), { bollMa: bollMa_2, bollUb: bollMa_2 + 2 * std, bollLb: bollMa_2 - 2 * std });
|
|
370
370
|
}
|
|
371
371
|
};
|
|
372
372
|
for (var i = 0; i < list.length; i++) {
|
|
@@ -455,8 +455,8 @@
|
|
|
455
455
|
return Ema;
|
|
456
456
|
}());
|
|
457
457
|
|
|
458
|
-
var __assign$
|
|
459
|
-
__assign$
|
|
458
|
+
var __assign$6 = (undefined && undefined.__assign) || function () {
|
|
459
|
+
__assign$6 = Object.assign || function(t) {
|
|
460
460
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
461
461
|
s = arguments[i];
|
|
462
462
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -464,13 +464,13 @@
|
|
|
464
464
|
}
|
|
465
465
|
return t;
|
|
466
466
|
};
|
|
467
|
-
return __assign$
|
|
467
|
+
return __assign$6.apply(this, arguments);
|
|
468
468
|
};
|
|
469
469
|
function addDetail(obj, list, detail) {
|
|
470
470
|
if (detail)
|
|
471
|
-
return __assign$
|
|
471
|
+
return __assign$6(__assign$6({}, obj), { detail: list });
|
|
472
472
|
else
|
|
473
|
-
return __assign$
|
|
473
|
+
return __assign$6({}, obj);
|
|
474
474
|
}
|
|
475
475
|
function getWeekLine(list, detail) {
|
|
476
476
|
var res = [];
|
|
@@ -799,8 +799,8 @@
|
|
|
799
799
|
return Kd;
|
|
800
800
|
}());
|
|
801
801
|
|
|
802
|
-
var __assign$
|
|
803
|
-
__assign$
|
|
802
|
+
var __assign$5 = (undefined && undefined.__assign) || function () {
|
|
803
|
+
__assign$5 = Object.assign || function(t) {
|
|
804
804
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
805
805
|
s = arguments[i];
|
|
806
806
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -808,7 +808,7 @@
|
|
|
808
808
|
}
|
|
809
809
|
return t;
|
|
810
810
|
};
|
|
811
|
-
return __assign$
|
|
811
|
+
return __assign$5.apply(this, arguments);
|
|
812
812
|
};
|
|
813
813
|
var Ma = /** @class */ (function () {
|
|
814
814
|
function Ma() {
|
|
@@ -882,13 +882,13 @@
|
|
|
882
882
|
var res = [];
|
|
883
883
|
for (var i = 0; i < list.length; i++) {
|
|
884
884
|
if (i < 4)
|
|
885
|
-
res[i] = __assign$
|
|
885
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma5: 0 });
|
|
886
886
|
else {
|
|
887
887
|
var sum = list
|
|
888
888
|
.slice(i - 4, i + 1)
|
|
889
889
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
890
890
|
var ma5 = Math.round((sum / 5) * 100) / 100;
|
|
891
|
-
res[i] = __assign$
|
|
891
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma5: ma5 });
|
|
892
892
|
}
|
|
893
893
|
}
|
|
894
894
|
return res;
|
|
@@ -902,13 +902,13 @@
|
|
|
902
902
|
var res = [];
|
|
903
903
|
for (var i = 0; i < list.length; i++) {
|
|
904
904
|
if (i < 9)
|
|
905
|
-
res[i] = __assign$
|
|
905
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma10: 0 });
|
|
906
906
|
else {
|
|
907
907
|
var sum = list
|
|
908
908
|
.slice(i - 9, i + 1)
|
|
909
909
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
910
910
|
var ma10 = Math.round((sum / 10) * 100) / 100;
|
|
911
|
-
res[i] = __assign$
|
|
911
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma10: ma10 });
|
|
912
912
|
}
|
|
913
913
|
}
|
|
914
914
|
return res;
|
|
@@ -922,13 +922,13 @@
|
|
|
922
922
|
var res = [];
|
|
923
923
|
for (var i = 0; i < list.length; i++) {
|
|
924
924
|
if (i < 19)
|
|
925
|
-
res[i] = __assign$
|
|
925
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma20: 0 });
|
|
926
926
|
else {
|
|
927
927
|
var sum = list
|
|
928
928
|
.slice(i - 19, i + 1)
|
|
929
929
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
930
930
|
var ma20 = Math.round((sum / 20) * 100) / 100;
|
|
931
|
-
res[i] = __assign$
|
|
931
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma20: ma20 });
|
|
932
932
|
}
|
|
933
933
|
}
|
|
934
934
|
return res;
|
|
@@ -942,13 +942,13 @@
|
|
|
942
942
|
var res = [];
|
|
943
943
|
for (var i = 0; i < list.length; i++) {
|
|
944
944
|
if (i < 59)
|
|
945
|
-
res[i] = __assign$
|
|
945
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma60: 0 });
|
|
946
946
|
else {
|
|
947
947
|
var sum = list
|
|
948
948
|
.slice(i - 59, i + 1)
|
|
949
949
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
950
950
|
var ma60 = Math.round((sum / 60) * 100) / 100;
|
|
951
|
-
res[i] = __assign$
|
|
951
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma60: ma60 });
|
|
952
952
|
}
|
|
953
953
|
}
|
|
954
954
|
return res;
|
|
@@ -962,13 +962,13 @@
|
|
|
962
962
|
var res = [];
|
|
963
963
|
for (var i = 0; i < list.length; i++) {
|
|
964
964
|
if (i < self - 1)
|
|
965
|
-
res[i] = __assign$
|
|
965
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma: 0 });
|
|
966
966
|
else {
|
|
967
967
|
var sum = list
|
|
968
968
|
.slice(i - (self - 1), i + 1)
|
|
969
969
|
.reduce(function (pre, current) { return pre + current.c; }, 0);
|
|
970
970
|
var ma = Math.round((sum / self) * 100) / 100;
|
|
971
|
-
res[i] = __assign$
|
|
971
|
+
res[i] = __assign$5(__assign$5({}, list[i]), { ma: ma });
|
|
972
972
|
}
|
|
973
973
|
}
|
|
974
974
|
return res;
|
|
@@ -977,8 +977,8 @@
|
|
|
977
977
|
return Ma;
|
|
978
978
|
}());
|
|
979
979
|
|
|
980
|
-
var __assign$
|
|
981
|
-
__assign$
|
|
980
|
+
var __assign$4 = (undefined && undefined.__assign) || function () {
|
|
981
|
+
__assign$4 = Object.assign || function(t) {
|
|
982
982
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
983
983
|
s = arguments[i];
|
|
984
984
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -986,7 +986,7 @@
|
|
|
986
986
|
}
|
|
987
987
|
return t;
|
|
988
988
|
};
|
|
989
|
-
return __assign$
|
|
989
|
+
return __assign$4.apply(this, arguments);
|
|
990
990
|
};
|
|
991
991
|
var MACD = /** @class */ (function () {
|
|
992
992
|
function MACD() {
|
|
@@ -1124,10 +1124,10 @@
|
|
|
1124
1124
|
var res = [];
|
|
1125
1125
|
for (var i = 0; i < list.length; i++) {
|
|
1126
1126
|
if (i < 12)
|
|
1127
|
-
res[i] = __assign$
|
|
1127
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { EMA12: null });
|
|
1128
1128
|
else {
|
|
1129
1129
|
beforeEMA12 = (beforeEMA12 * 11) / 13 + (this.getDI(list[i]) * 2) / 13;
|
|
1130
|
-
res[i] = __assign$
|
|
1130
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { EMA12: beforeEMA12 });
|
|
1131
1131
|
}
|
|
1132
1132
|
}
|
|
1133
1133
|
return res;
|
|
@@ -1143,10 +1143,10 @@
|
|
|
1143
1143
|
var res = [];
|
|
1144
1144
|
for (var i = 0; i < list.length; i++) {
|
|
1145
1145
|
if (i < 26)
|
|
1146
|
-
res[i] = __assign$
|
|
1146
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { EMA26: null });
|
|
1147
1147
|
else {
|
|
1148
1148
|
beforeEMA26 = (beforeEMA26 * 25) / 27 + (this.getDI(list[i]) * 2) / 27;
|
|
1149
|
-
res[i] = __assign$
|
|
1149
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { EMA26: beforeEMA26 });
|
|
1150
1150
|
}
|
|
1151
1151
|
}
|
|
1152
1152
|
return res;
|
|
@@ -1161,12 +1161,12 @@
|
|
|
1161
1161
|
var res = [];
|
|
1162
1162
|
for (var i = 0; i < list.length; i++) {
|
|
1163
1163
|
if (i < 26)
|
|
1164
|
-
res[i] = __assign$
|
|
1164
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { DIF: null });
|
|
1165
1165
|
else {
|
|
1166
1166
|
var EMA12 = ((_a = ResEMA12 === null || ResEMA12 === void 0 ? void 0 : ResEMA12[i]) === null || _a === void 0 ? void 0 : _a["EMA12"]) && ResEMA12[i]["EMA12"];
|
|
1167
1167
|
var EMA26 = ((_b = ResEMA26 === null || ResEMA26 === void 0 ? void 0 : ResEMA26[i]) === null || _b === void 0 ? void 0 : _b["EMA26"]) && ResEMA26[i]["EMA26"];
|
|
1168
1168
|
var DIF = EMA12 - EMA26;
|
|
1169
|
-
res[i] = __assign$
|
|
1169
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { DIF: DIF });
|
|
1170
1170
|
}
|
|
1171
1171
|
}
|
|
1172
1172
|
return res;
|
|
@@ -1181,19 +1181,19 @@
|
|
|
1181
1181
|
var beforeMACD9 = 0;
|
|
1182
1182
|
for (var i = 0; i < list.length; i++) {
|
|
1183
1183
|
if (i < 26)
|
|
1184
|
-
res[i] = __assign$
|
|
1184
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { MACD9: null, OSC: null });
|
|
1185
1185
|
else if (i === 26) {
|
|
1186
1186
|
var MACD9 = DIF.slice(26, 34)
|
|
1187
1187
|
.map(function (item) { return ((item === null || item === void 0 ? void 0 : item.DIF) ? item["DIF"] : 0); })
|
|
1188
1188
|
.reduce(function (accumulator, currentValue) { return accumulator + currentValue; });
|
|
1189
1189
|
var OSC = DIF[i]["DIF"] - MACD9;
|
|
1190
|
-
res[26] = __assign$
|
|
1190
|
+
res[26] = __assign$4(__assign$4({}, list[i]), { MACD9: MACD9, OSC: OSC });
|
|
1191
1191
|
beforeMACD9 = MACD9;
|
|
1192
1192
|
}
|
|
1193
1193
|
else {
|
|
1194
1194
|
var MACD9 = beforeMACD9 + ((DIF[i]["DIF"] - beforeMACD9) * 2) / 10;
|
|
1195
1195
|
var OSC = DIF[i]["DIF"] - MACD9;
|
|
1196
|
-
res[i] = __assign$
|
|
1196
|
+
res[i] = __assign$4(__assign$4({}, list[i]), { MACD9: MACD9, OSC: OSC });
|
|
1197
1197
|
beforeMACD9 = MACD9;
|
|
1198
1198
|
}
|
|
1199
1199
|
}
|
|
@@ -1203,8 +1203,8 @@
|
|
|
1203
1203
|
return MACD;
|
|
1204
1204
|
}());
|
|
1205
1205
|
|
|
1206
|
-
var __assign$
|
|
1207
|
-
__assign$
|
|
1206
|
+
var __assign$3 = (undefined && undefined.__assign) || function () {
|
|
1207
|
+
__assign$3 = Object.assign || function(t) {
|
|
1208
1208
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
1209
1209
|
s = arguments[i];
|
|
1210
1210
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -1212,7 +1212,7 @@
|
|
|
1212
1212
|
}
|
|
1213
1213
|
return t;
|
|
1214
1214
|
};
|
|
1215
|
-
return __assign$
|
|
1215
|
+
return __assign$3.apply(this, arguments);
|
|
1216
1216
|
};
|
|
1217
1217
|
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
1218
1218
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
@@ -1282,7 +1282,7 @@
|
|
|
1282
1282
|
else {
|
|
1283
1283
|
obv = currentVolume;
|
|
1284
1284
|
}
|
|
1285
|
-
res[i] = __assign$
|
|
1285
|
+
res[i] = __assign$3(__assign$3({}, list[i]), { obv: obv });
|
|
1286
1286
|
}
|
|
1287
1287
|
return res;
|
|
1288
1288
|
}
|
|
@@ -1290,8 +1290,8 @@
|
|
|
1290
1290
|
return Obv;
|
|
1291
1291
|
}());
|
|
1292
1292
|
|
|
1293
|
-
var __assign$
|
|
1294
|
-
__assign$
|
|
1293
|
+
var __assign$2 = (undefined && undefined.__assign) || function () {
|
|
1294
|
+
__assign$2 = Object.assign || function(t) {
|
|
1295
1295
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
1296
1296
|
s = arguments[i];
|
|
1297
1297
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -1299,7 +1299,7 @@
|
|
|
1299
1299
|
}
|
|
1300
1300
|
return t;
|
|
1301
1301
|
};
|
|
1302
|
-
return __assign$
|
|
1302
|
+
return __assign$2.apply(this, arguments);
|
|
1303
1303
|
};
|
|
1304
1304
|
var Rsi = /** @class */ (function () {
|
|
1305
1305
|
function Rsi() {
|
|
@@ -1325,7 +1325,7 @@
|
|
|
1325
1325
|
value: function (data, preList, type) {
|
|
1326
1326
|
preList.dataset.push(data);
|
|
1327
1327
|
if (preList.dataset.length < type + 1) {
|
|
1328
|
-
return __assign$
|
|
1328
|
+
return __assign$2(__assign$2({}, preList), { rsi: 0, type: type, avgGain: 0, avgLoss: 0 });
|
|
1329
1329
|
}
|
|
1330
1330
|
else {
|
|
1331
1331
|
// 计算初始增益和损失
|
|
@@ -1359,7 +1359,7 @@
|
|
|
1359
1359
|
// 计算RSI
|
|
1360
1360
|
var rs = avgGain / avgLoss;
|
|
1361
1361
|
var rsi = 100 - 100 / (1 + rs);
|
|
1362
|
-
return __assign$
|
|
1362
|
+
return __assign$2(__assign$2({}, preList), { type: type, rsi: rsi, avgGain: avgGain, avgLoss: avgLoss });
|
|
1363
1363
|
}
|
|
1364
1364
|
}
|
|
1365
1365
|
});
|
|
@@ -1547,8 +1547,8 @@
|
|
|
1547
1547
|
return Vma;
|
|
1548
1548
|
}());
|
|
1549
1549
|
|
|
1550
|
-
var __assign = (undefined && undefined.__assign) || function () {
|
|
1551
|
-
__assign = Object.assign || function(t) {
|
|
1550
|
+
var __assign$1 = (undefined && undefined.__assign) || function () {
|
|
1551
|
+
__assign$1 = Object.assign || function(t) {
|
|
1552
1552
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
1553
1553
|
s = arguments[i];
|
|
1554
1554
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
@@ -1556,7 +1556,7 @@
|
|
|
1556
1556
|
}
|
|
1557
1557
|
return t;
|
|
1558
1558
|
};
|
|
1559
|
-
return __assign.apply(this, arguments);
|
|
1559
|
+
return __assign$1.apply(this, arguments);
|
|
1560
1560
|
};
|
|
1561
1561
|
var Williams = /** @class */ (function () {
|
|
1562
1562
|
function Williams() {
|
|
@@ -1619,7 +1619,7 @@
|
|
|
1619
1619
|
var res = [];
|
|
1620
1620
|
for (var i = 0; i < list.length; i++) {
|
|
1621
1621
|
if (i < 9)
|
|
1622
|
-
res[i] = __assign(__assign({}, list[i]), { williams9: null });
|
|
1622
|
+
res[i] = __assign$1(__assign$1({}, list[i]), { williams9: null });
|
|
1623
1623
|
else {
|
|
1624
1624
|
var maxList = list.slice(i - 8, i).map(function (item) { return item["h"]; });
|
|
1625
1625
|
var minList = list.slice(i - 8, i).map(function (item) { return item["l"]; });
|
|
@@ -1627,7 +1627,7 @@
|
|
|
1627
1627
|
var min = Math.min.apply(Math, minList);
|
|
1628
1628
|
var close_2 = list[i]["c"];
|
|
1629
1629
|
var williams9 = ((max - close_2) / (max - min)) * -100;
|
|
1630
|
-
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 });
|
|
1631
1631
|
}
|
|
1632
1632
|
}
|
|
1633
1633
|
return res;
|
|
@@ -1641,7 +1641,7 @@
|
|
|
1641
1641
|
var res = [];
|
|
1642
1642
|
for (var i = 0; i < list.length; i++) {
|
|
1643
1643
|
if (i < 18)
|
|
1644
|
-
res[i] = __assign(__assign({}, list[i]), { williams18: null });
|
|
1644
|
+
res[i] = __assign$1(__assign$1({}, list[i]), { williams18: null });
|
|
1645
1645
|
else {
|
|
1646
1646
|
var maxList = list.slice(i - 17, i).map(function (item) { return item["h"]; });
|
|
1647
1647
|
var minList = list.slice(i - 17, i).map(function (item) { return item["l"]; });
|
|
@@ -1649,7 +1649,7 @@
|
|
|
1649
1649
|
var min = Math.min.apply(Math, minList);
|
|
1650
1650
|
var close_3 = list[i]["c"];
|
|
1651
1651
|
var williams18 = ((max - close_3) / (max - min)) * -100;
|
|
1652
|
-
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 });
|
|
1653
1653
|
}
|
|
1654
1654
|
}
|
|
1655
1655
|
return res;
|
|
@@ -1705,6 +1705,170 @@
|
|
|
1705
1705
|
return ObvEma;
|
|
1706
1706
|
}());
|
|
1707
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
|
+
|
|
1708
1872
|
function add(a, b) {
|
|
1709
1873
|
return a + b;
|
|
1710
1874
|
}
|
|
@@ -1748,6 +1912,7 @@
|
|
|
1748
1912
|
exports.Kd = Kd;
|
|
1749
1913
|
exports.Ma = Ma;
|
|
1750
1914
|
exports.Macd = MACD;
|
|
1915
|
+
exports.Mfi = Mfi;
|
|
1751
1916
|
exports.Obv = Obv;
|
|
1752
1917
|
exports.ObvEma = ObvEma;
|
|
1753
1918
|
exports.Rsi = Rsi;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ch20026103/anysis",
|
|
3
|
-
"version": "0.0.
|
|
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",
|
|
@@ -12,6 +12,21 @@
|
|
|
12
12
|
"module": "dist/esm/index.js",
|
|
13
13
|
"browser": "dist/umd/index.js",
|
|
14
14
|
"types": "dist/esm/index.d.ts",
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
|
|
17
|
+
"build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
|
|
18
|
+
"build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
|
|
19
|
+
"build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
|
|
20
|
+
"clean": "rimraf dist",
|
|
21
|
+
"lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
|
|
22
|
+
"prepare": "pnpm exec husky install",
|
|
23
|
+
"prettier": "pnpm exec prettier --write .",
|
|
24
|
+
"prepublishOnly": "pnpm build",
|
|
25
|
+
"published": "npm publish",
|
|
26
|
+
"unpublished": "npm unpublish --force --registry http://localhost:4873 ",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"demo": "node demo/main.js"
|
|
29
|
+
},
|
|
15
30
|
"lint-staged": {
|
|
16
31
|
"*.{js,jsx,ts,tsx,mjs}": [
|
|
17
32
|
"pnpm lint"
|
|
@@ -42,18 +57,5 @@
|
|
|
42
57
|
},
|
|
43
58
|
"vota": {
|
|
44
59
|
"node": "16.11.0"
|
|
45
|
-
},
|
|
46
|
-
"scripts": {
|
|
47
|
-
"build": "pnpm clean && pnpm build:esm && pnpm build:cjs && pnpm build:umd",
|
|
48
|
-
"build:cjs": "tsc --module commonjs --target es5 --outDir dist/cjs",
|
|
49
|
-
"build:esm": "tsc --module esnext --target es5 --outDir dist/esm",
|
|
50
|
-
"build:umd": "rollup dist/esm/index.js --file dist/umd/index.js --format umd --name anysis",
|
|
51
|
-
"clean": "rimraf dist",
|
|
52
|
-
"lint": "eslint --fix \"**/*.{js,jsx,ts,tsx,mjs}\"",
|
|
53
|
-
"prettier": "pnpm exec prettier --write .",
|
|
54
|
-
"published": "npm publish",
|
|
55
|
-
"unpublished": "npm unpublish --force --registry http://localhost:4873 ",
|
|
56
|
-
"test": "vitest",
|
|
57
|
-
"demo": "node demo/main.js"
|
|
58
60
|
}
|
|
59
|
-
}
|
|
61
|
+
}
|