89 lines
1.9 KiB
TypeScript
89 lines
1.9 KiB
TypeScript
/**
|
|
* 自定义均价线指标
|
|
*
|
|
* 用于分时图显示橙黄色均价线
|
|
* 计算公式:累计成交额 / 累计成交量
|
|
*/
|
|
|
|
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,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
},
|
|
|
|
};
|