feat: 新增 Wiki 基础理论和流程图解模块
基础理论: - 量化交易入门指南(零基础友好,含学习路径) 流程图解(3个完整流程图): - 信号系统完整流程图(总体/评分/EWO转换/大周期过滤) - 交易策略执行流程(通用流程/EWO决策树/MTF协同/风控) - 数据采集与处理流程(API获取/缓存管理/指标计算/质量检查) 所有内部链接均指向仓库内文档,无外部链接
这个提交包含在:
270
wiki/流程图解/交易策略执行流程.md
普通文件
270
wiki/流程图解/交易策略执行流程.md
普通文件
@@ -0,0 +1,270 @@
|
||||
# 交易策略执行流程
|
||||
|
||||
> 返回:[Wiki 主索引](../README.md)
|
||||
> 相关文档:[主要量化策略详解](../../03_交易策略/主要量化策略详解.md)
|
||||
|
||||
## 概述
|
||||
|
||||
本文档用流程图说明量化交易策略从信号产生到实际下单的完整执行流程,以及各类策略的决策树。
|
||||
|
||||
---
|
||||
|
||||
## 一、通用策略执行流程
|
||||
|
||||
```
|
||||
市场数据更新(新 K 线收线)
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 数据预处理 │
|
||||
│ ├─ 清洗异常值(价格跳空、成交量异常) │
|
||||
│ ├─ 计算技术指标 │
|
||||
│ └─ 更新指标缓存 │
|
||||
└──────────────────┬────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 信号生成层 │
|
||||
│ ├─ 运行多指标评分引擎 │
|
||||
│ ├─ 计算 bullishCount / bearishCount │
|
||||
│ └─ 输出信号方向和强度 │
|
||||
└──────────────────┬────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 信号过滤层(多重过滤) │
|
||||
│ ├─ 大周期偏向过滤(MTF) │
|
||||
│ ├─ 信号强度过滤(只取 STRONG/MEDIUM) │
|
||||
│ ├─ 成交量确认(放量才入场) │
|
||||
│ └─ 时间过滤(避开重大新闻时间) │
|
||||
└──────────────────┬────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 风险评估层 │
|
||||
│ ├─ 计算 ATR(波动率) │
|
||||
│ ├─ 确定止损价位(ATR × 倍数) │
|
||||
│ ├─ 计算仓位大小(Kelly 公式) │
|
||||
│ └─ 检查最大持仓限制 │
|
||||
└──────────────────┬────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 执行层 │
|
||||
│ ├─ 发送通知(飞书) │
|
||||
│ ├─ 记录信号(MySQL) │
|
||||
│ └─ 自动下单(若启用) │
|
||||
└──────────────────┬────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────────────┐
|
||||
│ 持仓管理层 │
|
||||
│ ├─ 监控止损触发 │
|
||||
│ ├─ 移动止损更新 │
|
||||
│ ├─ 分批止盈 │
|
||||
│ └─ 强制平仓(极端行情) │
|
||||
└───────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、EWO 转换信号决策树
|
||||
|
||||
```
|
||||
收到 EWO 转换通知
|
||||
(如:BTC/10m 红→绿)
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 检查通知质量 │
|
||||
│ EWO 穿越幅度 >= 品种阈值? │
|
||||
│ BTC: |EWO差值| >= 15.0 │
|
||||
│ SOL: |EWO差值| >= 0.5 │
|
||||
│ ├─ 否 → ⚠️ 微弱穿越,观望 │
|
||||
│ └─ 是 → 继续 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 检查上一阶段持续时间 │
|
||||
│ 持续 K 线数 >= 20? │
|
||||
│ ├─ 是 → ✅ 高质量信号(充分蓄势) │
|
||||
│ ├─ 5-19 → ⚡ 普通信号 │
|
||||
│ └─ < 5 → ⚠️ 可能假穿越,谨慎 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 检查大周期偏向 │
|
||||
│ 4h EWO 方向 = 多头? │
|
||||
│ ├─ 是 → ✅ 顺势信号,可入场 │
|
||||
│ ├─ 中性 → ⚡ 谨慎入场,减半仓位 │
|
||||
│ └─ 空头 → ❌ 逆势信号,不入场 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 检查 RSI 状态 │
|
||||
│ RSI < 70(做多)? │
|
||||
│ ├─ 是 → 未超买,可入场 │
|
||||
│ └─ 否 → RSI 超买,等待回调 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 确定入场参数 │
|
||||
│ 入场价 = 当前收盘价 │
|
||||
│ 止损价 = 入场价 - ATR × 1.5 │
|
||||
│ 止盈1 = 入场价 + ATR × 2.0(50%仓) │
|
||||
│ 止盈2 = 入场价 + ATR × 4.0(50%仓) │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、各策略类型执行要点
|
||||
|
||||
### 趋势跟踪策略
|
||||
|
||||
```
|
||||
适用场景:EWO 持续在零轴一侧,价格单边运动
|
||||
|
||||
入场条件:
|
||||
✅ EWO 穿越零轴(红→绿 做多,绿→红 做空)
|
||||
✅ 大周期偏向一致
|
||||
✅ 成交量放大确认
|
||||
✅ 价格在 MA100 上方(做多)
|
||||
|
||||
持仓管理:
|
||||
止损:入场价 - ATR × 1.5
|
||||
移动止损:每根 K 线更新为 SuperTrend 下轨
|
||||
止盈:等待 EWO 反向穿越才出场
|
||||
|
||||
适合品种:BTC、ETH(趋势性强)
|
||||
不适合:DOGE(情绪驱动,趋势不稳定)
|
||||
```
|
||||
|
||||
### 均值回归策略
|
||||
|
||||
```
|
||||
适用场景:价格偏离均线过大,预期回归
|
||||
|
||||
入场条件:
|
||||
✅ RSI < 30(超卖)做多
|
||||
✅ 价格触及布林带下轨
|
||||
✅ EWO 处于深度负值区域
|
||||
✅ 成交量萎缩(恐慌性卖出结束)
|
||||
|
||||
持仓管理:
|
||||
止损:布林带下轨再下 ATR × 1.0
|
||||
止盈:价格回到布林带中轨(MA20)
|
||||
|
||||
适合品种:BTC、ETH(流动性高,回归可靠)
|
||||
不适合:小市值币(可能持续下跌不回归)
|
||||
```
|
||||
|
||||
### 突破策略
|
||||
|
||||
```
|
||||
适用场景:价格突破关键阻力位
|
||||
|
||||
入场条件:
|
||||
✅ 价格突破近期高点(或支撑位)
|
||||
✅ 成交量 > 20日均量 × 1.5(放量突破)
|
||||
✅ EWO 在零轴上方且上升
|
||||
✅ MACD 金叉
|
||||
|
||||
持仓管理:
|
||||
止损:突破点下方 ATR × 1.0
|
||||
止盈:突破幅度的 2 倍(测量移动)
|
||||
|
||||
适合品种:BTC(关键价位突破效果好)
|
||||
注意:假突破风险,需要成交量确认
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、多周期协同决策流程(MTF)
|
||||
|
||||
```
|
||||
4h 周期分析(大方向)
|
||||
│
|
||||
├─ EWO > 0 且上升 → 大周期多头
|
||||
├─ EWO < 0 且下降 → 大周期空头
|
||||
└─ 其他 → 大周期中性
|
||||
│
|
||||
▼
|
||||
1h 周期分析(中期确认)
|
||||
│
|
||||
├─ 与 4h 方向一致 → 中期确认
|
||||
├─ 与 4h 方向相反 → 中期背离(谨慎)
|
||||
└─ 中性 → 等待
|
||||
│
|
||||
▼
|
||||
10m 周期(入场时机)
|
||||
│
|
||||
├─ EWO 穿越 + 4h/1h 均多头 → 强力入场信号
|
||||
├─ EWO 穿越 + 4h 多头 + 1h 中性 → 普通入场信号
|
||||
├─ EWO 穿越 + 4h 中性 → 谨慎入场(减半仓位)
|
||||
└─ EWO 穿越 + 4h 空头 → 不入场(逆势)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、风险控制决策流程
|
||||
|
||||
```
|
||||
信号触发
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 账户风险检查 │
|
||||
│ 当前持仓数 < 最大持仓数? │
|
||||
│ ├─ 否 → 不开新仓 │
|
||||
│ └─ 是 → 继续 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 仓位计算(Kelly 公式简化版) │
|
||||
│ 仓位% = (胜率 - 败率/盈亏比) × 0.5 │
|
||||
│ 最大单笔仓位 = 总资金 × 2% │
|
||||
│ 取两者较小值 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 止损设置 │
|
||||
│ ATR 止损 = 入场价 ± ATR × 倍数 │
|
||||
│ BTC: × 1.5 ETH: × 1.5 │
|
||||
│ SOL: × 2.0 DOGE: × 2.5 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 盈亏比验证 │
|
||||
│ 预期盈利 / 止损距离 >= 2.0? │
|
||||
│ ├─ 否 → 放弃本次信号 │
|
||||
│ └─ 是 → 执行入场 │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、不同市场状态下的策略选择
|
||||
|
||||
| 市场状态 | 识别方法 | 推荐策略 | 不推荐策略 |
|
||||
|---------|---------|---------|-----------|
|
||||
| 强趋势上涨 | EWO 持续 > 0,ADX > 25 | 趋势跟踪 | 均值回归 |
|
||||
| 强趋势下跌 | EWO 持续 < 0,ADX > 25 | 趋势跟踪(做空)| 抄底 |
|
||||
| 震荡盘整 | EWO 在零轴附近震荡,ADX < 20 | 均值回归 | 趋势跟踪 |
|
||||
| 突破行情 | 价格突破关键位,成交量放大 | 突破策略 | 均值回归 |
|
||||
| 极端恐慌 | RSI < 20,恐惧贪婪指数 < 15 | 逆势抄底(小仓)| 追空 |
|
||||
| 极端贪婪 | RSI > 80,恐惧贪婪指数 > 85 | 分批止盈 | 追多 |
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [信号系统完整流程图](./信号系统完整流程图.md) — 信号生成流程
|
||||
- [tradehk 信号评分引擎](../tradehk/信号评分引擎.md) — 评分机制
|
||||
- [风险管理体系](../../08_风险管理/风险管理体系.md) — 风控详解
|
||||
- [各币种专项策略](../../12_信号系统优化/各币种专项/) — 各币种参数
|
||||
339
wiki/流程图解/信号系统完整流程图.md
普通文件
339
wiki/流程图解/信号系统完整流程图.md
普通文件
@@ -0,0 +1,339 @@
|
||||
# 信号系统完整流程图
|
||||
|
||||
> 返回:[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) — 优化方案
|
||||
232
wiki/流程图解/数据采集与处理流程.md
普通文件
232
wiki/流程图解/数据采集与处理流程.md
普通文件
@@ -0,0 +1,232 @@
|
||||
# 数据采集与处理流程
|
||||
|
||||
> 返回:[Wiki 主索引](../README.md)
|
||||
> 相关文档:[数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md)
|
||||
|
||||
## 概述
|
||||
|
||||
本文档说明量化交易系统中数据从交易所 API 到信号计算的完整流程,包括数据获取、清洗、存储和实时更新。
|
||||
|
||||
---
|
||||
|
||||
## 一、Binance API 数据获取流程
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Binance API 端点 │
|
||||
│ │
|
||||
│ REST API(历史数据): │
|
||||
│ GET /api/v3/klines │
|
||||
│ 参数:symbol, interval, limit(最多1000根) │
|
||||
│ │
|
||||
│ WebSocket(实时数据): │
|
||||
│ wss://stream.binance.com:9443/ws/{symbol}@kline_{interval} │
|
||||
└──────────────────────┬──────────────────────────────────────┘
|
||||
│
|
||||
┌────────────┴────────────┐
|
||||
▼ ▼
|
||||
┌─────────────────┐ ┌──────────────────────┐
|
||||
│ 初始化加载 │ │ 实时更新 │
|
||||
│ (启动时) │ │ (持续运行) │
|
||||
│ │ │ │
|
||||
│ 拉取最近300根 │ │ WebSocket 推送 │
|
||||
│ K线数据 │ │ 每根K线实时更新 │
|
||||
│ 存入 pairCache │ │ 收线时触发信号检测 │
|
||||
└────────┬────────┘ └──────────┬───────────┘
|
||||
│ │
|
||||
└────────────┬──────────────┘
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 数据格式标准化 │
|
||||
│ │
|
||||
│ 原始 Binance K线格式: │
|
||||
│ [openTime, open, high, low, close, volume, │
|
||||
│ closeTime, quoteVolume, trades, ...] │
|
||||
│ │
|
||||
│ 标准化后的 Candle 格式: │
|
||||
│ { time: number, // Unix 时间戳(秒) │
|
||||
│ open: number, // 开盘价 │
|
||||
│ high: number, // 最高价 │
|
||||
│ low: number, // 最低价 │
|
||||
│ close: number, // 收盘价 │
|
||||
│ volume: number } // 成交量 │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、K线缓存管理流程
|
||||
|
||||
```
|
||||
pairCache 缓存结构:
|
||||
Map<"BTCUSDT__10m", {
|
||||
candles: Candle[], // 最多 300 根
|
||||
updatedAt: number // 最后更新时间
|
||||
}>
|
||||
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 缓存更新策略 │
|
||||
│ │
|
||||
│ 每30秒轮询: │
|
||||
│ 1. 检查缓存是否过期(> 30秒) │
|
||||
│ 2. 调用 Binance REST API 获取最新 K 线 │
|
||||
│ 3. 合并新数据到缓存(去重、排序) │
|
||||
│ 4. 保留最近 300 根(超出则删除最旧的) │
|
||||
│ 5. 更新 updatedAt 时间戳 │
|
||||
│ │
|
||||
│ WebSocket 实时更新: │
|
||||
│ 1. 收到 kline 消息 │
|
||||
│ 2. 判断是否已收线(x: true) │
|
||||
│ 3. 已收线 → 更新缓存中最后一根 K 线 │
|
||||
│ 4. 触发信号检测 │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、指标计算数据流
|
||||
|
||||
```
|
||||
输入:Candle[] 数组(300根K线)
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 提取价格序列 │
|
||||
│ closes = candles.map(c => c.close) │
|
||||
│ highs = candles.map(c => c.high) │
|
||||
│ lows = candles.map(c => c.low) │
|
||||
│ volumes = candles.map(c => c.volume) │
|
||||
│ midPrices = candles.map(c => (c.high + c.low) / 2) │
|
||||
└──────────────────────┬──────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 基础指标计算(所有指标的基础) │
|
||||
│ │
|
||||
│ EMA(5) = 指数移动平均(周期5) │
|
||||
│ EMA(10) = 指数移动平均(周期10) │
|
||||
│ EMA(20) = 指数移动平均(周期20) │
|
||||
│ EMA(35) = 指数移动平均(周期35) │
|
||||
│ │
|
||||
│ 计算公式: │
|
||||
│ EMA[i] = price[i] × k + EMA[i-1] × (1-k) │
|
||||
│ k = 2 / (period + 1) │
|
||||
└──────────────────────┬──────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 衍生指标计算 │
|
||||
│ │
|
||||
│ EWO = EMA(5) - EMA(35) │
|
||||
│ MACD = EMA(10) - EMA(20) │
|
||||
│ MACD信号线 = EMA(MACD, 10) │
|
||||
│ MACD柱 = MACD - 信号线 │
|
||||
│ │
|
||||
│ AO = SMA(midPrices, 5) - SMA(midPrices, 34) │
|
||||
│ │
|
||||
│ RSI = 100 - 100/(1 + RS) │
|
||||
│ RS = 平均涨幅(14) / 平均跌幅(14) │
|
||||
└──────────────────────┬──────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 信号评分计算 │
|
||||
│ (见:信号系统完整流程图) │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、数据质量检查流程
|
||||
|
||||
```
|
||||
原始 K 线数据
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 完整性检查 │
|
||||
│ ├─ 时间戳连续性(无缺口) │
|
||||
│ ├─ OHLC 逻辑合理性 │
|
||||
│ │ high >= max(open, close) │
|
||||
│ │ low <= min(open, close) │
|
||||
│ └─ 成交量 >= 0 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 异常值处理 │
|
||||
│ ├─ 价格跳空(> 20%)→ 标记警告 │
|
||||
│ ├─ 成交量异常(> 10倍均值)→ 标记 │
|
||||
│ └─ 零成交量 → 使用前一根数据填充 │
|
||||
└──────────────────┬──────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 数据量检查 │
|
||||
│ K线数量 >= 35 根? │
|
||||
│ ├─ 否 → 返回 null(数据不足) │
|
||||
│ └─ 是 → 继续计算 │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、多数据源整合流程(扩展方案)
|
||||
|
||||
```
|
||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||
│ Binance │ │ Glassnode│ │Coinglass │ │ CoinGecko│
|
||||
│ K线数据 │ │ 链上数据 │ │ 资金费率 │ │ 恐惧指数 │
|
||||
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
|
||||
│ │ │ │
|
||||
└──────────────┴──────────────┴──────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ 数据聚合层 │
|
||||
│ 统一时间戳 │
|
||||
│ 标准化格式 │
|
||||
│ 缺失值处理 │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ 多维度信号引擎 │
|
||||
│ 技术指标层(权重60%)│
|
||||
│ 链上数据层(权重25%)│
|
||||
│ 情绪指标层(权重15%)│
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、数据存储策略
|
||||
|
||||
| 数据类型 | 存储位置 | 保留时间 | 更新频率 |
|
||||
|---------|---------|---------|---------|
|
||||
| 实时 K 线 | 内存缓存(pairCache) | 300根 | 30秒 |
|
||||
| 行情数据 | 内存缓存(tickerCache) | 最新1条 | 30秒 |
|
||||
| 交易信号 | MySQL(signals 表) | 永久 | 实时 |
|
||||
| 用户配置 | MySQL(user_settings 表) | 永久 | 用户操作时 |
|
||||
| 历史 K 线 | 本地文件(Parquet/CSV) | 按需 | 手动下载 |
|
||||
| 链上数据 | 本地文件(JSON/CSV) | 按需 | 每日更新 |
|
||||
|
||||
---
|
||||
|
||||
## 七、API 速率限制处理
|
||||
|
||||
Binance API 有速率限制,需要合理规划请求频率:
|
||||
|
||||
| API 类型 | 限制 | tradehk 处理方式 |
|
||||
|---------|------|----------------|
|
||||
| REST API(K线)| 1200 请求/分钟 | 30秒轮询,每次批量获取 |
|
||||
| REST API(行情)| 1200 请求/分钟 | 与K线合并请求 |
|
||||
| WebSocket | 300 连接/5分钟 | 复用连接,不频繁重连 |
|
||||
|
||||
**注意**:监控超过 20 个币对时,建议将轮询间隔调整为 60 秒,避免触发速率限制。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md) — 详细数据流程
|
||||
- [tradehk 数据库与存储](../tradehk/数据库与存储.md) — 存储机制
|
||||
- [链上数据分析指南](../../10_链上数据分析/链上数据分析指南.md) — 链上数据扩展
|
||||
在新工单中引用
屏蔽一个用户