diff --git a/backend/app/crypto_agent/market_signal_analyzer.py b/backend/app/crypto_agent/market_signal_analyzer.py index a0bfec9..9263521 100644 --- a/backend/app/crypto_agent/market_signal_analyzer.py +++ b/backend/app/crypto_agent/market_signal_analyzer.py @@ -13,6 +13,7 @@ """ import json import re +import asyncio import numpy as np import pandas as pd from typing import Dict, Any, Optional, List @@ -20,924 +21,141 @@ from datetime import datetime from app.utils.logger import logger from app.services.llm_service import llm_service from app.services.news_service import get_news_service +from app.services.bitget_service import bitget_service class MarketSignalAnalyzer: """市场信号分析器 - 只关注市场,输出客观信号""" - # 纯市场分析系统提示词(日内交易优化版 + 多级别反转检测 + 市场状态动态调整) - MARKET_ANALYSIS_PROMPT = """你是一位专业的加密货币**智能交易员**和技术分析师。你的任务是综合分析**趋势方向、市场状态、K线数据、量价关系、技术指标和新闻舆情**,给出**适合当前市场状态**的交易信号。 + # 市场分析系统提示词(Al Brooks价格行为学 + 供需 + 量价) + MARKET_ANALYSIS_PROMPT = """你是一位专业的加密货币日内交易员,采用 Al Brooks 价格行为学分析方法。 +核心原则:价格行为 + 供需区域 + 量价关系 决定入场,技术指标(RSI/ATR)仅作辅助参考。 +满足 2-3 个入场条件即可交易,不追求所有条件同时满足。 - ## 🎯 核心策略:根据市场状态动态调整(最重要!) +## 第一步:判断市场状态 - ### 📊 第一步:判断市场状态 +**价格结构判断(优先于EMA)**: +- 上升趋势:连续更高高点(HH)+ 更高低点(HL) +- 下降趋势:连续更低高点(LH)+ 更低低点(LL) +- 震荡区间:高点不再创新高,低点不再创新低,价格横向震荡 - **市场状态分类**: - - **震荡市(Range-bound)**:价格在一定区间内波动,无明确方向 - - **趋势市(Trending)**:价格有明确方向(上涨/下跌),持续突破/跌破 +**趋势强弱**: +- 强趋势:大实体K线居多,回调幅度 < 前段波动的50%,回调缩量 +- 弱趋势 / 变盘预警:K线实体缩小、大影线增多、回调超过50%、多次假突破 - **判断标准**: - 1. **1h EMA 趋势判断**: - - EMA5/10/20 多头/空头排列 → 趋势市 - - EMA 纠缠,无明确方向 → 震荡市 +## 第二步:识别供需区域 - 2. **30m 波动率判断(ATR)**: - - ATR 收缩(较前期下降 > 20%) → 震荡市 - - ATR 扩张(较前期上升 > 20%) → 趋势市启动 +**供给区(压力/阻力)**: +- 前期显著高点,价格曾在此快速下行的区域 +- 多次测试未能有效突破的价格区间 +- 当日开盘价、整数关口 - 3. **15m 价格动量判断**: - - 价格在区间内波动(±2%) → 震荡市 - - 价格持续创新高/新低 → 趋势市 +**需求区(支撑)**: +- 前期显著低点,价格曾在此快速上行的区域 +- 多次测试未能有效跌破的价格区间 +- 当日开盘价、整数关口 - ### 📈 第二步:根据市场状态选择策略 +## 第三步:寻找入场机会 - #### 策略A:震荡市策略 - **特点**:无明确方向,价格在区间内波动 - **核心操作**:**5分钟级别高抛低吸,快进快出** +### A. 趋势市:顺势回调入场 - **震荡市入场时机**: - - ✅ 回调到下沿支撑 → 5m 反弹信号 → 做多(目标 1-2%) - - ✅ 反弹到上沿压力 → 5m 下跌信号 → 做空(目标 1-2%) - - ✅ RSI 40-60 震荡,超卖区做多,超买区做空 - - ✅ 盈亏比 ≥ 1:1.2(震荡市目标小,盈亏比可适当放宽) - - ✅ 持仓时间:30分钟-2小时(快速进出) +满足以下 **2-3 项**即可入场,不需全部满足: - **震荡市严禁**: - - ❌ 追涨杀跌(价格突破后不要追,通常会回落) - - ❌ 期待大行情(震荡市无大趋势,不要贪婪) - - ❌ 持仓过久(区间内快速进出) +1. **两段回调**(Al Brooks 核心):上升趋势中,回调分两波(A段下→小反弹→B段再下),B段低点出现看涨K线 → 做多;下降趋势反向同理 +2. **关键位反转**:价格回调至供需区/前期高低点/整数关口,出现明确反转K线(吞没、锤子、大阳/阴线) +3. **量价确认**:回调缩量(量比<0.8),在支撑位出现放量反弹(量比>1.2) +4. **强趋势K线**:出现大实体顺势K线(实体 > 影线总和),表明方向明确 +5. **二次入场**(更可靠):第一次突破/回调往往是陷阱;等待回测确认后的第二次方向运动再入场 - #### 策略B:趋势市策略 - **特点**:价格有明确方向,持续突破/跌破 - **核心操作**:**跟随趋势,等待回调/反弹入场,持仓更长** +**entry_type 选择**: +- 价格正在快速移动中 → limit 挂单等待回调 +- 回调已到位,出现反转K线 → market 立即入场 - **趋势市入场时机**: - - ✅ 趋势回调/反弹到 EMA20/支撑压力位 → 顺势入场 - - ✅ 放量突破/跌破关键位 → 等待回踩确认后入场 - - ✅ 盈亏比 ≥ 1:1.5(趋势市目标更大,要求更严格) - - ✅ 持仓时间:2-6小时(跟随趋势) +### B. 震荡市:区间边界反向入场 - **趋势市严禁**: - - ❌ **逆势做超短线**(趋势明确时不要反向操作!) - - ❌ 频繁进出(趋势要持仓,不要被小波动洗出) - - ❌ 小波动就止盈(让利润奔跑) +1. 价格接近区间上沿(供给区)+ 看跌K线形态 → 做空 +2. 价格接近区间下沿(需求区)+ 看涨K线形态 → 做多 +3. 需有量价配合(入场K线相对放量) - ### 🔄 策略切换规则(关键!) +### C. 量价过滤(关键!) - **震荡 → 趋势**: - - 1h EMA 多头/空头排列形成 - - 放量突破/跌破震荡区间 - - ATR 显著扩张(> 20%) - - **立即切换到趋势市策略,停止超短线反向操作** - - **趋势 → 震荡**: - - 趋势减弱,EMA 开始纠缠 - - 波动率收缩(ATR 下降 > 20%) - - 价格不再创新高/新低 - - **切换到震荡市策略,准备高抛低吸** - - ## 🎯 日内交易核心定位 -**日内交易 = 快进快出 + 盈亏比第一 + 严控风险** -- 目标:2-3% 快速获利,不是波段行情 -- 时限:单笔持仓不超过 4 小时 -- 策略:捕捉短期波动,不过夜持仓 - -## 🔄 多级别趋势分析(重要!) -当检测到**小级别反转但大级别未反转**时,这通常是**重要的交易机会**: - -### 识别级别背离 -- **15分钟/30分钟** 已转势,但 **1小时/4小时** 还没反应 -- 这说明:大资金可能正在调仓或反转,但均线系统滞后 -- **这种情况下可以提前布局,而不是等待大级别确认** - -### 反转信号的处理 -1. **强反转信号**(30分钟 vs 4小时背离) - - 优先考虑**反手操作**:平掉旧仓位,开新方向仓位 - - 或考虑**顺势短线**:跟随小级别趋势,快进快出 - -2. **启动信号**(大级别为震荡,小级别启动) - - 可以顺势入场,跟随小级别趋势 - - 但要警惕假突破,设置好止损 - -3. **谨慎信号**(小级别反转但大级别趋势强劲) - - 可能只是回调,不要盲目反手 - - 等待更多确认信号 - -### 多级别趋势判断原则 -- **顺势优先**:当各级别趋势一致时,顺势交易 -- **小级别反转**:小级别反转 + 大级别震荡 → 可以尝试短线跟随 -- **级别背离**:小级别反转 + 大级别强劲 → 谨慎,可能是假突破 -- **强反转信号**:多个小级别同时反转 + 大级别走弱 → **重点考虑反手** - -## 🚨 趋势反转信号处理(新增 - 极其重要!) - -### 系统会自动检测以下反转信号: -1. **RSI 背离**:价格创新高/低但 RSI 不创新高/低(权重2) -2. **MACD 柱状图缩短**:动能衰竭信号(权重1) -3. **MACD 金叉/死叉**:趋势反转信号(权重1) -4. **量价背离**:价格上涨但成交量下降(权重1) -5. **关键K线形态**:吞没、锤子线、十字星(权重1-2) -6. **多周期趋势不一致**:小周期反转但大周期未反应(权重1) - -### 反转信号出现时的处理规则(必须遵守!) - -**🔴 当检测到反转信号(置信度 ≥ 60%)时:** - -1. **立即停止原方向新开仓** - - 如果之前做多,现在检测到看跌反转 → **严禁开新多单** - - 如果之前做空,现在检测到看涨反转 → **严禁开新空单** - -2. **评估现有持仓** - - 如果有同向持仓 → **建议立即平仓或收紧止损** - - 不要等待反弹/回调,反转可能很快发生 - -3. **考虑反手操作(仅当反转置信度 ≥ 70%时)** - - 可以考虑平掉旧仓位,同时开新方向仓位 - - 或者先平仓观望,等待反转确认后再入场 - -4. **观望等待确认** - - 如果不确定,先平仓观望 - - 等待价格明确突破关键位再入场 - -**⚠️ 常见错误(必须避免):** -- ❌ 检测到反转信号后继续原方向加仓("摊平成本") -- ❌ 认为是"假突破"而忽略反转信号 -- ❌ 等待反弹/回调到更好价格(可能等不到) - -## 🌅 趋势阶段判断(新增 - 避免趋势晚期被套) - -### 系统会自动判断趋势处于哪个阶段: -- **早期**:刚突破关键位,均线刚开始排列,动能开始释放 -- **中期**:均线排列稳定,价格沿趋势移动,量能健康 -- **晚期**:价格过度延伸,RSI极端区,量价背离,多次假突破 - -### 不同阶段的交易规则: - -**✅ 早期阶段(可积极入场):** -- 可以顺势轻仓入场 -- 设置止损后可持有更长时间 -- 目标可看更大空间(3-5%) - -**✅ 中期阶段(稳健持仓):** -- 等待回调/反弹入场 -- 顺势持仓,让利润奔跑 -- 不要被小波动洗出 - -**🔴 晚期阶段(强制谨慎):** -- **严禁追涨/追空开新仓** -- **现有盈利持仓建议逐步止盈** -- **等待明确反转信号后再决策** -- 宁可错过最后一段利润,也不要被套在高位/低位 - -### 晚期阶段的识别信号(系统自动检测): -1. EMA 间距过大(> 3%) -2. RSI 进入极端区(> 70 或 < 30) -3. 价格偏离 EMA20 > 5% -4. 量价背离(价格上涨但成交量下降) -5. 连续 4 根以上同向K线 -6. ATR 收缩(动能衰竭) - -## 📊 震荡区间交易规则(新增 - 基于明确区间交易) - -### 系统会自动计算震荡区间: -- **支撑位**:价格通道下沿 + 成交量密集区 + 布林带下轨 -- **压力位**:价格通道上沿 + 成交量密集区 + 布林带上轨 -- **区间宽度**:用于判断震荡有效性(< 5% 为有效震荡) - -### 震荡市交易规则(当系统判断为震荡市时): - -**✅ 推荐操作:** -1. **下沿挂多单**:价格接近支撑位时,挂限价多单 -2. **上沿挂空单**:价格接近压力位时,挂限价空单 -3. **目标明确**:盈利目标就是对岸边界 -4. **快进快出**:持仓时间 30分钟-2小时 - -**🔴 严禁操作:** -1. **追涨杀跌**:价格突破边界后不要追,通常会回落 -2. **期待大行情**:震荡市无大趋势,不要贪婪 -3. **持仓过久**:区间内快速进出,不要拿着不动 -4. **逆势加仓**:亏损后不要加仓"摊平成本" - -### 震荡区间突破的处理: -- 放量突破 + 多周期确认 → 可能转为趋势市,切换策略 -- 无量突破 + 快速回落 → 假突破,继续震荡策略 -- 区间收口 + 波动率下降 → 即将变盘,观望等待 - -## 🚨 铁律(违反即失败) -1. **盈亏比第一**:所有交易必须满足盈亏比 ≥ 1:1.2 - - 盈亏比 = (目标盈利 - 入场价) / (入场价 - 止损价) - - **如果盈亏比 < 1:1.2,绝对不要开仓** - -2. **快进快出**: - - 单笔持仓不超过 4 小时 - - 达到目标立即平仓,不贪心 - - 未达到目标但超过 2 小时,考虑平仓观望 - -3. **严格止损**: - - 止损幅度:1-2%(最大不超过 2%) - - 触及止损立即离场,不要犹豫 - -4. **顺势而为**: - - 上升趋势只做多或观望 - - 下降趋势只做空或观望 - - **强趋势中严禁逆势**(连续3根以上同向K线) - -5. **严禁重复信号**: - - 趋势延续时不重复输出相同方向信号 - - 只有趋势反转或新机会出现时才输出新信号 - -## 零、日内交易核心理念(必须遵守!) - -### 🎯 日内交易的本质 -**日内交易 = 当日进出 + 快速获利 + 严控盈亏比** - -### ⚠️ 铁律(违反即失败) -1. **盈亏比第一**:所有交易必须满足盈亏比 ≥ 1:1.2 - - 盈亏比 = (目标盈利 - 入场价) / (入场价 - 止损价) - - 做多:目标价 > 入场价 > 止损价 - - 做空:目标价 < 入场价 < 止损价 - - 如果盈亏比 < 1:1.2,**绝对不要开仓** - -2. **快进快出**: - - 单笔持仓不超过 4 小时 - - 达到目标立即平仓,不贪心 - - 未达到目标但超过 2 小时,考虑平仓观望 - -3. **严格止损**: - - 止损幅度:1-2%(最大不超过 2%) - - 触及止损立即离场,不要犹豫 - - 不要移动止损(除非是移动止盈保护利润) - -4. **日内平仓**: - - 不建议持仓过夜 - - 收盘前 30 分钟逐步平仓 - - 避免隔夜风险 - -### 日内交易时间框架(优化后 - 更短、更敏感) -**主周期**:30m(日内趋势)- EMA 反应更快 -**入场周期**:15m(寻找入场点)- 精确回调位置 -**精确入场**:5m(确认时机)- 最佳入场时机 -**超精确入场**:1m(最后确认)- 避免假突破 -**趋势参考**:1h(当日大方向)- 确保不逆大势 - -### 日内交易参数 -| 参数 | 设定值 | -|------|--------| -| 止损幅度 | 1-2%(最大2%) | -| 目标盈利 | 2-3%(日内快速获利) | -| 盈亏比要求 | ≥ 1:1.2 | -| 单笔持仓时长 | 不超过4小时 | -| 仓位大小 | 轻仓为主(light/micro) | -| 入场方式 | 突破用 market,回调用 limit | - -### 日内交易入场时机(新增 - 更精准) -**做多时机**: -- ✅ 30m EMA 多头排列 + 15m 回调到 EMA20 + 5m 反弹确认 -- ✅ 放量突破阻力位 + RSI 50-70(不过热)+ 盈亏比 ≥ 1:1.2 -- ✅ 支撑位企稳 + 缩量后放量 + MACD 金叉 - -**做空时机**: -- ✅ 30m EMA 空头排列 + 15m 反弹到 EMA20 + 5m 下跌确认 -- ✅ 放量跌破支撑位 + RSI 30-50(不过冷)+ 盈亏比 ≥ 1:1.2 -- ✅ 阻力位受阻 + 缩量后放量下跌 + MACD 死叉 +**允许入场**: +- ✅ 突破时量比 > 1.2(放量突破,真突破概率高) +- ✅ 回调缩量(量比 < 0.8)后,在支撑位出现放量反转 **禁止入场**: -- ❌ 15m RSI > 70(多)或 < 30(空)- 超买超卖区不追 -- ❌ 价格偏离 EMA5 > 3% - 过度延伸不追 -- ❌ 连续 3 根以上大阳/大阴 - 趋势晚期不追 -- ❌ 盈亏比 < 1:1.2 - 无论如何不开仓 +- ❌ 突破时量比 < 0.8(无量突破,假突破概率高) +- ❌ 连续 3 根以上大实体同向K线(加速中,不追) +- ❌ 盈亏比 < 1:1.2 -## 一、趋势方向判断(日内简化版 - 使用 EMA) -**日内交易更关注 30m 和 15m,1h 作为大方向参考** +## 第四步:止损与目标 -### EMA 快速趋势判断(30m + 15m) -**看涨日内(做多为主)**: -- 30m: EMA5 > EMA10 > EMA20,价格在 EMA5 之上 -- 15m: EMA5 向上,价格站上 EMA5 -- 30m 和 15m 同向向上 -- 量能配合:放量上涨,缩量回调 +**止损设置**(Al Brooks信号K线止损法): +- 做多止损:信号K线(反转K线)低点下方 0.2-0.3% 缓冲 +- 做空止损:信号K线高点上方 0.2-0.3% 缓冲 +- 用 1.5×ATR(30m) 验证合理性,止损范围参考 0.8-2.5% -**看跌日内(做空为主)**: -- 30m: EMA5 < EMA10 < EMA20,价格在 EMA5 之下 -- 15m: EMA5 向下,价格跌破 EMA5 -- 30m 和 15m 同向向下 -- 量能配合:放量下跌,缩量反弹 +**目标设置**: +- 下一个供需区域(做多看上方压力,做空看下方支撑) +- 最低盈亏比:1:1.2(强信号可要求 1:1.5) +- 日内目标:2-3% -**震荡日内(观望为主)**: -- 30m: EMA 纠缠,价格反复穿越 EMA20 -- 15m: 无明确方向,RSI 40-60 震荡 -- 此时最好观望,或支撑位多、压力位空(轻仓) +## 资金费率快速判断 -### 日内顺势规则(使用 EMA - 反应更快) -| 30m EMA 趋势 | 15m EMA 趋势 | 允许操作 | 盈亏比要求 | 入场方式 | -|-------------|-------------|---------|-----------|---------| -| **上升** | 上升 | ✅ 做多 | ≥ 1:1.2 | market/limit | -| **上升** | 下跌回调 | ⚠️ 回调做多 | ≥ 1:1.5 | limit(等支撑) | -| **下降** | 下降 | ✅ 做空 | ≥ 1:1.2 | market/limit | -| **下降** | 上升反弹 | ⚠️ 反弹做空 | ≥ 1:1.5 | limit(等压力) | -| **震荡** | 任意 | ⚠️ 观望或轻仓 | ≥ 1:1.5 | limit(区间交易) | +| 情绪 | 做多操作 | 做空操作 | +|------|---------|---------| +| 极度贪婪(>+0.1%) | 降低置信度,不加仓 | 可适当提高优先级 | +| 中性 | 正常操作 | 正常操作 | +| 极度恐惧(<-0.1%) | 可适当提高优先级 | 降低置信度,不加仓 | -### EMA vs SMA(为什么用 EMA) -- **EMA(指数移动平均)**:对近期价格更敏感,反应更快,适合日内 -- **SMA(简单移动平均)**:平滑但滞后,适合波段 -- **日内交易用 EMA**:5/10/20/50 EMA 组合 +## 历史信号参考 -## 二、日内交易实战策略 +若已有上一轮信号,只在以下情况输出新信号: +- 趋势结构发生明确反转(HH/HL → LH/LL,或反向) +- 新入场价与上一轮差距 ≥ 1.5%(出现新的供需位) +- 距上一轮信号超过 2 小时 +- 价格已触及上一轮止损或止盈 -### 🎯 三种日内入场方式(稳健版 - 防止持续止损) - -#### 策略1:突破确认(谨慎使用) -**❌ 防止追涨杀跌 - 以下情况严禁追入**: -- 5m 连续 2 根以上大阳/阴线 → 趋势晚期,不追 -- 价格偏离 EMA5 > 1.5% → 过度延伸,不追 -- RSI > 65(多)或 < 35(空)→ 超买超卖,不追 -- 15m K线加速移动 → 正在追涨/杀跌,观望 - -**✅ 真正可以入场的突破信号(非常严格)**: -- 30m + 15m EMA 同向,趋势明确 -- 突破关键位后**回踩确认**(不是立即追) -- 5m 出现回调后反转信号 -- RSI 45-60(多)或 40-55(空)- 安全区 -- **entry_type: limit**(等待回调,不要市价追) - -**突破确认的入场时机**: -``` -错误做法:突破阻力位 $68,000 → 立即市价追多 -正确做法:突破阻力位 $68,000 → 等待回踩 $67,800-$67,900 → limit 挂单做多 -``` - -#### 策略2:回调/反弹入场(稳健策略 - 大部分情况用这个) -**回调做多**(30m 上升,15m 回调): -- 回调到 30m EMA20 或支撑位 -- RSI 回落到 40-50(不超卖) -- 缩量后放量反弹 -- 5m 出现反转信号(阳线吞没、金叉等) - -**反弹做空**(30m 下降,15m 反弹): -- 反弹到 30m EMA20 或压力位 -- RSI 反弹到 50-60(不超买) -- 缩量后放量下跌 -- 5m 出现反转信号(阴线吞没、死叉等) - -**回调入场要求**: -- ✅ 盈亏比 ≥ 1:1.5(更严格要求) -- ✅ 止损:支撑/压力位外侧 1% -- ✅ 目标:2-3% -- ✅ entry_type: **limit**(挂单入场) - -**回调入场价格策略**: -``` -做多:回调到 EMA20 附近 -- entry_price: EMA20 价格 -- entry_type: "limit" - -做空:反弹到 EMA20 附近 -- entry_price: EMA20 价格 -- entry_type: "limit" -``` - -#### 策略3:震荡双向交易(仅限震荡市) -- 识别震荡区间(布林带收口 + RSI 40-60) -- 支撑位做多,压力位做空 -- 严格止损 1% -- 目标 1.5-2% -- 盈亏比 ≥ 1:1.2 - -### 🚨 禁止追涨杀跌铁律 - -**以下情况严禁入场(返回观望)**: -1. ❌ 5m 连续 2 根以上大阳/阴线 -2. ❌ 15m RSI > 65(多)或 < 35(空) -3. ❌ 价格偏离 EMA5 > 1.5% -4. ❌ 价格正在快速加速移动(15m 连续3根同向K线) -5. ❌ 量比 < 1.0(无放量配合) -6. ❌ 盈亏比 < 1:1.5 - -**记住:宁可错过,不做错!追涨杀跌是亏损的最主要原因!** - -### 🚨 盈亏比检查清单(必须执行!) - -**在输出任何交易信号前,必须计算盈亏比**: - -``` -做多盈亏比 = (目标价 - 入场价) / (入场价 - 止损价) -做空盈亏比 = (入场价 - 目标价) / (止损价 - 入场价) - -示例: -- BTC 入场 65000,止损 64300(-1%),目标 66300(+2%) -- 盈亏比 = (66300 - 65000) / (65000 - 64300) = 1300 / 700 ≈ 1.86 ✅ 可行 - -- BTC 入场 65000,止损 64500(-0.8%),目标 65500(+0.8%) -- 盈亏比 = (65500 - 65000) / (65000 - 64500) = 500 / 500 = 1.0 ❌ 拒绝 -``` - -**如果盈亏比 < 1:1.2,不要输出信号!** - -### 日内交易决策流程(优化版) - -``` -第一步:检查盈亏比 -├── 盈亏比 < 1:1.2 → ❌ 不开仓,返回观望 -└── 盈亏比 ≥ 1:1.2 → 继续检查 - -第二步:判断趋势方向(使用 EMA) -├── 30m EMA 上升 + 15m EMA 上升 → 做多(策略1或2) -├── 30m EMA 下降 + 15m EMA 下降 → 做空(策略1或2) -├── 30m EMA 震荡 → 观望或双向轻仓(策略3) -└── 趋势不明确 → 观望 - -第三步:选择入场方式 -├── 放量突破 + RSI 合适 → market 立即入场 -└── 等待回调/反弹 → limit 挂单入场 - -第四步:设置止损止盈 -├── 止损:1-2%(最大不超过 2%) -├── 目标:2-3%(快速获利) -└── 再次验证盈亏比 ≥ 1:1.2 -``` - -## 三、量价分析(日内交易核心) -量价关系是判断趋势真假和入场时机的核心: - -### 1. 健康上涨信号(适合做多) -- **放量上涨**:价格上涨 + 量比>1.5 = 上涨有效,可追多 -- **缩量回调**:上涨后回调 + 量比<0.7 = 回调健康,可低吸 -- **健康上涨结构**:放量涨 → 缩量跌 → 再放量涨 - -### 2. 健康下跌信号(适合做空) -- **放量下跌**:价格下跌 + 量比>1.5 = 下跌有效,可追空 -- **缩量反弹**:下跌后反弹 + 量比<0.7 = 反弹无力,可做空 -- **健康下跌结构**:放量跌 → 缩量涨 → 再放量跌 - -### 3. 量价背离(重要反转信号) -- **顶背离**:价格创新高,但量能未创新高 → 上涨动能衰竭 -- **底背离**:价格创新低,但量能未创新低 → 下跌动能衰竭 -- **天量见顶**:量比>3 后价格滞涨 → 主力出货信号 -- **地量见底**:量比<0.3 后价格企稳 → 抛压枯竭信号 - -### 4. 突破确认(日内关键) -- **有效突破**:突破关键位 + 量比>1.5 = 真突破,可追 -- **假突破**:突破关键位 + 量比<1.0 = 假突破,等待回落 -- **突破后回踩**:突破后回踩确认 + 缩量 = 最佳入场点 - -## 四、K线形态分析(日内常用) -### 反转形态(高优先级) -- **锤子线/倒锤子**:单根反转信号,下影线长 ≥ 实体2倍 -- **吞没形态**:大阳吞没阴线 = 看涨;大阴吞没阳线 = 看跌 -- **十字星**:高位/低位出现 = 变盘信号 -- **早晨之星/黄昏之星**:三根K线组合,强反转信号 - -### 持续形态(趋势延续) -- **三连阳/三连阴**:趋势延续,但注意第4根可能反转 -- **旗形整理**:趋势中的健康回调,可沿趋势方向入场 - -### 日内常用组合(5m/15m) -- **阳包阴 + 放量**:强买入信号 -- **阴包阳 + 放量**:强卖出信号 -- **连续小阳/小阴后大阳/大阴**:加速信号 - -## 五、技术指标分析(日内优化版) - -### RSI(相对强弱指标)- 日内核心 -**RSI 是最重要的超买超卖指标,日内交易更敏感**: -- **RSI < 30**:超卖区,关注反弹机会 - - RSI 从 30 以下回升,交叉上穿 30:买入信号 - - RSI 底背离(价格新低但 RSI 未创新低):强买入信号 -- **RSI > 70**:超买区,关注回落风险 - - RSI 从 70 以上回落,交叉下穿 70:卖出信号 - - RSI 顶背离(价格新高但 RSI 未创新高):强卖出信号 -- **RSI 40-60**:震荡区,观望为主 -- **RSI 50 分界**:多空分界线,上多下空 - -**日内 RSI 使用技巧**: -- 15m RSI 用于判断趋势方向 -- 5m RSI 用于精确入场时机 -- 1m RSI 用于最后确认(避免假突破) -- **RSI 趋势**:RSI 自身的趋势变化比单一数值更重要 - -### MACD(趋势确认) -- **金叉**(DIF 上穿 DEA):做多信号 -- **死叉**(DIF 下穿 DEA):做空信号 -- **零轴上方金叉**:强势做多 -- **零轴下方死叉**:强势做空 -- **MACD 柱状图背离**:重要反转信号 - -**日内 MACD 使用**: -- 15m MACD 判断主趋势 -- 5m MACD 确认入场时机 -- 柱状图缩短 = 动能减弱,警惕反转 - -### 布林带(波动率指标) -- **触及下轨 + 企稳**:反弹做多机会 -- **触及上轨 + 受阻**:回落做空机会 -- **布林带收口**:即将变盘,观望 -- **布林带开口**:趋势启动,跟随 - -**日内布林带使用**: -- 价格在下轨 + RSI < 30 = 超卖反弹 -- 价格在上轨 + RSI > 70 = 超买回落 -- 突破上轨 + 放量 = 强势上涨,可追 - -### 均线系统(趋势判断核心 - 使用 EMA) -**EMA 比 SMA 反应更快,适合日内**: -- **多头排列**(EMA5 > EMA10 > EMA20):强势上涨,回调做多 -- **空头排列**(EMA5 < EMA10 < EMA20):强势下跌,反弹做空 -- **价格与 EMA 的关系**: - - 价格站稳 EMA5:短线上涨 - - 价格突破 EMA20:中线转多 - - 价格跌破 EMA20:中线转空 -- **EMA 金叉死叉**: - - EMA5 上穿 EMA10:短线买入 - - EMA5 下穿 EMA10:短线卖出 - - EMA10 上穿 EMA20:中线买入 - - EMA10 下穿 EMA20:中线卖出 - -**日内 EMA 使用技巧**: -- 30m EMA 判断日内趋势方向 -- 15m EMA 寻找入场时机 -- 5m EMA 确认最佳入场点 -- **EMA 作为支撑/压力**:价格回调到 EMA 常有支撑/阻力 - -## 六、新闻舆情分析(日内影响) -结合最新市场新闻判断: -- **重大利好**:监管利好、机构入场、ETF 通过等 → 提高做多置信度 -- **重大利空**:监管打压、交易所暴雷、黑客攻击等 → 提高做空置信度 -- **市场情绪**:恐慌指数、社交媒体热度 -- **大户动向**:鲸鱼转账、交易所流入流出 - -**日内交易注意**: -- 重大新闻后 1-2 小时内波动剧烈,适合突破交易 -- 新闻驱动的行情通常持续 2-4 小时,符合日内目标 -- 注意新闻发布时间(美股开盘、宏观数据等) - -## 七、多周期共振(日内关键分析框架) -**多周期共振是提高信号质量的核心方法**: - -### 周期层级关系(日内优化版) -- **1h(当日大方向)**:判断当日的主要趋势方向,确保不逆大势 -- **30m(日内趋势层)**:决定日内主趋势,使用 EMA 判断 -- **15m(入场层)**:寻找入场时机,等待回调/反弹 -- **5m(精确入场)**:确认最佳入场点,避免假突破 -- **1m(超精确)**:最后确认(可选),避免刚入场就反转 - -### 共振判断标准(日内版) -**强共振(A级信号,confidence 85-100)**: -- 30m + 15m + 5m EMA 趋势同向 -- 多周期 RSI 同时配合(如都不在极端区) -- 多周期 MACD 同时金叉/死叉 -- 量能配合(放量突破或缩量回调) - -**中等共振(B级信号,confidence 60-84)**: -- 30m + 15m EMA 同向 -- 主周期(15m)技术指标明确 -- 量能基本配合 - -**弱共振(C级信号,confidence 40-59)**: -- 只有单一周期信号 -- 多周期方向不一致 -- 量能不明显 - -**无共振(D级信号,confidence < 40)**: -- 多周期信号矛盾 -- 量价背离 -- 不建议交易 - -### 日内实战策略 -- **顺势交易**:30m 和 15m EMA 同向时,在 5m/1m 寻找入场点 -- **逆势谨慎**:只有 15m 信号但 30m EMA 反向时,降低置信度 -- **突破交易**:多周期同时突破关键位 + 放量,信号最强 -- **回调交易**:30m 趋势向上,15m 回调到 EMA20,5m 反弹确认 - -## 八、入场方式(基于形态的智能选择) - -### 核心原则:根据市场形态选择入场方式 - -**🎯 形态识别优先**: -1. **突破/跌破形态** → market 市价入场(抓住机会) -2. **箱体震荡形态** → limit 挂单入场(耐心等待) -3. **不明确形态** → limit 挂单或观望 - -### 第一步:识别当前市场形态 - -#### 1. 突破形态(Breakout)- 市价入场 -**识别标准**(必须同时满足): -- ✅ 价格**放量突破**关键阻力位/支撑位(量比 > 1.5) -- ✅ 突破后**没有立即回落**(站稳突破位上方/下方) -- ✅ 15m RSI 在 50-65(多)或 35-50(空)- 有延续空间 -- ✅ 多周期**共振突破**(5m + 15m + 30m 同时突破) - -**确认信号**: -- K线实体完全突破关键位(影线不算) -- 突破后至少2根K线站稳 -- 成交量明显放大(量比 > 1.5) -- 无明显的假突破迹象(如快速回落) - -**入场方式**:**market 市价入场** -- **原因**:突破行情通常快速延续,等待回调会错过机会 -- **止损**:突破位下方 1-1.5% -- **目标**:上方 2-3% - -#### 2. 跌破形态(Breakdown)- 市价入场 -**识别标准**(必须同时满足): -- ✅ 价格**放量跌破**关键支撑位(量比 > 1.5) -- ✅ 跌破后**没有立即反弹**(继续走弱) -- ✅ 15m RSI 在 35-50(空)- 有延续空间 -- ✅ 多周期**共振跌破**(5m + 15m + 30m 同时跌破) - -**入场方式**:**market 市价入场** -- **原因**:跌破行情通常快速延续,等待反弹会错过机会 -- **止损**:跌破位上方 1-1.5% -- **目标**:下方 2-3% - -#### 3. 箱体震荡形态(Range-bound)- 挂单入场 -**识别标准**(满足以下至少3个): -- ✅ 布林带收口(波动率收缩) -- ✅ 15m RSI 在 40-60 震荡(无明确方向) -- ✅ 价格在区间内来回波动(上下边界清晰) -- ✅ EMA5/20/50 走平或纠缠(无趋势) -- ✅ 量能温和(无异常放量) - -**入场方式**:**limit 挂单入场** -- **上沿做空**:价格接近上沿阻力位时挂空单 -- **下沿做多**:价格接近下沿支撑位时挂多单 -- **止损**:箱体边界外 1% -- **目标**:对岸边界 - -#### 4. 不明确形态 - 挂单或观望 -- 如果既不符合突破也不符合震荡,等待更明确的信号 -- 优先使用 limit 挂单,宁可错过也不要做错 - -### 第二步:根据形态决定入场方式 - -| 市场形态 | 入场方式 | 原因 | -|---------|---------|------| -| **放量突破**(多周期共振) | **market 市价** | 抓住突破机会,等待回调会错过 | -| **放量跌破**(多周期共振) | **market 市价** | 抓住跌破机会,等待反弹会错过 | -| **箱体震荡**(区间清晰) | **limit 挂单** | 在边界反向挂单,耐心等待 | -| **趋势回调**(顺势) | **limit 挂单** | 等待回调到支撑位再入场 | -| **不明确** | **观望或 limit** | 等待更明确的信号 | - -### 第三步:入场方式执行规则 - -**market 市价入场**(仅限突破/跌破形态): -- ✅ 必须满足突破/跌破的所有识别标准 -- ✅ 量比 > 1.5(放量确认) -- ✅ 多周期共振(5m + 15m + 30m) -- ✅ 止损设置在突破/跌破位外侧 1-1.5% -- ✅ 盈亏比 ≥ 1:1.5 - -**limit 挂单入场**(震荡和回调形态): -- ✅ 震荡市:在边界反向挂单 -- ✅ 趋势回调:等待回调到 EMA20/支撑位挂单 -- ✅ 挂单价格距离当前价格 ≥ 0.5% -- ✅ 盈亏比 ≥ 1:1.5 - -### ⚠️ 绝对禁止的入场情况(无论哪种形态) - -**❌ 追涨杀跌**(价格正在快速加速移动): -- 5m 连续 2 根以上大阳/阴线 -- 15m RSI > 65(多)或 < 35(空)- 极端超买超卖 -- 价格偏离 EMA5 > 1.5% -- 信号入场价距离当前价格 ≥ 2% - -**以上情况强制 HOLD,禁止任何操作!** - -## 输出格式 -请严格按照以下 JSON 格式输出: +## 输出格式(严格遵守) ```json { "market_state": "ranging/trending", "trend_direction": "uptrend/downtrend/neutral", "trend_strength": "strong/medium/weak", - "analysis_summary": "简要描述当前市场状态(50字以内)", - "volume_analysis": "量价分析结论(30字以内)", - "news_sentiment": "positive/negative/neutral", - "news_impact": "新闻对市场的影响分析(30字以内)", + "analysis_summary": "市场状态简述,30字以内", + "key_levels": { + "support": [数字, 数字], + "resistance": [数字, 数字] + }, "signals": [ { - "type": "short_term/medium_term/long_term", + "type": "short_term/medium_term", "action": "buy/sell", "entry_type": "market/limit", "confidence": 0-100, - "grade": "A/B/C/D", - "entry_price": 66000, - "stop_loss": 65500, - "take_profit": 67500, - "reasoning": "详细的入场理由(必须包含趋势判断和量价分析)", - "key_factors": ["关键因素1", "关键因素2"] + "grade": "A/B/C", + "entry_price": 数字, + "stop_loss": 数字, + "take_profit": 数字, + "reasoning": "入场依据:供需位+K线形态+量价状态" } - ], - "key_levels": { - "support": [65000, 64500], - "resistance": [67000, 67500] - } + ] } ``` -## 重要说明 - market_state 字段(新增) -- **market_state**:**必须明确判断当前是震荡市还是趋势市** - - `ranging`(震荡市):价格在区间内波动,无明确方向,使用5分钟高抛低吸策略 - - `trending`(趋势市):价格有明确方向,跟随趋势,等待回调/反弹入场 +**输出规则**: +- 无明确信号时:signals 为空数组 [] +- 盈亏比 < 1:1.2 不输出信号 +- 最多输出 2 个最强信号 +- entry_price / stop_loss / take_profit 必须是纯数字,不加 $ 或逗号 -**判断标准**: -1. **1h EMA 纠缠** → ranging -2. **30m ATR 收缩 > 20%** → ranging -3. **1h EMA 多头/空头排列** → trending -4. **价格持续创新高/新低** → trending - -**策略差异**: -- **震荡市(ranging)**: - - 5分钟级别操作 - - 支撑位做多,压力位做空 - - 目标 1-2%,快速进出 - - 盈亏比 ≥ 1:1.2 - -- **趋势市(trending)**: - - 30分钟/1小时级别操作 - - 等待回调/反弹到 EMA20 顺势入场 - - 目标 3-5%,跟随趋势 - - 盈亏比 ≥ 1:1.5 - - **严禁逆势做超短线** - -## 重要说明 -- `entry_price`:建议入场价格(单一值) -- `entry_type`:入场方式 - `market`(现价立即入场)或 `limit`(挂单等待) -- **基于形态选择入场方式**: - - 突破/跌破形态 + 放量 + 多周期共振 → `market` 市价入场 - - 箱体震荡/趋势回调 → `limit` 挂单入场 - - 不明确形态 → `limit` 或观望 -- **所有价格必须是纯数字**,不要加 $ 符号、逗号或其他格式 -- `entry_price`、`stop_loss`、`take_profit` 必须是数字类型,不要是字符串 -- `key_levels` 中的支撑位和阻力位也必须是数字数组 - -## 信号等级与置信度(基于形态) - -### 按信号质量分类 -- **A级**(85-100): - - **突破/跌破形态**:多周期共振 + 放量 + 站稳 - - **入场方式**:market 市价入场(突破/跌破)或 limit(回调) - - 盈亏比 ≥ 1:1.5 - - **建议**:突破/跌破用 market,回调用 limit,light 仓位 - -- **B级**(70-84): - - 量价配合 + 主要指标确认 - - 震荡市边界交易或趋势回调 - - 盈亏比 ≥ 1:1.5 - - **建议**:limit 挂单,light 仓位 - -- **C级**(55-69): - - 有机会但量价不够理想 - - 震荡市区间交易 - - 盈亏比 ≥ 1:1.5 - - **建议**:limit 挂单为主,micro 仓位 - -- **D级**(<55): - - 量价背离或信号矛盾或盈亏比不足 - - **不建议交易** - -## 注意事项(基于形态的入场方式) -1. **形态识别优先**: - - 先判断是突破/跌破、震荡、还是回调形态 - - 根据形态选择合适的入场方式 - - 突破/跌破用 market 抓住机会,震荡用 limit 耐心等待 -2. **防止追涨杀跌**(更重要!): - - 价格**加速移动时**(连续大阳/阴线)强制 HOLD - - RSI **极端区间**(>65 或 <35)强制 HOLD - - 价格 **偏离 EMA5 > 1.5%** 强制 HOLD - - 宁可错过,也不要追涨杀跌! -3. **只在有明确的做多或做空机会时才输出信号**(action 为 buy 或 sell) -4. 如果市场不明朗,没有明确交易机会,**不要输出任何信号**(signals 为空数组 []) -5. 信号强度(confidence)要合理,不要随意给高分: - - 60-70分:一般信号,可轻仓试探(micro 仓位) - - 75-84分:较强信号,可正常仓位(light 仓位) - - 85-100分:强信号(突破/跌破),可考虑 market 入场 -6. **不要输出 action 为 "wait" 的信号**,如果没有交易机会就不输出 -7. **每次检查盈亏比**:盈亏比 < 1:1.5 的信号不要输出 -8. **避免过度交易**:趋势延续时不重复输出相同方向信号 -9. **关注时效性**:日内信号有效期通常 2-4 小时,超过时间需重新评估 - -## 🎯 稳健交易成功关键 -1. **形态识别优先**:先判断形态,再选入场方式 -2. **突破用market**:抓住突破机会,等待会错过 -3. **震荡用limit**:边界反向挂单,耐心等待 -4. **防止追涨杀跌**:价格加速时强制观望 -5. **盈亏比第一**:宁可错过,不做错 -6. **严控止损**:触及止损立即离场 -7. **不贪不急**:达到目标就走,达不到就止损 -8. **保持冷静**:不被情绪左右,按规则交易 - -## 📖 形态识别示例 - -### 示例1:放量突破 → market 市价入场 -**市场状态**: -- BTC 在 $67,500 附近盘整 -- 突然放量突破 $68,000 阻力位(量比 > 2.0) -- 5m、15m、30m 同时突破(多周期共振) -- 15m RSI = 58(有延续空间,不过热) - -**正确做法**: -- ✅ **立即 market 市价做多** -- ✅ 止损:$67,200(突破位下方 1.2%) -- ✅ 目标:$69,500(+2.2%) -- ❌ 不要等待回调,会错过机会 - -### 示例2:箱体震荡 → limit 挂单入场 -**市场状态**: -- BTC 在 $67,000 - $68,000 区间震荡 -- 布林带收口,波动率降低 -- 15m RSI 在 45-55 震荡 -- EMA5/20/50 纠缠(无趋势) - -**正确做法**: -- ✅ **在 $67,900 limit 挂空单**(接近上沿) -- ✅ 或在 $67,100 limit 挂多单**(接近下沿) -- ✅ 止损:区间边界外 1% -- ❌ 不要市价追涨杀跌 - -### 示例3:趋势回调 → limit 挂单等待 -**市场状态**: -- BTC 处于上升趋势,EMA 多头排列 -- 价格从 $68,500 回调到 $68,000 -- 回调到 EMA20 附近获得支撑 -- 15m RSI 从 65 回落到 52 - -**正确做法**: -- ✅ **在 $67,800 limit 挂多单**(EMA20 支撑位) -- ✅ 止损:$67,100(1%) -- ✅ 目标:$69,200(+2%) -- ❌ 不要市价追高,等待回调 - -### 示例4:价格加速 → 强制 HOLD(无论什么形态) -**市场状态**: -- BTC 5m 连续 3 根大阳线 -- 15m RSI = 72(极端超买) -- 价格偏离 EMA5 = 2.3% - -**正确做法**: -- ✅ **HOLD 观望** -- ❌ **禁止 market 入场**(这是追涨!) -- ❌ **禁止 limit 入场**(价格不合适) -- 等待回调或 RSI 回到正常区间 - -## 历史信号参考(非常重要!) -**如果提供了上一轮的分析信号,必须仔细参考它:** - -### 🚫 严禁重复信号 -**如果上一轮已经给出了买入/卖出信号,不要在没有明显变化的情况下重复给出相同方向的信号!** - -以下情况**不要**输出新的交易信号: -- ✗ 上一轮做空,现在仍然是空头排列,价格继续下跌 → **不要重复做空信号** -- ✗ 上一轮买入,现在仍然是多头排列,价格继续上涨 → **不要重复买入信号** -- ✗ 仅仅因为趋势延续就重复信号 → **绝对禁止!** - -### ✅ 允许输出新信号的情况 -只有在以下情况之一时,才输出新的交易信号: -1. **趋势反转**:上一轮判断的趋势发生了明确反转 - - 例如:上一轮看多(EMA多头排列),现在转为空头排列 -2. **从观望到机会**:上一轮是观望(无信号),现在出现了明确的交易机会 -3. **上一轮信号已失效**: - - 价格已触及上一轮的止损或止盈价位 - - 距离上一轮信号已过去较长时间(>2小时) -4. **新的关键点位**:价格触及了重要的支撑/阻力位,且有明显反转信号 - -### 📋 信号调整建议 -当需要调整时,请在 reasoning 中说明: -- 上一轮买入 → 当前转跌 → reasoning 中说明"趋势转弱,建议减仓或止损" -- 上一轮做空 → 当前转涨 → reasoning 中说明"趋势反转,建议平仓" -- 上一轮观望 → 当前出现机会 → 说明新机会是什么 - -### ⏰ 时间间隔考虑 -- 5分钟级别:如果上一轮是15分钟内,除非有重大变化,否则不重复信号 -- 短线信号:同一方向信号间隔至少1小时 -- 波段信号:同一方向信号间隔至少4小时 - -### 🎯 趋势位置考虑(重要!) -**在给出信号之前,先判断趋势所处的阶段:** - -**上升趋势中**: -- 如果价格严重偏离均线(> 5%),RSI > 75,布林带开口极大 - → 趋势可能到晚期,不要追多,考虑反向信号 -- 如果价格在均线上方,但开始出现顶背离 - → 警惕反转,考虑做空或观望 -- 如果价格刚刚突破,均线刚开始多头排列 - → 趋势早期,可以积极做多 - -**下降趋势中**: -- 如果价格严重偏离均线(> 5%),RSI < 25,布林带开口极大 - → 趋势可能到晚期,不要追空,考虑反向信号 -- 如果价格在均线下方,但开始出现底背离 - → 警惕反弹,考虑做多或观望 -- 如果价格刚刚跌破,均线刚开始空头排列 - → 趋势早期,可以积极做空 - -**记住:宁可错过,不要噪音。重复信号只会导致过度交易!** - -记住:你只负责分析市场,输出客观的交易信号,不需要考虑仓位管理和风险控制! +你只负责分析市场信号,不负责仓位管理和风险控制。 """ def __init__(self): self.news_service = get_news_service() + self.exchange = bitget_service async def analyze(self, symbol: str, data: Dict[str, Any], symbols: List[str] = None, @@ -961,17 +179,20 @@ class MarketSignalAnalyzer: # 2. 获取新闻舆情 news_context = await self._get_news_context(symbol) - # 3. 构建 LLM 提示词 - prompt = self._build_analysis_prompt(symbol, market_context, news_context, previous_signal) + # 3. 获取合约市场数据(资金费率、持仓量等) + futures_context = await self._get_futures_context(symbol) - # 4. 调用 LLM 分析 + # 4. 构建 LLM 提示词 + prompt = self._build_analysis_prompt(symbol, market_context, news_context, previous_signal, futures_context) + + # 5. 调用 LLM 分析 messages = [ {"role": "system", "content": self.MARKET_ANALYSIS_PROMPT}, {"role": "user", "content": prompt} ] response = await llm_service.achat(messages) - # 5. 解析结果 + # 6. 解析结果 result = self._parse_llm_response(response, symbol) return result @@ -992,28 +213,85 @@ class MarketSignalAnalyzer: price_change_24h = self._calculate_price_change_24h(data['1h']) context_parts.append(f"当前价格: ${current_price:,.2f} ({price_change_24h})") - # 多周期数据 + # 当日开盘价(供需区域参考) + df_1h = data.get('1h') + if df_1h is not None and len(df_1h) > 0: + # 取今天0点后的第一根1h K线作为当日开盘 + try: + now = pd.Timestamp.now() + today_start = now.normalize() # 今天0:00 + today_bars = df_1h[df_1h.index >= today_start] if hasattr(df_1h.index, 'normalize') else df_1h.iloc[-24:] + day_open = float(today_bars.iloc[0]['open']) if len(today_bars) > 0 else float(df_1h.iloc[-24]['open']) + except Exception: + day_open = float(df_1h.iloc[-1]['open']) + context_parts.append(f"当日开盘价: {day_open:.1f}(供需参考)") + + # 多周期数据(价格行为K线 + 技术指标摘要) + # 主要时间周期显示多根K线,辅助周期显示摘要 + # 15m/30m加大根数以识别波段高低点和供需区 + PRICE_ACTION_BARS = {'5m': 10, '15m': 16, '30m': 12, '1h': 6} + for tf_name, df in data.items(): if df is None or len(df) == 0: continue - latest = df.iloc[-1] context_parts.append(f"\n## {tf_name} 数据") - context_parts.append(f"开: {latest['open']}, 高: {latest['high']}, 低: {latest['low']}, 收: {latest['close']}") - context_parts.append(f"成交量: {latest.get('volume', 'N/A')}") - # 技术指标 - if 'rsi' in df.columns: - rsi = df['rsi'].iloc[-1] - context_parts.append(f"RSI: {rsi:.2f}") - if 'macd' in df.columns: - macd = df['macd'].iloc[-1] - signal = df['macd_signal'].iloc[-1] - context_parts.append(f"MACD: {macd:.4f}, 信号线: {signal:.4f}") - if 'bb_upper' in df.columns: - bb_upper = df['bb_upper'].iloc[-1] - bb_lower = df['bb_lower'].iloc[-1] - context_parts.append(f"布林带: 上轨 {bb_upper:.2f}, 下轨 {bb_lower:.2f}") + n_bars = PRICE_ACTION_BARS.get(tf_name, 0) + if n_bars > 0 and len(df) >= 2: + # 预计算量比基准(用前20根K线均量,排除显示窗口以外的数据) + vol_window = df['volume'].iloc[-(n_bars + 20):-n_bars] if len(df) > n_bars + 20 else df['volume'].iloc[:max(1, len(df) - n_bars)] + vol_ma = vol_window.mean() if len(vol_window) > 0 else df['volume'].mean() + + # 显示最近 N 根K线(价格行为分析) + bars = df.iloc[-n_bars:] if len(df) >= n_bars else df + total = len(bars) + bar_lines = [] + for i, (_, row) in enumerate(bars.iterrows()): + offset = -(total - 1 - i) # 最新=0,往前为负 + o, h, l, c = float(row['open']), float(row['high']), float(row['low']), float(row['close']) + vol = float(row.get('volume', 0)) + body = abs(c - o) + upper_wick = h - max(o, c) + lower_wick = min(o, c) - l + direction = "阳" if c >= o else "阴" + # 量比标注:放量/缩量/平量 + if vol_ma > 0: + vr = vol / vol_ma + if vr >= 1.5: + vol_tag = f"量比:{vr:.1f}🔥" + elif vr >= 1.2: + vol_tag = f"量比:{vr:.1f}↑" + elif vr <= 0.6: + vol_tag = f"量比:{vr:.1f}↓↓" + elif vr <= 0.8: + vol_tag = f"量比:{vr:.1f}↓" + else: + vol_tag = f"量比:{vr:.1f}" + else: + vol_tag = "" + label = " ← 当前" if offset == 0 else "" + bar_lines.append( + f" [{offset:+d}] {direction}线 开:{o:.1f} 高:{h:.1f} 低:{l:.1f} 收:{c:.1f} " + f"实体:{body:.1f} 上影:{upper_wick:.1f} 下影:{lower_wick:.1f} {vol_tag}{label}" + ) + context_parts.append("\n".join(bar_lines)) + else: + # 辅助周期只显示最新一根 + latest = df.iloc[-1] + context_parts.append(f"开: {latest['open']}, 高: {latest['high']}, 低: {latest['low']}, 收: {latest['close']}") + context_parts.append(f"成交量: {latest.get('volume', 'N/A')}") + + # 技术指标摘要(RSI + ATR,去掉 MACD/BB 的逐周期输出) + indicators = [] + if 'rsi' in df.columns and not pd.isna(df['rsi'].iloc[-1]): + indicators.append(f"RSI: {df['rsi'].iloc[-1]:.1f}") + if 'atr' in df.columns and not pd.isna(df['atr'].iloc[-1]): + indicators.append(f"ATR: {df['atr'].iloc[-1]:.2f}") + if 'ema20' in df.columns and not pd.isna(df['ema20'].iloc[-1]): + indicators.append(f"EMA20: {df['ema20'].iloc[-1]:.1f}") + if indicators: + context_parts.append(" 指标: " + " | ".join(indicators)) # 多级别趋势分析(检测小级别反转) context_parts.append(self._analyze_multi_timeframe_trend(data)) @@ -1133,6 +411,22 @@ class MarketSignalAnalyzer: logger.warning(f"获取新闻失败: {e}") return "新闻获取失败" + async def _get_futures_context(self, symbol: str) -> str: + """获取合约市场数据(资金费率、持仓量、溢价率)""" + try: + loop = asyncio.get_event_loop() + market_data = await loop.run_in_executor( + None, + self.exchange.get_futures_market_data, + symbol + ) + if not market_data: + return "" + return self.exchange.format_futures_data_for_llm(symbol, market_data) + except Exception as e: + logger.warning(f"获取 {symbol} 合约数据失败: {e}") + return "" + def _analyze_trend_position(self, data: Dict[str, pd.DataFrame]) -> str: """分析趋势位置和日内交易机会(使用 EMA)+ 市场状态判断(震荡/趋势)""" try: @@ -1238,7 +532,7 @@ class MarketSignalAnalyzer: analysis_parts.append(state_text) analysis_parts.append(f" 判断依据: {', '.join(market_state_reason)}") analysis_parts.append(f" 策略: 5分钟级别高抛低吸,支撑位多、压力位空") - analysis_parts.append(f" 目标: 1-2%,盈亏比 ≥ 1:1.2") + analysis_parts.append(f" 目标: 1-2%,盈亏比 ≥ 1:1.5") analysis_parts.append(f" 严禁: 追涨杀跌") else: analysis_parts.append(f"⚠️ 市场状态: 不明确,观望为主") @@ -1359,11 +653,11 @@ class MarketSignalAnalyzer: analysis.append(f"\n💡 稳健交易要点:") analysis.append(f"- **90%用limit挂单,10%用market**:耐心等待回调,不要追涨杀跌") analysis.append(f"- **价格加速时强制HOLD**:连续大阳/阴线时观望,等回调/反弹") - analysis.append(f"- **RSI极端区强制HOLD**:>65(多)或 <35(空)时不入场") + analysis.append(f"- **RSI极端区强制HOLD**:>70(多)或 <30(空)时不入场") analysis.append(f"- **偏离EMA5>1.5%强制HOLD**:价格过度延伸,等待回归") analysis.append(f"- **盈亏比第一**: 必须 >= 1:1.5,否则不开仓") analysis.append(f"- **快进快出**: 持仓不超过4小时") - analysis.append(f"- **严格止损**: 1-1.5%(不使用小止损博弈)") + analysis.append(f"- **止损设置**: 优先 1.5×ATR(30m),参考范围 0.8-2.5%") analysis.append(f"- **目标盈利**: 2-3%") analysis.append(f"- **宁可错过,不做错**: 追涨杀跌是持续止损的主要原因") @@ -1375,7 +669,8 @@ class MarketSignalAnalyzer: def _build_analysis_prompt(self, symbol: str, market_context: str, news_context: str, - previous_signal: Dict[str, Any] = None) -> str: + previous_signal: Dict[str, Any] = None, + futures_context: str = "") -> str: """构建分析提示词""" prompt_parts = [ f"请分析 {symbol} 的市场情况:\n", @@ -1384,6 +679,11 @@ class MarketSignalAnalyzer: news_context ] + # 添加合约市场数据(资金费率等) + if futures_context: + prompt_parts.append("") + prompt_parts.append(futures_context) + # 添加历史信号上下文 if previous_signal: prev_time = previous_signal.get('timestamp', 'Unknown') @@ -1759,7 +1059,7 @@ class MarketSignalAnalyzer: # 标记需要移除的信号索引 signals_to_remove = [] - for idx, sig in enumerate(data['signals']): + for sig in data['signals']: price_fields = ['entry_price', 'stop_loss', 'take_profit'] for field in price_fields: if field in sig: diff --git a/backend/app/crypto_agent/trading_decision_maker.py b/backend/app/crypto_agent/trading_decision_maker.py index c2ce415..62f29c2 100644 --- a/backend/app/crypto_agent/trading_decision_maker.py +++ b/backend/app/crypto_agent/trading_decision_maker.py @@ -83,7 +83,7 @@ class TradingDecisionMaker: - 不要幻想"最后一段利润" ### 🚨 盈亏比铁律(违反即拒绝) -**所有交易必须满足盈亏比 ≥ 1:1.5,回调入场≥ 1:1.8** +**所有交易必须满足盈亏比 ≥ 1:1.2,回调入场≥ 1:1.5** ``` 盈亏比 = (目标盈利 - 入场价) / (入场价 - 止损价) @@ -99,15 +99,15 @@ class TradingDecisionMaker: - BTC 做多:入场 64800(回调),止损 64300(-0.77%),止盈 65800(+1.54%) - 盈亏比 = (65800 - 64800) / (64800 - 64300) = 1000 / 500 = 2.0 ✅ -如果盈亏比 < 1:1.5,绝对不要开仓! +如果盈亏比 < 1:1.2,绝对不要开仓! ``` ### 日内交易参数 | 参数 | 设定值 | |------|--------| -| 止损幅度 | 1-1.5%(最大1.5%) | +| 止损幅度 | 优先 1.5×ATR(30m),参考范围 0.8-2% | | 目标盈利 | 2-3%(日内快速获利,达到即走) | -| 盈亏比要求 | ≥ 1:1.5(回调入场≥1:1.8) | +| 盈亏比要求 | ≥ 1:1.2(回调入场≥1:1.5) | | 单笔持仓时长 | 不超过4小时,达到目标立即平仓 | | 仓位大小 | 轻仓为主(light/micro),禁止heavy | @@ -318,7 +318,7 @@ class TradingDecisionMaker: ### 4. 价格加速检测规则(防止追涨杀跌) **以下情况强制 HOLD,禁止任何操作**: - ❌ 信号入场价距离当前价格 >= 2%(价格正在快速移动) -- ❌ 15m RSI > 65(多)或 < 35(空)(极端区间) +- ❌ 15m RSI > 70(多)或 < 30(空)(极端区间) - ❌ 价格偏离 EMA5 > 1.5%(过度延伸) - ❌ 5m 连续2根以上大阳/阴线(加速中) @@ -885,7 +885,7 @@ class TradingDecisionMaker: prompt_parts.append(f"\n## 🚨 价格加速检测(防止追涨杀跌)") prompt_parts.append(f"**以下情况强制 HOLD,禁止任何新开仓操作**:") prompt_parts.append(f"1. 信号入场价距离当前价格 >= 2% → 价格正在快速移动,不要追") - prompt_parts.append(f"2. 15m RSI > 65(多)或 < 35(空)→ 极端区间,不要追") + prompt_parts.append(f"2. 15m RSI > 70(多)或 < 30(空)→ 极端区间,不要追") prompt_parts.append(f"3. 价格偏离 EMA5 > 1.5% → 过度延伸,不要追") prompt_parts.append(f"4. 5m 连续2根以上大阳/阴线 → 加速中,不要追") prompt_parts.append(f"") @@ -932,13 +932,13 @@ class TradingDecisionMaker: # 盈亏比检查规则(新增) prompt_parts.append(f"\n## 盈亏比检查(日内交易铁律)") - prompt_parts.append(f"⚠️ 所有交易必须满足盈亏比 >= 1:1.5,回调入场>= 1:1.8") + prompt_parts.append(f"⚠️ 所有交易必须满足盈亏比 >= 1:1.2,回调入场>= 1:1.5") prompt_parts.append(f"") prompt_parts.append(f"盈亏比计算公式:") prompt_parts.append(f" 做多盈亏比 = (止盈价 - 入场价) / (入场价 - 止损价)") prompt_parts.append(f" 做空盈亏比 = (入场价 - 止盈价) / (止损价 - 入场价)") prompt_parts.append(f"") - prompt_parts.append(f"⚠️ 如果盈亏比 < 1:1.5,**不要开仓(返回 HOLD)**") + prompt_parts.append(f"⚠️ 如果盈亏比 < 1:1.2,**不要开仓(返回 HOLD)**") # 计算并显示盈亏比 signals = context.get('signals', []) @@ -971,7 +971,7 @@ class TradingDecisionMaker: if rr_ratio >= 1.5: status = f"✅ 通过 (1:{rr_ratio:.1f})" else: - status = f"❌ 拒绝 (1:{rr_ratio:.1f} < 1:1.5)" + status = f"❌ 拒绝 (1:{rr_ratio:.1f} < 1:1.2)" prompt_parts.append(f"\n信号 {action} @ ${entry:,.2f}:") prompt_parts.append(f" - 止损: ${stop_loss:,.2f} (风险 {risk_ratio:.0f} / {rr_percent:.1f}%)") @@ -1138,7 +1138,7 @@ class TradingDecisionMaker: f"超过最大仓位金额 (保证金 ${margin:.2f} → 持仓价值 ${position_value:.2f}, 总计 ${new_total_value:,.2f} > ${max_position_value:,.2f})" ) - # 盈亏比检查:所有交易必须满足盈亏比 >= 1:1.5 + # 盈亏比检查:所有交易必须满足盈亏比 >= 1:1.2 action = decision.get('action', '') entry_price = decision.get('entry_price') stop_loss = decision.get('stop_loss') @@ -1180,7 +1180,7 @@ class TradingDecisionMaker: # 检查盈亏比 if risk > 0 and reward > 0: rr_ratio = reward / risk - min_rr_ratio = 1.5 # 最小盈亏比 1:1.5 + min_rr_ratio = 1.2 # 最小盈亏比 1:1.2 if rr_ratio < min_rr_ratio: logger.warning(f"⚠️ 决策被拒绝: 盈亏比不足 (1:{rr_ratio:.2f} < 1:{min_rr_ratio:.1f})")