@stvy/fund-indicators 1.0.0

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.
@@ -0,0 +1,633 @@
1
+ "use strict";
2
+ /**
3
+ * 技术指标模块 - 趋势、动量、震荡、通道类指标
4
+ * 基于 technicalindicators 库,所有函数接收净值序列作为输入
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.massIndex = exports.detectMAAlignment = exports.detectCrossSignal = exports.navPercentile = exports.bias = exports.dpo = exports.trix = exports.sar = exports.stochasticRSI = exports.williamsR = exports.momentum = exports.roc = exports.cci = exports.atr = exports.adx = exports.keltnerChannel = exports.donchianChannel = exports.bollingerBands = exports.kdj = exports.rsi = exports.macd = exports.kama = exports.tema = exports.dema = exports.wma = exports.ema = exports.sma = void 0;
8
+ const technicalindicators_1 = require("technicalindicators");
9
+ // ============================================================
10
+ // 辅助函数
11
+ // ============================================================
12
+ /** 将净值序列转为 high/low/close 格式(基金净值没有日内高低,三者相同) */
13
+ function navToHLC(nav) {
14
+ return nav.map((v) => ({ high: v, low: v, close: v }));
15
+ }
16
+ /** 对齐数组长度:前补 null 使其与输入等长 */
17
+ function padLeft(arr, totalLen) {
18
+ const padLen = totalLen - arr.length;
19
+ const result = new Array(padLen).fill(null);
20
+ for (const v of arr) {
21
+ result.push(v ?? null);
22
+ }
23
+ return result;
24
+ }
25
+ /** 安全取数组最后一个非 null 值 */
26
+ function lastNonNull(arr) {
27
+ for (let i = arr.length - 1; i >= 0; i--) {
28
+ if (arr[i] != null)
29
+ return arr[i];
30
+ }
31
+ return null;
32
+ }
33
+ // ============================================================
34
+ // 移动均线
35
+ // ============================================================
36
+ /** 简单移动平均线 (SMA) */
37
+ function sma(nav, period) {
38
+ const raw = technicalindicators_1.SMA.calculate({ values: nav, period });
39
+ const values = padLeft(raw, nav.length);
40
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
41
+ }
42
+ exports.sma = sma;
43
+ /** 指数移动平均线 (EMA) */
44
+ function ema(nav, period) {
45
+ const raw = technicalindicators_1.EMA.calculate({ values: nav, period });
46
+ const values = padLeft(raw, nav.length);
47
+ return { values, current: lastNonNull(values), period, type: 'EMA' };
48
+ }
49
+ exports.ema = ema;
50
+ /** 加权移动平均线 (WMA) */
51
+ function wma(nav, period) {
52
+ const raw = technicalindicators_1.WMA.calculate({ values: nav, period });
53
+ const values = padLeft(raw, nav.length);
54
+ return { values, current: lastNonNull(values), period, type: 'WMA' };
55
+ }
56
+ exports.wma = wma;
57
+ /** 双重指数移动平均线 (DEMA) */
58
+ function dema(nav, period) {
59
+ // DEMA = 2*EMA - EMA(EMA)
60
+ const ema1 = technicalindicators_1.EMA.calculate({ values: nav, period });
61
+ const ema1Padded = padLeft(ema1, nav.length);
62
+ // 取非null部分做第二次EMA
63
+ const ema1Values = ema1.filter((v) => v !== undefined);
64
+ const ema2 = technicalindicators_1.EMA.calculate({ values: ema1Values, period });
65
+ const values = new Array(nav.length).fill(null);
66
+ const offset = nav.length - ema1Values.length;
67
+ for (let i = 0; i < ema2.length; i++) {
68
+ const idx = offset + i;
69
+ if (idx < nav.length && ema2[i] != null && ema1Padded[idx] != null) {
70
+ values[idx] = 2 * ema1Padded[idx] - ema2[i];
71
+ }
72
+ }
73
+ return { values, current: lastNonNull(values), period, type: 'DEMA' };
74
+ }
75
+ exports.dema = dema;
76
+ /** 三重指数移动平均线 (TEMA) */
77
+ function tema(nav, period) {
78
+ const ema1Raw = technicalindicators_1.EMA.calculate({ values: nav, period });
79
+ const ema1Vals = ema1Raw.filter((v) => v !== undefined);
80
+ const ema2Raw = technicalindicators_1.EMA.calculate({ values: ema1Vals, period });
81
+ const ema2Vals = ema2Raw.filter((v) => v !== undefined);
82
+ const ema3Raw = technicalindicators_1.EMA.calculate({ values: ema2Vals, period });
83
+ // 将三层 EMA 全部填充到与 nav 等长
84
+ const ema1Padded = padLeft(ema1Raw, nav.length);
85
+ // ema2 的起始位置相对 ema1 又偏移了一截
86
+ const offset2 = nav.length - ema1Vals.length;
87
+ const ema2Full = new Array(nav.length).fill(null);
88
+ for (let i = 0; i < ema2Raw.length; i++) {
89
+ const idx = offset2 + i;
90
+ if (idx < nav.length)
91
+ ema2Full[idx] = ema2Raw[i] ?? null;
92
+ }
93
+ // ema3 的起始位置相对 ema2 又偏移了一截
94
+ const offset3 = offset2 + (ema1Vals.length - ema2Vals.length);
95
+ const ema3Full = new Array(nav.length).fill(null);
96
+ for (let i = 0; i < ema3Raw.length; i++) {
97
+ const idx = offset3 + i;
98
+ if (idx < nav.length)
99
+ ema3Full[idx] = ema3Raw[i] ?? null;
100
+ }
101
+ // TEMA = 3*EMA1 - 3*EMA2 + EMA3
102
+ const values = new Array(nav.length).fill(null);
103
+ for (let i = 0; i < nav.length; i++) {
104
+ const v1 = ema1Padded[i];
105
+ const v2 = ema2Full[i];
106
+ const v3 = ema3Full[i];
107
+ if (v1 != null && v2 != null && v3 != null) {
108
+ values[i] = 3 * v1 - 3 * v2 + v3;
109
+ }
110
+ }
111
+ return { values, current: lastNonNull(values), period, type: 'TEMA' };
112
+ }
113
+ exports.tema = tema;
114
+ /** 考夫曼自适应均线 (KAMA) - 手动实现 */
115
+ function kama(nav, period = 10, fast = 2, slow = 30) {
116
+ const fastSC = 2 / (fast + 1);
117
+ const slowSC = 2 / (slow + 1);
118
+ const values = new Array(nav.length).fill(null);
119
+ if (nav.length <= period)
120
+ return { values, current: null, period, type: 'KAMA' };
121
+ values[period] = nav[period];
122
+ for (let i = period + 1; i < nav.length; i++) {
123
+ // direction: 当前值与period前的值的绝对差
124
+ const direction = Math.abs(nav[i] - nav[i - period]);
125
+ // volatility: period内相邻差值绝对值之和
126
+ let volatility = 0;
127
+ for (let j = i - period + 1; j <= i; j++) {
128
+ volatility += Math.abs(nav[j] - nav[j - 1]);
129
+ }
130
+ // efficiency ratio
131
+ const er = volatility === 0 ? 0 : direction / volatility;
132
+ // smoothing constant
133
+ const sc = Math.pow(er * (fastSC - slowSC) + slowSC, 2);
134
+ // KAMA
135
+ const prevKama = values[i - 1];
136
+ values[i] = prevKama + sc * (nav[i] - prevKama);
137
+ }
138
+ return { values, current: lastNonNull(values), period, type: 'KAMA' };
139
+ }
140
+ exports.kama = kama;
141
+ // ============================================================
142
+ // MACD
143
+ // ============================================================
144
+ /**
145
+ * MACD 指标(DIF / DEA / 柱状线)
146
+ * @param nav 净值序列
147
+ * @param fastPeriod 快线周期(默认12)
148
+ * @param slowPeriod 慢线周期(默认26)
149
+ * @param signalPeriod 信号线周期(默认9)
150
+ */
151
+ function macd(nav, fastPeriod = 12, slowPeriod = 26, signalPeriod = 9) {
152
+ const raw = technicalindicators_1.MACD.calculate({
153
+ values: nav,
154
+ fastPeriod,
155
+ slowPeriod,
156
+ signalPeriod,
157
+ SimpleMAOscillator: false,
158
+ SimpleMASignal: false,
159
+ });
160
+ const dif = padLeft(raw.map((r) => r.MACD), nav.length);
161
+ const dea = padLeft(raw.map((r) => r.signal), nav.length);
162
+ const histogram = padLeft(raw.map((r) => r.histogram), nav.length);
163
+ return {
164
+ dif,
165
+ dea,
166
+ histogram,
167
+ currentDIF: lastNonNull(dif),
168
+ currentDEA: lastNonNull(dea),
169
+ currentHistogram: lastNonNull(histogram),
170
+ };
171
+ }
172
+ exports.macd = macd;
173
+ // ============================================================
174
+ // RSI
175
+ // ============================================================
176
+ /** RSI(相对强弱指标) */
177
+ function rsi(nav, period = 14) {
178
+ const raw = technicalindicators_1.RSI.calculate({ values: nav, period });
179
+ const values = padLeft(raw, nav.length);
180
+ return { values, current: lastNonNull(values), period };
181
+ }
182
+ exports.rsi = rsi;
183
+ // ============================================================
184
+ // KDJ(随机指标,含 J 值)
185
+ // ============================================================
186
+ /**
187
+ * KDJ 指标
188
+ * @param nav 净值序列
189
+ * @param kPeriod K 周期(默认9)
190
+ * @param kSmooth K 平滑因子(默认3)
191
+ * @param dPeriod D 周期(默认3)
192
+ */
193
+ function kdj(nav, kPeriod = 9, kSmooth = 3, dPeriod = 3) {
194
+ const hlc = navToHLC(nav);
195
+ const raw = technicalindicators_1.Stochastic.calculate({
196
+ high: hlc.map((h) => h.high),
197
+ low: hlc.map((h) => h.low),
198
+ close: hlc.map((h) => h.close),
199
+ period: kPeriod,
200
+ signalPeriod: dPeriod,
201
+ });
202
+ const kArr = padLeft(raw.map((r) => r.k), nav.length);
203
+ const dArr = padLeft(raw.map((r) => r.d), nav.length);
204
+ // J = 3K - 2D
205
+ const jArr = kArr.map((kVal, i) => {
206
+ const dVal = dArr[i];
207
+ if (kVal != null && dVal != null)
208
+ return 3 * kVal - 2 * dVal;
209
+ return null;
210
+ });
211
+ return {
212
+ k: kArr,
213
+ d: dArr,
214
+ j: jArr,
215
+ currentK: lastNonNull(kArr),
216
+ currentD: lastNonNull(dArr),
217
+ currentJ: lastNonNull(jArr),
218
+ };
219
+ }
220
+ exports.kdj = kdj;
221
+ // ============================================================
222
+ // 布林带
223
+ // ============================================================
224
+ /**
225
+ * 布林带 (Bollinger Bands)
226
+ * @param nav 净值序列
227
+ * @param period 均线周期(默认20)
228
+ * @param stdDev 标准差倍数(默认2)
229
+ */
230
+ function bollingerBands(nav, period = 20, stdDev = 2) {
231
+ const raw = technicalindicators_1.BollingerBands.calculate({ values: nav, period, stdDev });
232
+ const middle = padLeft(raw.map((r) => r.middle), nav.length);
233
+ const upper = padLeft(raw.map((r) => r.upper), nav.length);
234
+ const lower = padLeft(raw.map((r) => r.lower), nav.length);
235
+ // 计算带宽和 %B
236
+ const bandwidth = [];
237
+ const percentB = [];
238
+ for (let i = 0; i < nav.length; i++) {
239
+ const m = middle[i];
240
+ const u = upper[i];
241
+ const l = lower[i];
242
+ if (m != null && u != null && l != null) {
243
+ bandwidth.push((u - l) / m);
244
+ percentB.push(u === l ? 0.5 : (nav[i] - l) / (u - l));
245
+ }
246
+ else {
247
+ bandwidth.push(null);
248
+ percentB.push(null);
249
+ }
250
+ }
251
+ return { middle, upper, lower, bandwidth, percentB };
252
+ }
253
+ exports.bollingerBands = bollingerBands;
254
+ // ============================================================
255
+ // 唐奇安通道 (Donchian Channel)
256
+ // ============================================================
257
+ /**
258
+ * 唐奇安通道
259
+ * @param nav 净值序列
260
+ * @param period 回看周期(默认20)
261
+ */
262
+ function donchianChannel(nav, period = 20) {
263
+ const upper = [];
264
+ const lower = [];
265
+ const middle = [];
266
+ for (let i = 0; i < nav.length; i++) {
267
+ if (i < period - 1) {
268
+ upper.push(null);
269
+ lower.push(null);
270
+ middle.push(null);
271
+ continue;
272
+ }
273
+ const slice = nav.slice(i - period + 1, i + 1);
274
+ const high = Math.max(...slice);
275
+ const low = Math.min(...slice);
276
+ upper.push(high);
277
+ lower.push(low);
278
+ middle.push((high + low) / 2);
279
+ }
280
+ return { upper, lower, middle };
281
+ }
282
+ exports.donchianChannel = donchianChannel;
283
+ // ============================================================
284
+ // 肯特纳通道 (Keltner Channel)
285
+ // ============================================================
286
+ /**
287
+ * 肯特纳通道
288
+ * @param nav 净值序列
289
+ * @param emaPeriod EMA 周期(默认20)
290
+ * @param atrPeriod ATR 周期(默认10)
291
+ * @param multiplier ATR 倍数(默认2)
292
+ */
293
+ function keltnerChannel(nav, emaPeriod = 20, atrPeriod = 10, multiplier = 2) {
294
+ const emaResult = ema(nav, emaPeriod);
295
+ const atrResult = atr(nav, atrPeriod);
296
+ const upper = [];
297
+ const lower = [];
298
+ for (let i = 0; i < nav.length; i++) {
299
+ const e = emaResult.values[i];
300
+ const a = atrResult.values[i];
301
+ if (e != null && a != null) {
302
+ upper.push(e + multiplier * a);
303
+ lower.push(e - multiplier * a);
304
+ }
305
+ else {
306
+ upper.push(null);
307
+ lower.push(null);
308
+ }
309
+ }
310
+ return { upper, lower, middle: emaResult.values };
311
+ }
312
+ exports.keltnerChannel = keltnerChannel;
313
+ // ============================================================
314
+ // ADX(平均趋向指标)
315
+ // ============================================================
316
+ /** ADX + DI */
317
+ function adx(nav, period = 14) {
318
+ const hlc = navToHLC(nav);
319
+ const raw = technicalindicators_1.ADX.calculate({
320
+ high: hlc.map((h) => h.high),
321
+ low: hlc.map((h) => h.low),
322
+ close: hlc.map((h) => h.close),
323
+ period,
324
+ });
325
+ const adxArr = padLeft(raw.map((r) => r.adx), nav.length);
326
+ const plusDI = padLeft(raw.map((r) => r.pdi), nav.length);
327
+ const minusDI = padLeft(raw.map((r) => r.mdi), nav.length);
328
+ return {
329
+ adx: adxArr,
330
+ plusDI,
331
+ minusDI,
332
+ currentADX: lastNonNull(adxArr),
333
+ };
334
+ }
335
+ exports.adx = adx;
336
+ // ============================================================
337
+ // ATR(平均真实波幅 - 基于净值近似)
338
+ // ============================================================
339
+ /** ATR 近似值(基金净值无日内高低,用日涨跌幅绝对值近似) */
340
+ function atr(nav, period = 14) {
341
+ const hlc = navToHLC(nav);
342
+ const raw = technicalindicators_1.ATR.calculate({
343
+ high: hlc.map((h) => h.high),
344
+ low: hlc.map((h) => h.low),
345
+ close: hlc.map((h) => h.close),
346
+ period,
347
+ });
348
+ // 由于净值无日内波动,ATR 退化为 EMA(|ΔP|)
349
+ // 这里直接用技术库输出
350
+ const values = padLeft(raw, nav.length);
351
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
352
+ }
353
+ exports.atr = atr;
354
+ // ============================================================
355
+ // CCI(商品通道指数)
356
+ // ============================================================
357
+ /** CCI */
358
+ function cci(nav, period = 20) {
359
+ const hlc = navToHLC(nav);
360
+ const raw = technicalindicators_1.CCI.calculate({
361
+ high: hlc.map((h) => h.high),
362
+ low: hlc.map((h) => h.low),
363
+ close: hlc.map((h) => h.close),
364
+ period,
365
+ });
366
+ const values = padLeft(raw, nav.length);
367
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
368
+ }
369
+ exports.cci = cci;
370
+ // ============================================================
371
+ // ROC(变动率)
372
+ // ============================================================
373
+ /** ROC */
374
+ function roc(nav, period = 12) {
375
+ const raw = technicalindicators_1.ROC.calculate({ values: nav, period });
376
+ const values = padLeft(raw, nav.length);
377
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
378
+ }
379
+ exports.roc = roc;
380
+ // ============================================================
381
+ // 动量指标 (Momentum)
382
+ // ============================================================
383
+ /** 动量指标 = 当前净值 - N日前净值 */
384
+ function momentum(nav, period = 10) {
385
+ const values = [];
386
+ for (let i = 0; i < nav.length; i++) {
387
+ if (i < period) {
388
+ values.push(null);
389
+ }
390
+ else {
391
+ values.push(nav[i] - nav[i - period]);
392
+ }
393
+ }
394
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
395
+ }
396
+ exports.momentum = momentum;
397
+ // ============================================================
398
+ // Williams %R(威廉指标)
399
+ // ============================================================
400
+ /** Williams %R */
401
+ function williamsR(nav, period = 14) {
402
+ const hlc = navToHLC(nav);
403
+ const raw = technicalindicators_1.WilliamsR.calculate({
404
+ high: hlc.map((h) => h.high),
405
+ low: hlc.map((h) => h.low),
406
+ close: hlc.map((h) => h.close),
407
+ period,
408
+ });
409
+ const values = padLeft(raw, nav.length);
410
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
411
+ }
412
+ exports.williamsR = williamsR;
413
+ // ============================================================
414
+ // Stochastic RSI
415
+ // ============================================================
416
+ /** 随机 RSI */
417
+ function stochasticRSI(nav, rsiPeriod = 14, stochPeriod = 14, kPeriod = 3, dPeriod = 3) {
418
+ const raw = technicalindicators_1.StochasticRSI.calculate({
419
+ values: nav,
420
+ rsiPeriod,
421
+ stochasticPeriod: stochPeriod,
422
+ kPeriod,
423
+ dPeriod,
424
+ });
425
+ const k = padLeft(raw.map((r) => r.k), nav.length);
426
+ const d = padLeft(raw.map((r) => r.d), nav.length);
427
+ const j = k.map((kVal, i) => {
428
+ const dVal = d[i];
429
+ return kVal != null && dVal != null ? 3 * kVal - 2 * dVal : null;
430
+ });
431
+ return { k, d, j, currentK: lastNonNull(k), currentD: lastNonNull(d), currentJ: lastNonNull(j) };
432
+ }
433
+ exports.stochasticRSI = stochasticRSI;
434
+ // ============================================================
435
+ // SAR(抛物线转向)
436
+ // ============================================================
437
+ /**
438
+ * SAR 抛物线转向
439
+ * @param nav 净值序列
440
+ * @param step 加速因子步长(默认0.02)
441
+ * @param max 最大加速因子(默认0.2)
442
+ */
443
+ function sar(nav, step = 0.02, max = 0.2) {
444
+ const hlc = navToHLC(nav);
445
+ const raw = technicalindicators_1.PSAR.calculate({
446
+ high: hlc.map((h) => h.high),
447
+ low: hlc.map((h) => h.low),
448
+ step,
449
+ max,
450
+ });
451
+ const values = padLeft(raw, nav.length);
452
+ return { values, current: lastNonNull(values) };
453
+ }
454
+ exports.sar = sar;
455
+ // ============================================================
456
+ // TRIX(三重平滑指数)
457
+ // ============================================================
458
+ /** TRIX = 三重 EMA 的变化率 */
459
+ function trix(nav, period = 12) {
460
+ const ema1 = technicalindicators_1.EMA.calculate({ values: nav, period });
461
+ const ema1Vals = ema1.filter((v) => v !== undefined);
462
+ const ema2 = technicalindicators_1.EMA.calculate({ values: ema1Vals, period });
463
+ const ema2Vals = ema2.filter((v) => v !== undefined);
464
+ const ema3 = technicalindicators_1.EMA.calculate({ values: ema2Vals, period });
465
+ const values = new Array(nav.length).fill(null);
466
+ const offset = nav.length - ema3.length;
467
+ for (let i = 1; i < ema3.length; i++) {
468
+ const prev = ema3[i - 1];
469
+ const curr = ema3[i];
470
+ if (prev != null && curr != null && prev !== 0) {
471
+ values[offset + i] = ((curr - prev) / prev) * 100;
472
+ }
473
+ }
474
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
475
+ }
476
+ exports.trix = trix;
477
+ // ============================================================
478
+ // DPO(去趋势价格震荡器)
479
+ // ============================================================
480
+ /** DPO = 净值 - N/2+1 日前的 SMA */
481
+ function dpo(nav, period = 20) {
482
+ const smaResult = sma(nav, period);
483
+ const shift = Math.floor(period / 2) + 1;
484
+ const values = [];
485
+ for (let i = 0; i < nav.length; i++) {
486
+ const smaIdx = i + shift;
487
+ if (smaIdx < nav.length && smaResult.values[smaIdx] != null) {
488
+ values.push(nav[i] - smaResult.values[smaIdx]);
489
+ }
490
+ else {
491
+ values.push(null);
492
+ }
493
+ }
494
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
495
+ }
496
+ exports.dpo = dpo;
497
+ // ============================================================
498
+ // 均线偏离度 (BIAS / 乖离率)
499
+ // ============================================================
500
+ /** 乖离率 = (净值 - MA) / MA * 100 */
501
+ function bias(nav, period = 20) {
502
+ const maResult = sma(nav, period);
503
+ const values = [];
504
+ for (let i = 0; i < nav.length; i++) {
505
+ const m = maResult.values[i];
506
+ if (m != null && m !== 0) {
507
+ values.push(((nav[i] - m) / m) * 100);
508
+ }
509
+ else {
510
+ values.push(null);
511
+ }
512
+ }
513
+ return { values, current: lastNonNull(values), period, type: 'SMA' };
514
+ }
515
+ exports.bias = bias;
516
+ // ============================================================
517
+ // 净值百分位
518
+ // ============================================================
519
+ /**
520
+ * 净值百分位 - 当前净值在历史区间中所处的百分位
521
+ * @param nav 净值序列
522
+ * @param lookback 回看窗口(默认全部历史)
523
+ * @returns 0-100 的百分位值
524
+ */
525
+ function navPercentile(nav, lookback) {
526
+ const window = lookback ? nav.slice(-lookback) : nav;
527
+ const current = nav[nav.length - 1];
528
+ const sorted = [...window].sort((a, b) => a - b);
529
+ let rank = 0;
530
+ for (const v of sorted) {
531
+ if (v < current)
532
+ rank++;
533
+ else if (v === current)
534
+ rank += 0.5;
535
+ }
536
+ return (rank / sorted.length) * 100;
537
+ }
538
+ exports.navPercentile = navPercentile;
539
+ // ============================================================
540
+ // 均线交叉信号检测
541
+ // ============================================================
542
+ /** 检测短期均线与长期均线的交叉信号 */
543
+ function detectCrossSignal(fastMA, slowMA, lookback = 5) {
544
+ const fVals = fastMA.values;
545
+ const sVals = slowMA.values;
546
+ const len = Math.min(fVals.length, sVals.length);
547
+ for (let i = len - 1; i >= Math.max(1, len - lookback); i--) {
548
+ const fCurr = fVals[i];
549
+ const fPrev = fVals[i - 1];
550
+ const sCurr = sVals[i];
551
+ const sPrev = sVals[i - 1];
552
+ if (fCurr == null || fPrev == null || sCurr == null || sPrev == null)
553
+ continue;
554
+ // 金叉:快线从下方穿越慢线
555
+ if (fPrev <= sPrev && fCurr > sCurr) {
556
+ return { type: 'golden_cross', index: i, fastValue: fCurr, slowValue: sCurr };
557
+ }
558
+ // 死叉:快线从上方穿越慢线
559
+ if (fPrev >= sPrev && fCurr < sCurr) {
560
+ return { type: 'death_cross', index: i, fastValue: fCurr, slowValue: sCurr };
561
+ }
562
+ }
563
+ return { type: 'none', index: -1, fastValue: 0, slowValue: 0 };
564
+ }
565
+ exports.detectCrossSignal = detectCrossSignal;
566
+ // ============================================================
567
+ // 均线排列状态
568
+ // ============================================================
569
+ /**
570
+ * 检测均线多空排列
571
+ * @param maList 从短期到长期排列的均线结果列表
572
+ */
573
+ function detectMAAlignment(maList) {
574
+ const maValues = maList.map((m) => m.current ?? 0);
575
+ const allValid = maList.every((m) => m.current != null);
576
+ if (!allValid) {
577
+ return { alignment: 'neutral', maValues, divergence: 0 };
578
+ }
579
+ // 多头排列:短期 > 长期(递减)
580
+ let isBullish = true;
581
+ let isBearish = true;
582
+ for (let i = 1; i < maValues.length; i++) {
583
+ if (maValues[i] >= maValues[i - 1])
584
+ isBullish = false;
585
+ if (maValues[i] <= maValues[i - 1])
586
+ isBearish = false;
587
+ }
588
+ // 计算发散度(标准差)
589
+ const mean = maValues.reduce((a, b) => a + b, 0) / maValues.length;
590
+ const variance = maValues.reduce((sum, v) => sum + (v - mean) ** 2, 0) / maValues.length;
591
+ const divergence = Math.sqrt(variance);
592
+ const alignment = isBullish ? 'bullish' : isBearish ? 'bearish' : 'neutral';
593
+ return { alignment, maValues, divergence };
594
+ }
595
+ exports.detectMAAlignment = detectMAAlignment;
596
+ // ============================================================
597
+ // Mass Index(质量指数)
598
+ // ============================================================
599
+ /**
600
+ * Mass Index - 基于 EMA 的波动范围比率累积,用于识别变盘点
601
+ * @param nav 净值序列
602
+ * @param emaPeriod EMA 周期(默认9)
603
+ * @param sumPeriod 累积周期(默认25)
604
+ */
605
+ function massIndex(nav, emaPeriod = 9, sumPeriod = 25) {
606
+ // 由于净值没有 high/low,使用 EMA 的变化幅度近似
607
+ const ema1 = technicalindicators_1.EMA.calculate({ values: nav, period: emaPeriod });
608
+ const ema1Vals = ema1.filter((v) => v !== undefined);
609
+ const ema2 = technicalindicators_1.EMA.calculate({ values: ema1Vals, period: emaPeriod });
610
+ const ratios = [];
611
+ for (let i = 0; i < ema2.length; i++) {
612
+ const e1 = ema1Vals[i + (ema1Vals.length - ema2.length)];
613
+ const e2 = ema2[i];
614
+ if (e1 != null && e2 != null && e2 !== 0) {
615
+ ratios.push(e1 / e2);
616
+ }
617
+ else {
618
+ ratios.push(1);
619
+ }
620
+ }
621
+ const values = new Array(nav.length).fill(null);
622
+ const offset = nav.length - ratios.length;
623
+ for (let i = sumPeriod - 1; i < ratios.length; i++) {
624
+ let sum = 0;
625
+ for (let j = i - sumPeriod + 1; j <= i; j++) {
626
+ sum += ratios[j];
627
+ }
628
+ values[offset + i] = sum;
629
+ }
630
+ return { values, current: lastNonNull(values), period: sumPeriod, type: 'SMA' };
631
+ }
632
+ exports.massIndex = massIndex;
633
+ //# sourceMappingURL=technical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"technical.js","sourceRoot":"","sources":["../src/technical.ts"],"names":[],"mappings":"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"}