import React, { useState, useEffect, useRef } from 'react'; import { Card, Row, Col, Button, Select, Tabs, Statistic, Typography, Badge, Table } from 'antd'; import { ArrowUpOutlined, ArrowDownOutlined, LineChartOutlined, BarChartOutlined, PieChartOutlined } from '@ant-design/icons'; import { generateFutureData, generateKlineData } from '../../utils/mockData'; import useTheme from '../../hooks/useTheme'; // 导入Lightweight Charts import { createChart } from 'lightweight-charts'; const { Title, Text } = Typography; const { Option } = Select; const { TabPane } = Tabs; const { Column } = Table; const Detail = () => { const [selectedFuture, setSelectedFuture] = useState('MA'); const [futureData, setFutureData] = useState(generateFutureData('MA', '甲醇')); const [timePeriod, setTimePeriod] = useState('1DAY'); const [chart, setChart] = useState(null); const chartRef = useRef(null); // 品种列表 const futuresList = [ { code: 'MA', name: '甲醇' }, { code: 'CU', name: '铜' }, { code: 'SC', name: '原油' }, { code: 'RB', name: '螺纹钢' }, { code: 'P', name: '棕榈油' } ]; // K线数据 const klineData = generateKlineData(30); // 切换品种 const handleFutureChange = (code) => { const future = futuresList.find(f => f.code === code); setSelectedFuture(code); setFutureData(generateFutureData(code, future.name)); }; // 切换时间周期 const handleTimePeriodChange = (period) => { setTimePeriod(period); }; // 初始化K线图表 useEffect(() => { if (chartRef.current) { // 清除之前的图表 if (chart) { chart.destroy(); } // 创建新图表 const newChart = createChart(chartRef.current, { width: chartRef.current.clientWidth, height: 400, layout: { backgroundColor: '#ffffff', textColor: '#333333' }, grid: { vertLines: { color: '#f0f0f0' }, horzLines: { color: '#f0f0f0' } }, priceScale: { borderColor: '#f0f0f0' }, timeScale: { borderColor: '#f0f0f0' } }); // 添加蜡烛图系列 const candleSeries = newChart.addCandlestickSeries({ upColor: '#52c41a', downColor: '#ff4d4f', borderUpColor: '#52c41a', borderDownColor: '#ff4d4f', wickUpColor: '#52c41a', wickDownColor: '#ff4d4f' }); // 添加成交量系列 const volumeSeries = newChart.addHistogramSeries({ color: '#82ca9d', priceFormat: { type: 'volume' }, priceScaleId: '', scaleMargins: { top: 0.8, // 给蜡烛图留出空间 bottom: 0 } }); // 准备数据 const candleData = klineData.map(item => ({ time: item.time, open: parseFloat(item.open), high: parseFloat(item.high), low: parseFloat(item.low), close: parseFloat(item.close) })); const volumeData = klineData.map(item => ({ time: item.time, value: parseFloat(item.volume), color: parseFloat(item.close) >= parseFloat(item.open) ? '#52c41a' : '#ff4d4f' })); // 设置数据 candleSeries.setData(candleData); volumeSeries.setData(volumeData); // 适配窗口大小 const handleResize = () => { if (newChart) { newChart.resize(chartRef.current.clientWidth, 400); } }; window.addEventListener('resize', handleResize); setChart(newChart); // 清理函数 return () => { window.removeEventListener('resize', handleResize); if (newChart) { newChart.destroy(); } }; } }, []); return (
{/* 页面头部 */} {futureData.name} ({futureData.code}) 详情分析 {futureData.fullName} {/* 品种基本信息 */} 0 ? '#52c41a' : '#ff4d4f' }} suffix="元" /> 0 ? '#52c41a' : '#ff4d4f' }} suffix="%" /> {/* K线图表区 */}
{/* 技术指标和AI研判区 */} ({ key, value }))} rowKey="key" size="small"> { const indicatorNames = { macd: 'MACD', rsi: 'RSI', bollinger: '布林带', kdj: 'KDJ' }; return indicatorNames[text] || text; }} />
({ period, ...data }))} rowKey="period" size="small"> ( )} />
{/* 交易建议和AI研判区 */}
AI建议: 根据多周期分析,当前{futureData.name}处于{futureData.trends[timePeriod].status},建议{futureData.trends[timePeriod].direction === '看多' ? '逢低做多' : '逢高做空'}。
整体判断: {futureData.name}当前处于{futureData.adxStatus},{futureData.trends[timePeriod].direction === '看多' ? '多头力量较强' : '空头力量较强'}。
技术面分析:
  • MACD:{futureData.indicators.macd}
  • RSI:{futureData.indicators.rsi}
  • 布林带:{futureData.indicators.bollinger}
  • KDJ:{futureData.indicators.kdj}
风险提示: 当前风险等级为{futureData.riskLevel},波动率{futureData.volatility},建议控制仓位,严格设置止损。
); }; export default Detail;