ArrayMaximum and ArrayMinimum don't work with MqlRates array?

 

Hi,

About MqlRates array, why don't work with ArrayMaximum and ArrayMinimum?


MqlRates dados_candles[];

int copia = CopyRates(_Symbol,_Period, 0,3,dados_candles);
ArraySetAsSeries(dados_candles,true);
int idxMinValue;
int idxMaxValue;
if(copia != -1)
 {
  idxMinValue = ArrayMinimum(dados_candles,0,WHOLE_ARRAY);
  idxMaxValue = ArrayMaximum(dados_candles,0,WHOLE_ARRAY);
 }
Print("Valor mínimo: ", dados_candles[idxMinValue].low, " - Valor máximo: ", dados_candles[idxMaxValue].high);

This return: 'ArrayMinimum' - constant cannot be modified

Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / History Data Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / History Data Structure
  • www.mql5.com
History Data Structure - Data Structures - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 

Try this : 

int OnInit()
  {
//---
  MqlRates dados_candles[];
  int copia = CopyRates(_Symbol,_Period, 0,3,dados_candles);
  if(copia != -1)
  {
  /*
  idxMinValue = ArrayMinimum(dados_candles,0,WHOLE_ARRAY);
  idxMaxValue = ArrayMaximum(dados_candles,0,WHOLE_ARRAY);
  */
  rate_minmax mm=RatesMinMax(dados_candles,0,WHOLE_ARRAY);
    if(mm.max_ix!=-1&&mm.min_ix!=-1)
    {
    Print("Valor mínimo: ",mm.min, " - Valor máximo: ",mm.max);   
    }
  }

//---
   return(INIT_SUCCEEDED);
  }

struct rate_minmax
{
double min,max;
int min_ix,max_ix;
rate_minmax(void){min=-1;max=-1;min_ix=-1;max_ix=-1;}
};
rate_minmax RatesMinMax(MqlRates &target[],
                        int start,
                        int total){
rate_minmax result;
if(total==WHOLE_ARRAY){total=ArraySize(target);}
int until=start+total-1;
for(int i=start;i<=until;i++){
if(i==start)
  {
  result.min=target[i].low;
  result.min_ix=i;
  result.max=target[i].high;
  result.max_ix=i;
  }
if(i>start)
  {
  if(target[i].low<result.min){result.min=target[i].low;result.min_ix=i;}
  if(target[i].high>result.max){result.max=target[i].high;result.max_ix=i;}
  }
}
return(result);
}
 
Lorentzos Roussos:

Try this : 

Wow! works like a charm. I go to study this now to understand, thanks!