# 信号系统完整流程图 > 返回:[Wiki 主索引](../README.md) > 相关文档:[tradehk 信号评分引擎](../tradehk/信号评分引擎.md) ## 概述 本文档用流程图和文字说明 tradehk 信号系统从数据获取到通知推送的完整流程,适合快速理解整个系统的工作原理。 --- ## 一、总体流程 ``` ┌─────────────────────────────────────────────────────────────┐ │ Binance API │ │ (REST API / WebSocket) │ └──────────────────────┬──────────────────────────────────────┘ │ K线数据(每30秒轮询 + 实时推送) ▼ ┌─────────────────────────────────────────────────────────────┐ │ 内存缓存层 │ │ pairCache: Map<"BTCUSDT__10m", {candles[], updatedAt}> │ │ tickerCache: Map<"BTCUSDT", {price, change24h, volume}> │ └──────────────────────┬──────────────────────────────────────┘ │ ┌────────────┴────────────┐ ▼ ▼ ┌─────────────────┐ ┌──────────────────────┐ │ 信号检测流程 │ │ EWO转换检测流程 │ │ (每30秒) │ │ (每30秒) │ └────────┬────────┘ └──────────┬───────────┘ │ │ ▼ ▼ ┌─────────────────┐ ┌──────────────────────┐ │ generateSignal │ │ evaluateEwoTurn │ │ (多指标评分) │ │ (颜色转换检测) │ └────────┬────────┘ └──────────┬───────────┘ │ │ ▼ ▼ ┌─────────────────┐ ┌──────────────────────┐ │ MySQL 持久化 │ │ 去重检查 │ │ (signals 表) │ │ (dedup slot) │ └────────┬────────┘ └──────────┬───────────┘ │ │ ▼ ▼ ┌─────────────────┐ ┌──────────────────────┐ │ 频控检查 │ │ 飞书 Webhook 推送 │ │ (冷却时间) │ │ (EWO转换通知) │ └────────┬────────┘ └──────────────────────┘ │ ▼ ┌─────────────────┐ │ 飞书 Webhook │ │ (信号通知) │ └─────────────────┘ ``` --- ## 二、信号评分详细流程 ``` 输入:已收线的 K 线数组(至少35根) │ ▼ ┌───────────────────────────────────────┐ │ 计算所有指标 │ │ EWO = EMA(5) - EMA(35) │ │ MACD = EMA(10) - EMA(20) │ │ AO = SMA(中间价,5) - SMA(中间价,34) │ │ MA10, MA100 │ │ RSI(14)(若启用) │ │ 布林带(若启用) │ │ ... 其他可选指标 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 多空评分计算 │ │ │ │ bullishCount = 0 │ │ bearishCount = 0 │ │ │ │ EWO 穿越零轴? │ │ ├─ 红→绿 → bullishCount += 2 │ │ ├─ 绿→红 → bearishCount += 2 │ │ ├─ EWO > 0 → bullishCount += 1 │ │ └─ EWO < 0 → bearishCount += 1 │ │ │ │ MACD 金叉/死叉? │ │ ├─ 金叉 → bullishCount += 2 │ │ ├─ 死叉 → bearishCount += 2 │ │ ├─ 柱>0扩大 → bullishCount += 1 │ │ └─ 柱<0扩大 → bearishCount += 1 │ │ │ │ AO 穿越零轴? │ │ ├─ 上穿 → bullishCount += 1 │ │ └─ 下穿 → bearishCount += 1 │ │ │ │ MA 排列? │ │ ├─ 多头排列 → bullishCount += 1 │ │ └─ 空头排列 → bearishCount += 1 │ │ │ │ ... 可选指标评分 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 计算动态阈值 │ │ strongThreshold = 5 + floor(可选数×0.5)│ │ moderateThreshold = 3 + floor(可选数×0.3)│ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 判断信号方向 │ │ │ │ bullishCount > bearishCount? │ │ ├─ 是 → type = BUY │ │ │ bullishCount >= strong? │ │ │ ├─ 是 → STRONG │ │ │ ├─ >= moderate? → MODERATE │ │ │ └─ 否 → WEAK │ │ ├─ bearishCount > bullishCount? │ │ │ └─ 是 → type = SELL(同上逻辑) │ │ └─ 相等 → return null(无信号) │ └──────────────────┬────────────────────┘ │ ▼ 输出:TradingSignal 或 null ``` --- ## 三、EWO 转换检测流程 ``` 输入:用户的 EWO 转换规则列表 │ ▼ ┌───────────────────────────────────────┐ │ 按 symbol+interval 分组规则 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 对每个 symbol+interval: │ │ │ │ 取最后两根已收线 K 线 │ │ lastClosedIndex = 最新已收线 │ │ prevClosedIndex = 倒数第二根 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 计算 EWO 序列 │ │ ewoPrev = ewoSeries[prevClosedIndex] │ │ ewoNow = ewoSeries[lastClosedIndex] │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 颜色转换判断 │ │ prevColor = ewoPrev >= 0 ? 绿 : 红 │ │ nowColor = ewoNow >= 0 ? 绿 : 红 │ │ │ │ prevColor === nowColor? │ │ ├─ 是 → 跳过(无转换) │ │ └─ 否 → 继续 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 计算上一阶段持续时间 │ │ 向前遍历找到同颜色起始点 │ │ runStartIndex = 起始 K 线索引 │ │ runCandles = 持续 K 线根数 │ │ runDurationMs = 持续时间(毫秒) │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 去重检查 │ │ key = "ewo_turn:{symbol}:{interval} │ │ :{direction}:{bucketTs}" │ │ │ │ 已存在? │ │ ├─ 是 → 跳过(已推送过) │ │ └─ 否 → 继续 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 构建通知内容 │ │ 标题:EWO转换提醒 BTC/10m EWO 红->绿 │ │ 内容:触发规则、币对、转换时间、 │ │ EWO值、持续时间、区间等 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 推送飞书 Webhook │ │ pushLarkWebhookMessage() │ └───────────────────────────────────────┘ ``` --- ## 四、大周期偏向过滤流程 ``` 小周期信号(10m BUY) │ ▼ ┌───────────────────────────────────────┐ │ 大周期偏向过滤开关是否启用? │ │ trendBias.enabled = true? │ │ ├─ 否 → 直接使用信号 │ │ └─ 是 → 继续 │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 获取大周期 K 线(4h 或 12h) │ │ 计算 EWO、MACD、AO │ │ │ │ 评分: │ │ EWO > 0 → bullish += 2 │ │ MACD > 信号线 → bullish += 1 │ │ 柱状图 > 0 → bullish += 1 │ │ AO > 0 → bullish += 1 │ │ (空头方向同理) │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 大周期偏向判定 │ │ bearishScore >= 4 → BEARISH │ │ bullishScore >= 4 → BULLISH │ │ 其他 → NEUTRAL │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 过滤逻辑 │ │ 大周期 BEARISH + 小周期 BUY? │ │ ├─ 是 → 过滤掉(逆势信号) │ │ └─ 否 → 保留信号 │ │ │ │ 大周期 BULLISH + 小周期 SELL? │ │ ├─ 是 → 过滤掉(逆势信号) │ │ └─ 否 → 保留信号 │ └───────────────────────────────────────┘ ``` --- ## 五、优化后的 EWO 阈值过滤流程(建议) ``` EWO 穿越检测 │ ▼ ┌───────────────────────────────────────┐ │ 第一层:绝对值阈值检查 │ │ │ │ 获取品种阈值: │ │ BTC → 15.0 │ │ ETH → 12.0 │ │ SOL → 0.5 │ │ BNB → 10.0 │ │ DOGE → 0.002 │ │ │ │ |ewoNow - ewoPrev| >= 阈值? │ │ ├─ 是 → 强力穿越(+2分) │ │ └─ 否 → 微弱穿越(+1分 + ⚠️警告) │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 第二层:阶段持续时间检查 │ │ │ │ 上一阶段持续 K 线数: │ │ < 5 根 → -1分(可能假穿越) │ │ 5-19 根 → 不加减分 │ │ >= 20 根 → +1分(充分蓄势) │ └──────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────────────────┐ │ 第三层:成交量确认(可选) │ │ │ │ 穿越时成交量 > 20日均量? │ │ ├─ 是 → +1分(放量确认) │ │ └─ 否 → 不加分 │ └───────────────────────────────────────┘ ``` --- ## 六、数据流向总览 ``` 用户(浏览器) │ WebSocket 实时推送 │ REST API 查询 ▼ Nginx 反向代理(:80/:443) │ ▼ Node.js 应用(:3000) ├── tRPC API 路由 ├── marketEngine(后台定时任务) │ ├── 每30秒:refreshCacheForPairs │ │ └── Binance REST API │ ├── 每30秒:evaluateSignalsForUser │ │ └── generateSignal │ │ └── MySQL (signals 表) │ ├── 每30秒:evaluateEwoTurnForUser │ │ └── 飞书 Webhook │ └── 每4小时:buildPeriodicSummaryPayload │ └── 飞书 Webhook └── 静态文件服务(React 构建产物) │ MySQL(:3306) ├── users ├── user_settings ├── watchlist ├── signals └── dedup_slots ``` ## 相关文档 - [tradehk 信号评分引擎](../tradehk/信号评分引擎.md) — 评分机制详细说明 - [tradehk EWO转换检测机制](../tradehk/EWO转换检测机制.md) — 检测逻辑详细说明 - [tradehk 大周期偏向判定](../tradehk/大周期偏向判定.md) — 过滤机制详细说明 - [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) — 优化方案