Не заполняется массив

 

Здравствуйте, есть следующие функции


double bars_min (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iLow(aSymbol(x), tf(y), i);   

   }

   return ArrayMinimum (BarsMin_buffer, 0, WHOLE_ARRAY);

}

double bars_max (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iHigh(aSymbol(x), tf(y), i);   

   }

   return ArrayMaximum (BarsMax_buffer, 0, WHOLE_ARRAY);

}

Но при их исполнении выдает 5053 ошибку - т.е. не заполняется массив. Прогоняю циклом типа Символ х Таймфрейм (х - символ, у - таймфрейм)

Подскажите, пожалуйста, почему так происходит

 
Эдуард Климуш:

Здравствуйте, есть следующие функции

...

Но при их исполнении выдает 5053 ошибку - т.е. не заполняется массив. Прогоняю циклом типа Символ х Таймфрейм (х - символ, у - таймфрейм)

Подскажите, пожалуйста, почему так происходит

У вас так:

double bars_min (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iLow(aSymbol(x), tf(y), i);   

   }

   return ArrayMinimum (BarsMin_buffer, 0, WHOLE_ARRAY);

}

double bars_max (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iHigh(aSymbol(x), tf(y), i);   

   }

   return ArrayMaximum (BarsMax_buffer, 0, WHOLE_ARRAY);

}

Нужно так:

for (int i=0; i<bar;i++)
 
Эдуард Климуш:

Здравствуйте, есть следующие функции


double bars_min (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iLow(aSymbol(x), tf(y), i);   

   }

   return ArrayMinimum (BarsMin_buffer, 0, WHOLE_ARRAY);

}

double bars_max (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iHigh(aSymbol(x), tf(y), i);   

   }

   return ArrayMaximum (BarsMax_buffer, 0, WHOLE_ARRAY);

}

Но при их исполнении выдает 5053 ошибку - т.е. не заполняется массив. Прогоняю циклом типа Символ х Таймфрейм (х - символ, у - таймфрейм)

Подскажите, пожалуйста, почему так происходит

5053??? Такого кода нет вроде,  предположу что имелось в виду 4053

Может проблема в цикле: for (int i=0; i > < bar; i++)???

 
Эдуард Климуш:

Здравствуйте, есть следующие функции


double bars_min (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iLow(aSymbol(x), tf(y), i);   

   }

   return ArrayMinimum (BarsMin_buffer, 0, WHOLE_ARRAY);

}

double bars_max (int bar, int x, int y) {

   for (int i=0; i>bar;i++){

      BarsMin_buffer[i]=iHigh(aSymbol(x), tf(y), i);   

   }

   return ArrayMaximum (BarsMax_buffer, 0, WHOLE_ARRAY);

}

Но при их исполнении выдает 5053 ошибку - т.е. не заполняется массив. Прогоняю циклом типа Символ х Таймфрейм (х - символ, у - таймфрейм)

Подскажите, пожалуйста, почему так происходит

Для начала рассмотрим первую функцию (во второй будет аналогично)

double bars_min (int bar, int x, int y)
{
   for (int i=0; i<bar;i++) BarsMin_buffer[i]=iLow(aSymbol(x), tf(y), i);   
   return ArrayMinimum (BarsMin_buffer, 0, WHOLE_ARRAY);
}

Первое, что бросается в глаза, нужно объявить массив  BarsMin_buffer.   Стоп, а зачем вообще массив?  Запоминаем первое значение функции iLow(aSymbol(x), tf(y), i);  Затем в цикле for (int i=1; i<bar;i++) ищем остальные значения и если меньше запоминаем.

double bars_min (int bar, int x, int y)
{
   double mini=iLow(aSymbol(x), tf(y), i), mini2;
   for (int i=1; i<bar;i++)
   {
      mini2=iLow(aSymbol(x), tf(y), i);   
      if(mini2<mini)mini=mini2;
   }
   return mini;
}
 
STARIJ:

Для начала рассмотрим первую функцию (во второй будет аналогично)

Первое, что бросается в глаза, нужно объявить массив  BarsMin_buffer.   Стоп, а зачем вообще массив?  Запоминаем первое значение функции iLow(aSymbol(x), tf(y), i);  Затем в цикле for (int i=1; i<bar;i++) ищем остальные значения и если меньше запоминаем.


Можно вообще без циклов обойтись и лишних массивов

double bars_min(int bar,string symbol,ENUM_TIMEFRAMES period)
  {
   double hist_low[];
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   if(CopyLow(symbol,period,0,bar,hist_low)<bar)return(WRONG_VALUE);
   int index=ArrayMinimum(hist_low);
   if(index<0)return(WRONG_VALUE);
   return(NormalizeDouble(hist_low[index],digits));
  }

...

 

раз пошла такая пьянка...

можно вообще в три строки (вот что значит MQL4)

int digit=(int)SymbolInfoInteger(aSymbol(x),SYMBOL_DIGITS);
double Maximum=NormalizeDouble(iHigh(aSymbol(x),tf(y),iHighest(aSymbol(x),tf(y),MODE_HIGH,bar,0)),digit);
double Minimum=NormalizeDouble(iLow(aSymbol(x),tf(y),iLowest(aSymbol(x),tf(y),MODE_LOW,bar,0)),digit);
 
Taras Slobodyanik:

раз пошла такая пьянка...

можно вообще в три строки (вот что значит MQL4)


можно и так, но могут быть проблемы если данные функции вернут значение в случае ошибки

iHighest

Возвращаемое значение

Индекс наибольшего найденного значения (смещение относительно текущего бара) соответствующего графика или -1 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

iHigh

Возвращаемое значение

Значение максимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

..

 

можно и так, но могут быть проблемы если данные функции вернут значение в случае ошибки

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