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 微弱穿越问题
|
||||
60
wiki/tradehk/README.md
普通文件
60
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)
|
||||
184
wiki/tradehk/优化建议汇总.md
普通文件
184
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)
|
||||
174
wiki/tradehk/信号评分引擎.md
普通文件
174
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排列 | 价格<MA10<MA100 | +1 | 空头 |
|
||||
|
||||
**常开指标最高可得分**:多头最高 7 分(EWO穿越2 + MACD金叉2 + MACD柱1 + AO穿越1 + MA排列1)
|
||||
|
||||
### 可选指标评分表
|
||||
|
||||
| 指标 | 触发条件 | 分值 | 方向 | 开关 |
|
||||
|------|---------|------|------|------|
|
||||
| RSI | RSI < 超卖线(默认30) | +1 | 多头 | signalUseRsi |
|
||||
| RSI | RSI > 超买线(默认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) — 完整类型定义
|
||||
110
wiki/tradehk/大周期偏向判定.md
普通文件
110
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 多周期联动
|
||||
162
wiki/tradehk/开发历史与TODO.md
普通文件
162
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) — 优化详细说明
|
||||
334
wiki/tradehk/指标引擎详解.md
普通文件
334
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) — 优化建议
|
||||
207
wiki/tradehk/数据库与存储.md
普通文件
207
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<string, {
|
||||
candles: Candle[]; // 最多 CACHE_CANDLE_LIMIT(300) 根 K 线
|
||||
updatedAt: number; // 最后更新时间戳
|
||||
}>
|
||||
```
|
||||
|
||||
**键格式**:`"{symbol}__{interval}"`,如 `"BTCUSDT__10m"`
|
||||
|
||||
**更新时机**:每次引擎轮询时,通过 `refreshCacheForPairs` 从 Binance API 拉取最新数据。
|
||||
|
||||
### tickerCache(行情缓存)
|
||||
|
||||
```typescript
|
||||
Map<string, {
|
||||
price: number; // 最新价格
|
||||
change24h: number; // 24小时涨跌幅
|
||||
volume24h: number; // 24小时成交量
|
||||
updatedAt: number; // 最后更新时间戳
|
||||
}>
|
||||
```
|
||||
|
||||
**键格式**:`"{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) — 数据库备份和维护
|
||||
284
wiki/tradehk/类型系统参考.md
普通文件
284
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<string, TimeInterval>; // 每个币对的 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 使用说明
|
||||
130
wiki/tradehk/系统架构总览.md
普通文件
130
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)
|
||||
286
wiki/tradehk/部署运维指南.md
普通文件
286
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) — 功能路线图
|
||||
223
wiki/tradehk/飞书通知格式规范.md
普通文件
223
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 配置方法
|
||||
在新工单中引用
屏蔽一个用户