此方法工作正常。如果您发现 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;
}
trader_ema() 函数工作不正确,它只计算最后一段时间的平均值。请按照以下代码计算 trader_ema
function EMACalculator($limit,$array)
{
$EMA_previous_day = $array[0];
//print_r($array);
$multiplier1 = (2/$limit+1);
$EMA[]=array();
$EMA = $array[0];
$Close= $array[1];
while($limit)
{
//echo"EMA is $EMA\n";
$EMA = ($Close - $EMA_previous_day) * $multiplier1 + $EMA_previous_day;
$EMA_previous_day= $EMA;
$limit--;
}
return $EMA;
}
其中 $limit 接受 ema 的周期,$array:接受用于 ema 计算的数据数组。