本帖最后由 易造轮 于 2023-10-3 04:16 编辑
根据bingAI写的php转换过来的,支持未满足周期返回0值
ema sma macd计算.e
(11.78 KB, 下载次数: 105)
bug修正,请手动替换:ema计算,找到:
判断 (参_现行下标 = 1)
参_返回EMA数组 [参_现行下标] = 参_参考价数组 [1]
改成:
判断 (参_现行下标 = 参_周期数)
参_返回EMA数组 [参_现行下标] = 参_参考价数组 [参_现行下标]
补充php版源码
[PHP] 纯文本查看 复制代码 <?php// 定义一个函数,计算SMA
function SMA($收盘价数组, $周期数, $权重, $可返回空数组) {
// 初始化一个数组,存储SMA的结果
$result = array();
// 判断数组的元素个数是否大于等于周期
if (count($收盘价数组) >= $周期数) {
// 计算第一个周期的平均值,作为第一个SMA值
$sum = 0;
for ($i = 0; $i < $周期数; $i++) {
$sum = $sum + $收盘价数组[$i];
}
$average = $sum / $周期数;
$result[$周期数 - 1] = $average;
// 计算后续的SMA值,使用公式:SMA = (权重 * 当日收盘价 + (周期 - 权重) * 前一日SMA) / 周期
for ($i = $周期数; $i < count($收盘价数组); $i++) {
$SMA = ($权重 * $收盘价数组[$i] + ($周期数 - $权重) * $result[$i - 1]) / $周期数;
$result[$i] = $SMA;
}
} else {
// 判断是否返回0值数组
if ($可返回空数组) {
// 返回一个包含n个成员的0值数组
for ($i = 0; $i < count($收盘价数组); $i++) {
$result[$i] = 0;
}
} else {
// 返回一个空数组
$result = array();
}
}
// 返回结果数组
return $result;
}
function ema ($收盘价数组,$周期数) {
// 初始化一个空数组,用于存储EMA值
$ema = array ();
// 判断数组是否满足周期
if (count ($收盘价数组) < $周期数) {
// 如果不满足,返回一个包含n个0值的数组
for ($i = 0; $i < $周期数; $i++) {
$ema[$i] = 0;
}
return $ema;
}
// 如果满足,继续进行EMA的计算,以下代码与之前相同
$alpha = 2 / ($周期数 + 1);
$ema[0] = $收盘价数组[0];
for ($i = 1; $i < count ($收盘价数组); $i++) {
$ema[$i] = $alpha * $收盘价数组[$i] + (1 - $alpha) * $ema[$i-1];
}
return $ema;
}
function macd ($收盘价数组,$快线周期,$慢线周期,$DEA周期) {
// 初始化一个空数组,用于存储MACD值
$macd = array ();
// 判断数组是否满足周期
if (count ($收盘价数组) < $慢线周期) {
// 如果不满足,返回一个包含n个0值的数组
for ($i = 0; $i < $慢线周期; $i++) {
$macd[$i] = 0;
}
return $macd;
}
// 如果满足,继续进行MACD的计算,以下代码与之前相同
$ema12 = ema ($收盘价数组,$快线周期);
$ema26 = ema ($收盘价数组,$慢线周期);
$diff = array ();
for ($i = 0; $i < count ($收盘价数组); $i++) {
$diff[$i] = $ema12[$i] - $ema26[$i];
}
$dea = ema ($diff,$DEA周期);
for ($i = 0; $i < count ($收盘价数组); $i++) {
$macd[$i] = 2 * ($diff[$i] - $dea[$i]);
}
return $macd;
}
// 定义一个测试函数,使用示例数据调用SMA函数,并打印结果
function test() {
// 定义一个数组,存储示例数据
$data = array(10, 11, 12, 13, 14, 15, 16, 17, 18, 19);
// 调用SMA函数,计算5日SMA,权重为1,$可返回空数组为真
$SMA5 = SMA($data, 5, 1, true);
// 打印结果
echo "5日SMA的结果为:\n";
foreach ($SMA5 as $value) {
echo $value . "\n";
}
}
// 调用测试函数
test();
?>
|