|
|
|
@ -255,47 +255,67 @@ async function loadFuturesList() {
|
|
|
|
async function loadAllAIAnalysis() {
|
|
|
|
async function loadAllAIAnalysis() {
|
|
|
|
console.log('开始加载所有合约的AI分析结果...');
|
|
|
|
console.log('开始加载所有合约的AI分析结果...');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取今天的日期字符串用于比较
|
|
|
|
|
|
|
|
const today = new Date();
|
|
|
|
|
|
|
|
const todayStr = today.toISOString().split('T')[0]; // YYYY-MM-DD
|
|
|
|
|
|
|
|
|
|
|
|
// 分批加载,避免并发请求过多
|
|
|
|
// 分批加载,避免并发请求过多
|
|
|
|
const batchSize = 5;
|
|
|
|
const batchSize = 5;
|
|
|
|
for (let i = 0; i < allFuturesData.length; i += batchSize) {
|
|
|
|
for (let i = 0; i < allFuturesData.length; i += batchSize) {
|
|
|
|
const batch = allFuturesData.slice(i, i + batchSize);
|
|
|
|
const batch = allFuturesData.slice(i, i + batchSize);
|
|
|
|
const promises = batch.map(async (item) => {
|
|
|
|
const promises = batch.map(async (item) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const response = await fetch(`${API_BASE}/ai-analysis/${item.symbol}`);
|
|
|
|
// 获取历史记录
|
|
|
|
|
|
|
|
const response = await fetch(`${API_BASE}/ai-analysis/${item.symbol}/history?limit=1`);
|
|
|
|
const data = await response.json();
|
|
|
|
const data = await response.json();
|
|
|
|
|
|
|
|
|
|
|
|
if (data.success && data.data && data.data.result) {
|
|
|
|
if (data.success && data.data && data.data.length > 0) {
|
|
|
|
const result = data.data.result;
|
|
|
|
const latestRecord = data.data[0]; // 最新的一条记录
|
|
|
|
const analysisItem = allFuturesData.find(d => d.symbol === item.symbol);
|
|
|
|
const analysisTime = latestRecord.analysis_time;
|
|
|
|
if (analysisItem) {
|
|
|
|
|
|
|
|
analysisItem.hasAIAnalysis = true;
|
|
|
|
// 判断是否是今天的记录
|
|
|
|
analysisItem.aiResult = result;
|
|
|
|
const recordDate = new Date(analysisTime);
|
|
|
|
|
|
|
|
const recordDateStr = recordDate.toISOString().split('T')[0];
|
|
|
|
// 更新操作建议
|
|
|
|
|
|
|
|
if (result.trading_suggestion?.direction) {
|
|
|
|
if (recordDateStr === todayStr) {
|
|
|
|
analysisItem.suggestion = result.trading_suggestion.direction;
|
|
|
|
// 是今天的记录,加载数据
|
|
|
|
analysisItem.suggestionType = result.trading_suggestion.direction === '做多' ? 'up' : result.trading_suggestion.direction === '做空' ? 'down' : 'neutral';
|
|
|
|
const result = latestRecord.analysis_data;
|
|
|
|
}
|
|
|
|
const analysisItem = allFuturesData.find(d => d.symbol === item.symbol);
|
|
|
|
|
|
|
|
if (analysisItem) {
|
|
|
|
// 更新压力支撑位
|
|
|
|
analysisItem.hasAIAnalysis = true;
|
|
|
|
if (result.pivot_points) {
|
|
|
|
analysisItem.aiResult = result;
|
|
|
|
if (result.pivot_points.r1) analysisItem.resistance = result.pivot_points.r1;
|
|
|
|
analysisItem.analysisTime = analysisTime;
|
|
|
|
if (result.pivot_points.s1) analysisItem.support = result.pivot_points.s1;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 更新操作建议
|
|
|
|
|
|
|
|
if (result.trading_suggestion?.direction) {
|
|
|
|
// 更新多周期趋势
|
|
|
|
analysisItem.suggestion = result.trading_suggestion.direction;
|
|
|
|
if (result.four_dimensional) {
|
|
|
|
analysisItem.suggestionType = result.trading_suggestion.direction === '做多' ? 'up' : result.trading_suggestion.direction === '做空' ? 'down' : 'neutral';
|
|
|
|
const periodMap = { '60min': '60', '30min': '30', '15min': '15', '5min': '5' };
|
|
|
|
}
|
|
|
|
analysisItem.periods = {};
|
|
|
|
|
|
|
|
Object.entries(result.four_dimensional).forEach(([period, pdata]) => {
|
|
|
|
// 更新压力支撑位
|
|
|
|
const periodNum = periodMap[period];
|
|
|
|
if (result.pivot_points) {
|
|
|
|
if (periodNum) {
|
|
|
|
if (result.pivot_points.r1) analysisItem.resistance = result.pivot_points.r1;
|
|
|
|
const trend = pdata.conclusion || pdata.macd?.trend || 'neutral';
|
|
|
|
if (result.pivot_points.s1) analysisItem.support = result.pivot_points.s1;
|
|
|
|
analysisItem.periods[periodNum] = trend.includes('多') || trend === 'up' ? 'up' : trend.includes('空') || trend === 'down' ? 'down' : 'neutral';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
// 更新多周期趋势
|
|
|
|
|
|
|
|
if (result.four_dimensional) {
|
|
|
|
|
|
|
|
const periodMap = { '60min': '60', '30min': '30', '15min': '15', '5min': '5' };
|
|
|
|
|
|
|
|
analysisItem.periods = {};
|
|
|
|
|
|
|
|
Object.entries(result.four_dimensional).forEach(([period, pdata]) => {
|
|
|
|
|
|
|
|
const periodNum = periodMap[period];
|
|
|
|
|
|
|
|
if (periodNum) {
|
|
|
|
|
|
|
|
const trend = pdata.conclusion || pdata.macd?.trend || 'neutral';
|
|
|
|
|
|
|
|
analysisItem.periods[periodNum] = trend.includes('多') || trend === 'up' ? 'up' : trend.includes('空') || trend === 'down' ? 'down' : 'neutral';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log(`${item.symbol} 的分析记录不是今天的 (${recordDateStr}),不加载`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
console.log(`${item.symbol} 没有AI分析记录`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error(`加载 ${item.symbol} AI分析失败:`, error);
|
|
|
|
console.error(`加载 ${item.symbol} AI分析失败:`, error);
|
|
|
|
|