這個方法有效。如果您發現 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;
}