Индикаторы: Moving Average мультипериодный

 

Moving Average мультипериодный:

Мультипериодная скользящая средняя.

Author: Konstantin

 

А что за метод XHA, который не реализован?

 

У вас ошибка в алгоритме. Необходимо усреднять цены, а не средние значения.

void start(){
   for(int i=Bars-IndicatorCounted(); i>=0; i--){
     if(save_time!=iTime(0,tf, iBarShift(0,tf,Time[i]))){
        save_time =iTime(0,tf, iBarShift(0,tf,Time[i]));
        for(int j=MaPeriod-1;j>0;j--)
//        buf_arrey[j]=iMA(0,tf,1,0,0,price,j+iBarShift(0,tf,Time[i]));
        buf_arrey[j]=Price(i+j*MathFloor(tf/Period()));
     }
     buf_arrey[0]=Price(i);
     MaBuffer[i]=iMAOnArray(buf_arrey,0,MaPeriod,0,MaMethod,0);
   }
}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// функция double Price(price);
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
double Price(int i){
   switch(price){
      case 0 :  return (Close[i]);
      case 1 :  return (iMA(0,tf,1,0,0,1,iBarShift(0,tf,Time[i])));
      case 2 :  int kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( High[i]);
                return ( High[iHighest(0,0,MODE_HIGH,kol_vo_pois,i)]);
      case 3 :  kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( Low[i]);
                return ( Low[iLowest(0,0,MODE_LOW,kol_vo_pois,i)]);
      case 4 :  kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( (High[i]+Low[i])/2);
                return ( (High[iHighest(0,0,MODE_HIGH,kol_vo_pois,i)]+Low[iLowest(0,0,MODE_LOW,kol_vo_pois,i)])/2);
      case 5 : Print("Price not valide"); Comment("Price not valide"); return(0);
      case 6 : Print("Price not valide"); Comment("Price not valide"); return(0);
    }
}
 
kharko:

У вас ошибка в алгоритме. Необходимо усреднять цены, а не средние значения.

void start(){
   for(int i=Bars-IndicatorCounted(); i>=0; i--){
     if(save_time!=iTime(0,tf, iBarShift(0,tf,Time[i]))){
        save_time =iTime(0,tf, iBarShift(0,tf,Time[i]));
        for(int j=MaPeriod-1;j>0;j--)
//        buf_arrey[j]=iMA(0,tf,1,0,0,price,j+iBarShift(0,tf,Time[i]));
        buf_arrey[j]=Price(i+j*MathFloor(tf/Period()));
     }
     buf_arrey[0]=Price(i);
     MaBuffer[i]=iMAOnArray(buf_arrey,0,MaPeriod,0,MaMethod,0);
   }
}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// функция double Price(price);
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
double Price(int i){
   switch(price){
      case 0 :  return (Close[i]);
      case 1 :  return (iMA(0,tf,1,0,0,1,iBarShift(0,tf,Time[i])));
      case 2 :  int kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( High[i]);
                return ( High[iHighest(0,0,MODE_HIGH,kol_vo_pois,i)]);
      case 3 :  kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( Low[i]);
                return ( Low[iLowest(0,0,MODE_LOW,kol_vo_pois,i)]);
      case 4 :  kol_vo_pois=iBarShift(0,0,iTime(0,tf, iBarShift(0,tf,Time[i])))-i;
                if(kol_vo_pois==0) return ( (High[i]+Low[i])/2);
                return ( (High[iHighest(0,0,MODE_HIGH,kol_vo_pois,i)]+Low[iLowest(0,0,MODE_LOW,kol_vo_pois,i)])/2);
      case 5 : Print("Price not valide"); Comment("Price not valide"); return(0);
      case 6 : Print("Price not valide"); Comment("Price not valide"); return(0);
    }
}


Усредняется цена а не сред. знач!

 
Vinin:

А что за метод XHA, который не реализован?


Это обычный индикатор МА который имеет 4 метода, пятый это X метод :) Добавил Alert("Проверьте правильность метода МА");
 
costy_:
kharko:

У вас ошибка в алгоритме. Необходимо усреднять цены, а не средние значения.

Усредняется цена а не сред. знач!

     buf_arrey[j]=iMA(0,tf,...
     MaBuffer[i]=iMAOnArray(buf_arrey,...
 
eddy:
     buf_arrey[j]=iMA(0,tf,...
     MaBuffer[i]=iMAOnArray(buf_arrey,...

Почему же?!

Уговорили, для лентяев ... делаем проверку, если не равенство, ааа ужас какойто на баре ..

   for(price=4; price>=0; price--)
   for(i=Bars-IndicatorCounted(); i>=0; i--)
    switch(price){
     //PRICE_CLOSE
     case 0: if(iMA(0,tf,1,0,0,price,1+iBarShift(0,tf,Time[i])) != iClose(0,tf,1+iBarShift(0,tf,Time[i])))Alert("PRICE_CLOSE  aaaa ujyrfrjqnj"+i);
     break;
     //PRICE_OPEN
     case 1: if(iMA(0,tf,1,0,0,price,1+iBarShift(0,tf,Time[i])) != iOpen(0,tf,1+iBarShift(0,tf,Time[i])))Alert("PRICE_OPEN  aaaa ujyrfrjqnj"+i);
     break;
     //PRICE_HIGH
     case 2: if(iMA(0,tf,1,0,0,price,1+iBarShift(0,tf,Time[i])) != iHigh(0,tf,1+iBarShift(0,tf,Time[i])))Alert("PRICE_HIGH  aaaa ujyrfrjqnj"+i);
     break;
     //PRICE_LOW
     case 3: if(iMA(0,tf,1,0,0,price,1+iBarShift(0,tf,Time[i])) != iLow(0,tf,1+iBarShift(0,tf,Time[i])))Alert("PRICE_LOW  aaaa ujyrfrjqnj"+i);
     break;
     //PRICE_MEDIAN
     case 4: if(iMA(0,tf,1,0,0,price,1+iBarShift(0,tf,Time[i])) != (iHigh(0,tf,1+iBarShift(0,tf,Time[i]))+iLow(0,tf,1+iBarShift(0,tf,Time[i])))/2)
     Alert("PRICE_MEDIAN  aaaa ujyrfrjqnj"+i);
     break;
    }

Странно но терминал не не выдал ни единого алерта, хм значит все ок.

А, забыл, среднее арифметическое с периодом 1 является (равно) усредняемым(ому) значением(ю), школьная программа.