Ajuda para encontrar o erro (Array out of range).

 

Olá pessoal!


Estou aprendendo a fazer códigos no MetaEditor e recentemente me deparei com um problema no qual não consigo encontrar uma saída. Ficaria muito grato se alguém pudesse me dar uma "mãozinha".

O código consiste em imprimir os últimos valores das médias móveis de diferentes Timeframes.

Atualmente tenho isso:

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- input parameters
//input int      Input1;
//--- indicator buffers
double         maArray1[];
double         maArray2[];
double         maArray3[];
double         maArray4[];
double         maArray5[];
double         maArray6[];


double         media17_M1;
double         media72_M1;
double         media17_M5;
double         media72_M5;
double         media17_M15;
double         media72_M15;

int bc_1;
int bc_5;
int bc_15;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   SetIndexBuffer(0,maArray1,INDICATOR_DATA);
   SetIndexBuffer(1,maArray2,INDICATOR_DATA);
   SetIndexBuffer(2,maArray3,INDICATOR_DATA);
   SetIndexBuffer(3,maArray4,INDICATOR_DATA);
   SetIndexBuffer(4,maArray5,INDICATOR_DATA);
   SetIndexBuffer(5,maArray6,INDICATOR_DATA);
   
   
   
   media17_M1 = iMA(NULL,PERIOD_M1,17,0,MODE_SMA,PRICE_CLOSE);
   media72_M1 = iMA(NULL,PERIOD_M1,72,0,MODE_SMA,PRICE_CLOSE);


   media17_M5 = iMA(NULL,PERIOD_M5,17,0,MODE_SMA,PRICE_CLOSE);
   media72_M5 = iMA(NULL,PERIOD_M5,72,0,MODE_SMA,PRICE_CLOSE);


   media17_M15 = iMA(NULL,PERIOD_M15,17,0,MODE_SMA,PRICE_CLOSE);
   media72_M15 = iMA(NULL,PERIOD_M15,72,0,MODE_SMA,PRICE_CLOSE);


//---
   return(INIT_SUCCEEDED);
   

   
  }
//+------------------------------------------------------------------+
//| Expert deinitialization 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[])
     {          
     
  

  
//---

     
     
     
bc_1 = BarsCalculated(media17_M1);
bc_5 = BarsCalculated(media17_M5);
bc_15 = BarsCalculated(media17_M15);

   CopyBuffer(media17_M1,0,0,bc_1,maArray1);
   CopyBuffer(media72_M1,0,0,bc_1,maArray2);
   CopyBuffer(media17_M5,0,0,bc_5,maArray3);
   CopyBuffer(media72_M5,0,0,bc_5,maArray4);
   CopyBuffer(media17_M15,0,0,bc_15,maArray5);
   CopyBuffer(media72_M15,0,0,bc_15,maArray6);
          


double m1, m2, m3, m4, m5, m6;
m1 = maArray1[bc_1-1];
m2 = maArray2[bc_1-1];
m3 = maArray3[bc_5-1];
m4 = maArray4[bc_5-1];
m5 = maArray5[bc_15-1];
m6 = maArray6[bc_15-1];

Print("avg1 = ",m1);
Print("avg2 = ",m2);
Print("avg3 = ",m3);
Print("avg4 = ",m4);
Print("avg5 = ",m5);
Print("avg6 = ",m6);



//--- return value of prev_calculated for next call
   return(rates_total);
  }

void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      
  }
//+------------------------------------------------------------------+

Porém está me retornando o erro ARRAY OUT OF RANGE nas linhas para calcular os valores de m1, m2, m3, m4, m5 e m6.

Agradeço muito desde já pela atenção!

 
ca.kaique:

Olá pessoal!


Estou aprendendo a fazer códigos no MetaEditor e recentemente me deparei com um problema no qual não consigo encontrar uma saída. Ficaria muito grato se alguém pudesse me dar uma "mãozinha".

O código consiste em imprimir os últimos valores das médias móveis de diferentes Timeframes.

Atualmente tenho isso:

Porém está me retornando o erro ARRAY OUT OF RANGE nas linhas para calcular os valores de m1, m2, m3, m4, m5 e m6.

Agradeço muito desde já pela atenção!

só dei uma olhada muito rápida, mas se vc esta pegando a posição 0 do array

CopyBuffer(media17_M1,0,0,bc_1,maArray1);

a linha abaixo (e todas as outras com esse -1 dentro dos []:

m1 = maArray1[bc_1-1];

vão buscar a posição "-1" em um array - o que é impossível!

você pode fazer uma condicional para só executar se bc_1 for maior que zero (if bc_1 > 0) ....

 
CopyBuffer(media17_M1,0,0,rates_total,maArray1);
CopyBuffer(media72_M1,0,0,rates_total,maArray2);
CopyBuffer(media17_M5,0,0,rates_total,maArray3);
CopyBuffer(media72_M5,0,0,rates_total,maArray4);
CopyBuffer(media17_M15,0,0,rates_total,maArray5);
CopyBuffer(media72_M15,0,0,rates_total,maArray6);

double m1, m2, m3, m4, m5, m6;
m1 = maArray1[0];
m2 = maArray2[0];
m3 = maArray3[0];
m4 = maArray4[0];
m5 = maArray5[0];
m6 = maArray6[0];

Print("avg1 = ",m1);
Print("avg2 = ",m2);
Print("avg3 = ",m3);
Print("avg4 = ",m4);
Print("avg5 = ",m5);
Print("avg6 = ",m6);
 

Olá pessoal!


Primeiramente, gostaria muito de agradecer à vocês pela ajuda!

Com esses feedbacks consegui resolver o problema da seguinte forma:

bc_1 = BarsCalculated(media17_M1);
bc_5 = BarsCalculated(media17_M5);
bc_15 = BarsCalculated(media17_M15);

CopyBuffer(media17_M1,0,0,bc_1,maArray1);
CopyBuffer(media72_M1,0,0,bc_1,maArray2);
CopyBuffer(media17_M5,0,0,bc_5,maArray3);
CopyBuffer(media72_M5,0,0,bc_5,maArray4);
CopyBuffer(media17_M15,0,0,bc_15,maArray5);
CopyBuffer(media72_M15,0,0,bc_15,maArray6);


double m1, m2, m3, m4, m5, m6;


m1 = maArray1[rates_total-1];
m2 = maArray2[rates_total-1];
m3 = maArray3[rates_total-1];
m4 = maArray4[rates_total-1];
m5 = maArray5[rates_total-1];
m6 = maArray6[rates_total-1];


Print("avg1 = ",m1);
Print("avg2 = ",m2);
Print("avg3 = ",m3);
Print("avg4 = ",m4);
Print("avg5 = ",m5);
Print("avg6 = ",m6);


Desta forma, o código está me mostrando os valores atuais das médias móveis de 17 e 72 nos timeframes M1, M5 e M15. Agora partirei para a próxima etapa que é realizar algumas lógicas com esses valores.


Mas fiquei meio confuso com o código até agora...

Os valores atuais de "bc_1", "bc_5", "bc_15" quando utilizo o comando BarsCalculated, para cada tempo gráfico são estes:

bc_1 = 17520

bc_5 = 4586

bc_15 = 1778

Isto significa que cada array vai ter um tamanho diferente nessa parte:

CopyBuffer(media17_M1,0,0,bc_1,maArray1);
CopyBuffer(media72_M1,0,0,bc_1,maArray2);
CopyBuffer(media17_M5,0,0,bc_5,maArray3);
CopyBuffer(media72_M5,0,0,bc_5,maArray4);
CopyBuffer(media17_M15,0,0,bc_15,maArray5);
CopyBuffer(media72_M15,0,0,bc_15,maArray6);

Até aí tudo bem.. O que me deixou confuso foi esta parte:

double m1, m2, m3, m4, m5, m6;


m1 = maArray1[rates_total-1];
m2 = maArray2[rates_total-1];
m3 = maArray3[rates_total-1];
m4 = maArray4[rates_total-1];
m5 = maArray5[rates_total-1];
m6 = maArray6[rates_total-1];

Por que o código me retorna os valores corretos (valores atuais das médias móveis de 17 e 72 nos timeframes M1, M5 e M15) se "rates_total" não é do mesmo tamanho dos arrays? Como ele consegue buscar os valores atuais, no caso os últimos valores dos arrays?


Muito obrigado mais uma vez pela atenção!