Array out of range

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

Estou tentando fazer um indicador q so mostra a posição de 9 medias moveis, mas como nunca programei antes o codigo pode estrar meio feio e com alguns erros, ele faz o primeiro loop e desenha o indicador com os dados q ja estao no grafico, mas depois simplesmente nao atualiza mais, e quando tento rodar em dados historicos ele da "critical error: array out of range"

Bem eu sei que tem algumas funçoes meio "inuteis" e falta algumas medidas de segurança mas meu maior problema agora é o array out of range nos vetores das medias moveis, provavelmente é um erro bobo no copybuffer ou no loop mesmo, mas por favor se alguem puder me ajudar eu agradewço muito

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(rates_total<p9)
      return(0);

//---- MAs
   double MA1[],MA2[],MA3[],MA4[],MA5[],MA6[],MA7[],MA8[],MA9[];

// creating mas array
   double mas[9];
   double maSorted[9];
   int n=ArraySize(mas);
   int start;
   int to_copy;

   if(prev_calculated==0)
     {
      start=0;
      to_copy=rates_total;
        }else{
      start=prev_calculated-1;
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0 || prev_calculated>rates_total) to_copy++;
      }

//----copy the handles buffers to an arrary
   if(CopyBuffer(MA1Handle,0,0,to_copy, MA1)==0 ||
      CopyBuffer(MA2Handle, 0, 0, to_copy, MA2)==0 ||
      CopyBuffer(MA3Handle, 0, 0, to_copy, MA3)==0 ||
      CopyBuffer(MA4Handle, 0, 0, to_copy, MA4)==0 ||
      CopyBuffer(MA5Handle, 0, 0, to_copy, MA5)==0 ||
      CopyBuffer(MA6Handle, 0, 0, to_copy, MA6)==0 ||
      CopyBuffer(MA7Handle, 0, 0, to_copy, MA7)==0 ||
      CopyBuffer(MA8Handle, 0, 0, to_copy, MA8)==0 ||
      CopyBuffer(MA9Handle,0,start,to_copy,MA9)==0)
     {

      Print("Error in CopyBuffer");
      return(0);
     }

   for(int i=start; i<rates_total-1; i++)
     {
      mas[0]=MA1[i];
      mas[1]=MA2[i];
      mas[2]=MA3[i];
      mas[3]=MA4[i];
      mas[4]=MA5[i];
      mas[5]=MA6[i];
      mas[6]=MA7[i];
      mas[7]=MA8[i];
      mas[8]=MA9[i];



      for(int j=0; j<n; j++)
        {
         maSorted[j]=mas[j];
        }

      Sort(n,maSorted);

      int buffer1 = ArrayBsearch(maSorted,mas[0]);
      int buffer2 = ArrayBsearch(maSorted,mas[1]);
      int buffer3 = ArrayBsearch(maSorted,mas[2]);
      int buffer4 = ArrayBsearch(maSorted,mas[3]);
      int buffer5 = ArrayBsearch(maSorted,mas[4]);
      int buffer6 = ArrayBsearch(maSorted,mas[5]);
      int buffer7 = ArrayBsearch(maSorted,mas[6]);
      int buffer8 = ArrayBsearch(maSorted,mas[7]);
      int buffer9 = ArrayBsearch(maSorted,mas[8]);


      ma1Buffer[i] = buffer1;
      ma2Buffer[i] = buffer2;
      ma3Buffer[i] = buffer3;
      ma4Buffer[i] = buffer4;
      ma5Buffer[i] = buffer5;
      ma6Buffer[i] = buffer6;
      ma7Buffer[i] = buffer7;
      ma8Buffer[i] = buffer8;
      ma9Buffer[i] = buffer9;

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

void Swap(double &arr[],int j)
  {

   double temp;
   temp=arr[j];
   arr[j]=arr[j+1];
   arr[j+1]=temp;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Sort(int n,
          double &mas_1[])
  {

//////ORGANIZANDO O ARRAR MASORTED

   for(int i=0; i<n; i++)
     {
      for(int j=0; j<n-1; j++)
        {
         if(mas_1[j]>mas_1[j+1])
           {

            Swap(mas_1,j);

           }
        }
     }
  }
//+------------------------------------------------------------------+
Flavio Jarabeck
4146
Flavio Jarabeck  
pedro de:

Estou tentando fazer um indicador q so mostra a posição de 9 medias moveis, mas como nunca programei antes o codigo pode estrar meio feio e com alguns erros, ele faz o primeiro loop e desenha o indicador com os dados q ja estao no grafico, mas depois simplesmente nao atualiza mais, e quando tento rodar em dados historicos ele da "critical error: array out of range"

Bem eu sei que tem algumas funçoes meio "inuteis" e falta algumas medidas de segurança mas meu maior problema agora é o array out of range nos vetores das medias moveis, provavelmente é um erro bobo no copybuffer ou no loop mesmo, mas por favor se alguem puder me ajudar eu agradewço muito

em qual linha deu o erro?
pedro de
29
pedro de  
Minions Labs:
em qual linha deu o erro?

da erro nessa parte 

parece que o i do loop fica fora de range da MA1 e das outras tbm


n sei se o problema ta no copybuffer ou na logica do loop mesmo


vlw pela atenção 

      mas[0]=MA1[i];
      mas[1]=MA2[i];
      mas[2]=MA3[i];
      mas[3]=MA4[i];
      mas[4]=MA5[i];
      mas[5]=MA6[i];
      mas[6]=MA7[i];
      mas[7]=MA8[i];
      mas[8]=MA9[i];
Rogerio Giannetti Torres
1832
Rogerio Giannetti Torres  
pedro de:

Bom dia.

Pedro,

localizei alguns problemas no código, mas não identifiquei o motivo do índice errado.


1) O teste abaixo só é válido se p9 for o maior dos períodos das médias.

if(rates_total<p9)

       return(0);

O correto seria:

if(rates_total<p9 || rates_total<p8 || rates_total<p7 ...  rates_total<p1) return;


2) O teste de erro do CopyBuffer está incorreto.

CopyBuffer(MA9Handle,0,start,to_copy,MA...) == 0)

o correto é:

CopyBuffer(MA9Handle,0,start,to_copy,MA..) <= 0)

pedro de
29
pedro de  

Obrigado rogerio,


ja arrumei o copybuffer (tinmha feito isso mas apaguei antes de mandar aqui achando q tava errado haha)


A p9 é a maior sempre entao deixei assim msm


vou mandar o codigfo todo aqui caso deixe mais claro, por que continua dando array out of range quando tento rodar nos dados historicos, acho que é algum problema com a otimização do loop, porque ele desenha o indicador, mas depois nao atualiza conforme aparcem novos candles

//+------------------------------------------------------------------+
//|                                                      FiboMAs.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_minimum -2
#property indicator_maximum 10
#property indicator_buffers 9
#property indicator_plots   9
//----inputs MAs
input int p1=3;
input int p2=13;
input int p3=34;
input int p4=55;
input int p5=89;
input int p6=144;
input int p7=233;
input int p8=610;
input int p9=987;
//--- plot MA1
#property indicator_label1  "MA1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot MA2
#property indicator_label2  "MA2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//--- plot MA3
#property indicator_label3  "MA3"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreenYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2
//--- plot MA4
#property indicator_label4  "MA4"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrMediumSpringGreen
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//--- plot MA5
#property indicator_label5  "MA5"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrOrchid
#property indicator_style5  STYLE_SOLID
#property indicator_width5  2
//--- plot MA6
#property indicator_label6  "MA6"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrFuchsia
#property indicator_style6  STYLE_SOLID
#property indicator_width6  2
//--- plot MA7
#property indicator_label7  "MA7"
#property indicator_type7   DRAW_LINE
#property indicator_color7  clrBlue
#property indicator_style7  STYLE_SOLID
#property indicator_width7  2
//--- plot MA8
#property indicator_label8  "MA8"
#property indicator_type8   DRAW_LINE
#property indicator_color8  clrIndigo
#property indicator_style8  STYLE_SOLID
#property indicator_width8  2
//--- plot MA9
#property indicator_label9  "MA9"
#property indicator_type9   DRAW_LINE
#property indicator_color9  clrWhiteSmoke
#property indicator_style9  STYLE_SOLID
#property indicator_width9  2
//--- indicator buffers
double         ma1Buffer[];
double         ma2Buffer[];
double         ma3Buffer[];
double         ma4Buffer[];
double         ma5Buffer[];
double         ma6Buffer[];
double         ma7Buffer[];
double         ma8Buffer[];
double         ma9Buffer[];
//------ MA handles

int MA1Handle,MA2Handle,MA3Handle,MA4Handle,MA5Handle,MA6Handle,MA7Handle,MA8Handle,MA9Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ma1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,ma2Buffer,INDICATOR_DATA);
   SetIndexBuffer(2,ma3Buffer,INDICATOR_DATA);
   SetIndexBuffer(3,ma4Buffer,INDICATOR_DATA);
   SetIndexBuffer(4,ma5Buffer,INDICATOR_DATA);
   SetIndexBuffer(5,ma6Buffer,INDICATOR_DATA);
   SetIndexBuffer(6,ma7Buffer,INDICATOR_DATA);
   SetIndexBuffer(7,ma8Buffer,INDICATOR_DATA);
   SetIndexBuffer(8,ma9Buffer,INDICATOR_DATA);
   
   
   PlotIndexGetInteger(0,PLOT_DRAW_BEGIN,p1);
   PlotIndexGetInteger(1,PLOT_DRAW_BEGIN,p2);
   PlotIndexGetInteger(2,PLOT_DRAW_BEGIN,p3);
   PlotIndexGetInteger(3,PLOT_DRAW_BEGIN,p4);
   PlotIndexGetInteger(4,PLOT_DRAW_BEGIN,p5);
   PlotIndexGetInteger(5,PLOT_DRAW_BEGIN,p6);
   PlotIndexGetInteger(6,PLOT_DRAW_BEGIN,p7);
   PlotIndexGetInteger(7,PLOT_DRAW_BEGIN,p8);
   PlotIndexGetInteger(9,PLOT_DRAW_BEGIN,p9);
   
   
   
//----setting MAs handle (instanciando as medias moveis)    

   MA1Handle=iMA(NULL,0,p1,0,MODE_EMA,PRICE_CLOSE);
   MA2Handle=iMA(NULL,0,p2,0,MODE_EMA,PRICE_CLOSE);
   MA3Handle=iMA(NULL,0,p3,0,MODE_EMA,PRICE_CLOSE);
   MA4Handle=iMA(NULL,0,p4,0,MODE_EMA,PRICE_CLOSE);
   MA5Handle=iMA(NULL,0,p5,0,MODE_EMA,PRICE_CLOSE);
   MA6Handle=iMA(NULL,0,p6,0,MODE_EMA,PRICE_CLOSE);
   MA7Handle=iMA(NULL,0,p7,0,MODE_EMA,PRICE_CLOSE);
   MA8Handle=iMA(NULL,0,p8,0,MODE_EMA,PRICE_CLOSE);
   MA9Handle=iMA(NULL,0,p9,0,MODE_EMA,PRICE_CLOSE);

   if(p1>p2 || p2>p3 || p3>p4 || p4>p5 || p5>p6 || p6>p7 || p7>p8 || p8>p9)
     {

      Print("Invalid inputs");
      return(0);
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration 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[])
  {

   if(rates_total<p9)
      return(0);

//---- MAs
   double MA1[],MA2[],MA3[],MA4[],MA5[],MA6[],MA7[],MA8[],MA9[];

// creating mas array
   double mas[9];
   double maSorted[9];
   int n=ArraySize(mas);
   int start;
   int to_copy;

   if(prev_calculated==0)
     {
      start=0;
      to_copy=rates_total;
        }else{
      start=prev_calculated-1;
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0 || prev_calculated>rates_total) to_copy++;
      }

//----copy the handles buffers to an arrary
   if(CopyBuffer(MA1Handle,0,start,to_copy, MA1)==0 ||
      CopyBuffer(MA2Handle, 0, start, to_copy, MA2)==0 ||
      CopyBuffer(MA3Handle, 0, start, to_copy, MA3)==0 ||
      CopyBuffer(MA4Handle, 0, start, to_copy, MA4)==0 ||
      CopyBuffer(MA5Handle, 0, start, to_copy, MA5)==0 ||
      CopyBuffer(MA6Handle, 0, start, to_copy, MA6)==0 ||
      CopyBuffer(MA7Handle, 0, start, to_copy, MA7)==0 ||
      CopyBuffer(MA8Handle, 0, start, to_copy, MA8)==0 ||
      CopyBuffer(MA9Handle,0,start,to_copy,MA9)==0)
     {

      Print("Error in CopyBuffer");
      return(0);
     }

   for(int i=start; i<rates_total-1; i++)
     {
      mas[0]=MA1[i];
      mas[1]=MA2[i];
      mas[2]=MA3[i];
      mas[3]=MA4[i];
      mas[4]=MA5[i];
      mas[5]=MA6[i];
      mas[6]=MA7[i];
      mas[7]=MA8[i];
      mas[8]=MA9[i];



      for(int j=0; j<n; j++)
        {
         maSorted[j]=mas[j];
        }

      Sort(n,maSorted);

      int buffer1 = ArrayBsearch(maSorted,mas[0]);
      int buffer2 = ArrayBsearch(maSorted,mas[1]);
      int buffer3 = ArrayBsearch(maSorted,mas[2]);
      int buffer4 = ArrayBsearch(maSorted,mas[3]);
      int buffer5 = ArrayBsearch(maSorted,mas[4]);
      int buffer6 = ArrayBsearch(maSorted,mas[5]);
      int buffer7 = ArrayBsearch(maSorted,mas[6]);
      int buffer8 = ArrayBsearch(maSorted,mas[7]);
      int buffer9 = ArrayBsearch(maSorted,mas[8]);


      ma1Buffer[i] = buffer1;
      ma2Buffer[i] = buffer2;
      ma3Buffer[i] = buffer3;
      ma4Buffer[i] = buffer4;
      ma5Buffer[i] = buffer5;
      ma6Buffer[i] = buffer6;
      ma7Buffer[i] = buffer7;
      ma8Buffer[i] = buffer8;
      ma9Buffer[i] = buffer9;

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

void Swap(double &arr[],int j)
  {

   double temp;
   temp=arr[j];
   arr[j]=arr[j+1];
   arr[j+1]=temp;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Sort(int n,
          double &mas_1[])
  {

//////ORGANIZANDO O ARRAR MASORTED

   for(int i=0; i<n; i++)
     {
      for(int j=0; j<n-1; j++)
        {
         if(mas_1[j]>mas_1[j+1])
           {

            Swap(mas_1,j);

           }
        }
     }
  }
//+------------------------------------------------------------------+
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
Descubra novos recursos para o MetaTrader 5 com a comunidade e os serviços MQL5
  • www.mql5.com
Tire dúvidas sobre análise técnica, fale com outros traders sobre sistemas de negociação e melhore suas habilidades de programação de estratégias em linguagem MQL5. Participe do fórum, compartilhe ideias com traders de todo o mundo e ajude com feedback os novatos — nossa comunidade está crescendo junto com você. Indicadores: Renko 2.0 Renko...
Flavio Jarabeck
4146
Flavio Jarabeck  
pedro de:

Obrigado rogerio,


ja arrumei o copybuffer (tinmha feito isso mas apaguei antes de mandar aqui achando q tava errado haha)


A p9 é a maior sempre entao deixei assim msm


vou mandar o codigfo todo aqui caso deixe mais claro, por que continua dando array out of range quando tento rodar nos dados historicos, acho que é algum problema com a otimização do loop, porque ele desenha o indicador, mas depois nao atualiza conforme aparcem novos candles

O Array Out of Range sempre indica a Linha e Coluna no código fonte. Onde é exatamente o erro?

Assim facilita pra galera aqui analisar...

;)

pedro de
29
pedro de  

MinionsLab o erro da na linha 198 coluna 17

no "i" do loop, nos vetores das MA, essa parte do codigo mais exatamente:


a aba "experts" so avisa o primeiro "array out of range" mas conforme eu apago cada linha o erro aparece na proxima, 


obigado 

      mas[0]=MA1[i];
      mas[1]=MA2[i];
      mas[2]=MA3[i];
      mas[3]=MA4[i];
      mas[4]=MA5[i];
      mas[5]=MA6[i];
      mas[6]=MA7[i];
      mas[7]=MA8[i];
      mas[8]=MA9[i];
Flavio Jarabeck
4146
Flavio Jarabeck  
pedro de:

MinionsLab o erro da na linha 198 coluna 17

no "i" do loop, nos vetores das MA, essa parte do codigo mais exatamente:


a aba "experts" so avisa o primeiro "array out of range" mas conforme eu apago cada linha o erro aparece na proxima, 


obigado 

Por algum motivo que não consegui pegar aqui rapidamente, você está com problema no índice START, que não está batendo com os buffers das médias... provavelmente uma confusão de çalculo com o TO_COPY...

Fica nítido no último elemento dos buffers das médias que ficam com valores bagunçados...


pedro de
29
pedro de  
é, amanhã vou passar o dia inteiro tentando arrumar isso, quando eu conseguir atualizo o topico aqui, obrigado a todos que me ajudaram aqui, eu fui meio que copiando os indicadores exemplos a logica de otimização admito que ainda não entendo 100%
Flavio Jarabeck
4146
Flavio Jarabeck  
pedro de:
é, amanhã vou passar o dia inteiro tentando arrumar isso, quando eu conseguir atualizo o topico aqui, obrigado a todos que me ajudaram aqui, eu fui meio que copiando os indicadores exemplos a logica de otimização admito que ainda não entendo 100%

É a parte mais chata do MQL...

Inclusive é meio bizarro o processamento do OnCalculate, pois a cada nova barra, ele recebe a instrução de recalcular TODAS as barras...

Pra você entender onde está zica, usa o Debugger ou mete um Print() com tudo - é o que faço, não uso o MetaEditor pra codificar...

ex:

Print("RatesTotal:",rates_total,"  PrevCalc:",prev_calculated,"  i:",i);

e outros valores que vc ache necessário... assim você vai entender como inclusive o OnCalculate() se comporta - testa inclusive com o mercado aberto, que vc vai entender bem...

;)

Flavio Jarabeck
4146
Flavio Jarabeck  
Minions Labs:

É a parte mais chata do MQL...

Inclusive é meio bizarro o processamento do OnCalculate, pois a cada nova barra, ele recebe a instrução de recalcular TODAS as barras...

Pra você entender onde está zica, usa o Debugger ou mete um Print() com tudo - é o que faço, não uso o MetaEditor pra codificar...

ex:

Print("RatesTotal:",rates_total,"  PrevCalc:",prev_calculated,"  i:",i);

e outros valores que vc ache necessário... assim você vai entender como inclusive o OnCalculate() se comporta - testa inclusive com o mercado aberto, que vc vai entender bem...

;)

Põe o Print() dentro do FOR i...

;)

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