Вертикальная линия. - страница 4

 

Я пока разбираюсь в тонкостях индикаторов и есть вопросы. Я делаю сброс буфера индикатора в OnInit(), но почему то буфера не сбрасывается при компиляций индикатора. По логике должно остаться одна полная ячейка для каждого буфера после компиляций, но по картинке видно что там их много (думаю это остались предыдущие ячейки буферов). Где мне ошибка?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
Файлы:
 
Nauris Zukas:

Я пока разбираюсь в тонкостях индикаторов и есть вопросы. Я делаю сброс буфера индикатора в OnInit(), но почему то буфера не сбрасывается при компиляций индикатора. По логике должно остаться одна полная ячейка для каждого буфера после компиляций, но по картинке видно что там их много (думаю это остались предыдущие ячейки буферов). Где мне ошибка?

В OnInit индикаторные буферы имеют нулевую длину.


Поэтому с ними делай что душе угодно, им всё это как мёртвому припарки.

А вот когда выполнение кода переходит в OnCalculate тут-же размер становится равным rates_total

и во всех ячейках массива находится "мусор". Может и от старого расчёта индикатора остаться.

 
Alexey Viktorov:

В OnInit индикаторные буферы имеют нулевую длину.


Поэтому с ними делай что душе угодно, им всё это как мёртвому припарки.

А вот когда выполнение кода переходит в OnCalculate тут-же размер становится равным rates_total

и во всех ячейках массива находится "мусор". Может и от старого расчёта индикатора остаться.

Большое спасибо, все понял и все получилось! Сделал вот так:

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }
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[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Большое спасибо, все понял и все получилось! Сделал вот так:

А зачем дважды присваивать значение переменной?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

И вопрос: А зачем всё это надо? Ведь проходя по всем барам в цикле все ячейки массива по-любому чем-то должны заполняться. Разве-что индикатор должен показывать только текущее положение, но тогда инициализировать массив надо на каждом баре, а не только в начале...

 
Alexey Viktorov:

А зачем дважды присваивать значение переменной?

Я не был уверен что все действия с графиком имитирует OnInit(), например смена таимфреимов. Смена таимфреимов сбросила (счас проверил), но может есть что-то другое, поэтому я и поставил второй в OnInit() для уверенности. Но если не надо, тогда я не будут там ставить.
 
Alexey Viktorov:

И вопрос: А зачем всё это надо? Ведь проходя по всем барам в цикле все ячейки массива по-любому чем-то должны заполняться. Разве-что индикатор должен показывать только текущее положение, но тогда инициализировать массив надо на каждом баре, а не только в начале...

В этом примере, я хотел просто понять как сбросить буфер. Но в дальнейшем (в индикаторе над чем я сейчас работаю), мне надо будет и оставлять предыдущие ячейки и добавлять новые. И как раз над этим я стал работать.Так сказать - первые тесты.

 
Nauris Zukas:
Я не был уверен что все действия с графиком имитирует OnInit(), например смена таимфреимов. Смена таимфреимов сбросила (счас проверил), но может есть что-то другое, поэтому я и поставил второй в OnInit() для уверенности. Но если не надо, тогда я не будут там ставить.

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

А в общем-то можно обойтись без этой дополнительной bool переменной.

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[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

А в общем-то можно обойтись без этой дополнительной bool переменной.

Да, точно, еще лучше, спасибо.

 

Не подскажете почему если период больше 30 минут, то возвращает такое странное число?

Print("PERIOD: ",Period()); 

KP    0    14:33:22.423    Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30)    PERIOD: 30

GG    0    14:33:24.402    Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1)    PERIOD: 16385

RJ    0    14:33:25.675    Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4)    PERIOD: 16388
 
Nauris Zukas:

Не подскажете почему если период больше 30 минут, то возвращает такое странное число?

в МТ5, значения периодов не равны количеству минут, как в МТ4

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