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

 
Karputov Vladimir:

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

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

Уже проверял, при первом проходе limit > 10000 в следующих limit = 1
 
Vladimir Pastushak:
Уже проверял, при первом проходе limit > 10000 в следующих limit = 1
Вставьте код тот, который я дал и скажите, сколько раз внутри бара пересчитывается нулевой бар?
 
Vladimir Pastushak:
Кстати, код не точный. Значение на 0 баре меняется только один раз с образованием новой свечи. Хотя хз... может это то, что нужно.
 
Karputov Vladimir:
Вставьте код тот, который я дал и скажите, сколько раз внутри бара пересчитывается нулевой бар?
2016.01.31 12:29:13.033    test EURUSD,H1: limit=64999; rates_total=65000; prev_calculated=0
 
Vladimir Pastushak:
2016.01.31 12:29:13.033    test EURUSD,H1: limit=64999; rates_total=65000; prev_calculated=0
Первый проход (при prev_calculate==0) не смотрим. Смотрим следующие проходы. Сколько раз внутри бара пересчитывается нулевой бар?
 
Karputov Vladimir:
Первый проход (при prev_calculate==0) не смотрим. Смотрим следующие проходы. Сколько раз внутри бара пересчитывается нулевой бар?
2016.01.31 12:35:03.927    2012.07.13 11:00  test EURUSD,H1: limit=1; rates_total=1036; prev_calculated=1035
 
Vladimir Pastushak:
2016.01.31 12:35:03.927    2012.07.13 11:00  test EURUSD,H1: limit=1; rates_total=1036; prev_calculated=1035

Ладно. Зайдём с другой стороны...

На вопрос "Первый проход (при prev_calculate==0) не смотрим. Смотрим следующие проходы. Сколько раз внутри бара пересчитывается нулевой бар?" Вы не можете ответить, потому вставьте несколько строчек (второй, третий, четвёртый.... n-n -ый проход). Вставляете, пожалуйста, в виде кода, а не текстом.

 
Karputov Vladimir:

Ладно. Зайдём с другой стороны...

На вопрос "Первый проход (при prev_calculate==0) не смотрим. Смотрим следующие проходы. Сколько раз внутри бара пересчитывается нулевой бар?" Вы не можете ответить, потому вставьте несколько строчек (второй, третий, четвёртый.... n-n -ый проход). Вставляете, пожалуйста, в виде кода, а не текстом.

2016.01.31 12:35:03.927    2012.07.13 11:00  test EURUSD,H1: limit=1; rates_total=1036; prev_calculated=1035
2016.01.31 12:35:03.977    2012.07.13 12:00  test EURUSD,H1: limit=1; rates_total=1037; prev_calculated=1036
2016.01.31 12:35:04.020    2012.07.13 13:00  test EURUSD,H1: limit=1; rates_total=1038; prev_calculated=1037
2016.01.31 12:35:04.070    2012.07.13 14:00  test EURUSD,H1: limit=1; rates_total=1039; prev_calculated=1038
 

Правильный рабочий Вариант кода, исправления помог сделать Karputov Vladimir:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#property indicator_buffers 3
double MA1up[],MA1dw[],Buff[];
//+------------------------------------------------------------------+
//| 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);
   SetIndexStyle(2,DRAW_NONE,0,1,clrRed);
   SetIndexBuffer(2,Buff);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const datetime &time[],     // Time 
                 const double &open[],       // Open 
                 const double &high[],       // High 
                 const double &low[],        // Low 
                 const double &close[],      // Close 
                 const long &tick_volume[],  // Tick Volume 
                 const long &volume[],       // Real Volume 
                 const int &spread[]         // Spread 
   )
  {
   int limit=0;
   if(prev_calculated==0) // проверка на первый старт
      limit=rates_total-1;
   else
      limit=rates_total-prev_calculated+1;

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

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

Правильный рабочий Вариант кода, исправления помог сделать Karputov Vladimir:

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

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