/** * 技术指标纯函数实现(零 dsh 依赖,可独立测试)。 * * 对齐约定(与 DESIGN.md 一致): * - 输出与输入等长,头部无法计算的窗口位置为 `null`(模型可按索引对齐) * - 空输入或 window > 长度 → 全 null(合法结果) * - 前置条件(由调用方保证):window >= 1 且为整数;输入数组只含有限数 * - 违反前置条件抛 RangeError/TypeError(execute 层负责转成模型可见错误) */ /** 简单移动平均。头部 window-1 个 null。 */ export declare function sma(values: readonly number[], window: number): (number | null)[]; /** * 指数移动平均(TA-Lib 风格):seed = 前 window 个值的简单平均, * 之后 EMA[i] = alpha * values[i] + (1 - alpha) * EMA[i-1],alpha = 2/(window+1)。 * 头部 window-1 个 null,与 sma 对齐。 */ export declare function ema(values: readonly number[], window: number): (number | null)[]; /** * 相对强弱指数(Wilder 平滑)。 * 需要 window+1 个值才有第一个有效点,因此头部 window 个 null, * 第一个有效值在 index window。 */ export declare function rsi(values: readonly number[], window: number): (number | null)[]; export interface MacdOutput { /** 等长;头部 slow-1 个 null */ macd: (number | null)[]; /** 等长;头部 slow+signal-2 个 null */ signal: (number | null)[]; /** 等长;头部 slow+signal-2 个 null */ histogram: (number | null)[]; } /** * MACD:macd = EMA(fast) - EMA(slow);signal = EMA(signal) of macd; * histogram = macd - signal。要求 fast < slow。 */ export declare function macd(values: readonly number[], fast: number, slow: number, signal: number): MacdOutput; export interface BollingerOutput { upper: (number | null)[]; middle: (number | null)[]; lower: (number | null)[]; } /** 布林带:middle = SMA,band = multiplier * 总体标准差(除以 n)。头部 window-1 个 null。 */ export declare function bollinger(values: readonly number[], window: number, multiplier: number): BollingerOutput; /** * 平均真实波幅(Wilder):TR = max(h-l, |h-pc|, |l-pc|),首个 TR = h[0]-l[0]。 * 第一个 ATR = 前 window 个 TR 的简单平均;之后递归平滑。 * 头部 window 个 null,第一个有效值在 index window。三个输入必须等长。 */ export declare function atr(high: readonly number[], low: readonly number[], close: readonly number[], window: number): (number | null)[]; /** execute 层用的有限数检查:返回违规说明,无违规返回 null。 */ export declare function firstNonFinite(values: readonly number[]): number | null; export interface KdjOutput { k: (number | null)[]; d: (number | null)[]; j: (number | null)[]; } /** * KDJ 随机指标(RSV 法,K/D 初始 50):K = (2*K_prev + RSV)/3, * D = (2*D_prev + K)/3,J = 3K - 2D。头部 window-1 个 null。 */ export declare function kdj(high: readonly number[], low: readonly number[], close: readonly number[], window: number): KdjOutput; /** * 威廉指标 W%R:W%R = (Hn - C) / (Hn - Ln) * -100(区间 -100..0)。 * 头部 window-1 个 null。 */ export declare function williamsR(high: readonly number[], low: readonly number[], close: readonly number[], window: number): (number | null)[]; /** * 顺势指标 CCI:CCI = (TP - SMA(TP,n)) / (0.015 * 平均绝对偏差)。 * 头部 window-1 个 null。 */ export declare function cci(high: readonly number[], low: readonly number[], close: readonly number[], window: number): (number | null)[]; /** * 能量潮 OBV:OBV[0] = 0;之后按收盘涨跌加减成交量。输出等长、无 null。 */ export declare function obv(close: readonly number[], volume: readonly number[]): number[]; export interface AdxOutput { adx: (number | null)[]; plusDi: (number | null)[]; minusDi: (number | null)[]; } /** * 趋向指标 DMI/ADX(Wilder):+DM/-DM/TR 平滑 14 期 → +DI/-DI → * DX = 100*|+DI-(-DI)|/(+DI+(-DI)) → ADX = DX 的 Wilder 平滑。 * +DI/-DI 从 index window 起有效;ADX 从 index 2*window-2 起有效(更早为 null)。 */ export declare function adx(high: readonly number[], low: readonly number[], close: readonly number[], window: number): AdxOutput; /** * 变动率 ROC:ROC = (C - C[n 前]) / C[n 前] * 100。头部 window 个 null。 */ export declare function roc(values: readonly number[], window: number): (number | null)[];