日前用boaPHP做云选股系统,股票技术指标计算一般都用TA-LIB库,其对python用户支持很好,作为PHP用户我找到php-trader扩展,其也是基于TA-LIB库的,奈何文档很少。
其中一个较常用的股票技术指标MACD,用它算出来结果的和通达信、同花顺上不一致,查阅相关资料,需要从股票上市第一天的数据开始计算。
这就会有个新问题,每次盘中实时选股都要将一只股票30年的数据带进去计算一遍,效率太低。干脆直接用PHP实现MACD算法,后续也可以用C语言实现将其封装成PHP的扩展。
计算MACD的函数:通过前一个macd值就可以计算当前的,无需每次从上市第一天开始算,如果前一个macd值为null,则为上市第一天。将计算出来的MACD结果保存,供下次使用,以此循环。首次需要全量计算,以后每次用前一次保存的结果代入计算。
/*
计算MACD指标
$macd:传入保存的前一个macd值,就可以直接计算当前的,上市第一天这个值传入null
$close:当前股价或收盘价
返回值:当前计算出来的macd值,可以保存作为下次传入
*/
function macd($macd, $close, $fastPeriod = 12, $slowPeriod = 26, $signalPeriod = 9){
$fast = ema($macd['fast'], $close, $fastPeriod);
$slow = ema($macd['slow'], $close, $slowPeriod);
$dif = $fast - $slow;
$dea = ema($macd['dea'], $dif, $signalPeriod);
$bar = round(($dif - $dea) * 2, 2);
$data = [
'fast' => $fast,
'slow' => $slow,
'dif' => round($dif, 2),
'dea' => $dea,
'bar' => $bar
];
return $data;
}
其中以EMA方式计算,所需ema函数如下:
/*
EMA($X, $N),也叫EXPMA
$X的$N日指数移动平均(Exponential Moving Average)
2/($N+1)为固定权重系数
*/
function ema($pre, $X, $N){
if(empty($pre)) $pre = 0;
$Y = ($X * 2 + $pre * ($N - 1)) / ($N + 1);
return round($Y, 3);
}