Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нашел прибыльную стратегию? Заведи торговый сигнал и заработай на этом!
Постников Артем
21
Постников Артем 2013.03.27 14:28 

Здравствуйте!

Есть код, не нравится реализация функции iMAOnArray + хочется проводить сглаживание не только через встроенный iMa, хочется добавить свой алгоритм, нужно реализовать функции аналог iMAOnArray, которая имела бы идентичную спецификацию (список параметров), но в которой можно бы было указать свой тип сглаживания и свой MA а не стандартный, спасибо за ответ:

for(i=0; i<limit; i++) ind_buffer1[i]=iMA(NULL,0,TPeriod,0,MODE_SMMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++) ind_buffer2[i]=iMAOnArray(ind_buffer1,0,TPeriod,0,MODE_SMMA,i);
for(i=0; i<limit; i++) ind_buffer7[i]=iMAOnArray(ind_buffer2,0,TPeriod,0,MODE_EMA,i);
Постников Артем
21
Постников Артем 2013.03.27 21:35  
Актуально, UP!
Алексей Тарабанов
7220
Алексей Тарабанов 2013.03.27 21:46  
Ну и какого ответа Вы ожидаете, интересно знать? 
Постников Артем
21
Постников Артем 2013.03.27 21:55  
tara: Ну и какого ответа Вы ожидаете, интересно знать?  Можно выше приведенный код реализовать без iMAOnArray??? Короче, мне нужно использовать не стандартный МА, а собственный.
Алексей Тарабанов
7220
Алексей Тарабанов 2013.03.27 22:02  
Можно. Напишите аналог, который Вам нужен. 
Постников Артем
21
Постников Артем 2013.04.22 19:39  

Задачу решил:

Исходник функции такой:

double iMAOnArrayMQL4(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift,
                      double &buf[])
  {
   double arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+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]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
//+------------------------------------------------------------------+

Dmitry Fedoseev
41167
Dmitry Fedoseev 2013.04.22 19:53  
Быстродействие проверяли? Предполагаю, что в тестере с места не столкнешь.
Алексей Тарабанов
7220
Алексей Тарабанов 2013.04.22 20:11  
А компилировать пробовали?
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий