C语言实现MACD指标

发布时间 2023-09-01 23:47:58作者: C羽言

只有实现了EMA,才能取得MACD

EMA,指数移动平均线是一种 IIR 滤波器,很容易用 C 语言实现,并且使用最少的资源。与简单的移动平均线不同,它不需要 RAM 缓冲区来存储先前的样本。它只需要存储一个值(前一个平均值)。  

指数移动平均线表示为以下等式:avg[n] = (in * alpha) + avg[n-1]*(1-alpha)。使用浮点数学实现这个方程很简单,但使用定点变量有点棘手。此处的代码片段使用 32 位有符号整数作为平均值和输入值。中间值需要使用 64 位数学运算以避免溢出错误。

Alpha 值接近零表示重平均,而 Alpha 值为 1 表示不平均。

//This macros defines an alpha value between 0 and 1
#define DSP_EMA_I32_ALPHA(x) ( (uint16_t)(x * 65535) )
 
int32_t dsp_ema_i32(int32_t in, int32_t average, uint16_t alpha){
  int64_t tmp0; //calcs must be done in 64-bit math to avoid overflow
  tmp0 = (int64_t)in * (alpha) + (int64_t)average * (65536 - alpha);
  return (int32_t)((tmp0 + 32768) / 65536); //scale back to 32-bit (with rounding)
}

//here is a function that uses the averaging code
int32_t my_avg_func(void){
     static int32_t average = 0;
     int32_t adc_value;    
     adc_value = read_the_adc_value();
     average = dsp_ema_i32(adc_value, average, DSP_EMA_I32_ALPHA(0.1));
     return average;
}

来源:https://www.embeddedrelated.com/showcode/304.php