计算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";
}

点赞(0)
发表
评论
返回
顶部