From baf10a9e914900aac22b0c7840a2769b9c49db50 Mon Sep 17 00:00:00 2001 From: Manus Quant Agent Date: Thu, 5 Mar 2026 23:14:31 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20tradehk=20?= =?UTF-8?q?=E4=B8=93=E5=B1=9E=20Wiki=20=E6=96=87=E6=A1=A3=E4=BD=93?= =?UTF-8?q?=E7=B3=BB=EF=BC=8810=E4=B8=AA=E6=96=87=E6=A1=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 系统架构总览:技术栈、目录结构、数据流向 - 指标引擎详解:16个指标完整原理与参数(含源码行号) - 信号评分引擎:多指标共振评分机制、动态阈值、案例分析 - 大周期偏向判定:assessBigTimeframeBias 完整说明 - EWO转换检测机制:evaluateEwoTurnForUser 逐步流程 - 飞书通知格式规范:三类通知完整格式模板 - 类型系统参考:所有 TypeScript 类型完整文档 - 数据库与存储:MySQL 表结构、缓存机制、维护指南 - 部署运维指南:Docker Compose、Nginx、飞书配置 - 开发历史与TODO:功能状态表、优先级路线图 - 优化建议汇总:9项优化建议含源码位置和预期效果 --- wiki/tradehk/EWO转换检测机制.md | 168 ++++++++++++++++ wiki/tradehk/README.md | 60 ++++++ wiki/tradehk/优化建议汇总.md | 184 +++++++++++++++++ wiki/tradehk/信号评分引擎.md | 174 ++++++++++++++++ wiki/tradehk/大周期偏向判定.md | 110 ++++++++++ wiki/tradehk/开发历史与TODO.md | 162 +++++++++++++++ wiki/tradehk/指标引擎详解.md | 334 +++++++++++++++++++++++++++++++ wiki/tradehk/数据库与存储.md | 207 +++++++++++++++++++ wiki/tradehk/类型系统参考.md | 284 ++++++++++++++++++++++++++ wiki/tradehk/系统架构总览.md | 130 ++++++++++++ wiki/tradehk/部署运维指南.md | 286 ++++++++++++++++++++++++++ wiki/tradehk/飞书通知格式规范.md | 223 +++++++++++++++++++++ 12 files changed, 2322 insertions(+) create mode 100644 wiki/tradehk/EWO转换检测机制.md create mode 100644 wiki/tradehk/README.md create mode 100644 wiki/tradehk/优化建议汇总.md create mode 100644 wiki/tradehk/信号评分引擎.md create mode 100644 wiki/tradehk/大周期偏向判定.md create mode 100644 wiki/tradehk/开发历史与TODO.md create mode 100644 wiki/tradehk/指标引擎详解.md create mode 100644 wiki/tradehk/数据库与存储.md create mode 100644 wiki/tradehk/类型系统参考.md create mode 100644 wiki/tradehk/系统架构总览.md create mode 100644 wiki/tradehk/部署运维指南.md create mode 100644 wiki/tradehk/飞书通知格式规范.md diff --git a/wiki/tradehk/EWO转换检测机制.md b/wiki/tradehk/EWO转换检测机制.md new file mode 100644 index 0000000..8aab28f --- /dev/null +++ b/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 微弱穿越问题 diff --git a/wiki/tradehk/README.md b/wiki/tradehk/README.md new file mode 100644 index 0000000..4651609 --- /dev/null +++ b/wiki/tradehk/README.md @@ -0,0 +1,60 @@ +# tradehk 项目文档中心 + +> **tradehk** 是一个基于 Binance API 的全栈量化交易终端,采用 Node.js + TypeScript + React 构建,支持实时 K 线图、多指标共振信号引擎、自动交易、飞书通知等功能。 + +## 仓库地址 + +``` +ssh://git@git.hk.hao.work:2222/hao/tradehk.git +``` + +## 文档目录 + +| 文档 | 说明 | +|------|------| +| [系统架构总览](./系统架构总览.md) | 整体技术栈、模块划分、数据流向 | +| [指标引擎详解](./指标引擎详解.md) | 所有技术指标的实现原理与参数(基于 indicators.ts) | +| [信号评分引擎](./信号评分引擎.md) | 多指标共振评分机制完整说明(generateSignal 函数) | +| [大周期偏向判定](./大周期偏向判定.md) | assessBigTimeframeBias 函数原理与应用 | +| [EWO转换检测机制](./EWO转换检测机制.md) | EWO 红绿转换通知的完整检测流程(marketEngine.ts) | +| [飞书通知格式规范](./飞书通知格式规范.md) | 所有通知消息的格式模板与字段说明 | +| [类型系统参考](./类型系统参考.md) | TypeScript 类型定义完整参考(types.ts) | +| [数据库与存储](./数据库与存储.md) | MySQL 数据库结构、信号持久化、清理策略 | +| [部署运维指南](./部署运维指南.md) | Docker Compose 部署、Nginx 配置、环境变量 | +| [开发历史与TODO](./开发历史与TODO.md) | 项目演进记录、已完成功能、待开发项 | +| [优化建议汇总](./优化建议汇总.md) | 基于源码分析的优化点与改进路线图 | + +## 快速理解 + +tradehk 的核心工作流程如下: + +``` +Binance API(K线数据) + ↓ 每30秒轮询 +marketEngine.ts(市场引擎) + ↓ 计算指标 +indicators.ts(指标引擎) + ↓ 生成信号 +generateSignal() → 评分 → BUY/SELL/NEUTRAL + ↓ 持久化 +MySQL 数据库(signals 表) + ↓ 推送通知 +飞书 Webhook(Lark) +``` + +## 核心特性 + +- **默认周期**:10m(10分钟K线) +- **核心指标**:EWO + MACD + AO + MA(常开),RSI/KDJ/Stoch/BB/SuperTrend/DMI(可选) +- **信号强度**:STRONG(强)/ MODERATE(中)/ WEAK(弱) +- **通知模式**:EWO转换专项通知 + 可选全信号通知 +- **频控机制**:同币同方向最短间隔可配置(默认10分钟) +- **大周期过滤**:4h 或 12h 趋势偏向过滤小周期信号 + +## 相关知识 + +- [EWO 名词解释](../名词解释/EWO-艾略特波浪振荡器.md) +- [MACD 名词解释](../名词解释/MACD-指数移动平均线.md) +- [MTF 多时间框架分析](../名词解释/MTF-多时间框架分析.md) +- [信号系统优化建议](../../12_信号系统优化/信号系统深度优化建议.md) +- [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) diff --git a/wiki/tradehk/优化建议汇总.md b/wiki/tradehk/优化建议汇总.md new file mode 100644 index 0000000..649ac6c --- /dev/null +++ b/wiki/tradehk/优化建议汇总.md @@ -0,0 +1,184 @@ +# tradehk 优化建议汇总 + +> 返回:[tradehk 文档中心](./README.md) +> 详细说明:[信号系统深度优化建议](../../12_信号系统优化/信号系统深度优化建议.md) + +## 概述 + +本文档汇总基于 tradehk 源码深度分析后提出的所有优化建议,按优先级和实施难度排列,每项均标注源码位置和预期效果。 + +--- + +## 优先级一:立即可落地(1-3天) + +### 1. EWO 穿越幅度阈值过滤 + +**问题**:`indicators.ts` 约第 481 行,EWO 穿越判断仅检查正负号变化,不区分穿越幅度。 + +**现象**:BTC(穿越幅度 62.37)和 SOL(穿越幅度 0.044)获得相同的 +2 分。 + +**方案**:加入品种阈值判断,微弱穿越降为 +1 分或添加警告标记。 + +| 币种 | 推荐绝对阈值 | 推荐相对阈值(价格%) | +|------|------------|---------------------| +| BTC | ≥ 15.0 | ≥ 0.018% | +| ETH | ≥ 12.0 | ≥ 0.020% | +| BNB | ≥ 10.0 | ≥ 0.017% | +| SOL | ≥ 0.5 | ≥ 0.025% | +| DOGE | ≥ 0.002 | ≥ 0.080% | + +**预期效果**:SOL/DOGE 假信号率降低 30-40%,BTC/ETH 信号质量不受影响。 + +**流程说明**:→ [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) + +--- + +### 2. EWO 转换通知加入大周期信息 + +**问题**:`marketEngine.ts` 第 682-692 行,EWO 转换通知不包含大周期方向,用户无法快速判断是顺势还是逆势信号。 + +**方案**:在通知内容中加入一行 4h 大周期 EWO 方向。 + +**修改位置**:`marketEngine.ts` 第 682 行附近,在构建 content 数组时加入: + +``` +4h偏向: {4h EWO方向}({EWO值}) +``` + +**预期效果**:用户可以在收到通知的第一时间判断信号可靠性,减少逆势操作。 + +--- + +### 3. 大周期偏向粘性机制 + +**问题**:`assessBigTimeframeBias` 每次调用都直接返回当前结果,在震荡市中大周期偏向可能频繁切换。 + +**方案**:引入连续确认计数,需要连续 3 次(约90秒)计算结果一致才切换偏向方向。 + +**修改位置**:调用 `assessBigTimeframeBias` 的地方,加入状态缓存和计数逻辑。 + +**预期效果**:减少震荡市中大周期偏向的误判,提高趋势过滤的稳定性。 + +--- + +## 优先级二:中期优化(1-2周) + +### 4. EWO 阶段持续时间奖励 + +**问题**:当前系统不考虑 EWO 阶段的持续时间。持续 27 根 K 线的空头阶段后的红→绿穿越,比持续 3 根 K 线后的穿越更可靠。 + +**方案**:在 EWO 穿越评分中加入阶段持续时间奖励。 + +| 持续时间 | 额外分值 | +|---------|---------| +| < 5 根 K 线 | -1(减分,可能是假穿越) | +| 5-19 根 K 线 | 0(正常) | +| ≥ 20 根 K 线 | +1(奖励,趋势充分蓄势) | + +**修改位置**:`indicators.ts` 第 454-747 行的 `generateSignal` 函数,需要在计算 EWO 评分时同时计算阶段持续时间。 + +--- + +### 5. MTF 三层周期联动 + +**问题**:当前大周期偏向仅支持 4h 或 12h,缺少中间层(1h)的过渡。 + +**方案**:实现 4h → 1h → 10m 三层联动过滤: +- 4h 确定大方向(BULLISH/BEARISH) +- 1h 确认中期趋势(同向才放行) +- 10m 产生入场信号 + +**修改位置**:`marketEngine.ts` 的 `evaluateSignalsForUser` 函数,在调用 `generateSignal` 前先检查三层偏向。 + +**预期效果**:过滤掉约 40% 的逆势信号,显著提高信号胜率。 + +--- + +### 6. 成交量确认机制 + +**问题**:当前 `detectVolumeContraction` 仅检测缩量并添加警告,不影响评分。 + +**方案**: +- 穿越时成交量 > 20日均量 → EWO 穿越额外 +1 分 +- 穿越时成交量 < 20日均量 × 0.7 → EWO 穿越降为 +1 分 + +**修改位置**:`indicators.ts` 第 481 行附近,在 EWO 穿越判断中加入成交量比较。 + +--- + +## 优先级三:长期规划(1个月+) + +### 7. 品种特征自动学习 + +**方案**:记录每个币种每个周期的历史信号胜率,自动调整该币种的评分权重和阈值。 + +**实现思路**: +- 在 MySQL 中记录每个信号的后续价格变化(N根K线后的涨跌幅) +- 定期(每周)统计各币种各条件的胜率 +- 根据胜率自动调整 `IndicatorParams` 中的阈值参数 + +--- + +### 8. 链上数据集成 + +**方案**:接入 Glassnode/Coinglass API,将链上指标(MVRV、资金费率、持仓量)作为额外评分维度。 + +**接入点**:在 `generateSignal` 函数中加入链上数据评分层,权重低于技术指标(链上数据更新频率低)。 + +--- + +### 9. 回测验证系统 + +**方案**:基于历史 K 线数据,对当前信号参数进行回测,输出胜率、盈亏比、最大回撤等指标。 + +**实现思路**: +- 下载历史 K 线数据(Binance 历史 API) +- 对每根 K 线运行 `generateSignal` +- 统计信号后 N 根 K 线的价格变化 +- 输出回测报告 + +--- + +## 各币种优化优先级 + +| 币种 | 最优先优化项 | 预期改善 | +|------|------------|---------| +| BTC | 阶段持续时间奖励 | 过滤短暂假穿越,提高信号质量 | +| ETH | ETH/BTC 汇率过滤 | 识别 ETH 独立行情 vs 跟随 BTC | +| SOL | 相对阈值体系 | 解决绝对值差 1000 倍的问题 | +| BNB | 季度销毁预期过滤 | 避免销毁前后的异常信号 | +| DOGE | 情绪指标集成 | 识别马斯克推文等情绪驱动行情 | + +--- + +## 实施路线图 + +``` +第1周(立即): + ├── EWO 穿越幅度阈值过滤(BTC/ETH/SOL/BNB/DOGE) + └── EWO 转换通知加入大周期信息 + +第2周: + ├── 大周期偏向粘性机制 + └── EWO 阶段持续时间奖励 + +第3-4周: + ├── MTF 三层周期联动 + └── 成交量确认机制 + +第2个月: + ├── 品种特征自动学习(基础版) + └── 回测验证系统(基础版) + +长期: + ├── 链上数据集成 + └── 多交易所支持 +``` + +## 相关文档 + +- [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) — 最优先优化的详细说明 +- [BTC 专项深化策略](../../12_信号系统优化/各币种专项/BTC专项深化策略.md) +- [SOL 专项深化策略](../../12_信号系统优化/各币种专项/SOL专项深化策略.md) +- [BNB/DOGE 专项深化策略](../../12_信号系统优化/各币种专项/BNB_DOGE专项深化策略.md) +- [信号系统深度优化建议](../../12_信号系统优化/信号系统深度优化建议.md) diff --git a/wiki/tradehk/信号评分引擎.md b/wiki/tradehk/信号评分引擎.md new file mode 100644 index 0000000..e0d285e --- /dev/null +++ b/wiki/tradehk/信号评分引擎.md @@ -0,0 +1,174 @@ +# tradehk 信号评分引擎 + +> 返回:[tradehk 文档中心](./README.md) +> 源函数:`generateSignal()` — `client/src/lib/indicators.ts` 第 454-747 行 + +## 概述 + +`generateSignal` 是 tradehk 的核心信号生成函数。它采用**多指标共振评分机制**:对每根已收线的 K 线,计算各指标的多空得分,根据总分判断信号类型(BUY/SELL/NEUTRAL)和强度(STRONG/MODERATE/WEAK)。 + +## 函数签名 + +``` +generateSignal( + candles: Candle[], // K线数组(至少需要35根) + symbol: string, // 交易对(如 "BTCUSDT") + interval: TimeInterval, // 时间周期(如 "10m") + params?: IndicatorParams // 可选指标参数 +) → TradingSignal | null +``` + +## 评分机制 + +### 常开指标评分表 + +| 指标 | 触发条件 | 分值 | 方向 | +|------|---------|------|------| +| EWO | 上穿零轴(红→绿) | +2 | 多头 | +| EWO | 下穿零轴(绿→红) | +2 | 空头 | +| EWO | 在零轴上方(未穿越) | +1 | 多头 | +| EWO | 在零轴下方(未穿越) | +1 | 空头 | +| MACD | 金叉(MACD上穿信号线) | +2 | 多头 | +| MACD | 死叉(MACD下穿信号线) | +2 | 空头 | +| MACD柱 | 柱状图>0且扩大 | +1 | 多头 | +| MACD柱 | 柱状图<0且扩大 | +1 | 空头 | +| AO | 上穿零轴 | +1 | 多头 | +| AO | 下穿零轴 | +1 | 空头 | +| MA排列 | 价格>MA10>MA100 | +1 | 多头 | +| MA排列 | 价格 超买线(默认70) | +1 | 空头 | signalUseRsi | +| RSI | 从超卖区回升穿越30 | +1 | 多头 | signalUseRsi | +| RSI | 从超买区回落穿越70 | +1 | 空头 | signalUseRsi | +| KDJ | 低位金叉(K<30时K上穿D) | +2 | 多头 | signalUseKdj | +| KDJ | 普通金叉 | +1 | 多头 | signalUseKdj | +| KDJ | 高位死叉(K>70时K下穿D) | +2 | 空头 | signalUseKdj | +| KDJ | 普通死叉 | +1 | 空头 | signalUseKdj | +| Stoch | K<20且D<20 | +1 | 多头 | signalUseStoch | +| Stoch | K>80且D>80 | +1 | 空头 | signalUseStoch | +| 布林带 | 价格触及下轨 | +1 | 多头 | signalUseBollinger | +| 布林带 | 价格触及上轨 | +1 | 空头 | signalUseBollinger | +| SuperTrend | 方向由空转多 | +2 | 多头 | signalUseSuperTrend | +| SuperTrend | 多头趋势中 | +1 | 多头 | signalUseSuperTrend | +| SuperTrend | 方向由多转空 | +2 | 空头 | signalUseSuperTrend | +| SuperTrend | 空头趋势中 | +1 | 空头 | signalUseSuperTrend | +| DMI/ADX | ADX>25时+DI上穿-DI | +2 | 多头 | signalUseDmi | +| DMI/ADX | ADX>25时+DI>-DI | +1 | 多头 | signalUseDmi | +| DMI/ADX | ADX>25时-DI上穿+DI | +2 | 空头 | signalUseDmi | +| DMI/ADX | ADX>25时-DI>+DI | +1 | 空头 | signalUseDmi | + +## 强度判定阈值(动态) + +强度阈值根据**已启用的可选指标数量**动态调整,避免指标越多越容易触发强信号: + +``` +activeOptionalCount = 已启用的可选指标组数(0-6) +strongThreshold = 5 + floor(activeOptionalCount × 0.5) +moderateThreshold = 3 + floor(activeOptionalCount × 0.3) +``` + +| 启用可选指标数 | STRONG 阈值 | MODERATE 阈值 | +|--------------|-------------|---------------| +| 0(仅常开) | 5 分 | 3 分 | +| 2 个可选 | 6 分 | 3 分 | +| 4 个可选 | 7 分 | 4 分 | +| 6 个可选(全开)| 8 分 | 4 分 | + +## 信号类型判定 + +``` +if (bullishCount > bearishCount): + type = BUY + if bullishCount >= strongThreshold: strength = STRONG + elif bullishCount >= moderateThreshold: strength = MODERATE + else: strength = WEAK + +elif (bearishCount > bullishCount): + type = SELL + (同上逻辑) + +else: + return null(多空平衡,不产生信号) +``` + +## 输出结构(TradingSignal) + +```typescript +{ + id: string, // nanoid 生成的唯一 ID + timestamp: number, // 信号时间戳(毫秒) + symbol: string, // 交易对 + interval: TimeInterval, // K线周期 + type: 'BUY' | 'SELL', // 信号方向 + strength: 'STRONG' | 'MODERATE' | 'WEAK', // 信号强度 + price: number, // 当前收盘价 + indicators: { // 当前指标值快照 + ma10, ma100, ewo, macd, macdSignal, macdHistogram, ao + }, + reasons: string[], // 触发原因列表(中文) + isActive: boolean // 是否活跃 +} +``` + +## 实际案例分析 + +### 案例:2026-03-06 BTC/10m EWO 红→绿 + +**输入**: +- EWO 前值:-29.048617(红色) +- EWO 当前:+33.320837(绿色) +- 假设 MACD 金叉、AO 上穿、MA 多头排列 + +**评分计算**: +``` +EWO 穿越:+2(bullishCount) +MACD 金叉:+2 +MACD 柱扩大:+1 +AO 上穿:+1 +MA 多头排列:+1 +bullishCount = 7 +``` + +**强度判定**(仅常开指标,strongThreshold=5): +``` +7 >= 5 → STRONG(强信号) +``` + +### 案例:2026-03-06 SOL/10m EWO 红→绿 + +**输入**: +- EWO 前值:-0.037316(红色) +- EWO 当前:+0.006745(绿色) +- 穿越幅度极小(0.044061) + +**问题**:当前系统对 BTC(穿越幅度62.37)和 SOL(穿越幅度0.044)给出**相同的 +2 分**,无法区分信号质量。 + +**优化方案**:→ [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) + +## 关键设计决策 + +**为什么 EWO 穿越给 +2 而不是 +1?** + +EWO 是 tradehk 的核心指标,代表中短期动量的根本转变。穿越零轴意味着 EMA5 和 EMA35 的关系发生逆转,是趋势转换的重要信号,因此权重高于其他指标。 + +**为什么动态阈值?** + +固定阈值在只开 2 个指标时太难触发,开 6 个指标时又太容易触发。动态阈值确保无论用户开了多少指标,信号质量保持一致。 + +**为什么 ADX > 25 才计算 DMI?** + +ADX < 25 表示市场处于震荡状态,DMI 的 +DI/-DI 交叉在震荡市中产生大量假信号。只在强趋势(ADX > 25)时才使用 DMI,可以显著提高信号质量。 + +## 相关文档 + +- [指标引擎详解](./指标引擎详解.md) — 各指标计算原理 +- [大周期偏向判定](./大周期偏向判定.md) — 趋势过滤机制 +- [EWO转换检测机制](./EWO转换检测机制.md) — EWO 专项通知 +- [类型系统参考](./类型系统参考.md) — 完整类型定义 diff --git a/wiki/tradehk/大周期偏向判定.md b/wiki/tradehk/大周期偏向判定.md new file mode 100644 index 0000000..db63438 --- /dev/null +++ b/wiki/tradehk/大周期偏向判定.md @@ -0,0 +1,110 @@ +# tradehk 大周期偏向判定 + +> 返回:[tradehk 文档中心](./README.md) +> 源函数:`assessBigTimeframeBias()` — `client/src/lib/indicators.ts` 第 764-817 行 + +## 概述 + +大周期偏向判定是 tradehk 的趋势过滤机制。通过分析 4h 或 12h 的 EWO + MACD + AO 综合评分,判断当前大周期的趋势方向,用于过滤小周期信号中与大趋势相反的噪音信号。 + +## 评分规则 + +| 指标 | 条件 | 分值 | 方向 | +|------|------|------|------| +| EWO | EWO > 0 | +2 | 多头 | +| EWO | EWO < 0 | +2 | 空头 | +| MACD线 | MACD > 信号线 | +1 | 多头 | +| MACD线 | MACD < 信号线 | +1 | 空头 | +| MACD柱 | 柱状图 > 0 | +1 | 多头 | +| MACD柱 | 柱状图 < 0 | +1 | 空头 | +| AO | AO > 0 | +1 | 多头 | +| AO | AO < 0 | +1 | 空头 | + +**总分范围**:0-5 分(每个方向最高 5 分) + +## 判定阈值 + +``` +bearishScore >= 4 → 返回 'BEARISH'(空头偏向) +bullishScore >= 4 → 返回 'BULLISH'(多头偏向) +其他 → 返回 'NEUTRAL'(中性) +``` + +**设计逻辑**:需要至少 4/5 分才能确认方向,避免在震荡市中产生误判。EWO 权重为 2,因此 EWO 方向确定后,只需另外 2 个指标同向即可确认大周期偏向。 + +## 使用场景 + +### 1. 自动交易过滤 + +在 `AutoTradeConfig` 中配置 `trendBias`: + +```typescript +trendBias: { + enabled: true, + interval: '4h', // 使用4h大周期 + bias: 'BULLISH', // 当前计算结果 + lastUpdated: timestamp, + autoRefreshMinutes: 30 // 每30分钟重新计算 +} +``` + +当大周期为 BEARISH 时,系统可以过滤掉小周期的 BUY 信号(或反之)。 + +### 2. 信号质量评估 + +用户在查看 10m 信号时,可以参考 4h 大周期偏向: +- 4h BULLISH + 10m BUY → 顺势信号,可靠性高 +- 4h BEARISH + 10m BUY → 逆势信号,需谨慎 + +## 配置结构 + +```typescript +interface TrendBiasConfig { + enabled: boolean; // 是否启用大周期方向过滤 + interval: '4h' | '12h'; // 大周期 K 线周期 + bias: TrendBias; // 当前大周期方向(自动计算) + lastUpdated: number; // 最后更新时间戳 + autoRefreshMinutes: number; // 自动刷新间隔(分钟) +} + +type TrendBias = 'BEARISH' | 'BULLISH' | 'NEUTRAL' | null; +``` + +## 实际案例 + +### 2026-03-06 BTC 大周期状态 + +假设 4h K 线数据显示: +- EWO = -15.2(空头,-2分) +- MACD < 信号线(-1分) +- 柱状图 < 0(-1分) +- AO < 0(-1分) + +**bearishScore = 5 >= 4 → BEARISH** + +此时 10m 出现 EWO 红→绿信号,大周期过滤建议: +- 若启用过滤 → 该 BUY 信号被抑制(逆势) +- 若不启用过滤 → 正常触发 BUY 信号(可能是短期反弹) + +## 已知问题与优化建议 + +### 问题:大周期偏向切换过于灵敏 + +当前实现每次计算都直接返回结果,没有"粘性"机制。如果大周期在 BULLISH/NEUTRAL 之间反复切换,会导致小周期信号频繁被过滤/放行。 + +**优化方案**:引入连续确认机制——需要连续 3 次计算结果一致才切换大周期偏向。 + +详见:→ [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) + +### 问题:仅支持 4h 和 12h + +对于日内短线交易者,可能需要 1h 大周期过滤 10m 信号。 + +**优化方案**:扩展 `TrendBiasConfig.interval` 支持 `'1h' | '4h' | '12h' | '1d'`。 + +## 相关文档 + +- [信号评分引擎](./信号评分引擎.md) — 小周期信号生成 +- [EWO转换检测机制](./EWO转换检测机制.md) — EWO 专项通知 +- [MTF 多时间框架分析](../名词解释/MTF-多时间框架分析.md) — MTF 理论基础 +- [BTC 专项深化策略](../../12_信号系统优化/各币种专项/BTC专项深化策略.md) — BTC 多周期联动 diff --git a/wiki/tradehk/开发历史与TODO.md b/wiki/tradehk/开发历史与TODO.md new file mode 100644 index 0000000..c29e852 --- /dev/null +++ b/wiki/tradehk/开发历史与TODO.md @@ -0,0 +1,162 @@ +# tradehk 开发历史与 TODO + +> 返回:[tradehk 文档中心](./README.md) +> 源文件:`ideas.md`、`notes-indicator-status.txt`、`todo.md` + +## 项目演进概述 + +tradehk 从一个简单的 K 线图工具逐步演进为完整的量化交易终端,核心功能按以下顺序开发: + +``` +K线图显示 → 技术指标 → 信号引擎 → 飞书通知 → EWO专项通知 → 自动交易 +``` + +--- + +## 已完成功能 + +### 基础功能 + +- [x] Binance 实时 K 线图(lightweight-charts) +- [x] 多币对监控(Watchlist 管理) +- [x] 多周期切换(1m ~ 1M) +- [x] 深色专业交易终端 UI(Elite Dark Dashboard) +- [x] 用户认证(JWT + Manus OAuth) + +### 技术指标(16个) + +- [x] MA(简单移动平均线) +- [x] EMA(指数移动平均线) +- [x] EWO(艾略特波浪振荡器) +- [x] MACD(10, 20, 10 参数) +- [x] AO(动量振荡器) +- [x] RSI(相对强弱指数) +- [x] KDJ(随机指标衍生版) +- [x] Stoch(随机指标) +- [x] StochRSI(随机相对强弱指数) +- [x] 布林带(Bollinger Bands) +- [x] MFI(资金流量指数) +- [x] OBV(能量潮) +- [x] DMI/ADX(趋向运动指标) +- [x] SuperTrend(超级趋势指标) +- [x] ATR(平均真实波动幅度) +- [x] TTM Squeeze(挤压动量指标) + +### 信号系统 + +- [x] 多指标共振评分引擎(generateSignal) +- [x] 动态强度阈值(根据启用指标数调整) +- [x] 信号持久化(MySQL signals 表) +- [x] 信号去重(同币同方向同时间戳) +- [x] 大周期偏向判定(assessBigTimeframeBias) + +### 通知系统 + +- [x] 飞书 Webhook 推送 +- [x] EWO 转换专项通知(红→绿 / 绿→红) +- [x] 信号通知(可选,all_signals 模式) +- [x] 定期汇总通知(每N小时) +- [x] 信号推送频控(冷却时间可配置) +- [x] EWO 转换去重(全局共享去重槽) + +### 部署 + +- [x] Docker Compose 部署 +- [x] Nginx 反向代理 +- [x] MySQL 数据库 +- [x] 一键部署脚本(deploy.sh) +- [x] 数据库迁移(Drizzle Kit) + +--- + +## 待开发功能(TODO) + +以下内容来自 `ideas.md` 和 `todo.md`,按优先级排列: + +### 高优先级 + +| 功能 | 说明 | 难度 | +|------|------|------| +| EWO 穿越强度过滤 | 对微弱穿越(如 SOL 0.044)添加警告或过滤 | 低 | +| 品种自适应阈值 | 不同币种使用不同的 EWO 绝对值/相对值阈值 | 中 | +| 大周期偏向粘性 | 连续3次确认才切换大周期方向,避免频繁切换 | 低 | +| 通知加入大周期信息 | EWO 转换通知中附带 4h 大周期方向 | 低 | + +### 中优先级 + +| 功能 | 说明 | 难度 | +|------|------|------| +| MTF 三层联动 | 4h→1h→10m 三层周期联动过滤 | 高 | +| 阶段持续时间奖励 | EWO 阶段持续时间越长,穿越信号越可靠 | 中 | +| 成交量确认 | 穿越时成交量放大才确认信号 | 中 | +| 价格突破通知 | 价格突破关键阻力/支撑位通知 | 中 | +| 移动止损 | 基于 ATR 的动态止损线 | 高 | + +### 低优先级 / 探索中 + +| 功能 | 说明 | 难度 | +|------|------|------| +| 链上数据集成 | 接入 Glassnode/Coinglass 链上指标 | 高 | +| 情绪指标 | 恐惧贪婪指数、资金费率集成 | 中 | +| 回测功能 | 历史数据回测信号胜率 | 高 | +| 多交易所支持 | 接入 OKX、Bybit 等 | 高 | +| 移动端适配 | React Native 移动端 | 极高 | + +--- + +## 指标开发状态 + +来自 `notes-indicator-status.txt`: + +| 指标 | 计算状态 | 图表显示 | 信号评分 | 备注 | +|------|---------|---------|---------|------| +| MA | ✅ 完成 | ✅ 完成 | ✅ 完成 | 主图叠加 | +| EMA | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 主图叠加,用于 EWO/MACD 计算 | +| EWO | ✅ 完成 | ✅ 完成 | ✅ 完成 | 核心指标,权重最高 | +| MACD | ✅ 完成 | ✅ 完成 | ✅ 完成 | 使用 (10,20,10) 非标准参数 | +| AO | ✅ 完成 | ✅ 完成 | ✅ 完成 | | +| RSI | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认开启 | +| KDJ | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认关闭 | +| Stoch | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认关闭 | +| StochRSI | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 仅图表显示 | +| 布林带 | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认开启 | +| MFI | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 仅图表显示 | +| OBV | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 仅图表显示 | +| DMI/ADX | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认关闭,需 ADX>25 | +| SuperTrend | ✅ 完成 | ✅ 完成 | ✅ 完成 | 默认关闭 | +| ATR | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 被 SuperTrend/DMI 内部使用 | +| TTM Squeeze | ✅ 完成 | ✅ 完成 | ❌ 无独立评分 | 仅图表显示 | + +**待添加评分的指标**:MFI、OBV、StochRSI、TTM Squeeze(这些指标已有计算和显示,但尚未集成到信号评分引擎中) + +--- + +## 设计理念 + +tradehk 的设计遵循以下原则: + +**1. 已收线确认优先**:所有信号和通知均基于已收线的 K 线,避免未收线数据的噪音。 + +**2. 去重和频控并重**:EWO 转换使用去重(同转换只推一次),信号通知使用频控(冷却时间),两种机制针对不同场景。 + +**3. 动态阈值适应**:信号强度阈值根据启用的指标数量动态调整,确保信号质量一致性。 + +**4. 用户配置优先**:所有参数(指标参数、通知设置、监控规则)都可以用户级别配置,不强制全局统一。 + +--- + +## 相关优化建议 + +基于源码分析,以下是最值得优先落地的改进: + +1. **EWO 穿越幅度过滤**(1-2天工作量):在 `indicators.ts` 约第 481 行加入品种阈值判断 +2. **通知加入大周期信息**(半天工作量):在 `marketEngine.ts` 第 682 行附近加入 4h EWO 方向 +3. **大周期偏向粘性**(1天工作量):在 `assessBigTimeframeBias` 调用处加入连续确认计数 + +详见:→ [优化建议汇总](./优化建议汇总.md) + +## 相关文档 + +- [优化建议汇总](./优化建议汇总.md) — 完整优化路线图 +- [信号评分引擎](./信号评分引擎.md) — 当前信号机制 +- [EWO 阈值过滤完整流程](../../12_信号系统优化/EWO阈值过滤完整落地流程.md) — 优化详细说明 diff --git a/wiki/tradehk/指标引擎详解.md b/wiki/tradehk/指标引擎详解.md new file mode 100644 index 0000000..05c760f --- /dev/null +++ b/wiki/tradehk/指标引擎详解.md @@ -0,0 +1,334 @@ +# 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) — 优化建议 diff --git a/wiki/tradehk/数据库与存储.md b/wiki/tradehk/数据库与存储.md new file mode 100644 index 0000000..31c03c5 --- /dev/null +++ b/wiki/tradehk/数据库与存储.md @@ -0,0 +1,207 @@ +# tradehk 数据库与存储 + +> 返回:[tradehk 文档中心](./README.md) +> 源文件:`drizzle/schema.ts`、`server/db.ts`、`server/storage.ts` + +## 概述 + +tradehk 使用 MySQL 8.0 作为持久化存储,通过 Drizzle ORM 进行类型安全的数据库操作。主要存储:用户信息、用户配置、监控列表、交易信号记录。 + +--- + +## 数据库表结构 + +### users 表(用户) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INT AUTO_INCREMENT | 主键 | +| name | VARCHAR(255) | 显示名称 | +| username | VARCHAR(255) UNIQUE | 用户名 | +| email | VARCHAR(255) UNIQUE | 邮箱 | +| passwordHash | VARCHAR(255) | 密码哈希(bcrypt)| +| createdAt | DATETIME | 创建时间 | +| updatedAt | DATETIME | 更新时间 | + +--- + +### user_settings 表(用户配置) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INT AUTO_INCREMENT | 主键 | +| userId | INT | 外键 → users.id | +| configJson | TEXT | JSON 格式的完整用户配置(UserConfig) | +| updatedAt | DATETIME | 更新时间 | + +**configJson 结构**:存储 `UserConfig` 的完整 JSON 序列化,包含时区、指标参数、通知配置、EWO 规则等。 + +--- + +### watchlist 表(监控列表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INT AUTO_INCREMENT | 主键 | +| userId | INT | 外键 → users.id | +| symbol | VARCHAR(20) | 交易对(如 "BTCUSDT")| +| isActive | BOOLEAN | 是否在活跃监控列表中 | +| sortOrder | INT | 排列顺序 | +| createdAt | DATETIME | 创建时间 | + +--- + +### signals 表(交易信号记录) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INT AUTO_INCREMENT | 主键 | +| userId | INT | 外键 → users.id | +| symbol | VARCHAR(20) | 交易对 | +| interval | VARCHAR(10) | K线周期(如 "10m")| +| direction | ENUM('long','short') | 信号方向 | +| strength | ENUM('strong','medium','weak') | 信号强度 | +| score | INT | 信号评分(80/50/30)| +| price | DECIMAL(20,8) | 信号价格 | +| ewo | DECIMAL(20,8) | EWO 值(可空)| +| macd | DECIMAL(20,8) | MACD 值(可空)| +| macdSignal | DECIMAL(20,8) | MACD 信号线值(可空)| +| macdHist | DECIMAL(20,8) | MACD 柱状图值(可空)| +| ao | DECIMAL(20,8) | AO 值(可空)| +| reasons | TEXT | JSON 字符串,原因列表(可空)| +| signalAt | BIGINT | 信号时间戳(毫秒)| +| createdAt | DATETIME | 记录创建时间 | + +**索引**:`(userId, symbol, interval, direction, signalAt)` 联合唯一索引,用于信号去重。 + +--- + +## 内存缓存(pairCache / tickerCache) + +除 MySQL 外,tradehk 还维护两个内存缓存: + +### pairCache(K线缓存) + +```typescript +Map +``` + +**键格式**:`"{symbol}__{interval}"`,如 `"BTCUSDT__10m"` + +**更新时机**:每次引擎轮询时,通过 `refreshCacheForPairs` 从 Binance API 拉取最新数据。 + +### tickerCache(行情缓存) + +```typescript +Map +``` + +**键格式**:`"{symbol}"`,如 `"BTCUSDT"` + +--- + +## 关键数据库操作 + +### 信号去重检查 + +```typescript +// hasSignalRecord 函数 +// 检查同一用户、同一币对、同一方向、同一时间戳的信号是否已存在 +SELECT COUNT(*) FROM signals +WHERE userId = ? AND symbol = ? AND interval = ? + AND direction = ? AND signalAt = ? +``` + +### 信号窗口查询 + +```typescript +// getSignalsInWindow 函数 +// 用于定期汇总通知 +SELECT * FROM signals +WHERE userId = ? AND signalAt BETWEEN ? AND ? +ORDER BY signalAt DESC +LIMIT ? +``` + +### EWO 转换去重槽 + +EWO 转换去重使用 Redis 风格的共享槽(实际存储在 MySQL 的 `dedup_slots` 表中): + +```typescript +// consumeSharedEwoTurnDedupeSlot 函数 +// 原子性地检查并占用去重槽 +// 返回 true 表示允许推送,false 表示已推送过 +``` + +--- + +## 数据库维护 + +### 数据增长估算 + +假设监控 10 个币对,每个币对每小时产生 2 个信号: + +| 时间 | 信号记录数 | 磁盘占用(估算)| +|------|-----------|----------------| +| 1 天 | 480 条 | < 1 MB | +| 1 周 | 3,360 条 | < 5 MB | +| 1 月 | 14,400 条 | < 20 MB | +| 1 年 | 175,200 条 | < 250 MB | + +**结论**:signals 表增长缓慢,一般不需要特别清理。但如果监控大量币对或使用高频周期,建议设置定期清理任务。 + +### 清理过期信号 + +```sql +-- 清理30天前的信号记录 +DELETE FROM signals +WHERE signalAt < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) * 1000; +``` + +### 数据库备份 + +```bash +# 完整备份 +docker compose exec mysql mysqldump -u root -p tradehk > backup_$(date +%Y%m%d).sql + +# 只备份 signals 表 +docker compose exec mysql mysqldump -u root -p tradehk signals > signals_backup_$(date +%Y%m%d).sql +``` + +--- + +## Drizzle ORM 使用说明 + +tradehk 使用 Drizzle ORM 进行类型安全的数据库操作。 + +### 运行迁移 + +```bash +# 生成迁移文件 +pnpm drizzle-kit generate + +# 执行迁移 +pnpm drizzle-kit migrate +``` + +### 查看迁移历史 + +```bash +ls drizzle/migrations/ +``` + +--- + +## 相关文档 + +- [系统架构总览](./系统架构总览.md) — 数据流向 +- [类型系统参考](./类型系统参考.md) — Signal 类型定义 +- [部署运维指南](./部署运维指南.md) — 数据库备份和维护 diff --git a/wiki/tradehk/类型系统参考.md b/wiki/tradehk/类型系统参考.md new file mode 100644 index 0000000..b3eb6dd --- /dev/null +++ b/wiki/tradehk/类型系统参考.md @@ -0,0 +1,284 @@ +# tradehk 类型系统参考 + +> 返回:[tradehk 文档中心](./README.md) +> 源文件:`client/src/lib/types.ts`、`shared/types.ts` + +## 概述 + +tradehk 使用 TypeScript 强类型系统,所有数据结构都有明确的类型定义。本文档列出所有核心类型,方便开发者理解数据流和接口规范。 + +--- + +## 基础类型 + +### TimeInterval(K线周期) + +```typescript +type TimeInterval = + | '1m' | '3m' | '5m' | '10m' | '15m' | '30m' + | '1h' | '2h' | '4h' | '6h' | '12h' + | '1d' | '3d' | '1w' | '1M'; +``` + +**默认周期**:`10m`(10分钟) + +--- + +### Candle(K线数据) + +```typescript +interface Candle { + time: number; // Unix 时间戳(秒) + open: number; // 开盘价 + high: number; // 最高价 + low: number; // 最低价 + close: number; // 收盘价 + volume: number; // 成交量 +} +``` + +--- + +### TradingSignal(交易信号) + +```typescript +interface TradingSignal { + id: string; // nanoid 唯一 ID + timestamp: number; // 信号时间戳(毫秒) + symbol: string; // 交易对(如 "BTCUSDT") + interval: TimeInterval; // K线周期 + type: 'BUY' | 'SELL'; // 信号方向 + strength: 'STRONG' | 'MODERATE' | 'WEAK'; // 信号强度 + price: number; // 信号价格(收盘价) + indicators: { // 当前指标值快照 + ma10?: number; + ma100?: number; + ewo?: number; + macd?: number; + macdSignal?: number; + macdHistogram?: number; + ao?: number; + }; + reasons: string[]; // 触发原因列表(中文) + isActive: boolean; // 是否活跃 +} +``` + +--- + +### IndicatorParams(指标参数配置) + +```typescript +interface IndicatorParams { + // 移动平均线 + maPeriod?: number; // MA 短期周期(默认10) + maLongPeriod?: number; // MA 长期周期(默认100) + emaPeriods?: number[]; // 叠加显示的 EMA 周期列表(默认[12,26]) + + // MACD + macdFast?: number; // MACD 快线周期(默认10) + macdSlow?: number; // MACD 慢线周期(默认20) + macdSignal?: number; // MACD 信号线周期(默认10) + + // RSI + rsiPeriod?: number; // RSI 周期(默认14) + rsiOverbought?: number; // RSI 超买线(默认70) + rsiOversold?: number; // RSI 超卖线(默认30) + + // KDJ + kdjPeriod?: number; // KDJ 周期(默认9) + kdjKSmooth?: number; // K 平滑(默认3) + kdjDSmooth?: number; // D 平滑(默认3) + + // Stoch + stochPeriod?: number; // Stoch 周期(默认14) + stochSmooth?: number; // Stoch 平滑(默认3) + + // StochRSI + stochRsiRsiPeriod?: number; // StochRSI 的 RSI 周期(默认14) + stochRsiStochPeriod?: number; // StochRSI 的 Stoch 周期(默认14) + stochRsiKSmooth?: number; // K 平滑(默认3) + stochRsiDSmooth?: number; // D 平滑(默认3) + + // 布林带 + bollingerPeriod?: number; // 布林带周期(默认20) + bollingerStdDev?: number; // 标准差倍数(默认2) + + // SuperTrend + superTrendPeriod?: number; // SuperTrend ATR 周期(默认10) + superTrendMultiplier?: number; // SuperTrend 倍数(默认3) + + // DMI/ADX + dmiPeriod?: number; // DMI 周期(默认14) + + // ATR + atrPeriod?: number; // ATR 周期(默认14) + + // MFI + mfiPeriod?: number; // MFI 周期(默认14) + + // TTM Squeeze + ttmBbPeriod?: number; // 布林带周期(默认20) + ttmKcPeriod?: number; // 肯特纳通道周期(默认20) + + // 信号开关 + signalUseRsi?: boolean; // 是否使用 RSI 评分(默认true) + signalUseKdj?: boolean; // 是否使用 KDJ 评分(默认false) + signalUseStoch?: boolean; // 是否使用 Stoch 评分(默认false) + signalUseBollinger?: boolean; // 是否使用布林带评分(默认true) + signalUseSuperTrend?: boolean; // 是否使用 SuperTrend 评分(默认false) + signalUseDmi?: boolean; // 是否使用 DMI 评分(默认false) +} +``` + +--- + +### AlertConfig(通知配置) + +```typescript +interface AlertConfig { + enabled: boolean; // 通知总开关 + browserNotification: boolean; // 浏览器通知 + soundAlert: boolean; // 声音提醒 + alertOnBuySignal: boolean; // 买入信号通知 + alertOnSellSignal: boolean; // 卖出信号通知 + alertOnPriceBreakout: boolean; // 价格突破通知 + alertOnVolumeContraction: boolean; // 缩量提醒 + priceBreakoutPercent: number; // 价格突破阈值(%) + larkWebhookEnabled: boolean; // 飞书 Webhook 开关 + larkSignalNotifyMode: 'ewo_only' | 'all_signals'; // 通知模式 + signalLarkThrottleMinutes: number; // 信号推送频控(分钟) + ewoTurnRules: EwoTurnAlertRule[]; // EWO 转换规则 +} +``` + +--- + +### EwoTurnAlertRule(EWO 转换规则) + +```typescript +interface EwoTurnAlertRule { + id: string; // 规则 ID(nanoid) + enabled: boolean; // 是否启用 + symbol: string; // 交易对(如 "BTCUSDT") + interval: TimeInterval; // K线周期 + direction: EwoTurnDirection; // 转换方向 +} + +type EwoTurnDirection = 'red_to_green' | 'green_to_red'; +``` + +--- + +### TrendBiasConfig(大周期偏向配置) + +```typescript +interface TrendBiasConfig { + enabled: boolean; // 是否启用大周期过滤 + interval: '4h' | '12h'; // 大周期 K 线周期 + bias: TrendBias; // 当前大周期方向(自动计算) + lastUpdated: number; // 最后更新时间戳 + autoRefreshMinutes: number; // 自动刷新间隔(分钟) +} + +type TrendBias = 'BEARISH' | 'BULLISH' | 'NEUTRAL' | null; +``` + +--- + +### UserConfig(用户配置) + +```typescript +interface UserConfig { + timezone: string; // 用户时区(如 "Asia/Shanghai") + symbolIntervals: Record; // 每个币对的 K 线周期 + indicatorParams: IndicatorParams; // 指标参数 + showIndicators: ShowIndicatorsConfig; // 图表显示开关 + alerts: AlertConfig; // 通知配置 +} +``` + +--- + +### ShowIndicatorsConfig(图表显示配置) + +```typescript +interface ShowIndicatorsConfig { + showEwo: boolean; // 显示 EWO 子图 + showMacd: boolean; // 显示 MACD 子图 + showAo: boolean; // 显示 AO 子图 + showRsi: boolean; // 显示 RSI 子图 + showKdj: boolean; // 显示 KDJ 子图 + showStoch: boolean; // 显示 Stoch 子图 + showStochRsi: boolean; // 显示 StochRSI 子图 + showBollinger: boolean; // 显示布林带(主图叠加) + showMfi: boolean; // 显示 MFI 子图 + showObv: boolean; // 显示 OBV 子图 + showDmi: boolean; // 显示 DMI 子图 + showSuperTrend: boolean; // 显示 SuperTrend(主图叠加) + showAttr: boolean; // 显示 ATR 子图 + showTtmSqueeze: boolean; // 显示 TTM Squeeze 子图 + showEma: boolean; // 显示 EMA 叠加线 + showMa: boolean; // 显示 MA 叠加线 +} +``` + +--- + +## 数据库类型(shared/types.ts) + +### Signal(数据库信号记录) + +```typescript +// 对应 MySQL signals 表 +interface Signal { + id: number; // 自增主键 + userId: number; // 用户 ID + symbol: string; // 交易对 + interval: string; // K线周期 + direction: 'long' | 'short'; // 信号方向 + strength: 'strong' | 'medium' | 'weak'; // 信号强度 + score: number; // 信号评分(80/50/30) + price: number; // 信号价格 + ewo?: number; // EWO 值 + macd?: number; // MACD 值 + macdSignal?: number; // MACD 信号线值 + macdHist?: number; // MACD 柱状图值 + ao?: number; // AO 值 + reasons?: string; // JSON 字符串,原因列表 + signalAt: number; // 信号时间戳(毫秒) + createdAt: Date; // 创建时间 +} +``` + +--- + +## 类型常量 + +### 默认 EWO 监控规则 + +```typescript +const DEFAULT_EWO_RULE_SYMBOLS = [ + "BTCUSDT", "ETHUSDT", "BNBUSDT", "SOLUSDT", "DOGEUSDT" +]; +const DEFAULT_EWO_RULE_INTERVAL: TimeInterval = "10m"; +const DEFAULT_EWO_RULE_DIRECTION: EwoTurnDirection = "red_to_green"; +``` + +### 默认信号周期 + +```typescript +const DEFAULT_SYMBOL_INTERVAL: TimeInterval = "10m"; +``` + +### 缓存限制 + +```typescript +const CACHE_CANDLE_LIMIT = 300; // 每对最多缓存300根K线 +``` + +## 相关文档 + +- [指标引擎详解](./指标引擎详解.md) — 各指标函数签名 +- [信号评分引擎](./信号评分引擎.md) — TradingSignal 生成逻辑 +- [飞书通知格式规范](./飞书通知格式规范.md) — AlertConfig 使用说明 diff --git a/wiki/tradehk/系统架构总览.md b/wiki/tradehk/系统架构总览.md new file mode 100644 index 0000000..25e7ea1 --- /dev/null +++ b/wiki/tradehk/系统架构总览.md @@ -0,0 +1,130 @@ +# tradehk 系统架构总览 + +> 返回:[tradehk 文档中心](./README.md) + +## 技术栈 + +| 层次 | 技术 | 说明 | +|------|------|------| +| 前端框架 | React + TypeScript + Vite | 单页应用,实时更新 | +| UI 组件 | TailwindCSS + shadcn/ui | 深色专业交易终端风格 | +| 图表库 | lightweight-charts | TradingView 同款 K 线图库 | +| 后端框架 | Node.js + tRPC | 类型安全的 API 层 | +| 数据库 | MySQL(Drizzle ORM) | 信号持久化、用户配置 | +| 实时数据 | Binance WebSocket + REST API | K 线、行情、账户数据 | +| 通知推送 | 飞书 Webhook(Lark) | EWO 转换通知、信号通知 | +| 部署 | Docker Compose + Nginx | Node.js + MySQL + 反向代理 | +| 字体 | JetBrains Mono + Inter | 数字等宽字体 + 界面字体 | + +## 目录结构 + +``` +tradehk/ +├── client/ # 前端代码 +│ └── src/ +│ ├── lib/ +│ │ ├── indicators.ts # ★ 核心:所有技术指标计算 + 信号引擎 +│ │ ├── types.ts # ★ 核心:所有 TypeScript 类型定义 +│ │ ├── binanceApi.ts # Binance API 封装(前端) +│ │ ├── tradeService.ts # 交易服务(下单、持仓管理) +│ │ └── store.ts # 全局状态管理 +│ ├── components/ # UI 组件 +│ └── pages/ # 页面(Home、Login、NotFound) +├── server/ +│ ├── _core/ +│ │ ├── marketEngine.ts # ★ 核心:市场引擎(轮询、信号、EWO通知) +│ │ ├── marketData.ts # Binance API 封装(服务端) +│ │ ├── notification.ts # 通知服务基础层 +│ │ ├── lark.ts # 飞书 Webhook 推送 +│ │ └── dataApi.ts # 数据 API 路由 +│ ├── db.ts # 数据库操作层 +│ └── storage.ts # 存储抽象层 +├── shared/ +│ └── types.ts # 共享类型(数据库 schema 导出) +├── drizzle/ +│ ├── schema.ts # ★ 数据库表结构定义 +│ └── *.sql # 迁移文件 +├── deploy/ +│ ├── deploy.sh # 一键部署脚本 +│ ├── nginx.conf # Nginx 反向代理配置 +│ └── mysql/my.cnf # MySQL 配置 +└── docker-compose.yml # 生产环境容器编排 +``` + +## 数据流向 + +### 1. 实时行情流(前端) + +``` +Binance WebSocket + ↓ 订阅 K 线流(kline_10m 等) +useMarketData Hook + ↓ 更新 K 线缓存(最新300根) +K 线图组件(lightweight-charts) + ↓ 同步渲染 +指标子图(EWO / MACD / AO / RSI 等) +``` + +### 2. 信号检测流(服务端) + +``` +setInterval(每30秒,可配置 MARKET_ENGINE_POLL_MS) + ↓ +buildUserRuntimeConfigs() ← 从 MySQL 读取用户配置和监控列表 + ↓ +refreshCacheForPairs() ← 从 Binance REST API 拉取最新220根K线 + ↓ +evaluateSignalsForUser() ← 调用 generateSignal() 计算信号 + ↓ +hasSignalRecord() ← 去重检查(同币同方向同时间戳) + ↓ +saveSignal() ← 持久化到 MySQL signals 表 + ↓ +maybePushSignalLark() ← 频控后推送飞书通知 +``` + +### 3. EWO 转换检测流(服务端) + +``` +每次引擎轮询 + ↓ +evaluateEwoTurnForUser() + ↓ +取最后两根已收线K线的 EWO 值 + ↓ +比较颜色(red/green)是否发生变化 + ↓ +计算上一阶段持续时间和K线根数 + ↓ +consumeSharedEwoTurnDedupeSlot() ← 去重(同币同方向同时间戳只推一次) + ↓ +pushLarkWebhookMessage() ← 推送飞书通知 +``` + +## 关键配置参数 + +| 参数 | 默认值 | 说明 | +|------|--------|------| +| `MARKET_ENGINE_POLL_MS` | 30000 | 引擎轮询间隔(毫秒),最小10秒 | +| `MARKET_SUMMARY_INTERVAL_HOURS` | 4 | 定期汇总推送间隔(小时) | +| `CACHE_CANDLE_LIMIT` | 300 | 每对缓存K线数量上限 | +| `DEFAULT_SYMBOL_INTERVAL` | 10m | 默认K线周期 | +| `signalLarkThrottleMinutes` | 10 | 信号推送频控(分钟) | + +## 设计风格 + +tradehk 采用**精英深色仪表盘**风格(Elite Dark Dashboard): + +- **主背景**:`#0A0E17`(深海蓝黑) +- **主色调**:`#F0B90B`(Binance 黄金) +- **涨势色**:`#0ECB81`(清新绿) +- **跌势色**:`#F6465D`(警示红) +- **数字字体**:JetBrains Mono(等宽,确保对齐) +- **界面字体**:Inter(清晰易读) + +## 相关文档 + +- [指标引擎详解](./指标引擎详解.md) +- [信号评分引擎](./信号评分引擎.md) +- [EWO转换检测机制](./EWO转换检测机制.md) +- [部署运维指南](./部署运维指南.md) diff --git a/wiki/tradehk/部署运维指南.md b/wiki/tradehk/部署运维指南.md new file mode 100644 index 0000000..ab7f0ed --- /dev/null +++ b/wiki/tradehk/部署运维指南.md @@ -0,0 +1,286 @@ +# tradehk 部署运维指南 + +> 返回:[tradehk 文档中心](./README.md) +> 源文件:`docker-compose.yml`、`deploy/deploy.sh`、`deploy/nginx.conf` + +## 概述 + +tradehk 采用 Docker Compose 部署,包含三个容器:Node.js 应用服务、MySQL 数据库、Nginx 反向代理。支持一键部署脚本。 + +--- + +## 环境要求 + +| 组件 | 版本要求 | +|------|---------| +| Docker | 20.10+ | +| Docker Compose | 2.0+ | +| 服务器内存 | 最低 2GB | +| 服务器磁盘 | 最低 20GB | +| 操作系统 | Ubuntu 20.04+ / CentOS 7+ | + +--- + +## 快速部署 + +### 第一步:克隆仓库 + +```bash +git clone ssh://git@git.hk.hao.work:2222/hao/tradehk.git +cd tradehk +``` + +### 第二步:配置环境变量 + +复制并编辑环境变量文件: + +```bash +cp .env.example .env +``` + +关键环境变量说明: + +| 变量 | 必填 | 说明 | 示例 | +|------|------|------|------| +| `DATABASE_URL` | ✅ | MySQL 连接字符串 | `mysql://user:pass@mysql:3306/tradehk` | +| `JWT_SECRET` | ✅ | JWT 签名密钥(随机字符串) | `your-secret-key-here` | +| `LARK_WEBHOOK_URL` | ⭕ | 飞书 Webhook URL | `https://open.feishu.cn/...` | +| `MARKET_ENGINE_POLL_MS` | ⭕ | 引擎轮询间隔(毫秒) | `30000` | +| `MARKET_SUMMARY_INTERVAL_HOURS` | ⭕ | 汇总通知间隔(小时) | `4` | +| `BINANCE_API_KEY` | ⭕ | Binance API Key(自动交易需要) | `your-api-key` | +| `BINANCE_API_SECRET` | ⭕ | Binance API Secret | `your-api-secret` | + +### 第三步:一键部署 + +```bash +chmod +x deploy/deploy.sh +./deploy/deploy.sh +``` + +部署脚本会自动完成: +1. 构建 Docker 镜像 +2. 启动 MySQL 容器并等待就绪 +3. 运行数据库迁移(Drizzle migrate) +4. 启动 Node.js 应用容器 +5. 启动 Nginx 反向代理 + +--- + +## Docker Compose 结构 + +```yaml +services: + app: + build: . + ports: + - "3000:3000" + environment: + - DATABASE_URL + - JWT_SECRET + - LARK_WEBHOOK_URL + depends_on: + mysql: + condition: service_healthy + + mysql: + image: mysql:8.0 + volumes: + - mysql_data:/var/lib/mysql + - ./deploy/mysql/my.cnf:/etc/mysql/conf.d/my.cnf + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 + + nginx: + image: nginx:alpine + ports: + - "80:80" + - "443:443" + volumes: + - ./deploy/nginx.conf:/etc/nginx/conf.d/default.conf + depends_on: + - app + +volumes: + mysql_data: +``` + +--- + +## Nginx 配置说明 + +tradehk 的 Nginx 配置实现了: + +1. **前端静态文件服务**:React 构建产物(`/dist`) +2. **API 反向代理**:`/api/*` 转发到 Node.js 应用(`localhost:3000`) +3. **WebSocket 代理**:支持 tRPC WebSocket 连接 +4. **HTTPS 支持**:可配置 SSL 证书 + +关键配置片段: + +```nginx +server { + listen 80; + server_name your-domain.com; + + # 前端静态文件 + location / { + root /app/dist; + try_files $uri $uri/ /index.html; + } + + # API 代理 + location /api/ { + proxy_pass http://app:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + } +} +``` + +--- + +## 数据库管理 + +### 运行迁移 + +```bash +docker compose exec app pnpm drizzle-kit migrate +``` + +### 查看数据库 + +```bash +docker compose exec mysql mysql -u root -p tradehk +``` + +### 常用 SQL 查询 + +查看最近信号: +```sql +SELECT symbol, interval, direction, strength, price, + FROM_UNIXTIME(signalAt/1000) as signal_time +FROM signals +ORDER BY signalAt DESC +LIMIT 20; +``` + +查看 EWO 转换统计: +```sql +SELECT symbol, interval, direction, COUNT(*) as count +FROM signals +WHERE direction IN ('long', 'short') +GROUP BY symbol, interval, direction +ORDER BY count DESC; +``` + +--- + +## 日常运维 + +### 查看日志 + +```bash +# 应用日志 +docker compose logs -f app + +# 最近100行 +docker compose logs --tail=100 app + +# 只看错误 +docker compose logs app 2>&1 | grep -i error +``` + +### 重启服务 + +```bash +# 重启应用(不重启数据库) +docker compose restart app + +# 完整重启 +docker compose down && docker compose up -d +``` + +### 更新部署 + +```bash +git pull +docker compose build app +docker compose up -d app +``` + +### 备份数据库 + +```bash +docker compose exec mysql mysqldump -u root -p tradehk > backup_$(date +%Y%m%d).sql +``` + +--- + +## 飞书 Webhook 配置 + +### 获取 Webhook URL + +1. 在飞书群中添加自定义机器人 +2. 复制 Webhook URL(格式:`https://open.feishu.cn/open-apis/bot/v2/hook/xxx`) +3. 设置到环境变量 `LARK_WEBHOOK_URL` + +### 测试通知 + +```bash +curl -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" \ + -H "Content-Type: application/json" \ + -d '{"msg_type":"text","content":{"text":"tradehk 通知测试"}}' +``` + +--- + +## 性能调优 + +### MySQL 配置(deploy/mysql/my.cnf) + +| 参数 | 推荐值 | 说明 | +|------|--------|------| +| `innodb_buffer_pool_size` | 服务器内存的50% | InnoDB 缓冲池 | +| `max_connections` | 200 | 最大连接数 | +| `query_cache_size` | 64M | 查询缓存 | + +### 引擎轮询间隔 + +- **默认**:30秒(`MARKET_ENGINE_POLL_MS=30000`) +- **激进**:10秒(更快响应,更高 API 消耗) +- **保守**:60秒(减少 API 调用,适合多币对监控) + +**注意**:Binance API 有速率限制,监控超过20个币对时建议将轮询间隔设为60秒以上。 + +--- + +## 常见问题 + +**Q:EWO 转换通知没有收到?** + +检查顺序: +1. `LARK_WEBHOOK_URL` 是否正确配置 +2. 用户设置中 `larkWebhookEnabled` 是否为 true +3. `ewoTurnRules` 中是否有对应币对的规则且 `enabled=true` +4. 查看应用日志是否有推送错误 + +**Q:信号通知太频繁?** + +调整 `signalLarkThrottleMinutes` 参数(在用户设置中),默认10分钟,可以增加到30-60分钟。 + +**Q:数据库磁盘占用增长过快?** + +signals 表会持续增长。建议设置定期清理任务: +```sql +DELETE FROM signals WHERE signalAt < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) * 1000; +``` + +## 相关文档 + +- [系统架构总览](./系统架构总览.md) — 整体架构理解 +- [飞书通知格式规范](./飞书通知格式规范.md) — 通知配置说明 +- [开发历史与TODO](./开发历史与TODO.md) — 功能路线图 diff --git a/wiki/tradehk/飞书通知格式规范.md b/wiki/tradehk/飞书通知格式规范.md new file mode 100644 index 0000000..8275aca --- /dev/null +++ b/wiki/tradehk/飞书通知格式规范.md @@ -0,0 +1,223 @@ +# tradehk 飞书通知格式规范 + +> 返回:[tradehk 文档中心](./README.md) +> 源文件:`server/_core/marketEngine.ts`、`server/_core/lark.ts` + +## 概述 + +tradehk 通过飞书(Lark)Webhook 推送三类通知:EWO 转换通知、信号通知、定期汇总通知。所有通知均有标题长度限制(120字符)和内容长度限制(4000字符)。 + +## 通知类型一览 + +| 类型 | 触发条件 | 开关 | 频控 | +|------|---------|------|------| +| EWO 转换通知 | EWO 颜色转换(已收线确认) | larkWebhookEnabled | 去重(同转换只推一次) | +| 信号通知 | 多指标评分超过阈值 | larkSignalNotifyMode="all_signals" | signalLarkThrottleMinutes(默认10分钟)| +| 定期汇总通知 | 每N小时(默认4小时) | larkWebhookEnabled | 固定间隔 | + +--- + +## 类型一:EWO 转换通知 + +### 标题格式 + +``` +EWO转换提醒 {币对/周期} {方向} +``` + +示例: +``` +EWO转换提醒 BTC/10m EWO 红 -> 绿 +EWO转换提醒 SOL/10m EWO 绿 -> 红 +``` + +### 内容格式 + +``` +触发规则: {方向文字} +币对: {币对/周期} +转换确认: 已收线确认 +转换收线: {YYYY/MM/DD HH:mm:ss} ({时区}) +EWO: {前值} -> {当前值} +上一阶段: {颜色}({含义}) +持续: {时长} ({K线数}根{周期}K) +区间: {开始时间} ~ {结束时间} +当前: {颜色}({含义}) +``` + +### 完整示例(BTC 红→绿) + +``` +标题: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 +当前: 绿(多头) +``` + +### 完整示例(SOL 红→绿) + +``` +标题:EWO转换提醒 SOL/10m EWO 红 -> 绿 + +内容: +触发规则: EWO 红 -> 绿 +币对: SOL/10m +转换确认: 已收线确认 +转换收线: 2026/03/06 10:10:00 (Asia/Shanghai) +EWO: -0.037316 -> 0.006745 +上一阶段: 红(空头) +持续: 4小时 (24根10mK) +区间: 2026/03/06 06:00:00 ~ 2026/03/06 10:00:00 +当前: 绿(多头) +``` + +--- + +## 类型二:信号通知 + +### 标题格式 + +``` +{方向}信号 {币对/周期} {强度代码} +``` + +强度代码:H(STRONG)/ M(MODERATE)/ L(WEAK) + +示例: +``` +做多信号 BTC/10m H +做空信号 ETH/4h M +``` + +### 内容格式 + +``` +类型: {做多/做空} ({long/short}) +强度: {H/M/L} +币对: {币对/周期} +时间: {YYYY/MM/DD HH:mm:ss} ({时区}) +价格: {价格} +EWO: {值} +MACD: {值} +AO: {值} +Hist: {柱状图值} +依据: +- {原因1} +- {原因2} +...(最多8条) +``` + +### 完整示例 + +``` +标题:做多信号 BTC/10m H + +内容: +类型: 做多 (long) +强度: H +币对: BTC/10m +时间: 2026/03/06 10:10:00 (Asia/Shanghai) +价格: 85234.5 +EWO: 33.320837 +MACD: 12.456789 +AO: 8.234567 +Hist: 3.456789 +依据: +- EWO 上穿零轴(看多信号) +- MACD 金叉(看多) +- MACD 柱状图扩大(多头增强) +- AO 上穿零轴 +- 价格在MA10上方,MA10在MA100上方(多头排列) +- RSI(14)=42.3 超卖区(看多) +``` + +--- + +## 类型三:定期汇总通知 + +### 触发条件 + +每 N 小时(默认4小时,由 `MARKET_SUMMARY_INTERVAL_HOURS` 环境变量控制)自动推送。 + +### 内容格式 + +``` +时间: {当前时间} ({时区}) +窗口: {开始时间} ~ {结束时间} +币对(N): {币对列表} +图表指标(N): {指标列表} +信号指标(N): {指标列表} +{N}小时信号: 总={总数} 多={多头数} 空={空头数} +分币统计: +- {币对/周期} | 多:{数} 空:{数} | 高频:{原因代码} | 最近:{方向强度@价格} +... +``` + +--- + +## 通知配置结构 + +```typescript +interface AlertConfig { + enabled: boolean; // 总开关 + browserNotification: boolean; // 浏览器通知 + soundAlert: boolean; // 声音提醒 + alertOnBuySignal: boolean; // 买入信号通知 + alertOnSellSignal: boolean; // 卖出信号通知 + alertOnPriceBreakout: boolean; // 价格突破通知 + alertOnVolumeContraction: boolean; // 缩量提醒 + priceBreakoutPercent: number; // 价格突破阈值(%) + larkWebhookEnabled: boolean; // 飞书 Webhook 总开关 + larkSignalNotifyMode: 'ewo_only' | 'all_signals'; // 通知模式 + signalLarkThrottleMinutes: number; // 信号推送频控(分钟) + ewoTurnRules: EwoTurnAlertRule[]; // EWO 转换规则列表 +} +``` + +### 通知模式说明 + +| 模式 | 说明 | +|------|------| +| `ewo_only` | 只推送 EWO 转换通知(默认) | +| `all_signals` | 推送 EWO 转换 + 信号通知 + 定期汇总 | + +## 频控机制 + +### 信号通知频控 + +``` +throttleKey = "signal:{symbol}:{interval}:{buy/sell}" +冷却时间 = signalLarkThrottleMinutes × 60秒 +``` + +同一币对同一方向,在冷却时间内只推送一次。 + +### EWO 转换去重 + +``` +dedupeKey = "ewo_turn:{symbol}:{interval}:{direction}:{transitionBucketTs}" +``` + +同一根K线的同方向转换全局只推送一次(跨用户共享去重槽)。 + +## 环境变量配置 + +| 变量 | 说明 | 示例 | +|------|------|------| +| `LARK_WEBHOOK_URL` | 飞书 Webhook URL | https://open.feishu.cn/open-apis/bot/v2/hook/xxx | +| `MARKET_ENGINE_POLL_MS` | 引擎轮询间隔(毫秒) | 30000 | +| `MARKET_SUMMARY_INTERVAL_HOURS` | 汇总通知间隔(小时) | 4 | + +## 相关文档 + +- [EWO转换检测机制](./EWO转换检测机制.md) — EWO 通知的检测逻辑 +- [系统架构总览](./系统架构总览.md) — 通知在整体架构中的位置 +- [部署运维指南](./部署运维指南.md) — 飞书 Webhook 配置方法