- 系统架构总览:技术栈、目录结构、数据流向 - 指标引擎详解:16个指标完整原理与参数(含源码行号) - 信号评分引擎:多指标共振评分机制、动态阈值、案例分析 - 大周期偏向判定:assessBigTimeframeBias 完整说明 - EWO转换检测机制:evaluateEwoTurnForUser 逐步流程 - 飞书通知格式规范:三类通知完整格式模板 - 类型系统参考:所有 TypeScript 类型完整文档 - 数据库与存储:MySQL 表结构、缓存机制、维护指南 - 部署运维指南:Docker Compose、Nginx、飞书配置 - 开发历史与TODO:功能状态表、优先级路线图 - 优化建议汇总:9项优化建议含源码位置和预期效果
335 行
10 KiB
Markdown
335 行
10 KiB
Markdown
# tradehk 指标引擎详解
|
||
|
||
> 返回:[tradehk 文档中心](./README.md)
|
||
> 源文件:`client/src/lib/indicators.ts`
|
||
|
||
## 概述
|
||
|
||
tradehk 的指标引擎实现了 16 个技术指标,分为**基础构建块**和**应用指标**两层。所有指标均为纯函数,输入 K 线数组,输出数值数组(与输入等长,不足计算的位置填 `NaN`)。
|
||
|
||
## 基础构建块(内部函数)
|
||
|
||
这些函数不直接对外暴露,但被多个指标复用:
|
||
|
||
| 函数 | 说明 | 被哪些指标使用 |
|
||
|------|------|----------------|
|
||
| `calculateTR(highs, lows, closes)` | 真实波动幅度(True Range) | ATR、SuperTrend、DMI |
|
||
| `calculateRMA(values, period)` | Wilder 平滑移动平均(RMA) | ATR、RSI、DMI |
|
||
| `calculateStdDev(closes, period)` | 标准差 | 布林带、TTM Squeeze |
|
||
|
||
### 真实波动幅度(TR)
|
||
|
||
**公式**:`TR = max(High - Low, |High - Close_prev|, |Low - Close_prev|)`
|
||
|
||
**意义**:衡量当前K线的真实波动范围,考虑了跳空缺口。
|
||
|
||
### Wilder RMA
|
||
|
||
**公式**:`RMA[i] = RMA[i-1] × (period-1)/period + value[i] / period`
|
||
|
||
**与 EMA 的区别**:EMA 的平滑系数为 `2/(period+1)`,RMA 为 `1/period`,RMA 更平滑、反应更慢。
|
||
|
||
---
|
||
|
||
## 常开指标(核心信号引擎始终计算)
|
||
|
||
### 1. MA(简单移动平均线)
|
||
|
||
```
|
||
函数:calculateMA(closes, period)
|
||
默认参数:MA10(period=10)、MA100(period=100)
|
||
公式:MA[i] = sum(closes[i-period+1 .. i]) / period
|
||
```
|
||
|
||
**信号规则**(在 generateSignal 中):
|
||
- 价格 > MA10 且 MA10 > MA100 → `bullishCount += 1`(多头排列)
|
||
- 价格 < MA10 且 MA10 < MA100 → `bearishCount += 1`(空头排列)
|
||
|
||
**名词解释**:→ [MA 名词解释](../名词解释/EMA-指数移动平均线.md)
|
||
|
||
---
|
||
|
||
### 2. EMA(指数移动平均线)
|
||
|
||
```
|
||
函数:calculateEMA(closes, period)
|
||
平滑系数:k = 2 / (period + 1)
|
||
公式:EMA[i] = closes[i] × k + EMA[i-1] × (1-k)
|
||
```
|
||
|
||
**在 tradehk 中的用途**:
|
||
- 计算 EWO(EMA5 - EMA35)
|
||
- 计算 MACD(EMA10 - EMA20,信号线 EMA10)
|
||
- 可选叠加显示(emaPeriods 配置,默认 [12, 26])
|
||
|
||
**名词解释**:→ [EMA 名词解释](../名词解释/EMA-指数移动平均线.md)
|
||
|
||
---
|
||
|
||
### 3. EWO(艾略特波浪振荡器)
|
||
|
||
```
|
||
函数:calculateEWO(closes)
|
||
公式:EWO = EMA(5) - EMA(35)
|
||
颜色规则:EWO >= 0 → 绿色(多头);EWO < 0 → 红色(空头)
|
||
```
|
||
|
||
**信号规则**(权重最高,+2分):
|
||
- EWO 由负转正(红→绿穿越)→ `bullishCount += 2`
|
||
- EWO 由正转负(绿→红穿越)→ `bearishCount += 2`
|
||
- EWO > 0 但未穿越 → `bullishCount += 1`
|
||
- EWO < 0 但未穿越 → `bearishCount += 1`
|
||
|
||
**大周期偏向中的权重**:EWO 在 `assessBigTimeframeBias` 中权重为 2(最高),其他指标权重均为 1。
|
||
|
||
**EWO 转换通知**:当 EWO 发生颜色转换时,`marketEngine.ts` 的 `evaluateEwoTurnForUser` 函数会检测并推送飞书通知。
|
||
|
||
**名词解释**:→ [EWO 名词解释](../名词解释/EWO-艾略特波浪振荡器.md)
|
||
|
||
---
|
||
|
||
### 4. MACD(指数平滑异同移动平均线)
|
||
|
||
```
|
||
函数:calculateMACD(closes, fastPeriod=10, slowPeriod=20, signalPeriod=10)
|
||
注意:tradehk 使用 (10, 20, 10) 而非标准 (12, 26, 9)
|
||
MACD线 = EMA(10) - EMA(20)
|
||
信号线 = EMA(MACD线, 10)
|
||
柱状图 = MACD线 - 信号线
|
||
```
|
||
|
||
**信号规则**:
|
||
- MACD 上穿信号线(金叉)→ `bullishCount += 2`
|
||
- MACD 下穿信号线(死叉)→ `bearishCount += 2`
|
||
- 柱状图 > 0 且扩大 → `bullishCount += 1`
|
||
- 柱状图 < 0 且扩大 → `bearishCount += 1`
|
||
|
||
**大周期偏向中**:MACD线 vs 信号线(+1)+ 柱状图方向(+1),共最多 +2 分。
|
||
|
||
**名词解释**:→ [MACD 名词解释](../名词解释/MACD-指数移动平均线.md)
|
||
|
||
---
|
||
|
||
### 5. AO(动量振荡器,Awesome Oscillator)
|
||
|
||
```
|
||
函数:calculateAO(highs, lows)
|
||
公式:AO = SMA(中间价, 5) - SMA(中间价, 34)
|
||
中间价 = (High + Low) / 2
|
||
```
|
||
|
||
**信号规则**:
|
||
- AO 上穿零轴 → `bullishCount += 1`
|
||
- AO 下穿零轴 → `bearishCount += 1`
|
||
|
||
**大周期偏向中**:AO 方向(+1)。
|
||
|
||
**名词解释**:→ [AO 名词解释](../名词解释/AO-动量振荡器.md)
|
||
|
||
---
|
||
|
||
## 可选指标(由 IndicatorParams 控制开关)
|
||
|
||
### 6. RSI(相对强弱指数)
|
||
|
||
```
|
||
函数:calculateRSI(closes, period=14)
|
||
算法:使用 Wilder RMA 平滑
|
||
公式:RS = 平均涨幅 / 平均跌幅;RSI = 100 - 100/(1+RS)
|
||
默认参数:period=14, overbought=70, oversold=30
|
||
开关:signalUseRsi(默认 true)
|
||
```
|
||
|
||
**信号规则**:
|
||
- RSI < 30(超卖)→ `bullishCount += 1`
|
||
- RSI > 70(超买)→ `bearishCount += 1`
|
||
- RSI 从超卖区回升穿越30 → `bullishCount += 1`(反转确认)
|
||
- RSI 从超买区回落穿越70 → `bearishCount += 1`(反转确认)
|
||
|
||
**名词解释**:→ [RSI 名词解释](../名词解释/RSI-相对强弱指数.md)
|
||
|
||
---
|
||
|
||
### 7. KDJ(随机指标衍生版)
|
||
|
||
```
|
||
函数:calculateKDJ(highs, lows, closes, period=9, kSmooth=3, dSmooth=3)
|
||
RSV = (Close - LowestLow) / (HighestHigh - LowestLow) × 100
|
||
K = RMA(RSV, kSmooth)
|
||
D = RMA(K, dSmooth)
|
||
J = 3K - 2D
|
||
开关:signalUseKdj(默认 false)
|
||
```
|
||
|
||
**信号规则**:
|
||
- K 低位金叉(K上穿D且K<30)→ `bullishCount += 2`(强信号)
|
||
- K 普通金叉 → `bullishCount += 1`
|
||
- K 高位死叉(K下穿D且K>70)→ `bearishCount += 2`(强信号)
|
||
- K 普通死叉 → `bearishCount += 1`
|
||
|
||
**名词解释**:→ [KDJ 名词解释](../名词解释/KDJ-随机指标衍生版.md)
|
||
|
||
---
|
||
|
||
### 8. Stoch(随机指标)
|
||
|
||
```
|
||
函数:calculateStoch(highs, lows, closes, period=14, smooth=3)
|
||
%K = (Close - LowestLow) / (HighestHigh - LowestLow) × 100
|
||
%D = SMA(%K, smooth)
|
||
开关:signalUseStoch(默认 false)
|
||
```
|
||
|
||
**信号规则**:
|
||
- K < 20 且 D < 20 → `bullishCount += 1`(超卖)
|
||
- K > 80 且 D > 80 → `bearishCount += 1`(超买)
|
||
|
||
**名词解释**:→ [Stoch 名词解释](../名词解释/Stoch-随机指标.md)
|
||
|
||
---
|
||
|
||
### 9. StochRSI(随机相对强弱指数)
|
||
|
||
```
|
||
函数:calculateStochRSI(closes, rsiPeriod=14, stochPeriod=14, kSmooth=3, dSmooth=3)
|
||
先计算 RSI 序列,再对 RSI 序列做 Stoch 计算
|
||
开关:无独立信号开关(仅图表显示)
|
||
```
|
||
|
||
**名词解释**:→ [StochRSI 名词解释](../名词解释/StochRSI-随机相对强弱指数.md)
|
||
|
||
---
|
||
|
||
### 10. 布林带(Bollinger Bands)
|
||
|
||
```
|
||
函数:calculateBollingerBands(closes, period=20, stdDev=2)
|
||
中轨 = SMA(closes, 20)
|
||
上轨 = 中轨 + 2 × StdDev
|
||
下轨 = 中轨 - 2 × StdDev
|
||
开关:signalUseBollinger(默认 true)
|
||
```
|
||
|
||
**信号规则**:
|
||
- 价格触及下轨 → `bullishCount += 1`(超卖反弹)
|
||
- 价格触及上轨 → `bearishCount += 1`(超买回落)
|
||
- 带宽 < 2%(极度收窄)→ 警告提示"即将变盘"(不影响评分)
|
||
|
||
**名词解释**:→ [布林带名词解释](../名词解释/布林带.md)
|
||
|
||
---
|
||
|
||
### 11. MFI(资金流量指数)
|
||
|
||
```
|
||
函数:calculateMFI(highs, lows, closes, volumes, period=14)
|
||
典型价格 = (High + Low + Close) / 3
|
||
资金流量 = 典型价格 × 成交量
|
||
正负流量分别累加,MFI = 100 - 100/(1 + 正流量/负流量)
|
||
开关:无独立信号开关(仅图表显示)
|
||
```
|
||
|
||
**名词解释**:→ [MFI 名词解释](../名词解释/MFI-资金流量指数.md)
|
||
|
||
---
|
||
|
||
### 12. OBV(能量潮)
|
||
|
||
```
|
||
函数:calculateOBV(closes, volumes)
|
||
OBV[i] = OBV[i-1] + volume(若收涨)或 - volume(若收跌)
|
||
开关:无独立信号开关(仅图表显示)
|
||
```
|
||
|
||
**名词解释**:→ [OBV 名词解释](../名词解释/OBV-能量潮指标.md)
|
||
|
||
---
|
||
|
||
### 13. DMI/ADX(趋向运动指标)
|
||
|
||
```
|
||
函数:calculateDMI(highs, lows, closes, period=14)
|
||
+DI = 100 × RMA(+DM, period) / ATR
|
||
-DI = 100 × RMA(-DM, period) / ATR
|
||
ADX = RMA(|+DI - -DI| / (+DI + -DI) × 100, period)
|
||
开关:signalUseDmi(默认 false)
|
||
```
|
||
|
||
**信号规则**(仅在 ADX > 25 强趋势时生效):
|
||
- +DI 上穿 -DI(金叉)→ `bullishCount += 2`
|
||
- +DI 下穿 -DI(死叉)→ `bearishCount += 2`
|
||
- +DI > -DI(多头趋势)→ `bullishCount += 1`
|
||
- -DI > +DI(空头趋势)→ `bearishCount += 1`
|
||
|
||
**名词解释**:→ [ADX 名词解释](../名词解释/ADX-平均趋向指数.md)
|
||
|
||
---
|
||
|
||
### 14. SuperTrend(超级趋势指标)
|
||
|
||
```
|
||
函数:calculateSuperTrend(highs, lows, closes, period=10, multiplier=3)
|
||
基础上轨 = (High + Low)/2 + multiplier × ATR(period)
|
||
基础下轨 = (High + Low)/2 - multiplier × ATR(period)
|
||
方向:direction = 1(多头)或 -1(空头)
|
||
开关:signalUseSuperTrend(默认 false)
|
||
```
|
||
|
||
**信号规则**:
|
||
- 方向由 -1 转 1(转多)→ `bullishCount += 2`
|
||
- 方向由 1 转 -1(转空)→ `bearishCount += 2`
|
||
- 方向为 1(多头趋势中)→ `bullishCount += 1`
|
||
- 方向为 -1(空头趋势中)→ `bearishCount += 1`
|
||
|
||
**名词解释**:→ [SuperTrend 名词解释](../名词解释/SuperTrend-超级趋势指标.md)
|
||
|
||
---
|
||
|
||
### 15. ATR(平均真实波动幅度)
|
||
|
||
```
|
||
函数:calculateATR(highs, lows, closes, period=14)
|
||
ATR = RMA(TR, period)
|
||
```
|
||
|
||
**在 tradehk 中的用途**:被 SuperTrend 和 DMI 内部使用,不直接显示为独立指标。
|
||
|
||
**名词解释**:→ [ATR 名词解释](../名词解释/ATR-平均真实波动幅度.md)
|
||
|
||
---
|
||
|
||
### 16. TTM Squeeze(挤压动量指标)
|
||
|
||
```
|
||
函数:calculateTTMSqueeze(highs, lows, closes, bbPeriod=20, kcPeriod=20)
|
||
Squeeze 状态:布林带完全在肯特纳通道内 → squeeze=true(蓄势)
|
||
柱状图 = Close - (最高最低中点 + 布林带中轨) / 2
|
||
```
|
||
|
||
**信号规则**:柱状图方向反映动量,squeeze=true 时为蓄势状态,突破后方向即为行情方向。
|
||
|
||
**名词解释**:→ [TTM Squeeze 名词解释](../名词解释/TTM-Squeeze-挤压动量指标.md)
|
||
|
||
---
|
||
|
||
## 成交量收缩检测
|
||
|
||
```
|
||
函数:detectVolumeContraction(volumes)
|
||
逻辑:最近5根K线平均成交量 < 前20根K线平均成交量 × 0.7
|
||
```
|
||
|
||
当检测到缩量时,在信号原因列表中添加警告提示,但**不影响评分**。
|
||
|
||
---
|
||
|
||
## 指标参数配置接口
|
||
|
||
所有指标参数通过 `IndicatorParams` 接口统一管理,详见:[类型系统参考](./类型系统参考.md)
|
||
|
||
## 相关文档
|
||
|
||
- [信号评分引擎](./信号评分引擎.md) — 了解各指标如何组合评分
|
||
- [大周期偏向判定](./大周期偏向判定.md) — 了解 EWO/MACD/AO 在大周期中的权重
|
||
- [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) — 优化建议
|