Индикаторы: fine tuning MA

 

fine tuning MA:

MA с возможностью настройки.

Author: gumgum

 

Надо код упрощать

 
Vinin:

Надо код упрощать


Куда уж проще...
 

в init() добавил после точек 0

int init() {
   SetIndexStyle(0,DRAW_LINE,0,0);  
   SetIndexBuffer(0, ExtMapBuffer1);
   double sum=0;
   for(int h=0;h<=FTMA-1;h++) {
      PM[h]=shift1+MathPow(h/(FTMA-1.0),rank1)*(1.0-shift1);
      PM[h]=(shift2+MathPow(1-(h/(FTMA-1.0)),rank2)*(1.0-shift2))*PM[h];
      if((h/(FTMA-1.))<0.5) {
         PM[h]=(shift3+MathPow((1-(h/(FTMA-1.0))*2.0).0,rank3)*(1.0-shift3))*PM[h]; /
      } else {
         PM[h]=(shift3+MathPow((h/(FTMA-1.))*2.0-1.0,rank3)*(1.0-shift3))*PM[h];
      }
      sum+=PM[h];
   }
   double sum1=0;
   for(h=0;h<=FTMA-1;h++) {
      PM[h]=PM[h]/sum;
      sum1+=PM[h];
   }
  return(0);
}
Посмотри внимательно
 

Функцию старт я бы сделал примерно так

int start()  {
   int limit;
   int counted_bars=IndicatorCounted();
   limit=Bars - counted_bars - 1;
   if(counted_bars == 0)
      limit=Bars - FTMA - 1;
   for(int i=limit; i>=0; i--) {
      ExtMapBuffer1[i]=0;
      for(int h=0;h<FTMA;h++)
         ExtMapBuffer1[i]+=iMA(NULL, 0, 1, 0, MODE_SMA, PRICE, i) * PM[h];
   }
   return(0);
}
 
Vinin:

в init() добавил после точек 0

int init() {
   SetIndexStyle(0,DRAW_LINE,0,0);  
   SetIndexBuffer(0, ExtMapBuffer1);
   double sum=0;
   for(int h=0;h<=FTMA-1;h++) {
      PM[h]=shift1+MathPow(h/(FTMA-1.0),rank1)*(1.0-shift1);
      PM[h]=(shift2+MathPow(1-(h/(FTMA-1.0)),rank2)*(1.0-shift2))*PM[h];
      if((h/(FTMA-1.))<0.5) {
         PM[h]=(shift3+MathPow((1-(h/(FTMA-1.0))*2.0).0,rank3)*(1.0-shift3))*PM[h]; /
      } else {
         PM[h]=(shift3+MathPow((h/(FTMA-1.))*2.0-1.0,rank3)*(1.0-shift3))*PM[h];
      }
      sum+=PM[h];
   }
   double sum1=0;
   for(h=0;h<=FTMA-1;h++) {
      PM[h]=PM[h]/sum;
      sum1+=PM[h];
   }
  return(0);
}
Посмотри внимательно

Зачем после точек нули? если можно
// пример;
a=1.
 
Vinin:

Функцию старт я бы сделал примерно так

int start()  {
   int limit;
   int counted_bars=IndicatorCounted();
   limit=Bars - counted_bars - 1;
   if(counted_bars == 0)
      limit=Bars - FTMA - 1;
   for(int i=limit; i>=0; i--) {
      ExtMapBuffer1[i]=0;
      for(int h=0;h<FTMA;h++)
         ExtMapBuffer1[i]+=iMA(NULL, 0, 1, 0, MODE_SMA, PRICE, i) * PM[h];
   }
   return(0);
}

А какая разница?))) С limit я согласен, но это не критично)
 
gumgum:
Vinin:

Функцию старт я бы сделал примерно так

int start()  {
   int limit;
   int counted_bars=IndicatorCounted();
   limit=Bars - counted_bars - 1;
   if(counted_bars == 0)
      limit=Bars - FTMA - 1;
   for(int i=limit; i>=0; i--) {
      ExtMapBuffer1[i]=0;
      for(int h=0;h<FTMA;h++)
         ExtMapBuffer1[i]+=iMA(NULL, 0, 1, 0, MODE_SMA, PRICE, i) * PM[h];
   }
   return(0);
}

А какая разница?))) С limit я согласен, но это не критично)

Логические условия - основной тормоз. Я стараюсь по возможности их не использовать. Скорость работы очень сильно различается
 
gumgum:
Vinin:

в init() добавил после точек 0

}
Посмотри внимательно

Зачем после точек нули? если можно
// пример;
a=1.


PM[h]=(shift3+MathPow((1-(h/(FTMA-1.0))*2.0).0,rank3)*(1.0-shift3))*PM[h]; 
В этой строке есть явная ошибка. Видимо случайно точку поставил, а она в глаза не бросается. Если после точки стоит 0, то ошибку можно увидеть.
Почему компилятор пропускает такую конструкцию - я не знаю.
 
Vinin:
gumgum:
Vinin:

в init() добавил после точек 0

}
Посмотри внимательно

Зачем после точек нули? если можно
// пример;
a=1.


PM[h]=(shift3+MathPow((1-(h/(FTMA-1.0))*2.0).0,rank3)*(1.0-shift3))*PM[h]; 
В этой строке есть явная ошибка. Видимо случайно точку поставил, а она в глаза не бросается. Если после точки стоит 0, то ошибку можно увидеть.
Почему компилятор пропускает такую конструкцию - я не знаю.

Странно конечно, но это не влияет на работу.)) Спасибо впредь буду внимательнее.)))
 

Кстати, с настройками по умолчанию точная копия SMA(10)