怎么根据日K线美股数据算出5日,周K线 月K线数据,给出具体javascript 代码
时间: 2023-10-31 20:13:36 浏览: 147
以下是根据日K线美股数据计算5日,周K线和月K线数据的JavaScript代码:
```javascript
// 假设原始数据存储在一个数组中,每个元素包含日期、开盘价、最高价、最低价和收盘价等信息
const data = [
{ date: '2021-01-01', open: 100, high: 110, low: 90, close: 95 },
{ date: '2021-01-02', open: 95, high: 105, low: 85, close: 100 },
{ date: '2021-01-03', open: 98, high: 115, low: 95, close: 110 },
// ...
];
// 计算5日均线
const calc5MA = (index) => {
if (index < 4) { // 前4个数据无法计算5日均线
return null;
}
let sum = 0;
for (let i = index - 4; i <= index; i++) {
sum += data[i].close;
}
return sum / 5;
};
// 计算周K线和月K线数据
let weekData = [];
let monthData = [];
let lastWeek = null;
let lastMonth = null;
for (let i = 0; i < data.length; i++) {
const item = data[i];
const date = new Date(item.date);
const week = date.getWeek(); // 获取当前日期所在的周
const month = date.getMonth(); // 获取当前日期所在的月
if (!lastWeek || week !== lastWeek) { // 如果当前日期所在的周不同于上一个数据,则需新建一条周K线数据
weekData.push({
date: item.date,
open: item.open,
high: item.high,
low: item.low,
close: item.close,
ma5: calc5MA(i),
});
lastWeek = week;
} else { // 否则,更新上一条周K线数据的最高价、最低价和收盘价,并重新计算5日均线
const lastItem = weekData[weekData.length - 1];
lastItem.high = Math.max(lastItem.high, item.high);
lastItem.low = Math.min(lastItem.low, item.low);
lastItem.close = item.close;
lastItem.ma5 = calc5MA(i);
}
if (!lastMonth || month !== lastMonth) { // 如果当前日期所在的月不同于上一个数据,则需新建一条月K线数据
monthData.push({
date: item.date,
open: item.open,
high: item.high,
low: item.low,
close: item.close,
ma5: calc5MA(i),
});
lastMonth = month;
} else { // 否则,更新上一条月K线数据的最高价、最低价和收盘价,并重新计算5日均线
const lastItem = monthData[monthData.length - 1];
lastItem.high = Math.max(lastItem.high, item.high);
lastItem.low = Math.min(lastItem.low, item.low);
lastItem.close = item.close;
lastItem.ma5 = calc5MA(i);
}
}
// 获取当前日期所在的周数
Date.prototype.getWeek = function() {
const target = new Date(this.valueOf());
const firstDayOfWeek = 1; // 假设一周的第一天是星期一
const dayOfWeek = (this.getDay() + 6) % 7; // 将周日转换为7,方便计算
target.setDate(target.getDate() - dayOfWeek + firstDayOfWeek - 1);
const yearStart = new Date(target.getFullYear(), 0, 1);
const weekNo = Math.ceil(((target - yearStart) / 86400000 + 1) / 7);
return weekNo;
};
```
上述代码中,`calc5MA` 函数用于计算5日均线,它接受一个参数 `index`,表示当前数据在原始数组中的索引。`weekData` 和 `monthData` 数组分别用于存储周K线和月K线数据,`lastWeek` 和 `lastMonth` 变量记录上一个数据所在的周和月。在循环中,我们根据当前日期所在的周和月来判断是否需要新建一条K线数据,如果需要,则新建一条K线数据并存入相应的数组中;否则,更新上一个K线数据的最高价、最低价和收盘价,并重新计算5日均线。最后,我们还定义了一个 `getWeek` 函数,用于获取当前日期所在的周数。
阅读全文