array out of range

 

Boa tarde comunidade

Galera estou com problema na criaçao de um indicador, no qual esta dando a mensagens array out of range (100, 22) 

erro na linha 

"ExtStdDevBuffer[i]=StdDev_Func(i,IndicadorLS,MediaILS,Periodo); "

O indicador é basicamente uma diferencá de preço entre dois ativos e dessa diferença quero traçar uma média e um desvio porém esta dando o erro relatado




meu indicador seria:

//+------------------------------------------------------------------+

//|                                                 Indicador LS.mq5 |

//|                                  Copyright 2021, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2021, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

#include <MovingAverages.mqh>

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_plots   2

//--- plot Label1

#property indicator_label1  "Label1"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrGold

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1


#property indicator_type2   DRAW_LINE

#property indicator_color2  LightSeaGreen



//--- input parameters

input string      Ativo1 = "DOL$";

input string      Ativo2 = "WDO$";

input int         Periodo = 20;



//--- indicator buffers

double          IndicadorLS[];

double         MediaILS[];

double         PreçoAtivo1[];

double         PreçoAtivo2[];

double         ExtStdDevBuffer[];   


//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,IndicadorLS,INDICATOR_DATA);

   SetIndexBuffer(1,MediaILS,INDICATOR_DATA);

   SetIndexBuffer(2,PreçoAtivo1,INDICATOR_CALCULATIONS);

   SetIndexBuffer(3,PreçoAtivo2,INDICATOR_CALCULATIONS);

   SetIndexBuffer(4,ExtStdDevBuffer,INDICATOR_CALCULATIONS);

 

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

;//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const int begin,

                const double &price[])

 {




    

                

     if (CopyClose(Ativo1,0,0,rates_total,PreçoAtivo1)<=0)

     {

      Print("erro de obtenção dos Ativo 1", GetLastError());

      return(0);

     }

      

     if(CopyClose(Ativo2,0,0,rates_total,PreçoAtivo2)<=0)

      {

      Print("erro de obtenção dos Ativo 2", GetLastError());

      return(0);

     }  

       

    

  

  int inicio;

     if(prev_calculated == 0)

   {

   inicio = 0;

   

   }

   else

   {

   inicio = prev_calculated-1;

  

   }

     

      for(int i=inicio; i<rates_total; i++)

        

       {      

      IndicadorLS[i]=PreçoAtivo1[i]-PreçoAtivo2[i];  

      

      MediaILS[i]= SimpleMA(i,Periodo,IndicadorLS);

         

      ExtStdDevBuffer[i]=StdDev_Func(i,IndicadorLS,MediaILS,Periodo);  

          

      }

//---

  

//--- return value of prev_calculated for next call

   return(rates_total);

 }

 //+------------------------------------------------------------------+

double StdDev_Func(const int position,const double &price[],const double &ma_price[],const int period)

  {

   double std_dev=0.0;

//--- calcualte StdDev

   if(position>=period)

     {

      for(int i=0; i<period; i++)

         std_dev+=MathPow(price[position-i]-ma_price[position],2.0);

      std_dev=MathSqrt(std_dev/period);

     }

//--- return calculated value

   return(std_dev);

  }

 
array out of range é quando vc tenta acessar uma quantidade de vela que vc nao carregou, por exemplo vc carrega 10 velas e quer acessar a 11...da esse problema
 
Marcio Steinmetz:

Boa tarde comunidade

Galera estou com problema na criaçao de um indicador, no qual esta dando a mensagens array out of range (100, 22) 

erro na linha 

"ExtStdDevBuffer[i]=StdDev_Func(i,IndicadorLS,MediaILS,Periodo); "

O indicador é basicamente uma diferencá de preço entre dois ativos e dessa diferença quero traçar uma média e um desvio porém esta dando o erro relatado




meu indicador seria:

//+------------------------------------------------------------------+

//|                                                 Indicador LS.mq5 |

//|                                  Copyright 2021, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2021, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

#include <MovingAverages.mqh>

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_plots   2

//--- plot Label1

#property indicator_label1  "Label1"

#property indicator_type1   DRAW_LINE

#property indicator_color1  clrGold

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1


#property indicator_type2   DRAW_LINE

#property indicator_color2  LightSeaGreen



//--- input parameters

input string      Ativo1 = "DOL$";

input string      Ativo2 = "WDO$";

input int         Periodo = 20;



//--- indicator buffers

double          IndicadorLS[];

double         MediaILS[];

double         PreçoAtivo1[];

double         PreçoAtivo2[];

double         ExtStdDevBuffer[];   


//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   SetIndexBuffer(0,IndicadorLS,INDICATOR_DATA);

   SetIndexBuffer(1,MediaILS,INDICATOR_DATA);

   SetIndexBuffer(2,PreçoAtivo1,INDICATOR_CALCULATIONS);

   SetIndexBuffer(3,PreçoAtivo2,INDICATOR_CALCULATIONS);

   SetIndexBuffer(4,ExtStdDevBuffer,INDICATOR_CALCULATIONS);

 

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);

;//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const int begin,

                const double &price[])

 {




    

                

     if (CopyClose(Ativo1,0,0,rates_total,PreçoAtivo1)<=0)

     {

      Print("erro de obtenção dos Ativo 1", GetLastError());

      return(0);

     }

      

     if(CopyClose(Ativo2,0,0,rates_total,PreçoAtivo2)<=0)

      {

      Print("erro de obtenção dos Ativo 2", GetLastError());

      return(0);

     }  

       

    

  

  int inicio;

     if(prev_calculated == 0)

   {

   inicio = 0;

   

   }

   else

   {

   inicio = prev_calculated-1;

  

   }

     

      for(int i=inicio; i<rates_total; i++)

        

       {      

      IndicadorLS[i]=PreçoAtivo1[i]-PreçoAtivo2[i];  

      

      MediaILS[i]= SimpleMA(i,Periodo,IndicadorLS);

         

      ExtStdDevBuffer[i]=StdDev_Func(i,IndicadorLS,MediaILS,Periodo);  

          

      }

//---

  

//--- return value of prev_calculated for next call

   return(rates_total);

 }

 //+------------------------------------------------------------------+

double StdDev_Func(const int position,const double &price[],const double &ma_price[],const int period)

  {

   double std_dev=0.0;

//--- calcualte StdDev

   if(position>=period)

     {

      for(int i=0; i<period; i++)

         std_dev+=MathPow(price[position-i]-ma_price[position],2.0);

      std_dev=MathSqrt(std_dev/period);

     }

//--- return calculated value

   return(std_dev);

  }

Boa noite Marcio.

Vi que o indicador que você pretende é uma correlação.

Uma dificuldade em trabalhar com ativos diferentes em um mesmo indicador se dá pq os dois ativos não possuem o mesmo número de barras. Muitas vezes o leilão do dolar pode durar mais ou menos e mesmo que os históricos começem na mesma data (ainda pode não começar na mesma data) a quantidade de velas não vai bater. Como sugestão, cria um indicador que print o rates_total em cada ativo.

Então, o erro que está acontecendo aí é que o indicador está sendo chamado no índice e tem rates_total velas, mas no dolar possui um número menor que rates_total (que foi buscado no WIN), e é o que o Eduardo Oliveira disse.

O que você está escrevendo não é muito trivial, só para avisar, rs.

Mas não desiste não, vai estudando que é assim que a gente vence!

Sucesso!

 
Ricardo Branco:

Boa noite Marcio.

Vi que o indicador que você pretende é uma correlação.

Uma dificuldade em trabalhar com ativos diferentes em um mesmo indicador se dá pq os dois ativos não possuem o mesmo número de barras. Muitas vezes o leilão do dolar pode durar mais ou menos e mesmo que os históricos começem na mesma data (ainda pode não começar na mesma data) a quantidade de velas não vai bater. Como sugestão, cria um indicador que print o rates_total em cada ativo.

Então, o erro que está acontecendo aí é que o indicador está sendo chamado no índice e tem rates_total velas, mas no dolar possui um número menor que rates_total (que foi buscado no WIN), e é o que o Eduardo Oliveira disse.

O que você está escrevendo não é muito trivial, só para avisar, rs.

Mas não desiste não, vai estudando que é assim que a gente vence!

Sucesso!

Caras obrigado !!!!

Ainda estou engatinhando neste negocio de programação, mas estou no mercado faz um tempo!

Estou tentado fazer um indicador para depois partir para um EA, porém to vendo que não será tão trivial kkk

O que é mais engracado que ao escrever o indicador até a média ele não dá esse erro, porém é so escrever a linha do desvio padrão que da esse erro! 

Se fosse esse problema de quantidades diferentes de velas não deveria aparecerer quando eu calculasse a média também? 

Desde ja agradeço a atençao Eduardo Oliveira e Ricardo Branco!

Estou vendo aqui que quando coloco o indicador para funcionar durante o pregão ele funciona, porém quando a bolsa esta fechada não funciona!!!!

o baguio é loko!!!!

 
Eduardo Oliveira:
array out of range é quando vc tenta acessar uma quantidade de vela que vc nao carregou, por exemplo vc carrega 10 velas e quer acessar a 11...da esse problema

array out of range na verdade é quando você tenta acessar uma posição em um array que não existe, exemplo define um array com 5 posições (0-4) e tenta acessar a posição 5 que representa o sexto elemento, que não existe. Isso vale para qualquer linguagem de programação.

Eu entendi a sua resposta e não está errada, so quis frisar a parte da posição e não quantidade de velas.
 
Marcio Steinmetz:

Caras obrigado !!!!

Ainda estou engatinhando neste negocio de programação, mas estou no mercado faz um tempo!

Estou tentado fazer um indicador para depois partir para um EA, porém to vendo que não será tão trivial kkk

O que é mais engracado que ao escrever o indicador até a média ele não dá esse erro, porém é so escrever a linha do desvio padrão que da esse erro! 

Se fosse esse problema de quantidades diferentes de velas não deveria aparecerer quando eu calculasse a média também? 

Desde ja agradeço a atençao Eduardo Oliveira e Ricardo Branco!

Estou vendo aqui que quando coloco o indicador para funcionar durante o pregão ele funciona, porém quando a bolsa esta fechada não funciona!!!!

o baguio é loko!!!!

kkkkkk alguns vao até me chamar de doido, mas eu acho mais facil fazer um EA do que um indicador

 
Eduardo Oliveira:

kkkkkk alguns vao até me chamar de doido, mas eu acho mais facil fazer um EA do que um indicador

somos dois!

 
Jonathan Pereira:

somos dois!

Somos Três! kkkk

 
Marcio Steinmetz:


Boa tarde, Marcio

partindo de um ativo CUSTOM  DOL - WDO vai ficar muito fácil.


Razão: