本帖最后由 易造轮 于 2023-11-20 14:12 编辑
[PHP] 纯文本查看 复制代码
<?php
//定义一个函数,计算指定周期的指数移动平均线
function ema($价格数组, $周期) {
$平滑系数 = 2 / ($周期 + 1); //计算平滑系数
$ema = array(); //存放结果的数组
$ema[0] = $价格数组[0]; //第一个ema值等于第一个数据值
for ($i = 1; $i < count($价格数组); $i++) {
$ema[$i] = $平滑系数 * $价格数组[$i] + (1 - $平滑系数) * $ema[$i - 1]; //递推公式
}
return $ema;
}
//定义一个函数,计算指定周期的MACD指标
function macd($价格数组, $快线周期, $慢线周期, $dea周期) {
$dif数组 = array(); //存放DIF线的数组
$dea数组 = array(); //存放DEA线的数组
$macd数组 = array(); //存放MACD柱线的数组
$快线ema = ema($价格数组, $快线周期); //计算短期ema
$慢线ema = ema($价格数组, $慢线周期); //计算长期ema
for ($i = 0; $i < count($价格数组); $i++) {
$dif数组[$i] = $快线ema[$i] - $慢线ema[$i]; //计算DIF值
}
$dea数组 = ema($dif数组, $dea周期); //计算DEA值
for ($i = 0; $i < count($价格数组); $i++) {
$macd数组[$i] = 2 * ($dif数组[$i] - $dea数组[$i]); //计算MACD值
}
return array($dif数组, $dea数组, $macd数组); //返回结果数组
}
//定义一个函数,判断MACD的金叉、死叉、顶背离、底背离
function macd_cross($价格数组, $快线周期, $慢线周期, $周期) {
list($dif数组, $dea数组, $macd数组) = macd($价格数组, $快线周期, $慢线周期, $周期); //调用macd函数,获取指标值
$结果数组 = array(); //存放结果的数组
$峰值数组 = array(); //存放峰值的数组
$峰值索引 = array(); //存放峰值索引的数组
for ($i = 1; $i < count($价格数组) - 1; $i++) {
//判断金叉
if ($dif数组[$i] > $dea数组[$i] && $dif数组[$i - 1] <= $dea数组[$i - 1]) {
$结果数组[$i] = "金叉";
}
//判断死叉
if ($dif数组[$i] < $dea数组[$i] && $dif数组[$i - 1] >= $dea数组[$i - 1]) {
$结果数组[$i] = "死叉";
}
//找出峰值
if (($价格数组[$i] > $价格数组[$i - 1] && $价格数组[$i] > $价格数组[$i + 1]) || ($价格数组[$i] < $价格数组[$i - 1] && $价格数组[$i] < $价格数组[$i + 1])) {
$峰值数组[] = $价格数组[$i];
$峰值索引[] = $i;
}
}
//判断顶背离和底背离
for ($i = 1; $i < count($峰值数组); $i++) {
//计算两个峰之间的差值
$价差 = $峰值数组[$i] - $峰值数组[$i - 1];
$dif数组_diff = $dif数组[$峰值索引[$i]] - $dif数组[$峰值索引[$i - 1]];
//判断顶背离
if ($价差 > 0 && $dif数组_diff < 0) {
$结果数组[$峰值索引[$i]] = "顶背离";
}
//判断底背离
if ($价差 < 0 && $dif数组_diff > 0) {
$结果数组[$峰值索引[$i]] = "底背离";
}
}
//判断0轴突破
for ($i = 1; $i < count($价格数组); $i++) {
//判断0轴上穿
if ($macd数组[$i] > 0 && $macd数组[$i - 1] <= 0) {
$结果数组[$i] = "0轴上穿";
}
//判断0轴下穿
if ($macd数组[$i] < 0 && $macd数组[$i - 1] >= 0) {
$结果数组[$i] = "0轴下穿";
}
}
return $结果数组; //返回结果数组
}
//测试数据,假设是收盘价
$价格数组 = array(10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 9, 8, 9, 10, 11, 12, 13, 14, 15);
//测试函数,假设短期为12,长期为26,信号为9
$结果数组 = macd_cross($价格数组, 12, 26, 9);
//打印结果
print_r($结果数组);
?>
|