设为首页 收藏本站 切换语言

把SMA函数改成DMA函数

| 发表于 2024-3-14 12:11:43 | 显示全部楼层 |复制链接
哪位大神帮我把下面这个SMA函数改成DMA函数,     

DMA(C,N):   DMA算法:Y=C*N+Y'*(1-N)   
感谢
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- check period
   if(period>0 && period<=(position+1))
     {
      if(position==period-1)
        {
         for(int i=0; i<period; i++)
            result+=price[position-i];

         result/=period;
        }

      result=(prev_value*(period-1)+price[position])/period;
     }

   return(result);
  }








最近访问 头像模式
举报

评论 使用道具

精彩评论6

川哥财经
DDD
| 发表于 2024-3-14 14:20:06 | 显示全部楼层
double DynamicMA(const int position, const double N, const double prev_value, const double &price[]) {
  double result = 0.0;
  // 保证位置非负
  if(position >= 0) {
    // 如果是序列中的第一个元素,直接返回该价格作为初始值
    if(position == 0) {
      result = price[0];
    } else {
      // 按照DMA算法计算动态移动平均
      result = price[position] * N + prev_value * (1 - N);
    }
  }
  return result;
举报

点赞 评论 使用道具

roy13168
DD
 楼主 | 发表于 2024-3-14 17:30:28 | 显示全部楼层
川哥财经 发表于 2024-3-14 14:20
double DynamicMA(const int position, const double N, const double prev_value, const double &price[]) ...

大神你好,可以帮忙用这个函数改吗,用之前那个改的函数是固定的值
DynamicMA(MA10,500,30,0,MODE_SMA,i);         
MODE_SMA这个项目要删除,因为平滑方式不是用SMA,最终函数为DynamicMA(MA10,500,5,0,i);


double DynamicMA(const double &Array[],int total,const int iMAPeriod,const int ma_shift,ENUM_MA_METHOD ma_method,const int Shift)  
  {
   double buf[];
   if(total==0) total=ArraySize(Array);
   if(ArrayResize(buf,total)<0) return(0);
   switch(ma_method)
     {
      case MODE_SMMA :
        {
         double sum=0;
         int    i,k,pos;
         pos=1-iMAPeriod;
         while(pos>=0)
           {
            if(pos==1-iMAPeriod)
              {
               for(i=0,k=pos;i<iMAPeriod;i++,k++)
                 {
                  sum+=Array[k];
                  buf[k]=0;

                 }                                                  
              }                                                     
            else sum=buf[pos+1]*(iMAPeriod-1)+Array[pos];
            buf[pos]=sum/iMAPeriod;                                 
            pos--;
           }
         return(buf[Shift+ma_shift]);
        }
        
      default: return(0);
     }
   return(0);
  }
举报

点赞 评论 使用道具

川哥财经
DDD
| 发表于 2024-3-15 10:35:28 | 显示全部楼层
double DynamicMA(const double &Array[], int total, const int iMAPeriod, const int ma_shift, const int Shift) {
    double buf[ArraySize(Array)]; // 假设ArraySize(Array)可以得到Array的大小,适当调整以匹配你的环境
    if (total == 0) total = ArraySize(Array); // 如果未指定total,则从Array中获取
    if (ArrayResize(buf, total) < 0) return(0); // 确保buf大小合适,适当调整以匹配你的环境

    // 初始化sum变量和其他所需变量
    double sum = 0.0;
    int i, k, pos;

    // 根据动态移动平均逻辑计算
    pos = total - iMAPeriod; // 开始位置根据周期调整
    while (pos < total) {
        sum = 0; // 重置sum
        // 计算当前周期内的总和
        for (i = 0; i < iMAPeriod && (pos + i) < total; ++i) {
            sum += Array[pos + i];
        }
        // 计算并存储平均值
        buf[pos] = sum / iMAPeriod;
        ++pos;
    }

    // 根据偏移量返回结果
    int index = Shift + ma_shift;
    if (index >= 0 && index < total) {
        return buf[index];
    } else {
        return 0; // 如果索引超出范围,返回0
    }
}
举报

点赞 评论 使用道具

roy13168
DD
 楼主 | 发表于 2024-3-15 14:07:11 | 显示全部楼层
川哥财经 发表于 2024-3-15 10:35
double DynamicMA(const double &Array[], int total, const int iMAPeriod, const int ma_shift, const in ...

首先感谢你的热心帮助,因为我没有表达清楚,希望再次得到你的帮助

DMA(C,N):  DMA算法:Y=C*N+Y'*(1-N),其中N要求小1,在于0;   
N是变量,可以是用其他数组算出的一个小数,如CC=(close-close[i+1])/close[i+1]; xiao=MathAbs(CC);   
N也可以是手动设置的具体小数如0.02

所以最终的函数DynamicMA(MA10,500,CC,0,i);     或  DynamicMA(MA10,500,0.02,0,i);

可以根据EMA函数作相应的修改
double DynamicMA(const double &Array[],int total,const int iMAPeriod,const int ma_shift,ENUM_MA_METHOD ma_method,const int Shift)  
  {
   double buf[];
   if(total==0) total=ArraySize(Array);
   if(ArrayResize(buf,total)<0) return(0);
   switch(ma_method)
     {
      case MODE_EMA :   
        {
         double pr=2.0/(iMAPeriod+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=Array[pos+1];
            buf[pos]=Array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;

           }
         return(buf[Shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
举报

点赞 评论 使用道具

川哥财经
DDD
| 发表于 2024-3-15 14:09:21 | 显示全部楼层
double DynamicMA(const double &Array[], const double &N[], int total, const int ma_shift, const int Shift) {
    // 假设Array和N的长度相同,并已经被正确初始化
    if (total == 0) {
        // 假设存在一个函数ArraySize用于确定Array的大小
        total = ArraySize(Array);
    }
   
    // 根据total分配buf的内存。如果你的环境不同,请进行调整。
    double buf[ArraySize(Array)]; // 根据你的环境调整
   
    // 使用Array的最后一个元素初始化DMA计算
    buf[total - 1] = Array[total - 1]; // DMA计算的起点
   
    // 从后向前计算每个元素的DMA
    for (int pos = total - 2; pos >= 0; pos--) {
        // 这里,N[pos]指的是当前位置的动态N值
        // 对于固定的N,你可以直接传递一个常数值而不是数组
        buf[pos] = Array[pos] * N[pos] + buf[pos + 1] * (1 - N[pos]);
    }

    // 根据ma_shift和Shift返回值,确保我们不超出边界
    int index = Shift + ma_shift;
    if (index >= 0 && index < total) {
        return buf[index];
    } else {
        return 0; // 如果索引超出范围,返回0或适当的值
    }
}
举报

点赞 评论 使用道具

roy13168
DD
 楼主 | 发表于 2024-3-16 01:12:32 | 显示全部楼层
川哥财经 发表于 2024-3-15 14:09
double DynamicMA(const double &Array[], const double &N[], int total, const int ma_shift, const int  ...

double buf[ArraySize(Array)];

这一句报错,'[' - invalid index value

把[]括号里的'ArraySize(Array)'删除后,无报错,但指标不显示任何数据,麻烦帮忙看一下,谢谢。
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)