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 */}
{/* 图例 */}
);
}