Скачать MetaTrader 5

Не обновляется пользовательский индикатор

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114283
Forex Trader  
Здравствуйте, уважаемые разработчики. Имеется следующая проблема: пользовательский индикатор FAMA не обновляется при появлении новых баров, т.е. перестает строиться. Помогает только ручное обновление. С остальными индикаторами все нормально, кроме тех которые используют в своих расчетах этот индикатор. Этот вопрос уже поднимался здесь: "Пользовательский индикатор - отставание в отображении на графике"
но остался без ответа. Пожалуйста подскажите, что в этом индикаторе нужно исправить, чтобы он работал нормально.

Вот код индикатора.
//+------------------------------------------------------------------+
//|                                                               fAMA.mq4 |
//|                                             Copyright © 2005, Profi_R |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link      "rvm_fam@fromru.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Black
//---- input parameters
extern int Range=10;
extern int FastMA=2;
extern int SlowMA=30;
extern int filter=50;
extern int n=4;
extern int h=10;
extern int MA_Shift=0;
//---- buffers
double fAMA[];
double mAMA[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                               |
//+------------------------------------------------------------------+
int init()
  {
   string short_name; //????????? ?????????? short_name ???? "?????????"
//---- indicators
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   SetIndexBuffer(0,fAMA);
   SetIndexBuffer(1,mAMA);
//---- name for DataWindow and indicator subwindow label
   //?????????? short_name ??????????? ????????? ???????? ?????? ?????????
   short_name="fAMA("+Range+","+FastMA+","+SlowMA+","+filter+","+n+","+h+")";
   //??? ??????????? ?? ??????? ???????? ?????????? ??????? ????????????
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);//????????? ????? ??? ??????
//----
   SetIndexDrawBegin(0,Range); //????????? ????????? ????? ?????????? ??? 0 ??????
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                                    |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//---- TODO: add your code here
   int cb,i;
   double  k1,k2,Noise,ER,SSC,AMA,sdAMA,dAMA;
   if(Bars<=Range) return(0);
   else
   {
      k1=2.0/(SlowMA+1);
      k2=2.0/(FastMA+1)-k1;
      AMA=Close[Bars-Range];
      mAMA[Bars-Range]=Close[Bars-Range+1];
      for(cb=Bars-counted_bars-Range-1;cb>=0;cb--)
      {
         Noise=0;
         for(i=cb;i<=cb+Range-1;i++)
         {
            Noise=Noise+MathAbs(Close[i]-Close[i+1]);
         }
         if(Noise!=0)
         {
            ER=MathAbs(Close[cb]-Close[cb+Range])/Noise;
         }
         else
         {
            ER=0;
         }
         SSC=(ER*k2+k1);
         AMA=AMA+NormalizeDouble(SSC*SSC*(Close[cb]-AMA),4);
         mAMA[cb]=AMA;
         if(filter<1)
         {
            fAMA[cb]=mAMA[cb];
         }
         else
         {
            for(i=cb;i<=cb+SlowMA-1;i++)
            {
               sdAMA=sdAMA+MathAbs(mAMA[i]-mAMA[i+1]);
            }
            dAMA=mAMA[cb]-mAMA[cb+1];
            if(dAMA>=0)
            {
               if(dAMA<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&
                  High[cb]<=High[Highest(NULL,0,MODE_HIGH,n,cb)]+h*Point)
               {
                  fAMA[cb]=fAMA[cb+1];
               }
               else
               {
                  fAMA[cb]=mAMA[cb];
               }
            }
            else
            {
               if(MathAbs(dAMA)<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&
                  Low[Lowest(NULL,0,MODE_LOW,n,cb)]-h*Point<Low[cb])
               {
                  fAMA[cb]=fAMA[cb+1];
               }
               else
               {
                  fAMA[cb]=mAMA[cb];
               }
            }
            sdAMA=0.0;
         }
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+


upd: подправил сообщение, чтобы код нормально отображался

Forex Trader
114283
Forex Trader  
Автор этого индикатора Profi_R. Он часто бывает на этом форуме. Также его (автора) можно найти на Пауке.
Forex Trader
114283
Forex Trader  
а ещё вопросы такие лучше задавать на mql4.com..

там ответят.. программисты отсюда туда ушли...
Forex Trader
114283
Forex Trader  
попробуй это, выискал в архивах, а старый тоже должен по идее работать, никогда у него не было таких проблем если по ходу он не менялся кем - либо
//+------------------------------------------------------------------+
//|                                                         fAMA.mq4 |
//|                                        Copyright © 2005, Profi_R |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Profi_R"
#property link      "rvm_fam@fromru.com"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Black
//---- input parameters
extern int Range=10;
extern int FastMA=2;
extern int SlowMA=20;
extern int filter=60;
extern int n=6;
extern int h=30;
//---- buffers
double fAMA[];
double mAMA[];
int d_b;//объявление переменной short_name целочисленного типа
double  k1,k2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int cb;
   string short_name; //объявление переменной short_name типа "строковый"
//---- indicators
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,fAMA);
   SetIndexBuffer(1,mAMA);
//---- name for DataWindow and indicator subwindow label
   //переменной short_name присваиваем строковое значение равное выражению
   short_name="fAMA("+Range+","+FastMA+","+SlowMA+","+filter+","+n+","+h+")";
   //для отображения на графике присвоим индикатору краткое наименование
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);//Установим метку для буфера
//----
   if(filter>0) d_b=SlowMA; else d_b=Range;
   SetIndexDrawBegin(0,d_b); //установка начальной точки прорисовки для 0 буфера
//----
   k1=2.0/(SlowMA+1);
   k2=2.0/(FastMA+1)-k1;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
//---- TODO: add your code here
   int cb,i;
   double sdAMA,dAMA;
   if(Bars<=d_b)
   {
      Alert("Недостаточно данных!!! Всего баров - ",Bars,", минимально требуется - ",d_b);
      return(0);
   }
   for(cb=Bars-counted_bars-1;cb>=0;cb--)
   {
      if(cb>=Bars-Range)
      {
         mAMA[Bars-Range]=Close[Bars-Range];
      }
      else
      {
         CycleAMA(cb);
      }
      if(filter<1)
      {
         fAMA[cb]=mAMA[cb];
      }
      else
      {
         for(i=cb;i<=cb+SlowMA-1;i++)
         {
            sdAMA=sdAMA+MathAbs(mAMA[i]-mAMA[i+1]);
         }
         dAMA=mAMA[cb]-mAMA[cb+1];
         if(dAMA>=0)
         {
            if(dAMA<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&High[cb]<=High[Highest(NULL,0,MODE_HIGH,n,cb)]+h*Point)
            {
               fAMA[cb]=fAMA[cb+1];
            }
            else
            {
               fAMA[cb]=mAMA[cb];
            }
         }
         else
         {
            if(MathAbs(dAMA)<NormalizeDouble(filter*sdAMA/(100*SlowMA),4)&&Low[Lowest(NULL,0,MODE_LOW,n,cb)]-h*Point<Low[cb])
            {
               fAMA[cb]=fAMA[cb+1];
            }
            else
            {
               fAMA[cb]=mAMA[cb];
            }
         }
         sdAMA=0.0;
      }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//*****************************************************************************************//
// Функция возвращает сумму приращений на n предыдущих интервалах начиная с cb (включая)   //
//*****************************************************************************************//
double SumIncrements(int cb,int n)
   {
   int i;
   double Result;
   for(i=cb;i<cb+n;i++)
   {
      Result=Result+MathAbs(Close[i]-Close[i+1]);
   }
//----------
   return(Result);
   }
//+------------------------------------------------------------------+

//******************************************************************//
// Функция вычисляющая АМА на одном интевале                        //
//******************************************************************//
void CycleAMA(int cb)
   {
   double  Noise,ER,SSC;
   int i;
   Noise=SumIncrements(cb,Range);
   if(Noise!=0)
   {
      ER=MathAbs(Close[cb]-Close[cb+Range])/Noise;
   }
   else
   {
      ER=0;
   }
   SSC=(ER*k2+k1);
   mAMA[cb]=mAMA[cb+1]+SSC*SSC*(Close[cb]-mAMA[cb+1]);
//----------
   return(0);
   }
//+------------------------------------------------------------------+
Forex Trader
114283
Forex Trader  
а ещё вопросы такие лучше задавать на mql4.com..

там ответят.. программисты отсюда туда ушли...
Ну не знаю, не знаю... Не стоит так уж говорить за всех.
Тот форум какой-то флудливый стал в последнее время :(
Forex Trader
114283
Forex Trader  
попробуй это, выискал в архивах, а старый тоже должен по идее работать, никогда у него не было таких проблем если по ходу он не менялся кем - либо ...

Спасибо, этот работает нормально. Буду смотреть чего там другие программеры напихали, что его нужно на каждом баре обновлять.
zapletaich
5
zapletaich  

У меня была эта проблема. Решил просто и сердито: 

Вместо   for(cb=Bars-counted_bars-Range-1;cb>=0;cb--)

Написал  for(cb=0;cb<1000;cb++) 

Всё заработало как надо. А дальше 1000 баров в историю я не лезу - не нужно. Видно, на новых билдах плохо работают функции  Bars или IndicatorCounted().

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий