精易论坛

标题: MACD金叉、死叉、顶背离、底背离、0轴突破判断php源码 [打印本页]

作者: 易造轮    时间: 2023-11-20 13:49
标题: MACD金叉、死叉、顶背离、底背离、0轴突破判断php源码
本帖最后由 易造轮 于 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($结果数组);
?>


作者: 守幼金成    时间: 2023-11-20 14:00
谢谢分享
外部数据怎么传入呢
作者: kyo9766    时间: 2023-11-20 14:09
注释详细,好评,感谢分享
作者: seven7c    时间: 2023-11-20 14:18
背离就是这样判断的?

作者: xiaoniu1230    时间: 2023-11-20 15:04
感谢分享!  支持一下!  
作者: 煞老尸    时间: 2023-11-20 16:11
6666666666666666666666666
作者: mjh9527    时间: 2023-11-20 16:16

感谢分享!  支持一下!  
作者: 胖虎O    时间: 2023-11-20 16:19
看看,感谢分享
作者: 易造轮    时间: 2023-11-21 01:21
seven7c 发表于 2023-11-20 14:18
背离就是这样判断的?

只是抛砖引玉,实际需要根据自己的经验调整形态判断,还有大小周期结合
作者: zaozi    时间: 2023-11-21 07:24
这个可以
作者: 宁静清澈    时间: 2023-11-21 13:14
感谢分享!  支持一下!  
作者: 一指温柔    时间: 2023-11-21 14:17
感谢分享
作者: renjianhong48we    时间: 2023-11-21 14:18
感谢分享
作者: pipicool    时间: 2023-11-22 00:05
学习一下
作者: 一指温柔    时间: 2023-11-22 08:57
感谢分享
作者: 396384183    时间: 2023-11-22 18:07

感谢分享,很给力!~
作者: 快手    时间: 2023-11-23 16:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: tiandao1986    时间: 2023-12-6 20:45
这指标都是未来函数指标,不准的
作者: wolfpack    时间: 2024-4-21 13:23
有没有易语言代码?????
作者: 小黑12355    时间: 2025-4-16 23:43

感谢分享!  支持一下!  




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4