// ==================== 数据加载函数 ==================== async function loadParameters(state) { if (state.cachedParams) return state.cachedParams; try { // 不再传递 group 参数,后端从 SESSION 读取当前组 const url = '06.01_Parameter_JSON.php'; const res = await fetch(url); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); if (data.error) throw new Error(data.error); state.cachedParams = data; return data; } catch (err) { console.error('加载参数失败:', err); throw new Error('参数API请求失败: ' + err.message); } } async function loadDynamicIndicatorsForAllSymbols(state) { if (!state.activeSource || !state.cachedData) { return { error: '动态指标:基于已获取的K线数据,请先点击MEXC或Binance按钮获取K线数据' }; } const symbols = Object.keys(state.cachedData); const promises = symbols.map(async (sym) => { try { let url = `06.02_DynamicIndicators_JSON.php?source=${state.activeSource}&symbol=${sym}`; // 如果是 Binance,传递当前 group 参数 if (state.activeSource === 'binance') { const group = state.binanceGroup || 1; url += `&group=${group}`; } const res = await fetch(url); const data = await res.json(); return { symbol: sym, data: data }; } catch (err) { console.warn(`加载 ${sym} 动态指标失败`, err); return { symbol: sym, data: { error: err.message } }; } }); const results = await Promise.all(promises); const map = {}; for (const { symbol, data } of results) { map[symbol] = data; } state.cachedRealtimeIndicators = map; return map; } async function preloadDynamicIndicators(state, dom) { if (!state.activeSource || !state.cachedData) return; if (state.cachedRealtimeIndicators && Object.keys(state.cachedRealtimeIndicators).length > 0) return; console.log('[预加载] 开始静默加载动态指标...'); await loadDynamicIndicatorsForAllSymbols(state); console.log('[预加载] 动态指标加载完成'); if (state.currentMode === 'realtime') { renderRealtimeIndicators(state, dom); } } async function renderRealtimeIndicators(state, dom) { if (!state.activeSource || !state.cachedData) { dom.resultDiv.innerHTML = '