PHP的交易扩展看起来很有前途。底层代码非常成熟,我注意到在撰写本文时,最新的稳定PHP模块(
0.5.1)于今年年初发布,并支持PHP8。
可能需要阅读一些
文档,例如关于
trader_set_unstable_period的说明以及天哪,
交易者源代码,以提高熟练程度。
如果我在
PHP Docker容器中快速安装交易者模块。
apt-get update
pecl install trader
docker-php-ext-enable trader
使用这里的文章作为基准
![ema-benchmark-numbers](https://istack.dev59.com/JT7PK.webp)
请编写一个简单的测试脚本,比较@Tryke提供的函数和trader_ema
函数。
function exponentialMovingAverage(array $numbers, int $n): array
{
$m = count($numbers);
$α = 2 / ($n + 1);
$EMA = [];
$EMA[] = $numbers[0];
for ($i = 1; $i < $m; $i++) {
$EMA[] = ($α * $numbers[$i]) + ((1 - $α) * $EMA[$i - 1]);
}
return $EMA;
}
function merge_results($input, $avgs) {
$results = [];
$empty = count($input) - count($avgs);
foreach($input as $i => $price) {
$results[] = $i < $empty ? [$price, null] : [$price, round($avgs[$i], 2)];
}
return $results;
}
$real = [
22.27,
22.19,
22.08,
22.17,
22.18,
22.13,
22.23,
22.43,
22.24,
22.29,
22.15,
22.39,
22.38,
22.61,
23.36,
24.05,
23.75,
23.83,
23.95,
23.63,
23.82,
23.87,
23.65,
23.19,
23.10,
23.33,
22.68,
23.10,
22.40,
22.17
];
$timePeriod = 10;
$traderData = trader_ema($real,$timePeriod);
echo "trader ema\n";
var_dump(merge_results($real, $traderData));
$phpData = exponentialMovingAverage($real, 3);
echo "\n\nphp ema\n";
var_dump(merge_results($real, $phpData));
trader_ema
的结果完全匹配。Tryke函数的结果不匹配。它似乎从第一天开始就有结果,而我的期望(以及
trader_ema
和基准数的输出反映)是在经过
$timePeriod
后才有结果。请参阅
Investopedia关于EMA文章中的注释:
计算EMA需要比SMA多一个观察值。假设您想使用20天作为EMA的观察值数量。然后,您必须等到第20天才能获得SMA。在第21天,您可以将前一天的SMA用作昨天的第一个EMA。