/** * 自定义均价线指标 * * 用于分时图显示橙黄色均价线 * 计算公式:累计成交额 / 累计成交量 */ import type { KLineData } from 'klinecharts'; // 使用部分类型定义,因为 Indicator 类型很复杂 export const avgPriceIndicator = { name: 'AVG', shortName: 'AVG', calcParams: [] as number[], shouldOhlc: false, // 不显示 OHLC 信息 shouldFormatBigNumber: false, precision: 2, minValue: null as number | null, maxValue: null as number | null, figures: [ { key: 'avg', title: '均价: ', type: 'line', }, ], /** * 计算均价 * @param dataList K线数据列表 * @returns 均价数据 */ calc: (dataList: KLineData[]) => { let totalAmount = 0; // 累计成交额 let totalVolume = 0; // 累计成交量 return dataList.map((kLineData) => { const { close = 0, volume = 0 } = kLineData; totalAmount += close * volume; totalVolume += volume; const avgPrice = totalVolume > 0 ? totalAmount / totalVolume : close; return { avg: avgPrice }; }); }, /** * 绘制样式配置 */ styles: { lines: [ { color: '#FF9800', // 橙黄色 size: 2, style: 'solid', smooth: true, }, ], }, /** * 自定义 Tooltip 数据源 * 符合 IndicatorTooltipData 接口要求 */ createTooltipDataSource: ({ kLineData, indicator, defaultStyles }: any) => { const avgValue = kLineData?.avg; const lineColor = defaultStyles?.lines?.[0]?.color || '#FF9800'; return { name: 'AVG', calcParamsText: '', features: [] as any[], legends: [ { title: { text: '均价: ', color: lineColor }, value: { text: avgValue !== undefined ? avgValue.toFixed(2) : '--', color: lineColor, }, }, ], }; }, };