diff --git a/static/js/strategy.js b/static/js/strategy.js index fc9aeb4..14f84ed 100644 --- a/static/js/strategy.js +++ b/static/js/strategy.js @@ -16,6 +16,42 @@ return o; } + function showPreview(el, text, ok) { + if (!el) return; + if (!text) { + el.hidden = true; + el.textContent = ''; + return; + } + el.hidden = false; + el.textContent = text; + el.style.color = ok === false ? 'var(--loss)' : ''; + } + + function formatPlan(plan) { + if (!plan) return ''; + var lines = []; + if (plan.symbol) lines.push('品种:' + plan.symbol); + if (plan.target_lots != null) lines.push('目标手数:' + plan.target_lots); + if (plan.first_lots != null) lines.push('首仓:' + plan.first_lots + ' 手'); + if (plan.grid && plan.grid.length) { + lines.push('补仓档位:' + plan.grid.map(function (g) { return g.price; }).join(' → ')); + } + if (plan.message) lines.push(plan.message); + return lines.length ? lines.join('\n') : JSON.stringify(plan, null, 2); + } + + function formatRoll(preview) { + if (!preview) return ''; + var lines = []; + if (preview.add_lots != null) lines.push('加仓手数:' + preview.add_lots); + if (preview.new_stop_loss != null) lines.push('新止损:' + preview.new_stop_loss); + if (preview.total_lots != null) lines.push('合计手数:' + preview.total_lots); + if (preview.worst_loss != null) lines.push('最坏亏损:' + preview.worst_loss + ' 元'); + if (preview.message) lines.push(preview.message); + return lines.length ? lines.join('\n') : JSON.stringify(preview, null, 2); + } + var trendForm = document.getElementById('trend-form'); var btnPreview = document.getElementById('btn-trend-preview'); var btnExec = document.getElementById('btn-trend-exec'); @@ -23,20 +59,32 @@ if (btnPreview && trendForm) { btnPreview.addEventListener('click', function () { + btnPreview.disabled = true; jsonPost('/api/strategy/trend/preview', formData(trendForm)).then(function (d) { - if (!d.ok) { previewEl.textContent = d.error || '预览失败'; btnExec.hidden = true; return; } + if (!d.ok) { + showPreview(previewEl, d.error || '预览失败', false); + btnExec.hidden = true; + return; + } trendPayload = formData(trendForm); - previewEl.textContent = JSON.stringify(d.plan, null, 2); + showPreview(previewEl, formatPlan(d.plan), true); btnExec.hidden = false; + }).finally(function () { + btnPreview.disabled = false; }); }); } if (btnExec) { btnExec.addEventListener('click', function () { if (!trendPayload) return; + btnExec.disabled = true; + btnExec.textContent = '执行中…'; jsonPost('/api/strategy/trend/execute', trendPayload).then(function (d) { if (!d.ok) { alert(d.error); return; } location.reload(); + }).finally(function () { + btnExec.disabled = false; + btnExec.textContent = '确认执行首仓'; }); }); } @@ -47,18 +95,30 @@ var rollPrev = document.getElementById('roll-preview'); if (btnRollP && rollForm) { btnRollP.addEventListener('click', function () { + btnRollP.disabled = true; jsonPost('/api/strategy/roll/preview', formData(rollForm)).then(function (d) { - if (!d.ok) { rollPrev.textContent = d.error; btnRollE.hidden = true; return; } - rollPrev.textContent = JSON.stringify(d.preview, null, 2); + if (!d.ok) { + showPreview(rollPrev, d.error, false); + btnRollE.hidden = true; + return; + } + showPreview(rollPrev, formatRoll(d.preview), true); btnRollE.hidden = false; + }).finally(function () { + btnRollP.disabled = false; }); }); } if (btnRollE && rollForm) { btnRollE.addEventListener('click', function () { + btnRollE.disabled = true; + btnRollE.textContent = '执行中…'; jsonPost('/api/strategy/roll/execute', formData(rollForm)).then(function (d) { if (!d.ok) { alert(d.error); return; } location.reload(); + }).finally(function () { + btnRollE.disabled = false; + btnRollE.textContent = '执行滚仓'; }); }); } diff --git a/templates/settings.html b/templates/settings.html index 9a793ce..76883ce 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -2,113 +2,138 @@ {% block title %}系统设置 - 国内期货监控系统{% endblock %} {% block extra_css %} {% endblock %} {% block content %} -