90 lines
3.6 KiB
Python
90 lines
3.6 KiB
Python
|
||
import json
|
||
from datetime import datetime
|
||
|
||
# Load trading history
|
||
try:
|
||
with open('/Users/vivian/work/python/auto_trade_sys/交易记录_2026-02-13T10-01-03.json', 'r') as f:
|
||
trades = json.load(f)
|
||
except FileNotFoundError:
|
||
print("Error: Trading history file not found.")
|
||
trades = []
|
||
|
||
# Load current positions
|
||
try:
|
||
with open('/Users/vivian/work/python/auto_trade_sys/持仓记录_2026-02-13T10-01-38.json', 'r') as f:
|
||
positions = json.load(f)
|
||
except FileNotFoundError:
|
||
print("Error: Current positions file not found.")
|
||
positions = []
|
||
|
||
print("=== 亏损分析报告 (Loss Analysis Report) ===")
|
||
print(f"分析时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||
print("-" * 50)
|
||
|
||
# 1. Analyze Closed Trades (Focus on Losses)
|
||
print("\n[已平仓亏损分析 (Closed Losing Trades)]")
|
||
loss_trades = [t for t in trades if t.get('盈亏', 0) < 0]
|
||
if not loss_trades:
|
||
print("今天没有亏损交易 (No losing trades today).")
|
||
else:
|
||
for t in loss_trades:
|
||
symbol = t.get('交易对')
|
||
pnl = t.get('盈亏', 0)
|
||
pnl_pct = t.get('盈亏比例', 0)
|
||
margin = t.get('保证金', 0)
|
||
leverage = t.get('杠杆', 0)
|
||
exit_reason = t.get('离场原因', 'unknown')
|
||
|
||
# Calculate expected stop loss based on old config (2.5% price move * leverage)
|
||
expected_sl_pct = 2.5 * leverage
|
||
|
||
print(f"交易对: {symbol}")
|
||
print(f" 盈亏: {pnl:.2f} USDT ({pnl_pct:.2f}%)")
|
||
print(f" 保证金: {margin:.2f} USDT")
|
||
print(f" 杠杆: {leverage}x")
|
||
print(f" 离场原因: {exit_reason}")
|
||
if abs(pnl_pct) >= 15:
|
||
print(f" ⚠️ 严重亏损 (Severe Loss): >15% margin loss")
|
||
if abs(pnl_pct) >= expected_sl_pct - 5 and abs(pnl_pct) <= expected_sl_pct + 10:
|
||
print(f" ℹ️ 原因推测: 旧配置 MIN_STOP_LOSS_PRICE_PCT=2.5% (预期亏损 ~{expected_sl_pct}%)")
|
||
print("-" * 30)
|
||
|
||
# 2. Analyze Current Positions
|
||
print("\n[当前持仓分析 (Current Positions Analysis)]")
|
||
if not positions:
|
||
print("当前无持仓 (No active positions).")
|
||
else:
|
||
high_risk_positions = []
|
||
for p in positions:
|
||
symbol = p.get('symbol')
|
||
pnl = p.get('pnl', 0)
|
||
pnl_pct = p.get('pnl_percent', 0)
|
||
leverage = p.get('leverage', 0)
|
||
|
||
print(f"交易对: {symbol}")
|
||
print(f" 当前盈亏: {pnl:.2f} USDT ({pnl_pct:.2f}%)")
|
||
print(f" 杠杆: {leverage}x")
|
||
|
||
# Check against new 10% risk limit
|
||
if pnl_pct <= -10:
|
||
print(f" 🔴 建议平仓 (Recommended Close): 亏损超过 10% (新配置限制)")
|
||
high_risk_positions.append(symbol)
|
||
elif pnl_pct <= -5:
|
||
print(f" 🟠 风险警告 (Warning): 亏损接近 10%")
|
||
else:
|
||
print(f" 🟢 正常持有 (Holding)")
|
||
print("-" * 30)
|
||
|
||
if high_risk_positions:
|
||
print(f"\n🚨 紧急建议: 请立即检查并考虑平仓以下 {len(high_risk_positions)} 个高风险持仓:")
|
||
print(f" {', '.join(high_risk_positions)}")
|
||
else:
|
||
print("\n✅ 所有持仓风险在可控范围内 (<10% 亏损).")
|
||
|
||
print("\n=== 结论 (Conclusion) ===")
|
||
print("1. 今天的严重亏损 (-15% ~ -40%) 主要是由于旧配置 'MIN_STOP_LOSS_PRICE_PCT = 2.5%' 导致的。")
|
||
print(" 在 8x-10x 杠杆下,2.5% 的价格波动会导致 20%-25% 的本金亏损。")
|
||
print("2. 新配置 (0.5% 最小止损) 已生效,未来交易的止损将控制在 ~5% - 10% 本金亏损。")
|
||
print("3. 建议手动平仓当前亏损超过 10% 的老订单,以避免进一步扩大损失。")
|