feat: 新增 tradehk 专属 Wiki 文档体系(10个文档)
- 系统架构总览:技术栈、目录结构、数据流向 - 指标引擎详解:16个指标完整原理与参数(含源码行号) - 信号评分引擎:多指标共振评分机制、动态阈值、案例分析 - 大周期偏向判定:assessBigTimeframeBias 完整说明 - EWO转换检测机制:evaluateEwoTurnForUser 逐步流程 - 飞书通知格式规范:三类通知完整格式模板 - 类型系统参考:所有 TypeScript 类型完整文档 - 数据库与存储:MySQL 表结构、缓存机制、维护指南 - 部署运维指南:Docker Compose、Nginx、飞书配置 - 开发历史与TODO:功能状态表、优先级路线图 - 优化建议汇总:9项优化建议含源码位置和预期效果
这个提交包含在:
168
wiki/tradehk/EWO转换检测机制.md
普通文件
168
wiki/tradehk/EWO转换检测机制.md
普通文件
@@ -0,0 +1,168 @@
|
||||
# tradehk EWO 转换检测机制
|
||||
|
||||
> 返回:[tradehk 文档中心](./README.md)
|
||||
> 源函数:`evaluateEwoTurnForUser()` — `server/_core/marketEngine.ts` 第 611-700 行
|
||||
|
||||
## 概述
|
||||
|
||||
EWO 转换检测是 tradehk 最核心的通知功能。当 EWO 指标发生颜色转换(红→绿或绿→红)时,系统会自动检测并通过飞书 Webhook 推送通知。
|
||||
|
||||
## 触发条件
|
||||
|
||||
EWO 颜色定义:
|
||||
- **绿色(多头)**:EWO 值 >= 0
|
||||
- **红色(空头)**:EWO 值 < 0
|
||||
|
||||
转换方向:
|
||||
- `red_to_green`:EWO 由负转正(空头转多头)
|
||||
- `green_to_red`:EWO 由正转负(多头转空头)
|
||||
|
||||
## 检测流程(逐步说明)
|
||||
|
||||
### 第一步:获取已收线的 K 线
|
||||
|
||||
```
|
||||
取最后两根已收线 K 线的索引:
|
||||
- lastClosedIndex:最新已收线 K 线
|
||||
- prevClosedIndex:倒数第二根已收线 K 线
|
||||
|
||||
"已收线"判断:candle.time + intervalSeconds <= nowSeconds
|
||||
```
|
||||
|
||||
**为什么只用已收线?**
|
||||
|
||||
未收线的 K 线 EWO 值会随价格变化而变化,使用未收线数据会导致大量假通知。tradehk 严格使用已收线确认,确保通知的可靠性。
|
||||
|
||||
### 第二步:计算 EWO 值
|
||||
|
||||
```
|
||||
对截至 lastClosedIndex 的所有 K 线计算 EWO 序列
|
||||
ewoPrev = ewoSeries[prevClosedIndex]
|
||||
ewoNow = ewoSeries[lastClosedIndex]
|
||||
```
|
||||
|
||||
### 第三步:判断颜色是否转换
|
||||
|
||||
```
|
||||
prevColor = ewoPrev >= 0 ? "green" : "red"
|
||||
nowColor = ewoNow >= 0 ? "green" : "red"
|
||||
|
||||
如果 prevColor === nowColor → 无转换,跳过
|
||||
```
|
||||
|
||||
### 第四步:计算上一阶段持续时间
|
||||
|
||||
从 `prevClosedIndex` 向前遍历,找到上一阶段(同颜色)的起始点:
|
||||
|
||||
```
|
||||
runStartIndex = prevClosedIndex
|
||||
向前遍历:
|
||||
if ewoSeries[i] 颜色 === prevColor → runStartIndex = i
|
||||
else → 停止
|
||||
|
||||
runStartTs = candles[runStartIndex].time × 1000
|
||||
runEndTs = candles[prevClosedIndex].time × 1000 + intervalMs
|
||||
runCandles = prevClosedIndex - runStartIndex + 1
|
||||
runDurationMs = max(intervalMs, runEndTs - runStartTs)
|
||||
```
|
||||
|
||||
### 第五步:去重检查
|
||||
|
||||
```
|
||||
dedupeKey = "ewo_turn:{symbol}:{interval}:{direction}:{transitionBucketTs}"
|
||||
|
||||
consumeSharedEwoTurnDedupeSlot(dedupeKey, transitionBucketTs)
|
||||
→ 同一根K线的同方向转换只推送一次
|
||||
```
|
||||
|
||||
**去重的必要性**:引擎每30秒轮询一次,同一根K线可能被检测多次,去重确保每次转换只通知一次。
|
||||
|
||||
### 第六步:构建并推送通知
|
||||
|
||||
通知内容格式(以实际案例为例):
|
||||
|
||||
```
|
||||
标题:EWO转换提醒 BTC/10m EWO 红 -> 绿
|
||||
|
||||
内容:
|
||||
触发规则: EWO 红 -> 绿
|
||||
币对: BTC/10m
|
||||
转换确认: 已收线确认
|
||||
转换收线: 2026/03/06 10:10:00 (Asia/Shanghai)
|
||||
EWO: -29.048617 -> 33.320837
|
||||
上一阶段: 红(空头)
|
||||
持续: 4小时30分钟 (27根10mK)
|
||||
区间: 2026/03/06 05:30:00 ~ 2026/03/06 10:00:00
|
||||
当前: 绿(多头)
|
||||
```
|
||||
|
||||
## 通知字段说明
|
||||
|
||||
| 字段 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| 触发规则 | 转换方向 | EWO 红 -> 绿 |
|
||||
| 币对 | 交易对/周期 | BTC/10m |
|
||||
| 转换确认 | 确认方式 | 已收线确认 |
|
||||
| 转换收线 | 触发转换的K线收线时间 | 2026/03/06 10:10:00 |
|
||||
| EWO | 前值 → 当前值 | -29.048617 -> 33.320837 |
|
||||
| 上一阶段 | 转换前的颜色和含义 | 红(空头) |
|
||||
| 持续 | 上一阶段持续时间和K线数 | 4小时30分钟 (27根10mK) |
|
||||
| 区间 | 上一阶段的时间范围 | 05:30 ~ 10:00 |
|
||||
| 当前 | 转换后的颜色和含义 | 绿(多头) |
|
||||
|
||||
## 默认监控规则
|
||||
|
||||
系统默认对以下 5 个币对的 10m 周期监控 `red_to_green` 方向:
|
||||
|
||||
```typescript
|
||||
const DEFAULT_EWO_RULE_SYMBOLS = [
|
||||
"BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "DOGEUSDT"
|
||||
]
|
||||
```
|
||||
|
||||
用户可在设置中自定义规则(币对、周期、方向)。
|
||||
|
||||
## 规则配置结构
|
||||
|
||||
```typescript
|
||||
interface EwoTurnAlertRule {
|
||||
id: string;
|
||||
enabled: boolean;
|
||||
symbol: string; // 如 "BTCUSDT"
|
||||
interval: TimeInterval; // 如 "10m"
|
||||
direction: EwoTurnDirection; // "red_to_green" | "green_to_red"
|
||||
}
|
||||
```
|
||||
|
||||
## 与信号通知的区别
|
||||
|
||||
| 对比项 | EWO 转换通知 | 信号通知 |
|
||||
|--------|-------------|---------|
|
||||
| 触发条件 | EWO 颜色转换(已收线) | 多指标评分超过阈值 |
|
||||
| 通知模式 | 始终推送(larkWebhookEnabled=true) | 需要 larkSignalNotifyMode="all_signals" |
|
||||
| 频控 | 去重(同转换只推一次) | 频控(同币同方向最短N分钟) |
|
||||
| 信息量 | 包含持续时间、区间等上下文 | 包含评分原因列表 |
|
||||
| 适用场景 | 趋势转换的早期预警 | 多指标共振的入场信号 |
|
||||
|
||||
## 已知问题与优化建议
|
||||
|
||||
### 问题:无法区分强弱穿越
|
||||
|
||||
当前系统对 BTC(EWO 穿越幅度 62.37)和 SOL(穿越幅度 0.044)发出完全相同格式的通知,没有质量评级。
|
||||
|
||||
**优化方案**:在通知中加入穿越强度评级(强/中/弱),或对微弱穿越添加警告标记。
|
||||
|
||||
详见:→ [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md)
|
||||
|
||||
### 问题:通知无法区分市场环境
|
||||
|
||||
EWO 红→绿在大周期空头环境中可能是假反弹,但通知不包含大周期偏向信息。
|
||||
|
||||
**优化方案**:在通知中加入 4h 大周期 EWO 方向,帮助用户快速判断信号可靠性。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [飞书通知格式规范](./飞书通知格式规范.md) — 通知消息的完整格式
|
||||
- [信号评分引擎](./信号评分引擎.md) — 信号生成机制
|
||||
- [大周期偏向判定](./大周期偏向判定.md) — 趋势过滤
|
||||
- [SOL 专项深化策略](../../12_信号系统优化/各币种专项/SOL专项深化策略.md) — SOL 微弱穿越问题
|
||||
在新工单中引用
屏蔽一个用户