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

Para adicionar comentários, por favor Faça o login ou registrar
ca.kaique
17
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:

//+------------------------------------------------------------------+
//|                                                         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!

Henrique Vilela
116
Henrique Vilela  
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) ....

Atila Ribeiro
997
Atila Ribeiro  
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);
ca.kaique
17
ca.kaique  

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!

Para adicionar comentários, por favor Faça o login ou registrar