此方法运行良好。如果您发现 EMA 和 SMA 结果相同,则精度设置可能仍为默认值或未调整为您的用例。(例如,具有 3 个以上级别的浮点数、sathoshi 等)
# 这对于 0.00XXXXZ 级别的数值是必要的
ini_set( 'trader.real_precision', '8' );
(PECL trader >= 0.2.0)
trader_ema — 指数移动平均线
real
实数值数组。
timePeriod
周期数。有效范围从 2 到 100000。
返回一个包含计算数据的数组,或在失败时返回 false。
此方法运行良好。如果您发现 EMA 和 SMA 结果相同,则精度设置可能仍为默认值或未调整为您的用例。(例如,具有 3 个以上级别的浮点数、sathoshi 等)
# 这对于 0.00XXXXZ 级别的数值是必要的
ini_set( 'trader.real_precision', '8' );
如果您理解第二个参数的含义,则 trader_ema() 函数可以正常工作。第二个参数用于将值分组到重叠的周期中。在这些周期内,数字会进行简单的平均计算。
因此,如果您调用 trader_ema($array, 6),并且您的数组仅包含六个值,则您将获得一个简单的平均值,因为没有先前数据来加权该值。
如果您调用 trader_ema($array, 3),则您的六个数组值将被分组为四个重叠的三组,并且您将获得四个值,每个值代表该周期的 EMA。
以下是 trader_ema(array(1,2,2,1,3,4), 3) 和 trader_sma(array(1,2,2,1,3,4), 3) 的输出。您可以看到第一个值对于 EMA 和 SMA 计算都是相同的。
trader_ema(array(1,2,2,1,3,4), 3)
array(4) {
[2]=>
float(1.6666666667)
[3]=>
float(1.3333333333)
[4]=>
float(2.1666666667)
[5]=>
float(3.0833333333)
}
trader_sma(array(1,2,2,1,3,4), 3)
array(4) {
[2]=>
float(1.6666666667)
[3]=>
float(1.6666666667)
[4]=>
float(2)
[5]=>
float(2.6666666667)
}
trader_ema 计算值错误
这只会返回简单的移动平均值
要获得正确的 ema,请使用以下代码
$number 是数据数组,$n 是周期数
示例
$number[0] => 最后一个值
$number[n] =>第一个值
function exponentialMovingAverage(array $numbers, int $n): array
{
$numbers=array_reverse($numbers);
$m = count($numbers);
$α = 2 / ($n + 1);
$EMA = [];
// 从第一个数据点开始填充
$EMA[] = $numbers[0];
// 之后的每一天:EMAtoday = α⋅xtoday + (1-α)EMAyesterday
for ($i = 1; $i < $m; $i++) {
$EMA[] = ($α * $numbers[$i]) + ((1 - $α) * $EMA[$i - 1]);
}
$EMA=array_reverse($EMA);
return $EMA;
}