import { useState } from 'react'; import { ComposedChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Line } from 'recharts'; import type { KLineData } from '@/types'; interface KLineChartProps { data: KLineData[]; } // 简化的K线图 - 使用折线图模拟 export function KLineChart({ data }: KLineChartProps) { const [timeRange, setTimeRange] = useState<'1D' | '5D' | '1M' | '3M' | '6M' | '1Y'>('1M'); // 处理数据,添加颜色标记 const chartData = data.map(item => ({ ...item, isUp: item.close >= item.open, change: item.close - item.open, changePercent: ((item.close - item.open) / item.open * 100).toFixed(2) })); const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const d = payload[0].payload; const isUp = d.close >= d.open; return (
{d.date}
开盘: {d.open.toFixed(2)}
最高: {d.high.toFixed(2)}
最低: {d.low.toFixed(2)}
收盘: {d.close.toFixed(2)}
涨跌: {isUp ? '+' : ''}{d.changePercent}%
成交量: {(d.volume / 10000).toFixed(0)}万
); } return null; }; // 计算均线 const ma5 = chartData.map((_, index) => { if (index < 4) return null; const sum = chartData.slice(index - 4, index + 1).reduce((acc, d) => acc + d.close, 0); return sum / 5; }); const ma10 = chartData.map((_, index) => { if (index < 9) return null; const sum = chartData.slice(index - 9, index + 1).reduce((acc, d) => acc + d.close, 0); return sum / 10; }); const chartDataWithMA = chartData.map((item, index) => ({ ...item, ma5: ma5[index], ma10: ma10[index] })); const timeRanges: Array<'1D' | '5D' | '1M' | '3M' | '6M' | '1Y'> = ['1D', '5D', '1M', '3M', '6M', '1Y']; return (
{/* 时间范围选择 */}
{timeRanges.map((range) => ( ))}
{/* K线图 */}
value.slice(5)} /> value.toFixed(2)} orientation="right" /> } /> {/* K线 - 使用Bar模拟 */} {/* MA5 */} {/* MA10 */}
{/* 图例 */}
MA5
MA10
); }