fix: 修改压力支撑计算方法

master^2
Lxy 2 weeks ago
parent fd64d43574
commit 82b8f859d8

@ -67,8 +67,8 @@ def get_futures_list(db: Session = Depends(get_db)):
"periods": _get_period_trends(all_candles), "periods": _get_period_trends(all_candles),
"successRate": _calc_success_rate(all_candles), "successRate": _calc_success_rate(all_candles),
"trendScore": _calc_trend_score(all_candles), "trendScore": _calc_trend_score(all_candles),
"resistance": round(high_price * 1.02, 2), "resistance": round(2 * ((high_price + low_price + close_price) / 3) - low_price, 2),
"support": round(low_price * 0.98, 2), "support": round(2 * ((high_price + low_price + close_price) / 3) - high_price, 2),
"open": open_price, "open": open_price,
"high": high_price, "high": high_price,
"low": low_price, "low": low_price,
@ -120,12 +120,12 @@ def get_futures_detail(symbol: str, db: Session = Depends(get_db)):
change = close_price - open_price change = close_price - open_price
change_pct = (change / open_price * 100) if open_price > 0 else 0 change_pct = (change / open_price * 100) if open_price > 0 else 0
resistance1 = round(high_price * 1.01, 2) # Pivot Point 公式计算关键点位
resistance2 = round(high_price * 1.03, 2) pp = (high_price + low_price + close_price) / 3
resistance3 = round(high_price * 1.05, 2) r1 = round(2 * pp - low_price, 2)
support1 = round(low_price * 0.99, 2) r2 = round(pp + (high_price - low_price), 2)
support2 = round(low_price * 0.97, 2) s1 = round(2 * pp - high_price, 2)
support3 = round(low_price * 0.95, 2) s2 = round(pp - (high_price - low_price), 2)
suggestion = _get_suggestion(close_price, open_price, change_pct) suggestion = _get_suggestion(close_price, open_price, change_pct)
suggestion_type = "up" if change >= 0 else "down" suggestion_type = "up" if change >= 0 else "down"
@ -145,15 +145,16 @@ def get_futures_detail(symbol: str, db: Session = Depends(get_db)):
"low": low_price, "low": low_price,
"volume": sum(float(c.get("volume", 0)) for c in all_candles), "volume": sum(float(c.get("volume", 0)) for c in all_candles),
"entryPrice": round(close_price * 0.995, 2) if change >= 0 else round(close_price * 1.005, 2), "entryPrice": round(close_price * 0.995, 2) if change >= 0 else round(close_price * 1.005, 2),
"targetPrice": resistance1 if change >= 0 else support1, "targetPrice": r1 if change >= 0 else s1,
"stopLoss": support1 if change >= 0 else resistance1, "stopLoss": s1 if change >= 0 else r1,
"riskLevel": "" if trend_score >= 80 else "" if trend_score >= 60 else "", "riskLevel": "" if trend_score >= 80 else "" if trend_score >= 60 else "",
"macd": _calc_macd(all_candles), "macd": _calc_macd(all_candles),
"rsi": _calc_rsi(all_candles), "rsi": _calc_rsi(all_candles),
"boll": _calc_boll(all_candles), "boll": _calc_boll(all_candles),
"kdj": _calc_kdj(all_candles), "kdj": _calc_kdj(all_candles),
"resistances": [resistance1, resistance2, resistance3], "resistances": [r1, r2],
"supports": [support1, support2, support3], "supports": [s1, s2],
"pivotPoint": round(pp, 2),
"periodConsistency": _get_period_trends(all_candles) "periodConsistency": _get_period_trends(all_candles)
} }

@ -1117,6 +1117,24 @@ body {
font-variant-numeric: tabular-nums; font-variant-numeric: tabular-nums;
} }
.level-item.pivot-point {
background: rgba(139, 92, 246, 0.1);
border: 1px solid rgba(139, 92, 246, 0.2);
border-radius: 8px;
padding: 8px 12px;
margin: 4px 0;
}
.level-item.pivot-point span:first-child {
color: var(--purple);
font-weight: 600;
}
.level-item.pivot-point span:last-child {
color: var(--purple);
font-size: 14px;
}
.level-divider { .level-divider {
height: 1px; height: 1px;
background: var(--border-color); background: var(--border-color);
@ -1517,6 +1535,11 @@ body.theme-minimal .level-item {
border-radius: 9999px; border-radius: 9999px;
} }
body.theme-minimal .level-item.pivot-point {
background: rgba(124, 58, 237, 0.08);
border-color: rgba(124, 58, 237, 0.2);
}
body.theme-minimal .trend-row { body.theme-minimal .trend-row {
background: var(--bg-card); background: var(--bg-card);
border-radius: 9999px; border-radius: 9999px;

@ -321,14 +321,17 @@
<span class="level-group-label">压力</span> <span class="level-group-label">压力</span>
<div class="level-item" id="resistance-1"><span>R1</span><span>--</span></div> <div class="level-item" id="resistance-1"><span>R1</span><span>--</span></div>
<div class="level-item" id="resistance-2"><span>R2</span><span>--</span></div> <div class="level-item" id="resistance-2"><span>R2</span><span>--</span></div>
<div class="level-item" id="resistance-3"><span>R3</span><span>--</span></div> </div>
<div class="level-divider"></div>
<div class="level-item pivot-point" id="pivot-point">
<span>中枢 (PP)</span>
<span>--</span>
</div> </div>
<div class="level-divider"></div> <div class="level-divider"></div>
<div class="level-group support"> <div class="level-group support">
<span class="level-group-label">支撑</span> <span class="level-group-label">支撑</span>
<div class="level-item" id="support-1"><span>S1</span><span>--</span></div> <div class="level-item" id="support-1"><span>S1</span><span>--</span></div>
<div class="level-item" id="support-2"><span>S2</span><span>--</span></div> <div class="level-item" id="support-2"><span>S2</span><span>--</span></div>
<div class="level-item" id="support-3"><span>S3</span><span>--</span></div>
</div> </div>
</div> </div>
</div> </div>

@ -461,7 +461,7 @@ function updateDetailView(data) {
} }
if (data.resistances) { if (data.resistances) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 2; i++) {
const el = document.getElementById(`resistance-${i + 1}`); const el = document.getElementById(`resistance-${i + 1}`);
if (el) { if (el) {
el.querySelector('span:last-child').textContent = formatNumber(data.resistances[i]); el.querySelector('span:last-child').textContent = formatNumber(data.resistances[i]);
@ -469,7 +469,7 @@ function updateDetailView(data) {
} }
} }
if (data.supports) { if (data.supports) {
for (let i = 0; i < 3; i++) { for (let i = 0; i < 2; i++) {
const el = document.getElementById(`support-${i + 1}`); const el = document.getElementById(`support-${i + 1}`);
if (el) { if (el) {
el.querySelector('span:last-child').textContent = formatNumber(data.supports[i]); el.querySelector('span:last-child').textContent = formatNumber(data.supports[i]);
@ -477,6 +477,10 @@ function updateDetailView(data) {
} }
} }
if (data.pivotPoint) {
document.getElementById('pivot-point').querySelector('span:last-child').textContent = formatNumber(data.pivotPoint);
}
if (data.periodConsistency) { if (data.periodConsistency) {
const container = document.getElementById('period-trends'); const container = document.getElementById('period-trends');
const periodNames = { '5': '5分钟', '15': '15分钟', '30': '30分钟', '60': '60分钟' }; const periodNames = { '5': '5分钟', '15': '15分钟', '30': '30分钟', '60': '60分钟' };
@ -630,6 +634,12 @@ function showHistoryModal(record) {
<span class="level-value down">${formatNumber(v)}</span> <span class="level-value down">${formatNumber(v)}</span>
</div> </div>
`).join('')} `).join('')}
${record.pivot_point ? `
<div class="modal-level-row" style="background:rgba(139,92,246,0.1);border-radius:8px;">
<span class="level-label" style="color:#8b5cf6;font-weight:600;">中枢 (PP)</span>
<span class="level-value" style="color:#8b5cf6;">${formatNumber(record.pivot_point)}</span>
</div>
` : ''}
${(record.support_levels || []).map((v, i) => ` ${(record.support_levels || []).map((v, i) => `
<div class="modal-level-row"> <div class="modal-level-row">
<span class="level-label">支撑${i + 1}</span> <span class="level-label">支撑${i + 1}</span>

Loading…
Cancel
Save