Deduct open position margin from recommend max lots.

Recalculate tradable symbol budgets from remaining margin after CTP usage and refresh the table on position updates.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-29 09:39:42 +08:00
parent fd2dba22fd
commit 71c480a587
5 changed files with 96 additions and 8 deletions
+24 -4
View File
@@ -38,6 +38,7 @@
var recommendMaxByProduct = {};
var recommendMaxByCode = {};
var recRowsRaw = [];
var recMeta = {};
var recSortKey = 'trend';
var recSortDesc = true;
var recIndustryFilter = '';
@@ -1454,7 +1455,7 @@
return counts;
}
function updateRecStats(allRows, visibleRows) {
function updateRecStats(allRows, visibleRows, meta) {
var el = document.getElementById('rec-stats');
if (!el) return;
var total = (allRows || []).length;
@@ -1464,6 +1465,12 @@
return;
}
var parts = [];
if (meta && meta.margin_used > 0) {
parts.push(
'持仓占用 <strong>' + fmtNum(meta.margin_used) + '</strong> 元,' +
'剩余额度 <strong class="text-accent">' + fmtNum(meta.margin_budget_remaining) + '</strong> 元'
);
}
if (recIndustryFilter) {
parts.push('筛选 <strong>' + shown + '</strong> / 共 ' + total + ' 个品种');
} else {
@@ -1641,15 +1648,28 @@
function renderRecommendTable() {
var filtered = filterRecommendRows(recRowsRaw);
var sorted = sortRecommendRows(filtered);
updateRecStats(recRowsRaw, sorted);
updateRecStats(recRowsRaw, sorted, recMeta);
renderRecommendRows(sorted);
}
function renderRecommendations(data) {
if (!recommendList || !data) return;
updateRecommendMaxMaps(data);
recMeta = {
margin_used: data.margin_used || 0,
margin_budget_remaining: data.margin_budget_remaining,
margin_budget_total: data.margin_budget_total
};
var recCap = document.getElementById('rec-capital');
if (recCap && data.capital != null) recCap.textContent = Number(data.capital).toFixed(2);
var recMarginHint = document.getElementById('rec-margin-hint');
if (recMarginHint) {
if (recMeta.margin_used > 0) {
recMarginHint.textContent = ' · 已扣持仓占用 ' + fmtNum(recMeta.margin_used) + ' 元';
} else {
recMarginHint.textContent = '';
}
}
var recUpdated = document.getElementById('rec-updated');
if (recUpdated && data.updated_at) {
recUpdated.textContent = '每日后台更新 · 最近 ' + data.updated_at;
@@ -1658,7 +1678,7 @@
recRowsRaw = rows.slice();
if (!rows.length) {
recommendList.innerHTML = '<tr><td colspan="' + REC_COLSPAN + '" class="empty-hint">当前资金下暂无推荐品种(每日后台刷新)</td></tr>';
updateRecStats([], []);
updateRecStats([], [], recMeta);
return;
}
renderRecommendTable();
@@ -1692,7 +1712,7 @@
renderRecommendTable();
});
}
if (recRowsRaw.length) updateRecStats(recRowsRaw, filterRecommendRows(recRowsRaw));
if (recRowsRaw.length) updateRecStats(recRowsRaw, filterRecommendRows(recRowsRaw), recMeta);
}
function connectRecommendStream() {