// ==================== 数据加载函数 ==================== 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 = '
⚠️ 请先点击 MEXC 或 Binance 按钮获取K线数据
'; return; } // 确保指标字段已加载 if (!window.indicatorFields) { dom.resultDiv.innerHTML = '
⏳ 正在加载指标字段定义...
'; await loadIndicatorFields(); } if (!state.cachedRealtimeIndicators || Object.keys(state.cachedRealtimeIndicators).length === 0) { dom.resultDiv.innerHTML = '
⏳ 正在加载实时指标,请稍候...
'; await preloadDynamicIndicators(state, dom); await renderRealtimeIndicators(state, dom); return; } const dynamicFragment = renderAllDynamicIndicators(state.cachedRealtimeIndicators); dom.resultDiv.innerHTML = ''; dom.resultDiv.appendChild(dynamicFragment); } async function showParameterList(state, dom) { dom.resultDiv.innerHTML = '
⏳ 加载参数清单中...
'; try { const params = await loadParameters(state); const paramFragment = renderParameterList(params, state); const container = document.createElement('div'); container.id = 'fullParamContainer'; container.appendChild(paramFragment); dom.resultDiv.innerHTML = ''; dom.resultDiv.appendChild(container); if (state.activeSource && state.cachedData) { await preloadDynamicIndicators(state, dom); } } catch (err) { console.error('参数清单加载错误:', err); dom.resultDiv.innerHTML = `
❌ 参数清单加载失败
${err.message}
`; } } async function loadResultReportData(source, group = 1) { try { let url = `06.03_ResultReport_JSON.php?source=${source}`; if (source === 'binance') { url += `&group=${group}`; } 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); return data; } catch (err) { console.error('加载报告数据失败:', err); throw err; } }