文件
quantKonwledge/wiki/tradehk/EWO转换检测机制.md
Manus Quant Agent baf10a9e91 feat: 新增 tradehk 专属 Wiki 文档体系(10个文档)
- 系统架构总览:技术栈、目录结构、数据流向
- 指标引擎详解:16个指标完整原理与参数(含源码行号)
- 信号评分引擎:多指标共振评分机制、动态阈值、案例分析
- 大周期偏向判定:assessBigTimeframeBias 完整说明
- EWO转换检测机制:evaluateEwoTurnForUser 逐步流程
- 飞书通知格式规范:三类通知完整格式模板
- 类型系统参考:所有 TypeScript 类型完整文档
- 数据库与存储:MySQL 表结构、缓存机制、维护指南
- 部署运维指南:Docker Compose、Nginx、飞书配置
- 开发历史与TODO:功能状态表、优先级路线图
- 优化建议汇总:9项优化建议含源码位置和预期效果
2026-03-05 23:14:31 -05:00

5.4 KiB
原始文件 Blame 文件历史

tradehk EWO 转换检测机制

返回:tradehk 文档中心 源函数:evaluateEwoTurnForUser()server/_core/marketEngine.ts 第 611-700 行

概述

EWO 转换检测是 tradehk 最核心的通知功能。当 EWO 指标发生颜色转换(红→绿或绿→红)时,系统会自动检测并通过飞书 Webhook 推送通知。

触发条件

EWO 颜色定义:

  • 绿色(多头)EWO 值 >= 0
  • 红色(空头)EWO 值 < 0

转换方向:

  • red_to_greenEWO 由负转正(空头转多头)
  • green_to_redEWO 由正转负(多头转空头)

检测流程(逐步说明)

第一步:获取已收线的 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 方向:

const DEFAULT_EWO_RULE_SYMBOLS = [
  "BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "DOGEUSDT"
]

用户可在设置中自定义规则(币对、周期、方向)。

规则配置结构

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分钟
信息量 包含持续时间、区间等上下文 包含评分原因列表
适用场景 趋势转换的早期预警 多指标共振的入场信号

已知问题与优化建议

问题:无法区分强弱穿越

当前系统对 BTCEWO 穿越幅度 62.37)和 SOL穿越幅度 0.044)发出完全相同格式的通知,没有质量评级。

优化方案:在通知中加入穿越强度评级(强/中/弱),或对微弱穿越添加警告标记。

详见:→ EWO 阈值过滤完整流程

问题:通知无法区分市场环境

EWO 红→绿在大周期空头环境中可能是假反弹,但通知不包含大周期偏向信息。

优化方案:在通知中加入 4h 大周期 EWO 方向,帮助用户快速判断信号可靠性。

相关文档