用js实现macd
MACD 指标实现
MACD(Moving Average Convergence Divergence)是一种常用的技术分析指标,由三部分组成:DIF(差离值)、DEA(信号线)和 MACD 柱状图。以下是 JavaScript 实现方法:
计算 EMA(指数移动平均)
EMA 是 MACD 计算的基础,需要递归计算:
function calculateEMA(data, period) {
const k = 2 / (period + 1);
const ema = [];
ema[0] = data[0]; // 首日EMA等于当日收盘价
for (let i = 1; i < data.length; i++) {
ema[i] = data[i] * k + ema[i - 1] * (1 - k);
}
return ema;
}
计算 DIF 值
DIF 是 12 日 EMA 减去 26 日 EMA:
function calculateDIF(closingPrices) {
const ema12 = calculateEMA(closingPrices, 12);
const ema26 = calculateEMA(closingPrices, 26);
const dif = [];
for (let i = 0; i < closingPrices.length; i++) {
dif[i] = ema12[i] - ema26[i];
}
return dif;
}
计算 DEA 值
DEA 是 DIF 的 9 日 EMA:
function calculateDEA(dif) {
return calculateEMA(dif, 9);
}
计算 MACD 柱状图
MACD 柱是 DIF 与 DEA 的差值:
function calculateMACDHistogram(dif, dea) {
const histogram = [];
for (let i = 0; i < dif.length; i++) {
histogram[i] = (dif[i] - dea[i]) * 2; // 通常乘以2放大显示
}
return histogram;
}
完整 MACD 计算函数
整合所有计算步骤:
function calculateMACD(closingPrices) {
const dif = calculateDIF(closingPrices);
const dea = calculateDEA(dif);
const histogram = calculateMACDHistogram(dif, dea);
return {
dif,
dea,
histogram
};
}
使用示例
const closingPrices = [/* 填入连续交易日的收盘价数组 */];
const macd = calculateMACD(closingPrices);
console.log('DIF:', macd.dif);
console.log('DEA:', macd.dea);
console.log('MACD Histogram:', macd.histogram);
注意事项
- 初始数据量要求:至少需要 26 个交易日数据才能开始计算
- 数据顺序:收盘价数组应按时间升序排列(最旧数据在前)
- 精度处理:金融计算建议使用定点数或 decimal.js 等库处理浮点数精度问题
- 边界处理:前 25 个数据点的 MACD 值可能不准确,通常显示为 null 或 0
此实现可以直接用于金融图表显示或交易策略开发,计算结果与主流交易软件(如 TradingView)的 MACD 指标一致。







