220 lines
7.6 KiB
Python
220 lines
7.6 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
分析ETH过去4小时的市场数据,检查为什么没有开仓
|
||
"""
|
||
import sys
|
||
import os
|
||
import asyncio
|
||
from datetime import datetime, timedelta
|
||
|
||
# 添加项目路径
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'backend'))
|
||
|
||
from app.services.binance_service import binance_service
|
||
from app.crypto_agent.market_signal_analyzer import MarketSignalAnalyzer
|
||
from app.crypto_agent.trading_decision_maker import TradingDecisionMaker
|
||
from app.services.paper_trading_service import get_paper_trading_service
|
||
from app.utils.logger import logger
|
||
|
||
|
||
async def analyze_eth_4h():
|
||
"""分析ETH过去4小时的情况"""
|
||
print("=" * 80)
|
||
print("📊 ETH 过去4小时市场分析")
|
||
print("=" * 80)
|
||
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||
|
||
# 1. 获取服务
|
||
binance = binance_service
|
||
signal_analyzer = MarketSignalAnalyzer()
|
||
decision_maker = TradingDecisionMaker()
|
||
trading_service = get_paper_trading_service()
|
||
|
||
# 2. 获取当前行情
|
||
print("\n📈 当前行情:")
|
||
current_price = binance.get_current_price('ETHUSDT')
|
||
stats = binance.get_24h_stats('ETHUSDT')
|
||
|
||
if current_price:
|
||
print(f" 价格: ${current_price:,.2f}")
|
||
if stats:
|
||
print(f" 涨跌: {stats.get('priceChangePercent', 0):+.2f}%")
|
||
print(f" 成交量: {stats.get('volume', 0):,.0f}")
|
||
|
||
# 3. 获取K线数据(多周期)
|
||
print("\n📊 获取K线数据...")
|
||
data = binance.get_multi_timeframe_data('ETHUSDT')
|
||
|
||
if not data:
|
||
print("❌ 无法获取K线数据")
|
||
return
|
||
|
||
# 显示各周期数据量
|
||
for tf, df in data.items():
|
||
print(f" {tf}: {len(df)} 条数据")
|
||
|
||
# 4. 检查过去4小时的价格波动
|
||
print("\n📊 过去4小时价格波动:")
|
||
df_15m = data.get('15m')
|
||
if df_15m is not None and len(df_15m) > 0:
|
||
# 获取过去4小时的15分钟数据(16根)
|
||
recent_4h = df_15m.tail(16)
|
||
if len(recent_4h) > 0:
|
||
high = recent_4h['high'].max()
|
||
low = recent_4h['low'].min()
|
||
start_price = recent_4h.iloc[0]['close']
|
||
end_price = recent_4h.iloc[-1]['close']
|
||
volatility = ((high - low) / start_price) * 100
|
||
price_change = ((end_price - start_price) / start_price) * 100
|
||
|
||
print(f" 最高: ${high:,.2f}")
|
||
print(f" 最低: ${low:,.2f}")
|
||
print(f" 波动幅度: {volatility:.2f}%")
|
||
print(f" 价格变化: {price_change:+.2f}%")
|
||
|
||
# 5. 运行信号分析
|
||
print("\n🔍 信号分析:")
|
||
print("-" * 80)
|
||
|
||
analysis = await signal_analyzer.analyze('ETHUSDT', data)
|
||
|
||
# 显示分析结果
|
||
print(f"\n市场状态: {analysis.get('analysis_summary', 'N/A')}")
|
||
|
||
# 新闻情绪
|
||
if analysis.get('news_sentiment'):
|
||
sentiment_map = {'positive': '📈 积极', 'negative': '📉 消极', 'neutral': '➖ 中性'}
|
||
print(f"新闻情绪: {sentiment_map.get(analysis['news_sentiment'], analysis['news_sentiment'])}")
|
||
|
||
# 信号
|
||
signals = analysis.get('signals', [])
|
||
if signals:
|
||
print(f"\n🎯 生成 {len(signals)} 个信号:")
|
||
for sig in signals:
|
||
action = sig.get('action', 'wait')
|
||
action_map = {'buy': '🟢 做多', 'sell': '🔴 做空', 'wait': '⏸️ 观望'}
|
||
grade = sig.get('grade', 'D')
|
||
confidence = sig.get('confidence', 0)
|
||
|
||
print(f"\n {action_map.get(action, action)} [{grade}级] {confidence}%")
|
||
print(f" 入场: ${sig.get('entry_price', 0):,.2f}")
|
||
print(f" 止损: ${sig.get('stop_loss', 0):,.2f}")
|
||
print(f" 止盈: ${sig.get('take_profit', 0):,.2f}")
|
||
print(f" 入场方式: {sig.get('entry_type', 'N/A')}")
|
||
|
||
if sig.get('reason'):
|
||
print(f" 理由: {sig['reason']}")
|
||
if sig.get('risk_warning'):
|
||
print(f" ⚠️ 风险: {sig['risk_warning']}")
|
||
else:
|
||
print("\n⏸️ 无交易信号")
|
||
|
||
# 6. 检查当前持仓
|
||
print("\n💼 当前持仓:")
|
||
account = trading_service.get_account_status()
|
||
active_orders = trading_service.get_active_orders()
|
||
|
||
print(f" 余额: ${account['current_balance']:,.2f}")
|
||
print(f" 已用保证金: ${account['used_margin']:,.2f}")
|
||
print(f" 持仓数量: {len(active_orders)}")
|
||
|
||
if active_orders:
|
||
for order in active_orders:
|
||
print(f"\n {order.symbol} {order.side.value}")
|
||
print(f" 入场价: ${order.filled_price:,.2f}")
|
||
print(f" 当前价: ${current_price:,.2f}")
|
||
print(f" 保证金: ${order.margin:,.2f}")
|
||
print(f" 杠杆: {order.leverage}x")
|
||
else:
|
||
print(" 无持仓")
|
||
|
||
# 7. 模拟交易决策
|
||
print("\n🤖 交易决策分析:")
|
||
print("-" * 80)
|
||
|
||
if signals:
|
||
# 对每个信号做决策
|
||
for sig in signals[:3]: # 只看前3个
|
||
decision = await decision_maker.make_decision(
|
||
symbol='ETHUSDT',
|
||
signals=[sig],
|
||
current_data=data,
|
||
current_price=current_price
|
||
)
|
||
|
||
print(f"\n信号: {sig.get('action', 'wait')} | {sig.get('grade')}级 | {sig.get('confidence')}%")
|
||
print(f"决策: {decision['decision']}")
|
||
print(f"理由: {decision.get('reason', 'N/A')}")
|
||
|
||
if decision.get('orders_to_open'):
|
||
print(f"开仓: {len(decision['orders_to_open'])} 个")
|
||
if decision.get('orders_to_close'):
|
||
print(f"平仓: {decision['orders_to_close']}")
|
||
else:
|
||
print("无信号,不生成决策")
|
||
|
||
# 8. 检查是否有追涨杀跌的情况
|
||
print("\n⚠️ 追涨杀跌检测:")
|
||
print("-" * 80)
|
||
|
||
if df_15m is not None and len(df_15m) >= 5:
|
||
recent = df_15m.tail(5)
|
||
|
||
# 计算RSI
|
||
import pandas_ta as ta
|
||
rsi = recent['close'].ta.rsi(length=14)
|
||
current_rsi = rsi.iloc[-1] if not rsi.empty else 50
|
||
|
||
# 检查连续大阳线/阴线
|
||
big_moves = 0
|
||
for i in range(1, min(4, len(recent))):
|
||
change = abs((recent.iloc[i]['close'] - recent.iloc[i-1]['close']) / recent.iloc[i-1]['close']) * 100
|
||
if change >= 1.0:
|
||
big_moves += 1
|
||
|
||
# 检查价格偏离EMA
|
||
ema5 = recent['close'].ta.ema(length=5)
|
||
current_price = recent.iloc[-1]['close']
|
||
deviation = abs((current_price - ema5.iloc[-1]) / ema5.iloc[-1]) * 100 if not ema5.empty else 0
|
||
|
||
print(f" RSI(14): {current_rsi:.1f}")
|
||
print(f" 连续大K线: {big_moves} 根")
|
||
print(f" 偏离EMA5: {deviation:.2f}%")
|
||
|
||
# 判断是否满足追涨杀跌条件
|
||
is_chasing = False
|
||
reasons = []
|
||
|
||
if current_rsi > 65 or current_rsi < 35:
|
||
is_chasing = True
|
||
reasons.append(f"RSI处于极端区间 ({current_rsi:.1f})")
|
||
|
||
if big_moves >= 2:
|
||
is_chasing = True
|
||
reasons.append(f"连续{big_moves}根大K线")
|
||
|
||
if deviation > 1.5:
|
||
is_chasing = True
|
||
reasons.append(f"价格偏离EMA5超过1.5%")
|
||
|
||
if is_chasing:
|
||
print(f"\n 🚨 检测到追涨杀跌条件!")
|
||
for reason in reasons:
|
||
print(f" - {reason}")
|
||
print(f"\n → 这是防止开仓的原因之一")
|
||
else:
|
||
print(f"\n ✅ 未检测到追涨杀跌条件")
|
||
|
||
print("\n" + "=" * 80)
|
||
print("分析完成")
|
||
print("=" * 80)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
asyncio.run(analyze_eth_4h())
|
||
except Exception as e:
|
||
print(f"\n❌ 分析失败: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|