Проблемы отрисовки MQL4 индикатора

 

Не могу понять в чем проблема:

Суть индикатора если мувинг растет красим в синий если падает в красный.

На минутном графике как и в тестере по прохождению нескольких баров индикатор отображается скомкано не сглажено, так отрисовывается после запуска.

Если индикатор переустановить или пере компилировать то все отображается верно. В чем трабл понять не могу.

Хелп плиз ... Под утро уже не соображаю ...

До компиляции или переустановки:


После компиляции или переустановки


Код индюка

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#property indicator_buffers 2
double MA1up[],MA1dw[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexStyle(0,DRAW_LINE,0,1,clrBlue);
   SetIndexBuffer(0,MA1up);
   SetIndexStyle(1,DRAW_LINE,0,1,clrRed);
   SetIndexBuffer(1,MA1dw);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int limit=0;
   if(prev_calculated>rates_total || prev_calculated<=0) // проверка на первый старт
      limit=rates_total-1;
   else
      limit=rates_total-prev_calculated;

   for(int i=0; i<limit; i++)
      MA1up[i]=iMA(NULL,0,21,0,2,0,i);

   for(int i=0;i<limit;i++)
      if(MA1up[i+1]>MA1up[i])
        {
         MA1dw[i]=MA1up[i];
         MA1dw[i+1]=MA1up[i+1];
        }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

Не могу понять в чем проблема:

Суть индикатора если мувинг растет красим в синий если падает в красный.

На минутном графике как и в тестере по прохождению нескольких баров индикатор отображается скомкано не сглажено, так отрисовывается после запуска.

Если индикатор переустановить или пере компилировать то все отображается верно. В чем трабл понять не могу.

Хелп плиз ... Под утро уже не соображаю ...

До компиляции или переустановки:


После компиляции или переустановки


Код индюка

Вы пробовали в окне данных проверять значения индикатора в "проблемных" местах?

upd: чем хорош mql5. Можно тип индикатора задать DRAW_COLOR_LINE и с бубном танцевать не нужно! Один буфер - значение, один буфер - цвет. Не уверен, поддерживает ли mql4 этот синтаксис. 

 
Alexey Kozitsyn:

Вы пробовали в окне данных проверять значения индикатора в "проблемных" местах?

upd: чем хорош mql5. Можно тип индикатора задать DRAW_COLOR_LINE и с бубном танцевать не нужно! Один буфер - значение, один буфер - цвет. Не уверен, поддерживает ли mql4 этот синтаксис. 

Для мт4
 
Vladimir Pastushak:
Для мт4
Я по синтаксису понял, что для МТ4, Вы на вопрос не ответили.
 
Alexey Kozitsyn:
Я по синтаксису понял, что для МТ4, Вы на вопрос не ответили.
Не могу понять какое проблемное место может быть в этом индикаторе ?
 
Vladimir Pastushak:
Не могу понять какое проблемное место может быть в этом индикаторе ?

Это я уже понял. Повторюсь, Вы пробовали сравнивать значения буферов в окне данных?

Могу предложить вариант обнулять буфер MA1up  когда те же значения заносятся в буфер MA1dw.

 
Alexey Kozitsyn:

Это я уже понял. Повторюсь, Вы пробовали сравнивать значения буферов в окне данных?

Могу предложить вариант обнулять буфер MA1up  когда те же значения заносятся в буфер MA1dw.

У меня с индикаторами как то не особо складывается, (((   ))))))

Нет не пробовал, задаюсь вопросом что я могу получить сравнивая значения буферов ?

 
Vladimir Pastushak:

У меня с индикаторами как то не особо складывается, (((   ))))))

Нет не пробовал, задаюсь вопросом что я могу получить сравнивая значения буферов ?

Что происходит сейчас. Вы полностью в цикле заполняете один буфер - up. Далее, в следующем цикле сравниваете значения и если i значение < i+1 - заносите оба этих значения в буфер dw. Получается, что оба буфера имеют одинаковые значения по некоторым свечам (нисходящая МА). Если Вы уберете дубли проблема, возможно, исчезнет.
 
Alexey Kozitsyn:
Что происходит сейчас. Вы полностью в цикле заполняете один буфер - up. Далее, в следующем цикле сравниваете значения и если i значение < i+1 - заносите оба этих значения в буфер dw. Получается, что оба буфера имеют одинаковые значения по некоторым свечам. Если Вы уберете дубли проблема, возможно, исчезнет.
Спасибо. проблема исчезнет с наложением линий друг на друга, но скомканность все равно останется.
 
Vladimir Pastushak:
Спасибо. проблема исчезнет с наложением линий друг на друга, но скомканность все равно останется.

Вот такая проверка - она покажет сколько раз пересчитывается нулевой бар (и вообще, пересчитывается-ли):

   for(int i=0; i<limit; i++)
     {
      Print("limit=",limit,"; rates_total=",rates_total,"; prev_calculated=",prev_calculated);
      MA1up[i]=iMA(NULL,0,21,0,2,0,i);
     }

 Правда при первом проходе будет много принтов, но потом всё станет видно.

Причина обращения: