计算MA平均线实现MA5与MA20金叉死叉检测代码示例
// 假设从数据库获取的股票历史数据数组
$stockData = [
['date' => '2025-05-01', 'close' => 10.2],
['date' => '2025-05-02', 'close' => 10.5],
// 更多数据...
['date' => '2025-05-20', 'close' => 12.8],
['date' => '2025-05-21', 'close' => 13.2] // 当前日期数据
];
// 计算移动平均线
function calculateMA($data, $period) {
$ma = [];
for ($i = $period - 1; $i < count($data); $i++) {
$sum = 0;
for ($j = 0; $j < $period; $j++) {
$sum += $data[$i - $j]['close'];
}
$ma[$i]['date'] = $data[$i]['date'];
$ma[$i]['value'] = $sum / $period;
}
return $ma;
}
// 计算MA5和MA20
$ma5 = calculateMA($stockData, 5);
$ma20 = calculateMA($stockData, 20);
// 检测金叉死叉
$crossovers = [];
for ($i = 1; $i < count($ma5); $i++) {
// 确保有足够的MA20数据
if (isset($ma20[$i]) && isset($ma20[$i-1])) {
$prevDiff = $ma5[$i-1]['value'] - $ma20[$i-1]['value'];
$currDiff = $ma5[$i]['value'] - $ma20[$i]['value'];
if ($prevDiff < 0 && $currDiff > 0) {
// 金叉
$crossovers[] = [
'date' => $ma5[$i]['date'],
'type' => 'golden',
'ma5' => $ma5[$i]['value'],
'ma20' => $ma20[$i]['value']
];
} elseif ($prevDiff > 0 && $currDiff < 0) {
// 死叉
$crossovers[] = [
'date' => $ma5[$i]['date'],
'type' => 'dead',
'ma5' => $ma5[$i]['value'],
'ma20' => $ma20[$i]['value']
];
}
}
}
// 输出结果
echo "检测时间: 2025-05-21 11:14:35\n";
echo "金叉/死叉检测结果:\n";
foreach ($crossovers as $crossover) {
echo $crossover['date'] . " 出现" .
($crossover['type'] == 'golden' ? '金叉' : '死叉') .
" MA5=" . round($crossover['ma5'], 2) .
" MA20=" . round($crossover['ma20'], 2) . "\n";
}
// 如果没有检测到交叉
if (empty($crossovers)) {
echo "当前数据范围内未检测到金叉或死叉信号\n";
}